From b77d6b16e8a46458173542f1b7f936731834b699 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Tue, 4 May 2021 18:49:24 +0300 Subject: [PATCH 01/10] =?UTF-8?q?=D0=BF=D0=BE=D0=B2=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=BD=D0=BE=D0=B5=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=B1=D1=8A=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D0=B2=20Packet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs.gradle | 3 +- protocol/build.gradle | 1 + .../mc/protocol/PacketInboundHandler.java | 7 ++++- protocol/src/main/java/mc/protocol/State.java | 1 + .../java/mc/protocol/di/ProtocolModule.java | 30 ++++++++++++++++-- .../mc/protocol/io/codec/ProtocolDecoder.java | 11 +++++-- .../mc/protocol/packets/ClientSidePacket.java | 2 ++ .../java/mc/protocol/packets/EmptyPacket.java | 5 +++ .../java/mc/protocol/packets/PingPacket.java | 5 +++ .../mc/protocol/packets/UnknownPacket.java | 16 ++++++++-- .../client/CPlayerPositionAndLookPacket.java | 7 +++++ .../packets/client/ClientSettingsPacket.java | 10 ++++++ .../packets/client/HandshakePacket.java | 8 +++++ .../packets/client/LoginStartPacket.java | 5 +++ .../packets/client/PlayerLookPacket.java | 6 ++++ .../packets/client/PlayerPositionPacket.java | 6 ++++ .../packets/client/PluginMessagePacket.java | 6 ++++ .../packets/client/TeleportConfirmPacket.java | 5 +++ .../java/mc/protocol/utils/PacketFactory.java | 31 +++++++++++++++++++ .../java/mc/protocol/utils/PacketPool.java | 26 ++++++++++++++++ 20 files changed, 180 insertions(+), 11 deletions(-) create mode 100644 protocol/src/main/java/mc/protocol/utils/PacketFactory.java create mode 100644 protocol/src/main/java/mc/protocol/utils/PacketPool.java diff --git a/libs.gradle b/libs.gradle index 691322b..402450a 100644 --- a/libs.gradle +++ b/libs.gradle @@ -19,7 +19,8 @@ ext { yaml : 'org.yaml:snakeyaml:1.28', json : 'com.eclipsesource.minimal-json:minimal-json:0.9.5', ioutils : 'commons-io:commons-io:2.6', - jopt : 'net.sf.jopt-simple:jopt-simple:6.0-alpha-3' + jopt : 'net.sf.jopt-simple:jopt-simple:6.0-alpha-3', + objpool : 'org.apache.commons:commons-pool2:2.9.0' ] libs.logger = [ diff --git a/protocol/build.gradle b/protocol/build.gradle index 03ac861..9bcedb4 100644 --- a/protocol/build.gradle +++ b/protocol/build.gradle @@ -4,6 +4,7 @@ dependencies { api libs.netty api libs.reactor implementation libs.json + implementation libs.objpool testImplementation libs.lang3 } diff --git a/protocol/src/main/java/mc/protocol/PacketInboundHandler.java b/protocol/src/main/java/mc/protocol/PacketInboundHandler.java index a99fb4d..9ae31f1 100644 --- a/protocol/src/main/java/mc/protocol/PacketInboundHandler.java +++ b/protocol/src/main/java/mc/protocol/PacketInboundHandler.java @@ -4,19 +4,24 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.RequiredArgsConstructor; import mc.protocol.packets.ClientSidePacket; +import mc.protocol.utils.PacketPool; import reactor.core.publisher.Sinks; @RequiredArgsConstructor public class PacketInboundHandler extends SimpleChannelInboundHandler { + private final PacketPool poolPackets; + @SuppressWarnings("rawtypes") @Override - protected void channelRead0(ChannelHandlerContext ctx, ClientSidePacket packet) { + protected void channelRead0(ChannelHandlerContext ctx, ClientSidePacket packet) throws Exception { Sinks.Many packetSinks = ctx.channel().attr(NetworkAttributes.STATE) .get().getPacketSinks(packet.getClass()); if (packetSinks != null) { packetSinks.tryEmitNext(new ChannelContext<>(ctx, packet)); } + + poolPackets.returnObject(packet); } } diff --git a/protocol/src/main/java/mc/protocol/State.java b/protocol/src/main/java/mc/protocol/State.java index 180f4d7..5aba37b 100644 --- a/protocol/src/main/java/mc/protocol/State.java +++ b/protocol/src/main/java/mc/protocol/State.java @@ -80,6 +80,7 @@ public enum State { @Getter private final int id; + @Getter private final Map> clientSidePackets; private final Map, Integer> serverSidePackets; diff --git a/protocol/src/main/java/mc/protocol/di/ProtocolModule.java b/protocol/src/main/java/mc/protocol/di/ProtocolModule.java index 3e8a8df..3fee6b2 100644 --- a/protocol/src/main/java/mc/protocol/di/ProtocolModule.java +++ b/protocol/src/main/java/mc/protocol/di/ProtocolModule.java @@ -13,14 +13,23 @@ import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; import mc.protocol.NettyServer; import mc.protocol.PacketInboundHandler; +import mc.protocol.State; import mc.protocol.io.codec.ProtocolDecoder; import mc.protocol.io.codec.ProtocolEncoder; import mc.protocol.io.codec.ProtocolSplitter; +import mc.protocol.packets.ClientSidePacket; +import mc.protocol.packets.UnknownPacket; +import mc.protocol.utils.PacketFactory; +import mc.protocol.utils.PacketPool; +import org.apache.commons.pool2.ObjectPool; +import org.apache.commons.pool2.impl.GenericObjectPool; import javax.annotation.Nonnull; import javax.inject.Provider; import java.util.LinkedHashMap; import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; @Module public class ProtocolModule { @@ -55,15 +64,30 @@ public class ProtocolModule { } @Provides - Map provideChannelHandlerMap() { + Map provideChannelHandlerMap(PacketPool packetPool) { Map map = new LinkedHashMap<>(); map.put("packet_splitter", new ProtocolSplitter()); map.put("logger", new LoggingHandler(LogLevel.DEBUG)); - map.put("packet_decoder", new ProtocolDecoder(true)); + map.put("packet_decoder", new ProtocolDecoder(true, packetPool)); map.put("packet_encoder", new ProtocolEncoder()); - map.put("packet_handler", new PacketInboundHandler()); + map.put("packet_handler", new PacketInboundHandler(packetPool)); return map; } + + @Provides + @ServerScope + @SuppressWarnings({ "rawtypes", "unchecked" }) + PacketPool providePacketPool() { + Map, ObjectPool> map = Stream.of(State.values()) + .flatMap(state -> state.getClientSidePackets().values().stream()) + .distinct() + .collect(Collectors.toMap( + packetClass -> packetClass, + packetClass -> new GenericObjectPool(new PacketFactory<>(packetClass)))); + map.put(UnknownPacket.class, new GenericObjectPool(new PacketFactory<>(UnknownPacket.class))); + + return new PacketPool(map); + } } diff --git a/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java b/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java index b7ee9d5..062bd8f 100644 --- a/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java +++ b/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java @@ -10,15 +10,17 @@ import mc.protocol.State; import mc.protocol.io.NetByteBuf; import mc.protocol.packets.ClientSidePacket; import mc.protocol.packets.UnknownPacket; +import mc.protocol.utils.PacketPool; import java.util.List; import java.util.Objects; -@Slf4j @RequiredArgsConstructor +@Slf4j public class ProtocolDecoder extends ByteToMessageDecoder { private final boolean readUnknownPackets; + private final PacketPool poolPackets; @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { @@ -43,14 +45,17 @@ public class ProtocolDecoder extends ByteToMessageDecoder { log.warn("Unknown packet: State {} ; Id 0x{}", state, packetIdAsHexcode(packetId)); if (readUnknownPackets) { - UnknownPacket unknownPacket = new UnknownPacket(state, packetId, netByteBuf.readableBytes()); + UnknownPacket unknownPacket = poolPackets.borrowObject(UnknownPacket.class); + unknownPacket.setState(state); + unknownPacket.setId(packetId); + unknownPacket.setDataSize(netByteBuf.readableBytes()); unknownPacket.readSelf(netByteBuf); out.add(unknownPacket); } else { netByteBuf.skipBytes(netByteBuf.readableBytes()); } } else { - ClientSidePacket packet = packetClass.getDeclaredConstructor().newInstance(); + ClientSidePacket packet = poolPackets.borrowObject(packetClass); packet.readSelf(netByteBuf); log.debug("IN: {}:{}", state, packet); out.add(packet); diff --git a/protocol/src/main/java/mc/protocol/packets/ClientSidePacket.java b/protocol/src/main/java/mc/protocol/packets/ClientSidePacket.java index 6629750..735a823 100644 --- a/protocol/src/main/java/mc/protocol/packets/ClientSidePacket.java +++ b/protocol/src/main/java/mc/protocol/packets/ClientSidePacket.java @@ -8,4 +8,6 @@ import mc.protocol.io.NetByteBuf; public interface ClientSidePacket extends Packet { void readSelf(NetByteBuf netByteBuf); + + void passivate(); } diff --git a/protocol/src/main/java/mc/protocol/packets/EmptyPacket.java b/protocol/src/main/java/mc/protocol/packets/EmptyPacket.java index 60c800f..0e3a740 100644 --- a/protocol/src/main/java/mc/protocol/packets/EmptyPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/EmptyPacket.java @@ -13,4 +13,9 @@ public abstract class EmptyPacket implements ClientSidePacket, ServerSidePacket public void writeSelf(NetByteBuf netByteBuf) { // empty } + + @Override + public void passivate() { + // pass + } } diff --git a/protocol/src/main/java/mc/protocol/packets/PingPacket.java b/protocol/src/main/java/mc/protocol/packets/PingPacket.java index f40b121..3b1ee48 100644 --- a/protocol/src/main/java/mc/protocol/packets/PingPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/PingPacket.java @@ -34,6 +34,11 @@ public class PingPacket implements ClientSidePacket, ServerSidePacket { payload = netByteBuf.readLong(); } + @Override + public void passivate() { + this.payload = null; + } + @Override public void writeSelf(NetByteBuf netByteBuf) { netByteBuf.writeLong(payload); diff --git a/protocol/src/main/java/mc/protocol/packets/UnknownPacket.java b/protocol/src/main/java/mc/protocol/packets/UnknownPacket.java index aef7b74..6722e5f 100644 --- a/protocol/src/main/java/mc/protocol/packets/UnknownPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/UnknownPacket.java @@ -1,17 +1,19 @@ package mc.protocol.packets; import lombok.Data; +import lombok.NoArgsConstructor; import lombok.ToString; import mc.protocol.State; import mc.protocol.io.NetByteBuf; +@NoArgsConstructor @Data @ToString(exclude = "rawData") public class UnknownPacket implements ClientSidePacket { - private final State state; - private final int id; - private final int dataSize; + private State state; + private int id; + private int dataSize; private byte[] rawData; @Override @@ -19,4 +21,12 @@ public class UnknownPacket implements ClientSidePacket { rawData = new byte[dataSize]; netByteBuf.readBytes(rawData); } + + @Override + public void passivate() { + this.state = null; + this.id = 0; + this.dataSize = 0; + this.rawData = null; + } } diff --git a/protocol/src/main/java/mc/protocol/packets/client/CPlayerPositionAndLookPacket.java b/protocol/src/main/java/mc/protocol/packets/client/CPlayerPositionAndLookPacket.java index ed5c002..d7be871 100644 --- a/protocol/src/main/java/mc/protocol/packets/client/CPlayerPositionAndLookPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/client/CPlayerPositionAndLookPacket.java @@ -51,6 +51,13 @@ public class CPlayerPositionAndLookPacket implements ClientSidePacket { this.onGround = netByteBuf.readBoolean(); } + @Override + public void passivate() { + this.position = null; + this.look = null; + this.onGround = false; + } + public double getYPositionHead() { return this.position.getY() + 1.62f; } diff --git a/protocol/src/main/java/mc/protocol/packets/client/ClientSettingsPacket.java b/protocol/src/main/java/mc/protocol/packets/client/ClientSettingsPacket.java index 680db2c..b78dab3 100644 --- a/protocol/src/main/java/mc/protocol/packets/client/ClientSettingsPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/client/ClientSettingsPacket.java @@ -64,6 +64,16 @@ public class ClientSettingsPacket implements ClientSidePacket { this.mainHand = MainHand.valueById(netByteBuf.readVarInt()); } + @Override + public void passivate() { + this.locale = null; + this.viewDistance = 0; + this.chatMode = null; + this.chatColors = false; + this.$displayedSkinPartsBitMask = 0; + this.mainHand = null; + } + public boolean isCapeEnabled() { return ($displayedSkinPartsBitMask & 0x01) > 0; } diff --git a/protocol/src/main/java/mc/protocol/packets/client/HandshakePacket.java b/protocol/src/main/java/mc/protocol/packets/client/HandshakePacket.java index ccb86b5..005c6b9 100644 --- a/protocol/src/main/java/mc/protocol/packets/client/HandshakePacket.java +++ b/protocol/src/main/java/mc/protocol/packets/client/HandshakePacket.java @@ -47,4 +47,12 @@ public class HandshakePacket implements ClientSidePacket { nextState = State.getById(netByteBuf.readVarInt()); } + @Override + public void passivate() { + this.protocolVersion = 0; + this.host = null; + this.port = 0; + this.nextState = null; + } + } diff --git a/protocol/src/main/java/mc/protocol/packets/client/LoginStartPacket.java b/protocol/src/main/java/mc/protocol/packets/client/LoginStartPacket.java index 77775b6..0462715 100644 --- a/protocol/src/main/java/mc/protocol/packets/client/LoginStartPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/client/LoginStartPacket.java @@ -34,4 +34,9 @@ public class LoginStartPacket implements ClientSidePacket { this.name = netByteBuf.readString(); } + @Override + public void passivate() { + this.name = null; + } + } diff --git a/protocol/src/main/java/mc/protocol/packets/client/PlayerLookPacket.java b/protocol/src/main/java/mc/protocol/packets/client/PlayerLookPacket.java index 0f6ec16..35568fa 100644 --- a/protocol/src/main/java/mc/protocol/packets/client/PlayerLookPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/client/PlayerLookPacket.java @@ -39,4 +39,10 @@ public class PlayerLookPacket implements ClientSidePacket { this.onGround = netByteBuf.readBoolean(); } + + @Override + public void passivate() { + this.look = null; + this.onGround = false; + } } diff --git a/protocol/src/main/java/mc/protocol/packets/client/PlayerPositionPacket.java b/protocol/src/main/java/mc/protocol/packets/client/PlayerPositionPacket.java index abbc609..3be5633 100644 --- a/protocol/src/main/java/mc/protocol/packets/client/PlayerPositionPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/client/PlayerPositionPacket.java @@ -43,6 +43,12 @@ public class PlayerPositionPacket implements ClientSidePacket { this.onGround = netByteBuf.readBoolean(); } + @Override + public void passivate() { + this.position = null; + this.onGround = false; + } + public double getYPositionHead() { return this.position.getY() + 1.62f; } diff --git a/protocol/src/main/java/mc/protocol/packets/client/PluginMessagePacket.java b/protocol/src/main/java/mc/protocol/packets/client/PluginMessagePacket.java index 622bd4e..2ae5ab0 100644 --- a/protocol/src/main/java/mc/protocol/packets/client/PluginMessagePacket.java +++ b/protocol/src/main/java/mc/protocol/packets/client/PluginMessagePacket.java @@ -39,4 +39,10 @@ public class PluginMessagePacket implements ClientSidePacket { this.rawData = new byte[netByteBuf.readableBytes()]; netByteBuf.readBytes(this.rawData); } + + @Override + public void passivate() { + this.channelName = null; + this.rawData = null; + } } diff --git a/protocol/src/main/java/mc/protocol/packets/client/TeleportConfirmPacket.java b/protocol/src/main/java/mc/protocol/packets/client/TeleportConfirmPacket.java index eee3df4..fd120e9 100644 --- a/protocol/src/main/java/mc/protocol/packets/client/TeleportConfirmPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/client/TeleportConfirmPacket.java @@ -33,4 +33,9 @@ public class TeleportConfirmPacket implements ClientSidePacket { public void readSelf(NetByteBuf netByteBuf) { this.teleportId = netByteBuf.readVarInt(); } + + @Override + public void passivate() { + this.teleportId = 0; + } } diff --git a/protocol/src/main/java/mc/protocol/utils/PacketFactory.java b/protocol/src/main/java/mc/protocol/utils/PacketFactory.java new file mode 100644 index 0000000..4532257 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/utils/PacketFactory.java @@ -0,0 +1,31 @@ +package mc.protocol.utils; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import mc.protocol.packets.ClientSidePacket; +import org.apache.commons.pool2.BasePooledObjectFactory; +import org.apache.commons.pool2.PooledObject; +import org.apache.commons.pool2.impl.DefaultPooledObject; + +@Slf4j +@RequiredArgsConstructor +public class PacketFactory

extends BasePooledObjectFactory

{ + + private final Class

clazz; + + @Override + public P create() throws Exception { + log.info("Create {}", clazz); + return clazz.getDeclaredConstructor().newInstance(); + } + + @Override + public PooledObject

wrap(P packet) { + return new DefaultPooledObject<>(packet); + } + + @Override + public void passivateObject(PooledObject

pooledPacket) { + pooledPacket.getObject().passivate(); + } +} diff --git a/protocol/src/main/java/mc/protocol/utils/PacketPool.java b/protocol/src/main/java/mc/protocol/utils/PacketPool.java new file mode 100644 index 0000000..447d7c2 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/utils/PacketPool.java @@ -0,0 +1,26 @@ +package mc.protocol.utils; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import mc.protocol.packets.ClientSidePacket; +import org.apache.commons.pool2.ObjectPool; + +import java.util.Map; + +@Slf4j +@RequiredArgsConstructor +public class PacketPool { + + @SuppressWarnings("rawtypes") + private final Map, ObjectPool> mapPoolPackets; + + @SuppressWarnings("unchecked") + public

P borrowObject(Class

packetClass) throws Exception { + return (P) mapPoolPackets.get(packetClass).borrowObject(); + } + + @SuppressWarnings("unchecked") + public

void returnObject(P packet) throws Exception { + mapPoolPackets.get(packet.getClass()).returnObject(packet); + } +} From 0f1c9bfb1b94ef627ca8f2d4ccb4b09af1072214 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 5 May 2021 20:09:32 +0300 Subject: [PATCH 02/10] =?UTF-8?q?=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84?= =?UTF-8?q?=D0=B5=D0=B9=D1=81=20EventBus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/mc/protocol/utils/EventBus.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 protocol/src/main/java/mc/protocol/utils/EventBus.java diff --git a/protocol/src/main/java/mc/protocol/utils/EventBus.java b/protocol/src/main/java/mc/protocol/utils/EventBus.java new file mode 100644 index 0000000..036b25c --- /dev/null +++ b/protocol/src/main/java/mc/protocol/utils/EventBus.java @@ -0,0 +1,17 @@ +package mc.protocol.utils; + +import mc.protocol.ChannelContext; +import mc.protocol.State; +import mc.protocol.packets.ClientSidePacket; + +public interface EventBus { + +

void subscribe(State state, Class

packetClass, EventHandler

eventHandler); + +

void emit(State state, ChannelContext

channelContext); + + @FunctionalInterface + interface EventHandler

{ + void handle(ChannelContext

channelContext); + } +} From 205e813fc4c011e7cce9bb0483cd9d86ce2bb3ec Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 5 May 2021 20:09:49 +0300 Subject: [PATCH 03/10] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=8F=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20EventBus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/mc/protocol/NettyServer.java | 7 ++++++ .../mc/protocol/PacketInboundHandler.java | 13 ++++------ .../java/mc/protocol/di/ProtocolModule.java | 16 +++++++++--- .../mc/protocol/utils/SimpleEventBus.java | 25 +++++++++++++++++++ .../main/java/mc/protocol/utils/Table.java | 23 +++++++++++++++++ server/src/main/java/mc/server/Main.java | 10 ++++---- 6 files changed, 77 insertions(+), 17 deletions(-) create mode 100644 protocol/src/main/java/mc/protocol/utils/SimpleEventBus.java create mode 100644 protocol/src/main/java/mc/protocol/utils/Table.java diff --git a/protocol/src/main/java/mc/protocol/NettyServer.java b/protocol/src/main/java/mc/protocol/NettyServer.java index 2c92645..476c9a5 100644 --- a/protocol/src/main/java/mc/protocol/NettyServer.java +++ b/protocol/src/main/java/mc/protocol/NettyServer.java @@ -5,12 +5,15 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import mc.protocol.di.DaggerProtocolComponent; import mc.protocol.di.ProtocolComponent; +import mc.protocol.packets.ClientSidePacket; +import mc.protocol.utils.EventBus; @Slf4j @RequiredArgsConstructor public class NettyServer { private final ServerBootstrap serverBootstrap; + private final EventBus eventBus; public void bind(String host, int port) { log.info("Network starting: {}:{}", host, port); @@ -24,6 +27,10 @@ public class NettyServer { } } + public

void listenPacket(State state, Class

packetClass, EventBus.EventHandler

eventHandler) { + this.eventBus.subscribe(state, packetClass, eventHandler); + } + public static NettyServer createServer() { ProtocolComponent component = DaggerProtocolComponent.create(); return component.getNettyServer(); diff --git a/protocol/src/main/java/mc/protocol/PacketInboundHandler.java b/protocol/src/main/java/mc/protocol/PacketInboundHandler.java index a99fb4d..da372c6 100644 --- a/protocol/src/main/java/mc/protocol/PacketInboundHandler.java +++ b/protocol/src/main/java/mc/protocol/PacketInboundHandler.java @@ -4,19 +4,16 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.RequiredArgsConstructor; import mc.protocol.packets.ClientSidePacket; -import reactor.core.publisher.Sinks; +import mc.protocol.utils.EventBus; @RequiredArgsConstructor public class PacketInboundHandler extends SimpleChannelInboundHandler { - @SuppressWarnings("rawtypes") + private final EventBus eventBus; + @Override protected void channelRead0(ChannelHandlerContext ctx, ClientSidePacket packet) { - Sinks.Many packetSinks = ctx.channel().attr(NetworkAttributes.STATE) - .get().getPacketSinks(packet.getClass()); - - if (packetSinks != null) { - packetSinks.tryEmitNext(new ChannelContext<>(ctx, packet)); - } + State state = ctx.channel().attr(NetworkAttributes.STATE).get(); + eventBus.emit(state, new ChannelContext<>(ctx, packet)); } } diff --git a/protocol/src/main/java/mc/protocol/di/ProtocolModule.java b/protocol/src/main/java/mc/protocol/di/ProtocolModule.java index 3e8a8df..8ea6642 100644 --- a/protocol/src/main/java/mc/protocol/di/ProtocolModule.java +++ b/protocol/src/main/java/mc/protocol/di/ProtocolModule.java @@ -16,6 +16,8 @@ import mc.protocol.PacketInboundHandler; import mc.protocol.io.codec.ProtocolDecoder; import mc.protocol.io.codec.ProtocolEncoder; import mc.protocol.io.codec.ProtocolSplitter; +import mc.protocol.utils.EventBus; +import mc.protocol.utils.SimpleEventBus; import javax.annotation.Nonnull; import javax.inject.Provider; @@ -26,8 +28,8 @@ import java.util.Map; public class ProtocolModule { @Provides - NettyServer provideServer(ServerBootstrap serverBootstrap) { - return new NettyServer(serverBootstrap); + NettyServer provideServer(ServerBootstrap serverBootstrap, EventBus eventBus) { + return new NettyServer(serverBootstrap, eventBus); } @Provides @@ -55,15 +57,21 @@ public class ProtocolModule { } @Provides - Map provideChannelHandlerMap() { + Map provideChannelHandlerMap(EventBus eventBus) { Map map = new LinkedHashMap<>(); map.put("packet_splitter", new ProtocolSplitter()); map.put("logger", new LoggingHandler(LogLevel.DEBUG)); map.put("packet_decoder", new ProtocolDecoder(true)); map.put("packet_encoder", new ProtocolEncoder()); - map.put("packet_handler", new PacketInboundHandler()); + map.put("packet_handler", new PacketInboundHandler(eventBus)); return map; } + + @Provides + @ServerScope + EventBus provideEventBus() { + return new SimpleEventBus(); + } } diff --git a/protocol/src/main/java/mc/protocol/utils/SimpleEventBus.java b/protocol/src/main/java/mc/protocol/utils/SimpleEventBus.java new file mode 100644 index 0000000..32c6bc6 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/utils/SimpleEventBus.java @@ -0,0 +1,25 @@ +package mc.protocol.utils; + +import mc.protocol.ChannelContext; +import mc.protocol.State; +import mc.protocol.packets.ClientSidePacket; + +@SuppressWarnings({ "rawtypes", "unchecked" }) +public class SimpleEventBus implements EventBus { + + private final Table, EventHandler> table = new Table<>(); + + @Override + public

void subscribe(State state, Class

packetClass, EventHandler

eventHandler) { + table.put(state, packetClass, eventHandler); + } + + @Override + public

void emit(State state, ChannelContext

channelContext) { + EventHandler eventHandler = table.getColumnAndRow(state, channelContext.getPacket().getClass()); + + if (eventHandler != null) { + eventHandler.handle(channelContext); + } + } +} diff --git a/protocol/src/main/java/mc/protocol/utils/Table.java b/protocol/src/main/java/mc/protocol/utils/Table.java new file mode 100644 index 0000000..acc1302 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/utils/Table.java @@ -0,0 +1,23 @@ +package mc.protocol.utils; + +import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.Map; + +public class Table { + + private final Map> map = new HashMap<>(); + + @Nullable + public V getColumnAndRow(C column, R row) { + if (!map.containsKey(column)) { + return null; + } + + return map.get(column).get(row); + } + + public void put(C column, R row, V value) { + map.computeIfAbsent(column, c -> new HashMap<>()).put(row, value); + } +} diff --git a/server/src/main/java/mc/server/Main.java b/server/src/main/java/mc/server/Main.java index fedfe80..2962839 100644 --- a/server/src/main/java/mc/server/Main.java +++ b/server/src/main/java/mc/server/Main.java @@ -49,11 +49,11 @@ public class Main { NettyServer server = NettyServer.createServer(); PacketHandler packetHandler = serverComponent.getPacketHandler(); - State.HANDSHAKING.packetFlux(HandshakePacket.class).subscribe(packetHandler::onHandshake); - State.STATUS.packetFlux(PingPacket.class).subscribe(packetHandler::onKeepAlive); - State.STATUS.packetFlux(StatusServerRequestPacket.class).subscribe(packetHandler::onServerStatus); - State.LOGIN.packetFlux(LoginStartPacket.class).subscribe(packetHandler::onLoginStart); - State.PLAY.packetFlux(PingPacket.class).subscribe(packetHandler::onKeepAlivePlay); + server.listenPacket(State.HANDSHAKING, HandshakePacket.class, packetHandler::onHandshake); + server.listenPacket(State.STATUS, PingPacket.class, packetHandler::onKeepAlive); + server.listenPacket(State.STATUS, StatusServerRequestPacket.class, packetHandler::onServerStatus); + server.listenPacket(State.LOGIN, LoginStartPacket.class, packetHandler::onLoginStart); + server.listenPacket(State.PLAY, PingPacket.class, packetHandler::onKeepAlivePlay); server.bind(config.server().host(), config.server().port()); } From c4a6a019084cfd01e15c1e9b9d3dedf51b037a6a Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 5 May 2021 20:43:09 +0300 Subject: [PATCH 04/10] =?UTF-8?q?=D1=83=D0=B1=D0=B8=D1=80=D0=B0=D0=B5?= =?UTF-8?q?=D0=BC=20reactor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- protocol/build.gradle | 1 - protocol/src/main/java/mc/protocol/State.java | 18 ------------------ 2 files changed, 19 deletions(-) diff --git a/protocol/build.gradle b/protocol/build.gradle index 03ac861..b27f6a5 100644 --- a/protocol/build.gradle +++ b/protocol/build.gradle @@ -2,7 +2,6 @@ apply from: rootDir.toPath().resolve('logic.gradle').toFile() dependencies { api libs.netty - api libs.reactor implementation libs.json testImplementation libs.lang3 diff --git a/protocol/src/main/java/mc/protocol/State.java b/protocol/src/main/java/mc/protocol/State.java index 180f4d7..e94fe07 100644 --- a/protocol/src/main/java/mc/protocol/State.java +++ b/protocol/src/main/java/mc/protocol/State.java @@ -8,12 +8,9 @@ import mc.protocol.packets.PingPacket; import mc.protocol.packets.ServerSidePacket; import mc.protocol.packets.client.*; import mc.protocol.packets.server.*; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Sinks; import javax.annotation.Nullable; import java.util.Collections; -import java.util.HashMap; import java.util.Map; @RequiredArgsConstructor @@ -83,9 +80,6 @@ public enum State { private final Map> clientSidePackets; private final Map, Integer> serverSidePackets; - @SuppressWarnings("rawtypes") - private final Map, Sinks.Many> observedMap = new HashMap<>(); - State(int id, Map> clientSidePackets) { this.id = id; this.clientSidePackets = clientSidePackets; @@ -101,16 +95,4 @@ public enum State { public Integer getServerSidePacketId(Class clazz) { return serverSidePackets == null ? null : serverSidePackets.get(clazz); } - - - @SuppressWarnings("rawtypes") - public

Sinks.Many getPacketSinks(Class

packetClass) { - return observedMap.get(packetClass); - } - - @SuppressWarnings("unchecked") - public

Flux> packetFlux(Class

packetClass) { - return observedMap.computeIfAbsent(packetClass, aClass -> Sinks.many().multicast().directBestEffort()) - .asFlux().map(ChannelContext.class::cast); - } } From 5f431ff1389599ab4a0ea5d630be00f0f160ef5a Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 6 May 2021 13:14:42 +0300 Subject: [PATCH 05/10] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D0=BF=D1=80=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=BA=D0=BE=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- protocol/build.gradle | 3 +- .../main/java/mc/protocol/ChannelContext.java | 20 ------ .../mc/protocol/NettyConnectionContext.java | 49 +++++++++++++ .../main/java/mc/protocol/NettyServer.java | 71 ++++++++++++++++--- .../mc/protocol/PacketInboundHandler.java | 5 +- protocol/src/main/java/mc/protocol/State.java | 9 +-- .../mc/protocol/api/ConnectionContext.java | 19 +++++ .../src/main/java/mc/protocol/api/Server.java | 11 +++ .../mc/protocol/di/ProtocolComponent.java | 4 +- .../java/mc/protocol/di/ProtocolModule.java | 60 ++-------------- .../mc/protocol/io/codec/ProtocolDecoder.java | 14 ++-- server/src/main/java/mc/server/Main.java | 11 ++- .../main/java/mc/server/PacketHandler.java | 44 ++++++------ 13 files changed, 200 insertions(+), 120 deletions(-) delete mode 100644 protocol/src/main/java/mc/protocol/ChannelContext.java create mode 100644 protocol/src/main/java/mc/protocol/NettyConnectionContext.java create mode 100644 protocol/src/main/java/mc/protocol/api/ConnectionContext.java create mode 100644 protocol/src/main/java/mc/protocol/api/Server.java diff --git a/protocol/build.gradle b/protocol/build.gradle index 03ac861..b8fb582 100644 --- a/protocol/build.gradle +++ b/protocol/build.gradle @@ -1,8 +1,9 @@ apply from: rootDir.toPath().resolve('logic.gradle').toFile() dependencies { - api libs.netty api libs.reactor + + implementation libs.netty implementation libs.json testImplementation libs.lang3 diff --git a/protocol/src/main/java/mc/protocol/ChannelContext.java b/protocol/src/main/java/mc/protocol/ChannelContext.java deleted file mode 100644 index 51d7a89..0000000 --- a/protocol/src/main/java/mc/protocol/ChannelContext.java +++ /dev/null @@ -1,20 +0,0 @@ -package mc.protocol; - -import io.netty.channel.ChannelHandlerContext; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import mc.protocol.packets.ClientSidePacket; - -@RequiredArgsConstructor -public class ChannelContext

{ - - @Getter - private final ChannelHandlerContext ctx; - - @Getter - private final P packet; - - public void setState(State state) { - ctx.channel().attr(NetworkAttributes.STATE).set(state); - } -} diff --git a/protocol/src/main/java/mc/protocol/NettyConnectionContext.java b/protocol/src/main/java/mc/protocol/NettyConnectionContext.java new file mode 100644 index 0000000..a4cdc65 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/NettyConnectionContext.java @@ -0,0 +1,49 @@ +package mc.protocol; + +import io.netty.channel.ChannelHandlerContext; +import lombok.RequiredArgsConstructor; +import mc.protocol.api.ConnectionContext; +import mc.protocol.packets.ClientSidePacket; +import mc.protocol.packets.ServerSidePacket; + +@RequiredArgsConstructor +public class NettyConnectionContext

implements ConnectionContext

{ + + private final ChannelHandlerContext ctx; + private final P packet; + + @Override + public State getState() { + return ctx.channel().attr(NetworkAttributes.STATE).get(); + } + + @Override + public void setState(State state) { + ctx.channel().attr(NetworkAttributes.STATE).set(state); + } + + @Override + public P clientPacket() { + return packet; + } + + @Override + public void send(ServerSidePacket packet) { + ctx.write(packet); + } + + @Override + public void sendNow(ServerSidePacket packet) { + ctx.writeAndFlush(packet); + } + + @Override + public void flushSending() { + ctx.flush(); + } + + @Override + public void disconnect() { + ctx.disconnect(); + } +} diff --git a/protocol/src/main/java/mc/protocol/NettyServer.java b/protocol/src/main/java/mc/protocol/NettyServer.java index 2c92645..16325ac 100644 --- a/protocol/src/main/java/mc/protocol/NettyServer.java +++ b/protocol/src/main/java/mc/protocol/NettyServer.java @@ -1,22 +1,40 @@ package mc.protocol; import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import mc.protocol.di.DaggerProtocolComponent; -import mc.protocol.di.ProtocolComponent; +import mc.protocol.api.ConnectionContext; +import mc.protocol.api.Server; +import mc.protocol.io.codec.ProtocolDecoder; +import mc.protocol.io.codec.ProtocolEncoder; +import mc.protocol.io.codec.ProtocolSplitter; + +import javax.annotation.Nonnull; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.function.Consumer; @Slf4j @RequiredArgsConstructor -public class NettyServer { +public class NettyServer implements Server { - private final ServerBootstrap serverBootstrap; + private Consumer> consumerNewConnection; + private Consumer> consumerDisconnect; + @Override public void bind(String host, int port) { log.info("Network starting: {}:{}", host, port); try { - serverBootstrap.bind(host, port).sync().channel().closeFuture().sync(); + createServerBootstrap().bind(host, port).sync().channel().closeFuture().sync(); } catch (InterruptedException e) { if (log.isTraceEnabled()) { log.trace("{}: {}", e.getClass().getSimpleName(), e.getMessage(), e); @@ -24,8 +42,45 @@ public class NettyServer { } } - public static NettyServer createServer() { - ProtocolComponent component = DaggerProtocolComponent.create(); - return component.getNettyServer(); + @Override + public void onNewConnect(Consumer> consumer) { + this.consumerNewConnection = consumer; + } + + @Override + public void onDisonnect(Consumer> consumer) { + this.consumerDisconnect = consumer; + } + + private ServerBootstrap createServerBootstrap() { + ServerBootstrap bootstrap = new ServerBootstrap(); + + bootstrap.group(new NioEventLoopGroup(1), new NioEventLoopGroup()) + .channel(NioServerSocketChannel.class) + .childHandler(createChannelChannelInitializer()); + + return bootstrap; + } + + private ChannelInitializer createChannelChannelInitializer() { + return new ChannelInitializer<>() { + @Override + protected void initChannel(@Nonnull SocketChannel socketChannel) { + ChannelPipeline pipeline = socketChannel.pipeline(); + createChannelHandlerMap().forEach(pipeline::addLast); + } + }; + } + + private Map createChannelHandlerMap() { + Map map = new LinkedHashMap<>(); + + map.put("packet_splitter", new ProtocolSplitter()); + map.put("logger", new LoggingHandler(LogLevel.DEBUG)); + map.put("packet_decoder", new ProtocolDecoder(true, consumerNewConnection, consumerDisconnect)); + map.put("packet_encoder", new ProtocolEncoder()); + map.put("packet_handler", new PacketInboundHandler()); + + return map; } } diff --git a/protocol/src/main/java/mc/protocol/PacketInboundHandler.java b/protocol/src/main/java/mc/protocol/PacketInboundHandler.java index a99fb4d..3f170e9 100644 --- a/protocol/src/main/java/mc/protocol/PacketInboundHandler.java +++ b/protocol/src/main/java/mc/protocol/PacketInboundHandler.java @@ -3,6 +3,7 @@ package mc.protocol; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.RequiredArgsConstructor; +import mc.protocol.api.ConnectionContext; import mc.protocol.packets.ClientSidePacket; import reactor.core.publisher.Sinks; @@ -12,11 +13,11 @@ public class PacketInboundHandler extends SimpleChannelInboundHandler packetSinks = ctx.channel().attr(NetworkAttributes.STATE) + Sinks.Many packetSinks = ctx.channel().attr(NetworkAttributes.STATE) .get().getPacketSinks(packet.getClass()); if (packetSinks != null) { - packetSinks.tryEmitNext(new ChannelContext<>(ctx, packet)); + packetSinks.tryEmitNext(new NettyConnectionContext<>(ctx, packet)); } } } diff --git a/protocol/src/main/java/mc/protocol/State.java b/protocol/src/main/java/mc/protocol/State.java index 180f4d7..72e39b4 100644 --- a/protocol/src/main/java/mc/protocol/State.java +++ b/protocol/src/main/java/mc/protocol/State.java @@ -2,6 +2,7 @@ package mc.protocol; import lombok.Getter; import lombok.RequiredArgsConstructor; +import mc.protocol.api.ConnectionContext; import mc.protocol.packets.ClientSidePacket; import mc.protocol.packets.Packet; import mc.protocol.packets.PingPacket; @@ -84,7 +85,7 @@ public enum State { private final Map, Integer> serverSidePackets; @SuppressWarnings("rawtypes") - private final Map, Sinks.Many> observedMap = new HashMap<>(); + private final Map, Sinks.Many> observedMap = new HashMap<>(); State(int id, Map> clientSidePackets) { this.id = id; @@ -104,13 +105,13 @@ public enum State { @SuppressWarnings("rawtypes") - public

Sinks.Many getPacketSinks(Class

packetClass) { + public

Sinks.Many getPacketSinks(Class

packetClass) { return observedMap.get(packetClass); } @SuppressWarnings("unchecked") - public

Flux> packetFlux(Class

packetClass) { + public

Flux> packetFlux(Class

packetClass) { return observedMap.computeIfAbsent(packetClass, aClass -> Sinks.many().multicast().directBestEffort()) - .asFlux().map(ChannelContext.class::cast); + .asFlux().map(ConnectionContext.class::cast); } } diff --git a/protocol/src/main/java/mc/protocol/api/ConnectionContext.java b/protocol/src/main/java/mc/protocol/api/ConnectionContext.java new file mode 100644 index 0000000..b2ed00e --- /dev/null +++ b/protocol/src/main/java/mc/protocol/api/ConnectionContext.java @@ -0,0 +1,19 @@ +package mc.protocol.api; + +import mc.protocol.State; +import mc.protocol.packets.ClientSidePacket; +import mc.protocol.packets.ServerSidePacket; + +public interface ConnectionContext

{ + + State getState(); + void setState(State state); + + P clientPacket(); + + void send(ServerSidePacket packet); + void sendNow(ServerSidePacket packet); + void flushSending(); + + void disconnect(); +} diff --git a/protocol/src/main/java/mc/protocol/api/Server.java b/protocol/src/main/java/mc/protocol/api/Server.java new file mode 100644 index 0000000..e06d137 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/api/Server.java @@ -0,0 +1,11 @@ +package mc.protocol.api; + +import java.util.function.Consumer; + +public interface Server { + + void bind(String host, int port); + + void onNewConnect(Consumer> consumer); + void onDisonnect(Consumer> consumer); +} diff --git a/protocol/src/main/java/mc/protocol/di/ProtocolComponent.java b/protocol/src/main/java/mc/protocol/di/ProtocolComponent.java index a433211..84caa5b 100644 --- a/protocol/src/main/java/mc/protocol/di/ProtocolComponent.java +++ b/protocol/src/main/java/mc/protocol/di/ProtocolComponent.java @@ -1,11 +1,11 @@ package mc.protocol.di; import dagger.Component; -import mc.protocol.NettyServer; +import mc.protocol.api.Server; @Component(modules = ProtocolModule.class) @ServerScope public interface ProtocolComponent { - NettyServer getNettyServer(); + Server getServer(); } diff --git a/protocol/src/main/java/mc/protocol/di/ProtocolModule.java b/protocol/src/main/java/mc/protocol/di/ProtocolModule.java index 3e8a8df..c298873 100644 --- a/protocol/src/main/java/mc/protocol/di/ProtocolModule.java +++ b/protocol/src/main/java/mc/protocol/di/ProtocolModule.java @@ -2,68 +2,16 @@ package mc.protocol.di; import dagger.Module; import dagger.Provides; -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; import mc.protocol.NettyServer; -import mc.protocol.PacketInboundHandler; -import mc.protocol.io.codec.ProtocolDecoder; -import mc.protocol.io.codec.ProtocolEncoder; -import mc.protocol.io.codec.ProtocolSplitter; - -import javax.annotation.Nonnull; -import javax.inject.Provider; -import java.util.LinkedHashMap; -import java.util.Map; +import mc.protocol.api.Server; @Module public class ProtocolModule { @Provides - NettyServer provideServer(ServerBootstrap serverBootstrap) { - return new NettyServer(serverBootstrap); + @ServerScope + Server provideServer() { + return new NettyServer(); } - @Provides - ServerBootstrap provideServerBootstrap(ChannelInitializer channelChannelInitializer) { - ServerBootstrap bootstrap = new ServerBootstrap(); - - bootstrap.group(new NioEventLoopGroup(1), new NioEventLoopGroup()) - .channel(NioServerSocketChannel.class) - .childHandler(channelChannelInitializer); - - return bootstrap; - } - - @Provides - ChannelInitializer provideChannelChannelInitializer( - Provider> channelHandlerMapProvider) { - - return new ChannelInitializer<>() { - @Override - protected void initChannel(@Nonnull SocketChannel socketChannel) { - ChannelPipeline pipeline = socketChannel.pipeline(); - channelHandlerMapProvider.get().forEach(pipeline::addLast); - } - }; - } - - @Provides - Map provideChannelHandlerMap() { - Map map = new LinkedHashMap<>(); - - map.put("packet_splitter", new ProtocolSplitter()); - map.put("logger", new LoggingHandler(LogLevel.DEBUG)); - map.put("packet_decoder", new ProtocolDecoder(true)); - map.put("packet_encoder", new ProtocolEncoder()); - map.put("packet_handler", new PacketInboundHandler()); - - return map; - } } diff --git a/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java b/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java index b7ee9d5..6bc2e65 100644 --- a/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java +++ b/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java @@ -5,30 +5,36 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageDecoder; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import mc.protocol.NettyConnectionContext; import mc.protocol.NetworkAttributes; import mc.protocol.State; +import mc.protocol.api.ConnectionContext; import mc.protocol.io.NetByteBuf; import mc.protocol.packets.ClientSidePacket; import mc.protocol.packets.UnknownPacket; +import javax.annotation.Nonnull; import java.util.List; import java.util.Objects; +import java.util.function.Consumer; @Slf4j @RequiredArgsConstructor public class ProtocolDecoder extends ByteToMessageDecoder { private final boolean readUnknownPackets; + private final Consumer> consumerNewConnection; + private final Consumer> consumerDisconnect; @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - ctx.channel().attr(NetworkAttributes.STATE).set(State.HANDSHAKING); + public void channelActive(@Nonnull ChannelHandlerContext ctx) throws Exception { + consumerNewConnection.accept(new NettyConnectionContext<>(ctx, null)); super.channelActive(ctx); } @Override - public void channelInactive(ChannelHandlerContext ctx) throws Exception { - ctx.channel().attr(NetworkAttributes.STATE).set(null); + public void channelInactive(@Nonnull ChannelHandlerContext ctx) throws Exception { + consumerDisconnect.accept(new NettyConnectionContext<>(ctx, null)); super.channelInactive(ctx); } diff --git a/server/src/main/java/mc/server/Main.java b/server/src/main/java/mc/server/Main.java index fedfe80..553757a 100644 --- a/server/src/main/java/mc/server/Main.java +++ b/server/src/main/java/mc/server/Main.java @@ -7,8 +7,10 @@ import joptsimple.OptionParser; import joptsimple.OptionSet; import joptsimple.util.PathConverter; import lombok.extern.slf4j.Slf4j; -import mc.protocol.NettyServer; import mc.protocol.State; +import mc.protocol.api.Server; +import mc.protocol.di.DaggerProtocolComponent; +import mc.protocol.di.ProtocolComponent; import mc.protocol.packets.PingPacket; import mc.protocol.packets.client.HandshakePacket; import mc.protocol.packets.client.LoginStartPacket; @@ -38,6 +40,8 @@ public class Main { private void run(OptionSet optionSet) { log.info("mc-project launch"); + ProtocolComponent protocolComponent = DaggerProtocolComponent.create(); + ConfigModule configModule = new ConfigModule((Path) optionSet.valueOf(CLI_CONFIG)); ServerComponent serverComponent = DaggerServerComponent.builder() @@ -46,9 +50,12 @@ public class Main { Config config = serverComponent.getConfig(); - NettyServer server = NettyServer.createServer(); + Server server = protocolComponent.getServer(); PacketHandler packetHandler = serverComponent.getPacketHandler(); + server.onNewConnect(connectionContext -> connectionContext.setState(State.HANDSHAKING)); + server.onDisonnect(connectionContext -> connectionContext.setState(null)); + State.HANDSHAKING.packetFlux(HandshakePacket.class).subscribe(packetHandler::onHandshake); State.STATUS.packetFlux(PingPacket.class).subscribe(packetHandler::onKeepAlive); State.STATUS.packetFlux(StatusServerRequestPacket.class).subscribe(packetHandler::onServerStatus); diff --git a/server/src/main/java/mc/server/PacketHandler.java b/server/src/main/java/mc/server/PacketHandler.java index 49ebee7..be7786c 100644 --- a/server/src/main/java/mc/server/PacketHandler.java +++ b/server/src/main/java/mc/server/PacketHandler.java @@ -3,6 +3,7 @@ package mc.server; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import mc.protocol.*; +import mc.protocol.api.ConnectionContext; import mc.protocol.model.Location; import mc.protocol.model.Look; import mc.protocol.model.ServerInfo; @@ -27,22 +28,23 @@ import java.util.UUID; @RequiredArgsConstructor public class PacketHandler { - private final Config config; private final Random random = new Random(System.currentTimeMillis()); + private final Config config; - public void onHandshake(ChannelContext channel) { - channel.setState(channel.getPacket().getNextState()); + public void onHandshake(ConnectionContext context) { + context.setState(context.clientPacket().getNextState()); } - public void onKeepAlive(ChannelContext channel) { - channel.getCtx().writeAndFlush(channel.getPacket()).channel().disconnect(); + public void onKeepAlive(ConnectionContext context) { + context.sendNow(context.clientPacket()); + context.disconnect(); } - public void onKeepAlivePlay(ChannelContext channel) { - channel.getCtx().writeAndFlush(channel.getPacket()); + public void onKeepAlivePlay(ConnectionContext context) { + context.sendNow(context.clientPacket()); } - public void onServerStatus(ChannelContext channel) { + public void onServerStatus(ConnectionContext context) { ServerInfo serverInfo = new ServerInfo(); serverInfo.version().name(ProtocolConstant.PROTOCOL_NAME); serverInfo.version().protocol(ProtocolConstant.PROTOCOL_NUMBER); @@ -58,18 +60,18 @@ public class PacketHandler { StatusServerResponse response = new StatusServerResponse(); response.setInfo(serverInfo); - channel.getCtx().writeAndFlush(response); + context.sendNow(response); } - public void onLoginStart(ChannelContext channel) { - LoginStartPacket loginStartPacket = channel.getPacket(); + public void onLoginStart(ConnectionContext context) { + LoginStartPacket loginStartPacket = context.clientPacket(); var loginSuccessPacket = new LoginSuccessPacket(); loginSuccessPacket.setUuid(UUID.randomUUID()); loginSuccessPacket.setName(loginStartPacket.getName()); - channel.getCtx().writeAndFlush(loginSuccessPacket); - channel.setState(State.PLAY); + context.sendNow(loginSuccessPacket); + context.setState(State.PLAY); var joinGamePacket = new JoinGamePacket(); joinGamePacket.setEntityId(random.nextInt()); @@ -78,14 +80,14 @@ public class PacketHandler { joinGamePacket.setDifficulty(Difficulty.PEACEFUL); joinGamePacket.setLevelType(LevelType.FLAT); - channel.getCtx().write(joinGamePacket); + context.send(joinGamePacket); Location spawnLocation = new Location(0d, 63d, 0d); var spawnPositionPacket = new SpawnPositionPacket(); spawnPositionPacket.setSpawn(spawnLocation); - channel.getCtx().write(spawnPositionPacket); + context.send(spawnPositionPacket); var playerAbilitiesPacket = new PlayerAbilitiesPacket(); playerAbilitiesPacket.setCatFly(true); @@ -95,29 +97,29 @@ public class PacketHandler { playerAbilitiesPacket.setFieldOfView(0.0f); playerAbilitiesPacket.setFlyingSpeed(0.05f); - channel.getCtx().write(playerAbilitiesPacket); + context.send(playerAbilitiesPacket); - channel.getCtx().flush(); + context.flushSending(); var chunkDataPacket = new ChunkDataPacket(); chunkDataPacket.setX(0); chunkDataPacket.setZ(0); - channel.getCtx().writeAndFlush(chunkDataPacket); + context.sendNow(chunkDataPacket); var playerPositionAndLookPacket = new SPlayerPositionAndLookPacket(); playerPositionAndLookPacket.setPosition(spawnLocation); playerPositionAndLookPacket.setLook(new Look(0f, 0f)); playerPositionAndLookPacket.setTeleportId(random.nextInt()); - channel.getCtx().write(playerPositionAndLookPacket); + context.send(playerPositionAndLookPacket); PingPacket pingPacket = new PingPacket(); pingPacket.setPayload(System.currentTimeMillis()); - channel.getCtx().write(pingPacket); + context.send(pingPacket); - channel.getCtx().flush(); + context.flushSending(); } private static String faviconToBase64(Path iconPath) { From de43210747abbc2c9258b285de5a2b9ab008d3cf Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 6 May 2021 13:43:01 +0300 Subject: [PATCH 06/10] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D0=BF=D1=80=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=BA=D0=BE=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/protocol/packets/client/ClientSettingsPacket.java | 4 ++-- .../java/mc/protocol/packets/server/JoinGamePacket.java | 6 +++--- .../src/main/java/mc/protocol/{ => utils}/ChatMode.java | 2 +- .../src/main/java/mc/protocol/{ => utils}/Difficulty.java | 2 +- .../src/main/java/mc/protocol/{ => utils}/GameMode.java | 2 +- .../src/main/java/mc/protocol/{ => utils}/LevelType.java | 2 +- .../src/main/java/mc/protocol/{ => utils}/MainHand.java | 2 +- server/src/main/java/mc/server/PacketHandler.java | 3 +++ 8 files changed, 13 insertions(+), 10 deletions(-) rename protocol/src/main/java/mc/protocol/{ => utils}/ChatMode.java (92%) rename protocol/src/main/java/mc/protocol/{ => utils}/Difficulty.java (87%) rename protocol/src/main/java/mc/protocol/{ => utils}/GameMode.java (88%) rename protocol/src/main/java/mc/protocol/{ => utils}/LevelType.java (91%) rename protocol/src/main/java/mc/protocol/{ => utils}/MainHand.java (91%) diff --git a/protocol/src/main/java/mc/protocol/packets/client/ClientSettingsPacket.java b/protocol/src/main/java/mc/protocol/packets/client/ClientSettingsPacket.java index b78dab3..b22914d 100644 --- a/protocol/src/main/java/mc/protocol/packets/client/ClientSettingsPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/client/ClientSettingsPacket.java @@ -1,8 +1,8 @@ package mc.protocol.packets.client; import lombok.*; -import mc.protocol.ChatMode; -import mc.protocol.MainHand; +import mc.protocol.utils.ChatMode; +import mc.protocol.utils.MainHand; import mc.protocol.io.NetByteBuf; import mc.protocol.packets.ClientSidePacket; diff --git a/protocol/src/main/java/mc/protocol/packets/server/JoinGamePacket.java b/protocol/src/main/java/mc/protocol/packets/server/JoinGamePacket.java index 936bc82..a427359 100644 --- a/protocol/src/main/java/mc/protocol/packets/server/JoinGamePacket.java +++ b/protocol/src/main/java/mc/protocol/packets/server/JoinGamePacket.java @@ -1,9 +1,9 @@ package mc.protocol.packets.server; import lombok.Data; -import mc.protocol.Difficulty; -import mc.protocol.GameMode; -import mc.protocol.LevelType; +import mc.protocol.utils.Difficulty; +import mc.protocol.utils.GameMode; +import mc.protocol.utils.LevelType; import mc.protocol.io.NetByteBuf; import mc.protocol.packets.ServerSidePacket; diff --git a/protocol/src/main/java/mc/protocol/ChatMode.java b/protocol/src/main/java/mc/protocol/utils/ChatMode.java similarity index 92% rename from protocol/src/main/java/mc/protocol/ChatMode.java rename to protocol/src/main/java/mc/protocol/utils/ChatMode.java index 33c7bcc..992862a 100644 --- a/protocol/src/main/java/mc/protocol/ChatMode.java +++ b/protocol/src/main/java/mc/protocol/utils/ChatMode.java @@ -1,4 +1,4 @@ -package mc.protocol; +package mc.protocol.utils; import javax.annotation.Nullable; diff --git a/protocol/src/main/java/mc/protocol/Difficulty.java b/protocol/src/main/java/mc/protocol/utils/Difficulty.java similarity index 87% rename from protocol/src/main/java/mc/protocol/Difficulty.java rename to protocol/src/main/java/mc/protocol/utils/Difficulty.java index def20c1..dcca038 100644 --- a/protocol/src/main/java/mc/protocol/Difficulty.java +++ b/protocol/src/main/java/mc/protocol/utils/Difficulty.java @@ -1,4 +1,4 @@ -package mc.protocol; +package mc.protocol.utils; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/protocol/src/main/java/mc/protocol/GameMode.java b/protocol/src/main/java/mc/protocol/utils/GameMode.java similarity index 88% rename from protocol/src/main/java/mc/protocol/GameMode.java rename to protocol/src/main/java/mc/protocol/utils/GameMode.java index b224ea6..eb8b92d 100644 --- a/protocol/src/main/java/mc/protocol/GameMode.java +++ b/protocol/src/main/java/mc/protocol/utils/GameMode.java @@ -1,4 +1,4 @@ -package mc.protocol; +package mc.protocol.utils; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/protocol/src/main/java/mc/protocol/LevelType.java b/protocol/src/main/java/mc/protocol/utils/LevelType.java similarity index 91% rename from protocol/src/main/java/mc/protocol/LevelType.java rename to protocol/src/main/java/mc/protocol/utils/LevelType.java index 2b99f36..eaa50da 100644 --- a/protocol/src/main/java/mc/protocol/LevelType.java +++ b/protocol/src/main/java/mc/protocol/utils/LevelType.java @@ -1,4 +1,4 @@ -package mc.protocol; +package mc.protocol.utils; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/protocol/src/main/java/mc/protocol/MainHand.java b/protocol/src/main/java/mc/protocol/utils/MainHand.java similarity index 91% rename from protocol/src/main/java/mc/protocol/MainHand.java rename to protocol/src/main/java/mc/protocol/utils/MainHand.java index 15ea441..3dec589 100644 --- a/protocol/src/main/java/mc/protocol/MainHand.java +++ b/protocol/src/main/java/mc/protocol/utils/MainHand.java @@ -1,4 +1,4 @@ -package mc.protocol; +package mc.protocol.utils; import javax.annotation.Nullable; diff --git a/server/src/main/java/mc/server/PacketHandler.java b/server/src/main/java/mc/server/PacketHandler.java index be7786c..f4efb2d 100644 --- a/server/src/main/java/mc/server/PacketHandler.java +++ b/server/src/main/java/mc/server/PacketHandler.java @@ -13,6 +13,9 @@ import mc.protocol.packets.client.LoginStartPacket; import mc.protocol.packets.client.StatusServerRequestPacket; import mc.protocol.packets.server.*; import mc.protocol.serializer.TextSerializer; +import mc.protocol.utils.Difficulty; +import mc.protocol.utils.GameMode; +import mc.protocol.utils.LevelType; import mc.server.config.Config; import org.apache.commons.io.IOUtils; From a3eb0eba862886e3252e8ce0aa72b3f152598be7 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 6 May 2021 13:50:40 +0300 Subject: [PATCH 07/10] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20EventBus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/protocol/NettyConnectionContext.java | 9 +-------- .../main/java/mc/protocol/NettyServer.java | 8 ++++---- .../mc/protocol/PacketInboundHandler.java | 2 +- .../mc/protocol/api/ConnectionContext.java | 5 +---- .../src/main/java/mc/protocol/api/Server.java | 4 ++-- .../mc/protocol/io/codec/ProtocolDecoder.java | 8 ++++---- .../main/java/mc/protocol/utils/EventBus.java | 4 ++-- .../mc/protocol/utils/SimpleEventBus.java | 6 +++--- .../main/java/mc/server/PacketHandler.java | 19 +++++++++---------- 9 files changed, 27 insertions(+), 38 deletions(-) diff --git a/protocol/src/main/java/mc/protocol/NettyConnectionContext.java b/protocol/src/main/java/mc/protocol/NettyConnectionContext.java index a4cdc65..c231dcf 100644 --- a/protocol/src/main/java/mc/protocol/NettyConnectionContext.java +++ b/protocol/src/main/java/mc/protocol/NettyConnectionContext.java @@ -3,14 +3,12 @@ package mc.protocol; import io.netty.channel.ChannelHandlerContext; import lombok.RequiredArgsConstructor; import mc.protocol.api.ConnectionContext; -import mc.protocol.packets.ClientSidePacket; import mc.protocol.packets.ServerSidePacket; @RequiredArgsConstructor -public class NettyConnectionContext

implements ConnectionContext

{ +public class NettyConnectionContext implements ConnectionContext { private final ChannelHandlerContext ctx; - private final P packet; @Override public State getState() { @@ -22,11 +20,6 @@ public class NettyConnectionContext

implements Conne ctx.channel().attr(NetworkAttributes.STATE).set(state); } - @Override - public P clientPacket() { - return packet; - } - @Override public void send(ServerSidePacket packet) { ctx.write(packet); diff --git a/protocol/src/main/java/mc/protocol/NettyServer.java b/protocol/src/main/java/mc/protocol/NettyServer.java index da14177..d94f053 100644 --- a/protocol/src/main/java/mc/protocol/NettyServer.java +++ b/protocol/src/main/java/mc/protocol/NettyServer.java @@ -31,8 +31,8 @@ public class NettyServer implements Server { private final PacketPool packetPool; private final EventBus eventBus; - private Consumer> consumerNewConnection; - private Consumer> consumerDisconnect; + private Consumer consumerNewConnection; + private Consumer consumerDisconnect; @Override public void bind(String host, int port) { @@ -48,12 +48,12 @@ public class NettyServer implements Server { } @Override - public void onNewConnect(Consumer> consumer) { + public void onNewConnect(Consumer consumer) { this.consumerNewConnection = consumer; } @Override - public void onDisonnect(Consumer> consumer) { + public void onDisonnect(Consumer consumer) { this.consumerDisconnect = consumer; } diff --git a/protocol/src/main/java/mc/protocol/PacketInboundHandler.java b/protocol/src/main/java/mc/protocol/PacketInboundHandler.java index fb5afad..20feab1 100644 --- a/protocol/src/main/java/mc/protocol/PacketInboundHandler.java +++ b/protocol/src/main/java/mc/protocol/PacketInboundHandler.java @@ -16,7 +16,7 @@ public class PacketInboundHandler extends SimpleChannelInboundHandler(ctx, packet)); + eventBus.emit(state, new NettyConnectionContext(ctx), packet); poolPackets.returnObject(packet); } diff --git a/protocol/src/main/java/mc/protocol/api/ConnectionContext.java b/protocol/src/main/java/mc/protocol/api/ConnectionContext.java index b2ed00e..5cf5c3d 100644 --- a/protocol/src/main/java/mc/protocol/api/ConnectionContext.java +++ b/protocol/src/main/java/mc/protocol/api/ConnectionContext.java @@ -1,16 +1,13 @@ package mc.protocol.api; import mc.protocol.State; -import mc.protocol.packets.ClientSidePacket; import mc.protocol.packets.ServerSidePacket; -public interface ConnectionContext

{ +public interface ConnectionContext { State getState(); void setState(State state); - P clientPacket(); - void send(ServerSidePacket packet); void sendNow(ServerSidePacket packet); void flushSending(); diff --git a/protocol/src/main/java/mc/protocol/api/Server.java b/protocol/src/main/java/mc/protocol/api/Server.java index 2e4af87..e0b8777 100644 --- a/protocol/src/main/java/mc/protocol/api/Server.java +++ b/protocol/src/main/java/mc/protocol/api/Server.java @@ -10,8 +10,8 @@ public interface Server { void bind(String host, int port); - void onNewConnect(Consumer> consumer); - void onDisonnect(Consumer> consumer); + void onNewConnect(Consumer consumer); + void onDisonnect(Consumer consumer);

void listenPacket(State state, Class

packetClass, EventBus.EventHandler

eventHandler); } diff --git a/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java b/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java index af11952..ec8d9a3 100644 --- a/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java +++ b/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java @@ -25,18 +25,18 @@ public class ProtocolDecoder extends ByteToMessageDecoder { private final boolean readUnknownPackets; private final PacketPool poolPackets; - private final Consumer> consumerNewConnection; - private final Consumer> consumerDisconnect; + private final Consumer consumerNewConnection; + private final Consumer consumerDisconnect; @Override public void channelActive(@Nonnull ChannelHandlerContext ctx) throws Exception { - consumerNewConnection.accept(new NettyConnectionContext<>(ctx, null)); + consumerNewConnection.accept(new NettyConnectionContext(ctx)); super.channelActive(ctx); } @Override public void channelInactive(@Nonnull ChannelHandlerContext ctx) throws Exception { - consumerDisconnect.accept(new NettyConnectionContext<>(ctx, null)); + consumerDisconnect.accept(new NettyConnectionContext(ctx)); super.channelInactive(ctx); } diff --git a/protocol/src/main/java/mc/protocol/utils/EventBus.java b/protocol/src/main/java/mc/protocol/utils/EventBus.java index 0d7ad36..1409e8e 100644 --- a/protocol/src/main/java/mc/protocol/utils/EventBus.java +++ b/protocol/src/main/java/mc/protocol/utils/EventBus.java @@ -8,10 +8,10 @@ public interface EventBus {

void subscribe(State state, Class

packetClass, EventHandler

eventHandler); -

void emit(State state, ConnectionContext

channelContext); +

void emit(State state, ConnectionContext channelContext, P packet); @FunctionalInterface interface EventHandler

{ - void handle(ConnectionContext

channelContext); + void handle(ConnectionContext channelContext, P packet); } } diff --git a/protocol/src/main/java/mc/protocol/utils/SimpleEventBus.java b/protocol/src/main/java/mc/protocol/utils/SimpleEventBus.java index d79649d..4061e58 100644 --- a/protocol/src/main/java/mc/protocol/utils/SimpleEventBus.java +++ b/protocol/src/main/java/mc/protocol/utils/SimpleEventBus.java @@ -15,11 +15,11 @@ public class SimpleEventBus implements EventBus { } @Override - public

void emit(State state, ConnectionContext

channelContext) { - EventHandler eventHandler = table.getColumnAndRow(state, channelContext.clientPacket().getClass()); + public

void emit(State state, ConnectionContext channelContext, P packet) { + EventHandler eventHandler = table.getColumnAndRow(state, packet.getClass()); if (eventHandler != null) { - eventHandler.handle(channelContext); + eventHandler.handle(channelContext, packet); } } } diff --git a/server/src/main/java/mc/server/PacketHandler.java b/server/src/main/java/mc/server/PacketHandler.java index f4efb2d..bf35af9 100644 --- a/server/src/main/java/mc/server/PacketHandler.java +++ b/server/src/main/java/mc/server/PacketHandler.java @@ -34,20 +34,21 @@ public class PacketHandler { private final Random random = new Random(System.currentTimeMillis()); private final Config config; - public void onHandshake(ConnectionContext context) { - context.setState(context.clientPacket().getNextState()); + public void onHandshake(ConnectionContext context, HandshakePacket packet) { + context.setState(packet.getNextState()); } - public void onKeepAlive(ConnectionContext context) { - context.sendNow(context.clientPacket()); + public void onKeepAlive(ConnectionContext context, PingPacket packet) { + context.sendNow(packet); context.disconnect(); } - public void onKeepAlivePlay(ConnectionContext context) { - context.sendNow(context.clientPacket()); + public void onKeepAlivePlay(ConnectionContext context, PingPacket packet) { + context.sendNow(packet); } - public void onServerStatus(ConnectionContext context) { + @SuppressWarnings("unused") + public void onServerStatus(ConnectionContext context, StatusServerRequestPacket packet) { ServerInfo serverInfo = new ServerInfo(); serverInfo.version().name(ProtocolConstant.PROTOCOL_NAME); serverInfo.version().protocol(ProtocolConstant.PROTOCOL_NUMBER); @@ -66,9 +67,7 @@ public class PacketHandler { context.sendNow(response); } - public void onLoginStart(ConnectionContext context) { - LoginStartPacket loginStartPacket = context.clientPacket(); - + public void onLoginStart(ConnectionContext context, LoginStartPacket loginStartPacket) { var loginSuccessPacket = new LoginSuccessPacket(); loginSuccessPacket.setUuid(UUID.randomUUID()); loginSuccessPacket.setName(loginStartPacket.getName()); From d02a80299f9215262ce69930ae43b951d8225d4d Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 6 May 2021 13:58:05 +0300 Subject: [PATCH 08/10] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D0=BF=D1=80=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=BA=D0=BE=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- protocol/src/main/java/mc/protocol/NettyServer.java | 5 +++-- .../src/main/java/mc/protocol/PacketInboundHandler.java | 4 ++-- protocol/src/main/java/mc/protocol/api/Server.java | 3 ++- protocol/src/main/java/mc/protocol/di/ProtocolModule.java | 8 ++++---- .../main/java/mc/protocol/{utils => event}/EventBus.java | 2 +- .../java/mc/protocol/{utils => event}/SimpleEventBus.java | 3 ++- .../main/java/mc/protocol/io/codec/ProtocolDecoder.java | 2 +- .../java/mc/protocol/{utils => pool}/PacketFactory.java | 2 +- .../main/java/mc/protocol/{utils => pool}/PacketPool.java | 2 +- 9 files changed, 17 insertions(+), 14 deletions(-) rename protocol/src/main/java/mc/protocol/{utils => event}/EventBus.java (94%) rename protocol/src/main/java/mc/protocol/{utils => event}/SimpleEventBus.java (92%) rename protocol/src/main/java/mc/protocol/{utils => pool}/PacketFactory.java (96%) rename protocol/src/main/java/mc/protocol/{utils => pool}/PacketPool.java (96%) diff --git a/protocol/src/main/java/mc/protocol/NettyServer.java b/protocol/src/main/java/mc/protocol/NettyServer.java index d94f053..9980d56 100644 --- a/protocol/src/main/java/mc/protocol/NettyServer.java +++ b/protocol/src/main/java/mc/protocol/NettyServer.java @@ -17,8 +17,8 @@ import mc.protocol.io.codec.ProtocolDecoder; import mc.protocol.io.codec.ProtocolEncoder; import mc.protocol.io.codec.ProtocolSplitter; import mc.protocol.packets.ClientSidePacket; -import mc.protocol.utils.EventBus; -import mc.protocol.utils.PacketPool; +import mc.protocol.event.EventBus; +import mc.protocol.pool.PacketPool; import javax.annotation.Nonnull; import java.util.LinkedHashMap; @@ -58,6 +58,7 @@ public class NettyServer implements Server { } @Override + @SuppressWarnings("java:S2326") // Сонар, ты бредишь public

void listenPacket(State state, Class

packetClass, EventBus.EventHandler

eventHandler) { this.eventBus.subscribe(state, packetClass, eventHandler); } diff --git a/protocol/src/main/java/mc/protocol/PacketInboundHandler.java b/protocol/src/main/java/mc/protocol/PacketInboundHandler.java index 20feab1..ad7cd16 100644 --- a/protocol/src/main/java/mc/protocol/PacketInboundHandler.java +++ b/protocol/src/main/java/mc/protocol/PacketInboundHandler.java @@ -4,8 +4,8 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.RequiredArgsConstructor; import mc.protocol.packets.ClientSidePacket; -import mc.protocol.utils.EventBus; -import mc.protocol.utils.PacketPool; +import mc.protocol.event.EventBus; +import mc.protocol.pool.PacketPool; @RequiredArgsConstructor public class PacketInboundHandler extends SimpleChannelInboundHandler { diff --git a/protocol/src/main/java/mc/protocol/api/Server.java b/protocol/src/main/java/mc/protocol/api/Server.java index e0b8777..93b213f 100644 --- a/protocol/src/main/java/mc/protocol/api/Server.java +++ b/protocol/src/main/java/mc/protocol/api/Server.java @@ -2,7 +2,7 @@ package mc.protocol.api; import mc.protocol.State; import mc.protocol.packets.ClientSidePacket; -import mc.protocol.utils.EventBus; +import mc.protocol.event.EventBus; import java.util.function.Consumer; @@ -13,5 +13,6 @@ public interface Server { void onNewConnect(Consumer consumer); void onDisonnect(Consumer consumer); + @SuppressWarnings("java:S2326") // Сонар, ты бредишь

void listenPacket(State state, Class

packetClass, EventBus.EventHandler

eventHandler); } diff --git a/protocol/src/main/java/mc/protocol/di/ProtocolModule.java b/protocol/src/main/java/mc/protocol/di/ProtocolModule.java index b4c1d0d..09e2b61 100644 --- a/protocol/src/main/java/mc/protocol/di/ProtocolModule.java +++ b/protocol/src/main/java/mc/protocol/di/ProtocolModule.java @@ -7,10 +7,10 @@ import mc.protocol.State; import mc.protocol.api.Server; import mc.protocol.packets.ClientSidePacket; import mc.protocol.packets.UnknownPacket; -import mc.protocol.utils.EventBus; -import mc.protocol.utils.PacketFactory; -import mc.protocol.utils.PacketPool; -import mc.protocol.utils.SimpleEventBus; +import mc.protocol.event.EventBus; +import mc.protocol.pool.PacketFactory; +import mc.protocol.pool.PacketPool; +import mc.protocol.event.SimpleEventBus; import org.apache.commons.pool2.ObjectPool; import org.apache.commons.pool2.impl.GenericObjectPool; diff --git a/protocol/src/main/java/mc/protocol/utils/EventBus.java b/protocol/src/main/java/mc/protocol/event/EventBus.java similarity index 94% rename from protocol/src/main/java/mc/protocol/utils/EventBus.java rename to protocol/src/main/java/mc/protocol/event/EventBus.java index 1409e8e..e9d6e66 100644 --- a/protocol/src/main/java/mc/protocol/utils/EventBus.java +++ b/protocol/src/main/java/mc/protocol/event/EventBus.java @@ -1,4 +1,4 @@ -package mc.protocol.utils; +package mc.protocol.event; import mc.protocol.State; import mc.protocol.api.ConnectionContext; diff --git a/protocol/src/main/java/mc/protocol/utils/SimpleEventBus.java b/protocol/src/main/java/mc/protocol/event/SimpleEventBus.java similarity index 92% rename from protocol/src/main/java/mc/protocol/utils/SimpleEventBus.java rename to protocol/src/main/java/mc/protocol/event/SimpleEventBus.java index 4061e58..1c0c576 100644 --- a/protocol/src/main/java/mc/protocol/utils/SimpleEventBus.java +++ b/protocol/src/main/java/mc/protocol/event/SimpleEventBus.java @@ -1,8 +1,9 @@ -package mc.protocol.utils; +package mc.protocol.event; import mc.protocol.State; import mc.protocol.api.ConnectionContext; import mc.protocol.packets.ClientSidePacket; +import mc.protocol.utils.Table; @SuppressWarnings({ "rawtypes", "unchecked" }) public class SimpleEventBus implements EventBus { diff --git a/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java b/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java index ec8d9a3..eb24736 100644 --- a/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java +++ b/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java @@ -12,7 +12,7 @@ import mc.protocol.api.ConnectionContext; import mc.protocol.io.NetByteBuf; import mc.protocol.packets.ClientSidePacket; import mc.protocol.packets.UnknownPacket; -import mc.protocol.utils.PacketPool; +import mc.protocol.pool.PacketPool; import javax.annotation.Nonnull; import java.util.List; diff --git a/protocol/src/main/java/mc/protocol/utils/PacketFactory.java b/protocol/src/main/java/mc/protocol/pool/PacketFactory.java similarity index 96% rename from protocol/src/main/java/mc/protocol/utils/PacketFactory.java rename to protocol/src/main/java/mc/protocol/pool/PacketFactory.java index 8c17dca..f0caf1a 100644 --- a/protocol/src/main/java/mc/protocol/utils/PacketFactory.java +++ b/protocol/src/main/java/mc/protocol/pool/PacketFactory.java @@ -1,4 +1,4 @@ -package mc.protocol.utils; +package mc.protocol.pool; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/protocol/src/main/java/mc/protocol/utils/PacketPool.java b/protocol/src/main/java/mc/protocol/pool/PacketPool.java similarity index 96% rename from protocol/src/main/java/mc/protocol/utils/PacketPool.java rename to protocol/src/main/java/mc/protocol/pool/PacketPool.java index 447d7c2..932fec1 100644 --- a/protocol/src/main/java/mc/protocol/utils/PacketPool.java +++ b/protocol/src/main/java/mc/protocol/pool/PacketPool.java @@ -1,4 +1,4 @@ -package mc.protocol.utils; +package mc.protocol.pool; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; From 0aaf17b17fac1415a195dfb4aeeb6628edfddc2e Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 6 May 2021 14:21:24 +0300 Subject: [PATCH 09/10] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BF=D1=83=D0=BB=20=D0=B4=D0=BB=D1=8F=20NettyC?= =?UTF-8?q?onnectionContext?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/protocol/NettyConnectionContext.java | 18 ++++++++++---- .../main/java/mc/protocol/NettyServer.java | 6 +++-- .../mc/protocol/PacketInboundHandler.java | 7 +++++- .../java/mc/protocol/di/ProtocolModule.java | 12 ++++++++-- .../mc/protocol/io/codec/ProtocolDecoder.java | 12 ++++++++-- .../mc/protocol/packets/ClientSidePacket.java | 5 ++-- .../pool/NettyConnectionContextFactory.java | 24 +++++++++++++++++++ .../java/mc/protocol/pool/Passivable.java | 6 +++++ 8 files changed, 76 insertions(+), 14 deletions(-) create mode 100644 protocol/src/main/java/mc/protocol/pool/NettyConnectionContextFactory.java create mode 100644 protocol/src/main/java/mc/protocol/pool/Passivable.java diff --git a/protocol/src/main/java/mc/protocol/NettyConnectionContext.java b/protocol/src/main/java/mc/protocol/NettyConnectionContext.java index c231dcf..23fe235 100644 --- a/protocol/src/main/java/mc/protocol/NettyConnectionContext.java +++ b/protocol/src/main/java/mc/protocol/NettyConnectionContext.java @@ -1,14 +1,19 @@ package mc.protocol; import io.netty.channel.ChannelHandlerContext; -import lombok.RequiredArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Setter; +import lombok.experimental.Accessors; import mc.protocol.api.ConnectionContext; import mc.protocol.packets.ServerSidePacket; +import mc.protocol.pool.Passivable; -@RequiredArgsConstructor -public class NettyConnectionContext implements ConnectionContext { +@EqualsAndHashCode +public class NettyConnectionContext implements ConnectionContext, Passivable { - private final ChannelHandlerContext ctx; + @Accessors(chain = true) + @Setter + private ChannelHandlerContext ctx; @Override public State getState() { @@ -39,4 +44,9 @@ public class NettyConnectionContext implements ConnectionContext { public void disconnect() { ctx.disconnect(); } + + @Override + public void passivate() { + this.ctx = null; + } } diff --git a/protocol/src/main/java/mc/protocol/NettyServer.java b/protocol/src/main/java/mc/protocol/NettyServer.java index 9980d56..7555e24 100644 --- a/protocol/src/main/java/mc/protocol/NettyServer.java +++ b/protocol/src/main/java/mc/protocol/NettyServer.java @@ -19,6 +19,7 @@ import mc.protocol.io.codec.ProtocolSplitter; import mc.protocol.packets.ClientSidePacket; import mc.protocol.event.EventBus; import mc.protocol.pool.PacketPool; +import org.apache.commons.pool2.ObjectPool; import javax.annotation.Nonnull; import java.util.LinkedHashMap; @@ -29,6 +30,7 @@ import java.util.function.Consumer; @RequiredArgsConstructor public class NettyServer implements Server { + private final ObjectPool poolNettyConnectionContext; private final PacketPool packetPool; private final EventBus eventBus; private Consumer consumerNewConnection; @@ -88,9 +90,9 @@ public class NettyServer implements Server { map.put("packet_splitter", new ProtocolSplitter()); map.put("logger", new LoggingHandler(LogLevel.DEBUG)); - map.put("packet_decoder", new ProtocolDecoder(true, packetPool, consumerNewConnection, consumerDisconnect)); + map.put("packet_decoder", new ProtocolDecoder(true, poolNettyConnectionContext, packetPool, consumerNewConnection, consumerDisconnect)); map.put("packet_encoder", new ProtocolEncoder()); - map.put("packet_handler", new PacketInboundHandler(packetPool, eventBus)); + map.put("packet_handler", new PacketInboundHandler(poolNettyConnectionContext, packetPool, eventBus)); return map; } diff --git a/protocol/src/main/java/mc/protocol/PacketInboundHandler.java b/protocol/src/main/java/mc/protocol/PacketInboundHandler.java index ad7cd16..81a3e0d 100644 --- a/protocol/src/main/java/mc/protocol/PacketInboundHandler.java +++ b/protocol/src/main/java/mc/protocol/PacketInboundHandler.java @@ -6,18 +6,23 @@ import lombok.RequiredArgsConstructor; import mc.protocol.packets.ClientSidePacket; import mc.protocol.event.EventBus; import mc.protocol.pool.PacketPool; +import org.apache.commons.pool2.ObjectPool; @RequiredArgsConstructor public class PacketInboundHandler extends SimpleChannelInboundHandler { + private final ObjectPool poolNettyConnectionContext; private final PacketPool poolPackets; private final EventBus eventBus; @Override protected void channelRead0(ChannelHandlerContext ctx, ClientSidePacket packet) throws Exception { State state = ctx.channel().attr(NetworkAttributes.STATE).get(); - eventBus.emit(state, new NettyConnectionContext(ctx), packet); + NettyConnectionContext context = poolNettyConnectionContext.borrowObject().setCtx(ctx); + eventBus.emit(state, context, packet); + + poolNettyConnectionContext.returnObject(context); poolPackets.returnObject(packet); } } diff --git a/protocol/src/main/java/mc/protocol/di/ProtocolModule.java b/protocol/src/main/java/mc/protocol/di/ProtocolModule.java index 09e2b61..3de0cb2 100644 --- a/protocol/src/main/java/mc/protocol/di/ProtocolModule.java +++ b/protocol/src/main/java/mc/protocol/di/ProtocolModule.java @@ -2,12 +2,14 @@ package mc.protocol.di; import dagger.Module; import dagger.Provides; +import mc.protocol.NettyConnectionContext; import mc.protocol.NettyServer; import mc.protocol.State; import mc.protocol.api.Server; import mc.protocol.packets.ClientSidePacket; import mc.protocol.packets.UnknownPacket; import mc.protocol.event.EventBus; +import mc.protocol.pool.NettyConnectionContextFactory; import mc.protocol.pool.PacketFactory; import mc.protocol.pool.PacketPool; import mc.protocol.event.SimpleEventBus; @@ -23,8 +25,8 @@ public class ProtocolModule { @Provides @ServerScope - Server provideServer(PacketPool packetPool, EventBus eventBus) { - return new NettyServer(packetPool, eventBus); + Server provideServer(ObjectPool poolNettyConnectionContext, PacketPool packetPool, EventBus eventBus) { + return new NettyServer(poolNettyConnectionContext, packetPool, eventBus); } @Provides @@ -47,4 +49,10 @@ public class ProtocolModule { EventBus provideEventBus() { return new SimpleEventBus(); } + + @Provides + @ServerScope + ObjectPool providePoolNettyConnectionContext() { + return new GenericObjectPool<>(new NettyConnectionContextFactory()); + } } diff --git a/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java b/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java index eb24736..89f541f 100644 --- a/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java +++ b/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java @@ -13,6 +13,7 @@ import mc.protocol.io.NetByteBuf; import mc.protocol.packets.ClientSidePacket; import mc.protocol.packets.UnknownPacket; import mc.protocol.pool.PacketPool; +import org.apache.commons.pool2.ObjectPool; import javax.annotation.Nonnull; import java.util.List; @@ -24,19 +25,26 @@ import java.util.function.Consumer; public class ProtocolDecoder extends ByteToMessageDecoder { private final boolean readUnknownPackets; + private final ObjectPool poolNettyConnectionContext; private final PacketPool poolPackets; private final Consumer consumerNewConnection; private final Consumer consumerDisconnect; @Override public void channelActive(@Nonnull ChannelHandlerContext ctx) throws Exception { - consumerNewConnection.accept(new NettyConnectionContext(ctx)); + NettyConnectionContext context = poolNettyConnectionContext.borrowObject().setCtx(ctx); + consumerNewConnection.accept(context); + + poolNettyConnectionContext.returnObject(context); super.channelActive(ctx); } @Override public void channelInactive(@Nonnull ChannelHandlerContext ctx) throws Exception { - consumerDisconnect.accept(new NettyConnectionContext(ctx)); + NettyConnectionContext context = poolNettyConnectionContext.borrowObject().setCtx(ctx); + consumerDisconnect.accept(context); + + poolNettyConnectionContext.returnObject(context); super.channelInactive(ctx); } diff --git a/protocol/src/main/java/mc/protocol/packets/ClientSidePacket.java b/protocol/src/main/java/mc/protocol/packets/ClientSidePacket.java index 735a823..1a10cd9 100644 --- a/protocol/src/main/java/mc/protocol/packets/ClientSidePacket.java +++ b/protocol/src/main/java/mc/protocol/packets/ClientSidePacket.java @@ -1,13 +1,12 @@ package mc.protocol.packets; import mc.protocol.io.NetByteBuf; +import mc.protocol.pool.Passivable; /** * Пакеты отправляемые клиентом. */ -public interface ClientSidePacket extends Packet { +public interface ClientSidePacket extends Packet, Passivable { void readSelf(NetByteBuf netByteBuf); - - void passivate(); } diff --git a/protocol/src/main/java/mc/protocol/pool/NettyConnectionContextFactory.java b/protocol/src/main/java/mc/protocol/pool/NettyConnectionContextFactory.java new file mode 100644 index 0000000..df211e0 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/pool/NettyConnectionContextFactory.java @@ -0,0 +1,24 @@ +package mc.protocol.pool; + +import mc.protocol.NettyConnectionContext; +import org.apache.commons.pool2.BasePooledObjectFactory; +import org.apache.commons.pool2.PooledObject; +import org.apache.commons.pool2.impl.DefaultPooledObject; + +public class NettyConnectionContextFactory extends BasePooledObjectFactory { + + @Override + public NettyConnectionContext create() throws Exception { + return new NettyConnectionContext(); + } + + @Override + public PooledObject wrap(NettyConnectionContext context) { + return new DefaultPooledObject<>(context); + } + + @Override + public void passivateObject(PooledObject pooledObj) { + pooledObj.getObject().passivate(); + } +} diff --git a/protocol/src/main/java/mc/protocol/pool/Passivable.java b/protocol/src/main/java/mc/protocol/pool/Passivable.java new file mode 100644 index 0000000..856f776 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/pool/Passivable.java @@ -0,0 +1,6 @@ +package mc.protocol.pool; + +public interface Passivable { + + void passivate(); +} From 4c20c7fd0212d72b3226a25c36907779487e6197 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 6 May 2021 14:34:47 +0300 Subject: [PATCH 10/10] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20DI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/mc/protocol/NettyServer.java | 18 +++--- .../main/java/mc/protocol/di/PoolModule.java | 42 ++++++++++++++ .../mc/protocol/di/ProtocolComponent.java | 5 +- .../java/mc/protocol/di/ProtocolModule.java | 55 ++++++++++--------- .../mc/protocol/io/codec/ProtocolDecoder.java | 8 ++- server/src/main/java/mc/server/Main.java | 7 ++- 6 files changed, 96 insertions(+), 39 deletions(-) create mode 100644 protocol/src/main/java/mc/protocol/di/PoolModule.java diff --git a/protocol/src/main/java/mc/protocol/NettyServer.java b/protocol/src/main/java/mc/protocol/NettyServer.java index 7555e24..70ff2cb 100644 --- a/protocol/src/main/java/mc/protocol/NettyServer.java +++ b/protocol/src/main/java/mc/protocol/NettyServer.java @@ -13,15 +13,14 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import mc.protocol.api.ConnectionContext; import mc.protocol.api.Server; +import mc.protocol.event.EventBus; import mc.protocol.io.codec.ProtocolDecoder; import mc.protocol.io.codec.ProtocolEncoder; import mc.protocol.io.codec.ProtocolSplitter; import mc.protocol.packets.ClientSidePacket; -import mc.protocol.event.EventBus; -import mc.protocol.pool.PacketPool; -import org.apache.commons.pool2.ObjectPool; import javax.annotation.Nonnull; +import javax.inject.Provider; import java.util.LinkedHashMap; import java.util.Map; import java.util.function.Consumer; @@ -30,8 +29,8 @@ import java.util.function.Consumer; @RequiredArgsConstructor public class NettyServer implements Server { - private final ObjectPool poolNettyConnectionContext; - private final PacketPool packetPool; + private final Provider protocolDecoderProvider; + private final Provider packetInboundHandlerProvider; private final EventBus eventBus; private Consumer consumerNewConnection; private Consumer consumerDisconnect; @@ -90,9 +89,14 @@ public class NettyServer implements Server { map.put("packet_splitter", new ProtocolSplitter()); map.put("logger", new LoggingHandler(LogLevel.DEBUG)); - map.put("packet_decoder", new ProtocolDecoder(true, poolNettyConnectionContext, packetPool, consumerNewConnection, consumerDisconnect)); + + ProtocolDecoder protocolDecoder = protocolDecoderProvider.get(); + protocolDecoder.setConsumerNewConnection(consumerNewConnection); + protocolDecoder.setConsumerDisconnect(consumerDisconnect); + map.put("packet_decoder", protocolDecoder); + map.put("packet_encoder", new ProtocolEncoder()); - map.put("packet_handler", new PacketInboundHandler(poolNettyConnectionContext, packetPool, eventBus)); + map.put("packet_handler", packetInboundHandlerProvider.get()); return map; } diff --git a/protocol/src/main/java/mc/protocol/di/PoolModule.java b/protocol/src/main/java/mc/protocol/di/PoolModule.java new file mode 100644 index 0000000..756c6c2 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/di/PoolModule.java @@ -0,0 +1,42 @@ +package mc.protocol.di; + +import dagger.Module; +import dagger.Provides; +import mc.protocol.NettyConnectionContext; +import mc.protocol.State; +import mc.protocol.packets.ClientSidePacket; +import mc.protocol.packets.UnknownPacket; +import mc.protocol.pool.NettyConnectionContextFactory; +import mc.protocol.pool.PacketFactory; +import mc.protocol.pool.PacketPool; +import org.apache.commons.pool2.ObjectPool; +import org.apache.commons.pool2.impl.GenericObjectPool; + +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Module +public class PoolModule { + + @Provides + @ServerScope + @SuppressWarnings({ "rawtypes", "unchecked" }) + PacketPool providePacketPool() { + Map, ObjectPool> map = Stream.of(State.values()) + .flatMap(state -> state.getClientSidePackets().values().stream()) + .distinct() + .collect(Collectors.toMap( + packetClass -> packetClass, + packetClass -> new GenericObjectPool(new PacketFactory<>(packetClass)))); + map.put(UnknownPacket.class, new GenericObjectPool(new PacketFactory<>(UnknownPacket.class))); + + return new PacketPool(map); + } + + @Provides + @ServerScope + ObjectPool providePoolNettyConnectionContext() { + return new GenericObjectPool<>(new NettyConnectionContextFactory()); + } +} diff --git a/protocol/src/main/java/mc/protocol/di/ProtocolComponent.java b/protocol/src/main/java/mc/protocol/di/ProtocolComponent.java index 84caa5b..da7725e 100644 --- a/protocol/src/main/java/mc/protocol/di/ProtocolComponent.java +++ b/protocol/src/main/java/mc/protocol/di/ProtocolComponent.java @@ -3,7 +3,10 @@ package mc.protocol.di; import dagger.Component; import mc.protocol.api.Server; -@Component(modules = ProtocolModule.class) +@Component(modules = { + ProtocolModule.class, + PoolModule.class +}) @ServerScope public interface ProtocolComponent { diff --git a/protocol/src/main/java/mc/protocol/di/ProtocolModule.java b/protocol/src/main/java/mc/protocol/di/ProtocolModule.java index 3de0cb2..26de985 100644 --- a/protocol/src/main/java/mc/protocol/di/ProtocolModule.java +++ b/protocol/src/main/java/mc/protocol/di/ProtocolModule.java @@ -2,46 +2,52 @@ package mc.protocol.di; import dagger.Module; import dagger.Provides; +import lombok.RequiredArgsConstructor; import mc.protocol.NettyConnectionContext; import mc.protocol.NettyServer; -import mc.protocol.State; +import mc.protocol.PacketInboundHandler; import mc.protocol.api.Server; -import mc.protocol.packets.ClientSidePacket; -import mc.protocol.packets.UnknownPacket; import mc.protocol.event.EventBus; -import mc.protocol.pool.NettyConnectionContextFactory; -import mc.protocol.pool.PacketFactory; -import mc.protocol.pool.PacketPool; import mc.protocol.event.SimpleEventBus; +import mc.protocol.io.codec.ProtocolDecoder; +import mc.protocol.pool.PacketPool; import org.apache.commons.pool2.ObjectPool; -import org.apache.commons.pool2.impl.GenericObjectPool; -import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.Stream; +import javax.inject.Provider; @Module +@RequiredArgsConstructor public class ProtocolModule { + private final boolean readUnknownPackets; + @Provides @ServerScope - Server provideServer(ObjectPool poolNettyConnectionContext, PacketPool packetPool, EventBus eventBus) { - return new NettyServer(poolNettyConnectionContext, packetPool, eventBus); + Server provideServer( + Provider protocolDecoderProvider, + Provider packetInboundHandlerProvider, + EventBus eventBus + ) { + return new NettyServer(protocolDecoderProvider, packetInboundHandlerProvider, eventBus); } @Provides @ServerScope - @SuppressWarnings({ "rawtypes", "unchecked" }) - PacketPool providePacketPool() { - Map, ObjectPool> map = Stream.of(State.values()) - .flatMap(state -> state.getClientSidePackets().values().stream()) - .distinct() - .collect(Collectors.toMap( - packetClass -> packetClass, - packetClass -> new GenericObjectPool(new PacketFactory<>(packetClass)))); - map.put(UnknownPacket.class, new GenericObjectPool(new PacketFactory<>(UnknownPacket.class))); + ProtocolDecoder provideProtocolDecoder( + ObjectPool poolNettyConnectionContext, + PacketPool poolPackets + ) { + return new ProtocolDecoder(readUnknownPackets, poolNettyConnectionContext, poolPackets); + } - return new PacketPool(map); + @Provides + @ServerScope + PacketInboundHandler providePacketInboundHandler( + ObjectPool poolNettyConnectionContext, + PacketPool packetPool, + EventBus eventBus + ) { + return new PacketInboundHandler(poolNettyConnectionContext, packetPool, eventBus); } @Provides @@ -50,9 +56,4 @@ public class ProtocolModule { return new SimpleEventBus(); } - @Provides - @ServerScope - ObjectPool providePoolNettyConnectionContext() { - return new GenericObjectPool<>(new NettyConnectionContextFactory()); - } } diff --git a/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java b/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java index 89f541f..1e2e6ab 100644 --- a/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java +++ b/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java @@ -4,6 +4,7 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageDecoder; import lombok.RequiredArgsConstructor; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import mc.protocol.NettyConnectionContext; import mc.protocol.NetworkAttributes; @@ -27,8 +28,11 @@ public class ProtocolDecoder extends ByteToMessageDecoder { private final boolean readUnknownPackets; private final ObjectPool poolNettyConnectionContext; private final PacketPool poolPackets; - private final Consumer consumerNewConnection; - private final Consumer consumerDisconnect; + + @Setter + private Consumer consumerNewConnection; + @Setter + private Consumer consumerDisconnect; @Override public void channelActive(@Nonnull ChannelHandlerContext ctx) throws Exception { diff --git a/server/src/main/java/mc/server/Main.java b/server/src/main/java/mc/server/Main.java index 3f2b7ff..e330fec 100644 --- a/server/src/main/java/mc/server/Main.java +++ b/server/src/main/java/mc/server/Main.java @@ -11,6 +11,7 @@ import mc.protocol.State; import mc.protocol.api.Server; import mc.protocol.di.DaggerProtocolComponent; import mc.protocol.di.ProtocolComponent; +import mc.protocol.di.ProtocolModule; import mc.protocol.packets.PingPacket; import mc.protocol.packets.client.HandshakePacket; import mc.protocol.packets.client.LoginStartPacket; @@ -40,8 +41,6 @@ public class Main { private void run(OptionSet optionSet) { log.info("mc-project launch"); - ProtocolComponent protocolComponent = DaggerProtocolComponent.create(); - ConfigModule configModule = new ConfigModule((Path) optionSet.valueOf(CLI_CONFIG)); ServerComponent serverComponent = DaggerServerComponent.builder() @@ -50,6 +49,10 @@ public class Main { Config config = serverComponent.getConfig(); + ProtocolComponent protocolComponent = DaggerProtocolComponent.builder() + .protocolModule(new ProtocolModule(true)) + .build(); + Server server = protocolComponent.getServer(); PacketHandler packetHandler = serverComponent.getPacketHandler();