diff --git a/libs.gradle b/libs.gradle
index 365ee1a..d6958eb 100644
--- a/libs.gradle
+++ b/libs.gradle
@@ -13,6 +13,8 @@ ext {
annotations: 'com.google.code.findbugs:jsr305:3.0.2',
guava : 'com.google.guava:guava:30.1-jre',
lang3 : 'org.apache.commons:commons-lang3:3.11',
+ netty : 'io.netty:netty-all:4.1.22.Final',
+ reactor : 'io.projectreactor:reactor-core:3.4.5'
]
libs.logger = [
diff --git a/protocol/build.gradle b/protocol/build.gradle
index 4e4b0da..4677d8a 100644
--- a/protocol/build.gradle
+++ b/protocol/build.gradle
@@ -1,7 +1,8 @@
apply from: rootDir.toPath().resolve('logic.gradle').toFile()
dependencies {
- implementation 'io.netty:netty-all:4.1.22.Final'
+ implementation libs.netty
+ implementation libs.reactor
implementation libs.guava
testImplementation libs.lang3
diff --git a/protocol/src/main/java/mc/protocol/ChannelContext.java b/protocol/src/main/java/mc/protocol/ChannelContext.java
new file mode 100644
index 0000000..ba85b49
--- /dev/null
+++ b/protocol/src/main/java/mc/protocol/ChannelContext.java
@@ -0,0 +1,20 @@
+package mc.protocol;
+
+import io.netty.channel.ChannelHandlerContext;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import mc.protocol.packets.Packet;
+
+@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/NettyServer.java b/protocol/src/main/java/mc/protocol/NettyServer.java
new file mode 100644
index 0000000..b2f20fc
--- /dev/null
+++ b/protocol/src/main/java/mc/protocol/NettyServer.java
@@ -0,0 +1,43 @@
+package mc.protocol;
+
+import io.netty.bootstrap.ServerBootstrap;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import mc.protocol.di.DaggerProtocolComponent;
+import mc.protocol.di.ProtocolComponent;
+import mc.protocol.packets.Packet;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Sinks;
+
+import java.util.Map;
+
+@SuppressWarnings("rawtypes")
+@Slf4j
+@RequiredArgsConstructor
+public class NettyServer {
+
+ private final ServerBootstrap serverBootstrap;
+ private final Map, Sinks.Many> observedMap;
+
+ public void bind(String host, int port) {
+ log.info("Network starting: {}:{}", host, port);
+
+ try {
+ serverBootstrap.bind(host, port).sync().channel().closeFuture().sync();
+ } catch (InterruptedException e) {
+ if (log.isTraceEnabled()) {
+ log.trace("{}: {}", e.getClass().getSimpleName(), e.getMessage(), e);
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public Flux> packetFlux(Class packetClass) {
+ return observedMap.get(packetClass).asFlux().map(ChannelContext.class::cast);
+ }
+
+ 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
new file mode 100644
index 0000000..451f3b7
--- /dev/null
+++ b/protocol/src/main/java/mc/protocol/PacketInboundHandler.java
@@ -0,0 +1,21 @@
+package mc.protocol;
+
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.SimpleChannelInboundHandler;
+import lombok.RequiredArgsConstructor;
+import mc.protocol.packets.Packet;
+import reactor.core.publisher.Sinks;
+
+import java.util.Map;
+
+@SuppressWarnings("rawtypes")
+@RequiredArgsConstructor
+public class PacketInboundHandler extends SimpleChannelInboundHandler {
+
+ private final Map, Sinks.Many> observedMap;
+
+ @Override
+ protected void channelRead0(ChannelHandlerContext ctx, Packet packet) {
+ observedMap.get(packet.getClass()).tryEmitNext(new ChannelContext<>(ctx, packet));
+ }
+}
diff --git a/protocol/src/main/java/mc/protocol/State.java b/protocol/src/main/java/mc/protocol/State.java
index b9b9d53..01c2971 100644
--- a/protocol/src/main/java/mc/protocol/State.java
+++ b/protocol/src/main/java/mc/protocol/State.java
@@ -55,6 +55,7 @@ public enum State {
@Getter
private final int id;
+ @Getter
private final BiMap> serverBoundPackets;
private final BiMap> clientBoundPackets;
diff --git a/protocol/src/main/java/mc/protocol/di/ProtocolComponent.java b/protocol/src/main/java/mc/protocol/di/ProtocolComponent.java
new file mode 100644
index 0000000..a433211
--- /dev/null
+++ b/protocol/src/main/java/mc/protocol/di/ProtocolComponent.java
@@ -0,0 +1,11 @@
+package mc.protocol.di;
+
+import dagger.Component;
+import mc.protocol.NettyServer;
+
+@Component(modules = ProtocolModule.class)
+@ServerScope
+public interface ProtocolComponent {
+
+ NettyServer getNettyServer();
+}
diff --git a/server/src/main/java/mc/server/di/NetworkModule.java b/protocol/src/main/java/mc/protocol/di/ProtocolModule.java
similarity index 52%
rename from server/src/main/java/mc/server/di/NetworkModule.java
rename to protocol/src/main/java/mc/protocol/di/ProtocolModule.java
index 851566e..3ee3ba3 100644
--- a/server/src/main/java/mc/server/di/NetworkModule.java
+++ b/protocol/src/main/java/mc/protocol/di/ProtocolModule.java
@@ -1,5 +1,6 @@
-package mc.server.di;
+package mc.protocol.di;
+import com.google.common.collect.ImmutableMap;
import dagger.Module;
import dagger.Provides;
import io.netty.bootstrap.ServerBootstrap;
@@ -11,28 +12,29 @@ 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.extern.slf4j.Slf4j;
+import mc.protocol.ChannelContext;
+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.server.network.Server;
-import mc.server.network.netty.handler.HandshakeHandler;
-import mc.server.network.netty.NettyServer;
-import mc.server.network.netty.handler.KeepAliveHandler;
-import mc.server.network.netty.handler.LoginHandler;
-import mc.server.network.netty.handler.StatusHandler;
+import mc.protocol.packets.Packet;
+import reactor.core.publisher.Sinks;
import javax.inject.Provider;
import java.util.LinkedHashMap;
import java.util.Map;
+import java.util.stream.Stream;
@Module
-@Slf4j
-public class NetworkModule {
+public class ProtocolModule {
+ @SuppressWarnings("rawtypes")
@Provides
- Server provideServer(ServerBootstrap serverBootstrap) {
- return new NettyServer(serverBootstrap);
+ NettyServer provideServer(ServerBootstrap serverBootstrap,
+ Map, Sinks.Many> observedMap) {
+ return new NettyServer(serverBootstrap, observedMap);
}
@Provides
@@ -47,7 +49,9 @@ public class NetworkModule {
}
@Provides
- ChannelInitializer provideChannelChannelInitializer(Provider