diff --git a/src/main/java/mc/protocol/State.java b/src/main/java/mc/protocol/State.java index da448e6..3d38333 100644 --- a/src/main/java/mc/protocol/State.java +++ b/src/main/java/mc/protocol/State.java @@ -7,7 +7,9 @@ import lombok.RequiredArgsConstructor; import mc.protocol.packets.Packet; import mc.protocol.packets.PacketDirection; import mc.protocol.packets.client.HandshakePacket; +import mc.protocol.packets.client.LoginStartPacket; import mc.protocol.packets.client.StatusServerRequest; +import mc.protocol.packets.server.DisconnectPacket; import mc.protocol.packets.server.StatusServerResponse; import javax.annotation.Nullable; @@ -24,6 +26,12 @@ public enum State { ImmutableBiMap.of(0x00, StatusServerRequest.class), // client bound ImmutableBiMap.of(0x00, StatusServerResponse.class) + ), + LOGIN(2, + // server bound + ImmutableBiMap.of(0x00, LoginStartPacket.class), + // client bound + ImmutableBiMap.of(0x00, DisconnectPacket.class) ); @Nullable diff --git a/src/main/java/mc/protocol/packets/client/LoginStartPacket.java b/src/main/java/mc/protocol/packets/client/LoginStartPacket.java new file mode 100644 index 0000000..6fa953e --- /dev/null +++ b/src/main/java/mc/protocol/packets/client/LoginStartPacket.java @@ -0,0 +1,43 @@ +package mc.protocol.packets.client; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; +import mc.protocol.State; +import mc.protocol.io.NetByteBuf; +import mc.protocol.packets.Packet; + +/** + * Login start packet. + * + *

Начало авторизации.

+ * + *

Структура пакета

+ *
+ * | FIELD | TYPE   | NOTES            |
+ * |-------|--------|------------------|
+ * | Name  | String | Имя/Логин игрока |
+ * 
+ * + * @see Login start + * @see State + */ +@NoArgsConstructor +@Getter +@EqualsAndHashCode +@ToString +public class LoginStartPacket implements Packet { + + private String name; + + @Override + public void readSelf(NetByteBuf netByteBuf) { + this.name = netByteBuf.readString(); + } + + @Override + public void writeSelf(NetByteBuf netByteBuf) { + netByteBuf.writeString(name); + } +} diff --git a/src/main/java/mc/protocol/packets/server/DisconnectPacket.java b/src/main/java/mc/protocol/packets/server/DisconnectPacket.java new file mode 100644 index 0000000..2cfb3e2 --- /dev/null +++ b/src/main/java/mc/protocol/packets/server/DisconnectPacket.java @@ -0,0 +1,47 @@ +package mc.protocol.packets.server; + +import lombok.Data; +import mc.protocol.State; +import mc.protocol.io.NetByteBuf; +import mc.protocol.packets.Packet; + +/** + * Diconnect packet. + * + *

Отключение клиента сервером с указанием причины.

+ * + *

Структура пакета

+ *
+ * | FIELD  | TYPE | NOTES                            |
+ * |--------|------|----------------------------------|
+ * | Reason | Text | Причина отключения. Опционально. |
+ * 
+ * + * @see Disconnect + * @see State + */ +@Data +public class DisconnectPacket implements Packet { + + /** + * Причина отключения. + * + *

Пример:

+ *
+	 * {
+	 *     "text": "foo"
+	 * }
+	 * 
+ */ + private String reason; + + @Override + public void readSelf(NetByteBuf netByteBuf) { + this.reason = netByteBuf.readString(); + } + + @Override + public void writeSelf(NetByteBuf netByteBuf) { + netByteBuf.writeString(reason); + } +} diff --git a/src/main/java/mc/server/di/NetworkModule.java b/src/main/java/mc/server/di/NetworkModule.java index c06bb2c..c5ca566 100644 --- a/src/main/java/mc/server/di/NetworkModule.java +++ b/src/main/java/mc/server/di/NetworkModule.java @@ -16,9 +16,10 @@ 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.HandshakeHandler; +import mc.server.network.netty.handler.HandshakeHandler; import mc.server.network.netty.NettyServer; -import mc.server.network.netty.StatusHandler; +import mc.server.network.netty.handler.LoginHandler; +import mc.server.network.netty.handler.StatusHandler; import javax.inject.Provider; import java.util.LinkedHashMap; @@ -56,14 +57,17 @@ public class NetworkModule { } @Provides - Map provideChannelHandlerMap(Provider statusHandlerProvider) { + Map provideChannelHandlerMap( + Provider statusHandlerProvider, + Provider loginHandlerProvider + ) { Map map = new LinkedHashMap<>(); map.put("logger", new LoggingHandler(LogLevel.DEBUG)); map.put("protocol_splitter", new ProtocolSplitter()); map.put("protocol_decoder", new ProtocolDecoder(true)); map.put("protocol_encoder", new ProtocolEncoder()); - map.put("handshake_handler", new HandshakeHandler(statusHandlerProvider)); + map.put("handshake_handler", new HandshakeHandler(statusHandlerProvider, loginHandlerProvider)); return map; } @@ -72,4 +76,9 @@ public class NetworkModule { StatusHandler provideStatusHandler() { return new StatusHandler(); } + + @Provides + LoginHandler provideLoginHandler() { + return new LoginHandler(); + } } diff --git a/src/main/java/mc/server/network/netty/AbstractPacketHandler.java b/src/main/java/mc/server/network/netty/handler/AbstractPacketHandler.java similarity index 92% rename from src/main/java/mc/server/network/netty/AbstractPacketHandler.java rename to src/main/java/mc/server/network/netty/handler/AbstractPacketHandler.java index 733e255..3d2d900 100644 --- a/src/main/java/mc/server/network/netty/AbstractPacketHandler.java +++ b/src/main/java/mc/server/network/netty/handler/AbstractPacketHandler.java @@ -1,4 +1,4 @@ -package mc.server.network.netty; +package mc.server.network.netty.handler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; diff --git a/src/main/java/mc/server/network/netty/HandshakeHandler.java b/src/main/java/mc/server/network/netty/handler/HandshakeHandler.java similarity index 58% rename from src/main/java/mc/server/network/netty/HandshakeHandler.java rename to src/main/java/mc/server/network/netty/handler/HandshakeHandler.java index 8ceb9a1..5f31d3e 100644 --- a/src/main/java/mc/server/network/netty/HandshakeHandler.java +++ b/src/main/java/mc/server/network/netty/handler/HandshakeHandler.java @@ -1,9 +1,10 @@ -package mc.server.network.netty; +package mc.server.network.netty.handler; import io.netty.channel.ChannelHandlerContext; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import mc.protocol.NetworkAttributes; +import mc.protocol.State; import mc.protocol.packets.client.HandshakePacket; import javax.inject.Provider; @@ -13,12 +14,18 @@ import javax.inject.Provider; public class HandshakeHandler extends AbstractPacketHandler { private final Provider statusHandlerProvider; + private final Provider loginHandlerProvider; @Override protected void channelRead1(ChannelHandlerContext ctx, HandshakePacket packet) { log.info("{}", packet); ctx.channel().attr(NetworkAttributes.STATE).set(packet.getNextState()); - ctx.pipeline().replace("handshake_handler", "status_handler", statusHandlerProvider.get()); + + if (State.STATUS == packet.getNextState()) { + ctx.pipeline().replace("handshake_handler", "status_handler", statusHandlerProvider.get()); + } else if (State.LOGIN == packet.getNextState()) { + ctx.channel().pipeline().replace("handshake_handler", "login_handler", loginHandlerProvider.get()); + } } } diff --git a/src/main/java/mc/server/network/netty/handler/LoginHandler.java b/src/main/java/mc/server/network/netty/handler/LoginHandler.java new file mode 100644 index 0000000..8a0d92c --- /dev/null +++ b/src/main/java/mc/server/network/netty/handler/LoginHandler.java @@ -0,0 +1,18 @@ +package mc.server.network.netty.handler; + +import io.netty.channel.ChannelHandlerContext; +import mc.protocol.packets.client.LoginStartPacket; +import mc.protocol.packets.server.DisconnectPacket; + +public class LoginHandler extends AbstractPacketHandler { + + @Override + protected void channelRead1(ChannelHandlerContext ctx, LoginStartPacket packet) { + DisconnectPacket disconnectPacket = new DisconnectPacket(); + disconnectPacket.setReason("{\n" + + " \"text\": \"Server is not available.\"\n" + + "}"); + + ctx.channel().writeAndFlush(disconnectPacket).channel().disconnect(); + } +} diff --git a/src/main/java/mc/server/network/netty/StatusHandler.java b/src/main/java/mc/server/network/netty/handler/StatusHandler.java similarity index 95% rename from src/main/java/mc/server/network/netty/StatusHandler.java rename to src/main/java/mc/server/network/netty/handler/StatusHandler.java index 2d898ff..0628875 100644 --- a/src/main/java/mc/server/network/netty/StatusHandler.java +++ b/src/main/java/mc/server/network/netty/handler/StatusHandler.java @@ -1,4 +1,4 @@ -package mc.server.network.netty; +package mc.server.network.netty.handler; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j;