From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Nassim Jahnke Date: Thu, 29 Apr 2021 21:19:33 +0200 Subject: [PATCH] Add Channel initialization listeners diff --git a/src/main/java/io/papermc/paper/network/ChannelInitializeListener.java b/src/main/java/io/papermc/paper/network/ChannelInitializeListener.java new file mode 100644 index 0000000000000000000000000000000000000000..88099df34c2d74daba9645aadf65b446ca795a91 --- /dev/null +++ b/src/main/java/io/papermc/paper/network/ChannelInitializeListener.java @@ -0,0 +1,15 @@ +package io.papermc.paper.network; + +import io.netty.channel.Channel; +import org.checkerframework.checker.nullness.qual.NonNull; + +/** + * Internal API to register channel initialization listeners. + *

+ * This is not officially supported API and we make no guarantees to the existence or state of this interface. + */ +@FunctionalInterface +public interface ChannelInitializeListener { + + void afterInitChannel(@NonNull Channel channel); +} diff --git a/src/main/java/io/papermc/paper/network/ChannelInitializeListenerHolder.java b/src/main/java/io/papermc/paper/network/ChannelInitializeListenerHolder.java new file mode 100644 index 0000000000000000000000000000000000000000..30e62719e0a83525daa33cf41cb61df360c0e046 --- /dev/null +++ b/src/main/java/io/papermc/paper/network/ChannelInitializeListenerHolder.java @@ -0,0 +1,74 @@ +package io.papermc.paper.network; + +import io.netty.channel.Channel; +import net.kyori.adventure.key.Key; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * Internal API to register channel initialization listeners. + *

+ * This is not officially supported API and we make no guarantees to the existence or state of this class. + */ +public final class ChannelInitializeListenerHolder { + + private static final Map LISTENERS = new HashMap<>(); + private static final Map IMMUTABLE_VIEW = Collections.unmodifiableMap(LISTENERS); + + private ChannelInitializeListenerHolder() { + } + + /** + * Registers whether an initialization listener is registered under the given key. + * + * @param key key + * @return whether an initialization listener is registered under the given key + */ + public static boolean hasListener(@NonNull Key key) { + return LISTENERS.containsKey(key); + } + + /** + * Registers a channel initialization listener called after ServerConnection is initialized. + * + * @param key key + * @param listener initialization listeners + */ + public static void addListener(@NonNull Key key, @NonNull ChannelInitializeListener listener) { + LISTENERS.put(key, listener); + } + + /** + * Removes and returns an initialization listener registered by the given key if present. + * + * @param key key + * @return removed initialization listener if present + */ + public static @Nullable ChannelInitializeListener removeListener(@NonNull Key key) { + return LISTENERS.remove(key); + } + + /** + * Returns an immutable map of registered initialization listeners. + * + * @return immutable map of registered initialization listeners + */ + public static @NonNull Map getListeners() { + return IMMUTABLE_VIEW; + } + + /** + * Calls the registered listeners with the given channel. + * + * @param channel channel + */ + public static void callListeners(@NonNull Channel channel) { + for (ChannelInitializeListener listener : LISTENERS.values()) { + listener.afterInitChannel(channel); + } + } +} diff --git a/src/main/java/net/minecraft/server/network/ServerConnectionListener.java b/src/main/java/net/minecraft/server/network/ServerConnectionListener.java index 7fe08a998b4067f9f67c7e7a2244c1de0b194093..3d78b1f06839fa6534c84979a32bb80ec5de6d84 100644 --- a/src/main/java/net/minecraft/server/network/ServerConnectionListener.java +++ b/src/main/java/net/minecraft/server/network/ServerConnectionListener.java @@ -112,6 +112,7 @@ public class ServerConnectionListener { pending.add((Connection) object); // Paper channel.pipeline().addLast("packet_handler", (ChannelHandler) object); ((Connection) object).setListener(new ServerHandshakePacketListenerImpl(ServerConnectionListener.this.server, (Connection) object)); + io.papermc.paper.network.ChannelInitializeListenerHolder.callListeners(channel); // Paper } }).group((EventLoopGroup) lazyinitvar.get()).localAddress(address, port)).option(ChannelOption.AUTO_READ, false).bind().syncUninterruptibly()); // CraftBukkit }