diff --git a/src/main/java/mc/core/ByteArrayOutputNetStream.java b/src/main/java/mc/core/ByteArrayOutputNetStream.java deleted file mode 100644 index 8907ad7..0000000 --- a/src/main/java/mc/core/ByteArrayOutputNetStream.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * DmitriyMX - * 2018-04-08 - */ -package mc.core; - -import java.io.ByteArrayOutputStream; - -public class ByteArrayOutputNetStream extends NetStream { - private ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - @Override - public byte readByte() { - throw new UnsupportedOperationException(); - } - - @Override - public void readBytes(byte[] buffer) { - throw new UnsupportedOperationException(); - } - - @Override - public int readUnsignedShort() { - throw new UnsupportedOperationException(); - } - - @Override - public int readInt() { - throw new UnsupportedOperationException(); - } - - @Override - public void writeByte(int value) { - baos.write(value); - } - - @Override - public void writeBytes(byte[] buffer) { - baos.write(buffer, 0, buffer.length); - } - - @Override - public void writeInt(final int value) { - baos.write((byte) value >>> 24); - baos.write((byte) value >>> 16); - baos.write((byte) value >>> 8); - baos.write((byte) value); - } - - @Override - public void skipBytes(int count) { - throw new UnsupportedOperationException(); - } - - public byte[] toByteArray() { - return baos.toByteArray(); - } -} diff --git a/src/main/java/mc/core/netty/proto_1122/NettyServer.java b/src/main/java/mc/core/netty/proto_1122/NettyServer.java deleted file mode 100644 index c8d50e9..0000000 --- a/src/main/java/mc/core/netty/proto_1122/NettyServer.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * DmitriyMX - * 2018-03-25 - */ -package mc.core.netty.proto_1122; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.logging.LoggingHandler; -import mc.core.Server; -import mc.core.StartServerException; - -public class NettyServer implements Server { - private EventLoopGroup bossGroup, workerGroup; - - private ChannelInitializer buildChannelInitializer() { - return new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { - socketChannel.pipeline().addLast( - new LoggingHandler(), - new PacketEncoder(), - new PacketDecoder(), - new PacketHandler() - ); - } - }; - } - - private ServerBootstrap buildServerBootstrap() { - ServerBootstrap bootstrap = new ServerBootstrap(); - - bootstrap.group(bossGroup, workerGroup) - .channel(NioServerSocketChannel.class) - .childHandler(buildChannelInitializer()); - - return bootstrap; - } - - @Override - public void start(String host, int port) throws StartServerException { - bossGroup = new NioEventLoopGroup(1); - workerGroup = new NioEventLoopGroup(); - - ServerBootstrap serverBootstrap = buildServerBootstrap(); - - try { - serverBootstrap.bind(host, port).sync().channel().closeFuture().sync(); - } catch (InterruptedException e) { - throw new StartServerException(e); - } - } -} diff --git a/src/main/java/mc/core/netty/proto_1122/PacketDecoder.java b/src/main/java/mc/core/netty/proto_1122/PacketDecoder.java deleted file mode 100644 index c7ca076..0000000 --- a/src/main/java/mc/core/netty/proto_1122/PacketDecoder.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * DmitriyMX - * 2018-03-25 - */ -package mc.core.netty.proto_1122; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import lombok.extern.slf4j.Slf4j; -import mc.core.CSPacket; -import mc.core.NetStream; -import mc.core.netty.proto_1122.packets.RawPacket; - -import java.util.List; - -@Slf4j -public class PacketDecoder extends ByteToMessageDecoder { - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - ctx.channel().attr(State.ATTR_STATE).set(State.STATUS); - ctx.fireChannelActive(); - } - - @Override - public void channelInactive(ChannelHandlerContext ctx) throws Exception { - ctx.channel().attr(State.ATTR_STATE).set(null); - ctx.fireChannelInactive(); - } - - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { - State state = ctx.channel().attr(State.ATTR_STATE).get(); - NetStream netStream = new WrapperNetStream(in); - - log.debug("ByteBuf readableBytes: {}", in.readableBytes()); - - int size = netStream.readVarInt(); - log.debug("Pkt-Size: {}", size); - int id = netStream.readVarInt(); - log.debug("Pkt-Id: {}", id); - - Class clientSidePacketClass = state.getClientSidePacket(id); - if (clientSidePacketClass == null) { - log.warn("Unknown packet: {}:{}", state.name(), id); - - if (log.isDebugEnabled()) { - byte[] rawData; - if (size > in.readableBytes()) { - rawData = new byte[in.readableBytes()]; - } else { - rawData = new byte[size - NetStream.sizeVarInt(id)]; - } - in.readBytes(rawData); - - RawPacket packet = new RawPacket(); - packet.setRawData(rawData); - out.add(packet); - } - } else { - CSPacket packet = clientSidePacketClass.newInstance(); - netStream.setExpectedSize(size - NetStream.sizeVarInt(id)); - packet.readSelf(netStream); - out.add(packet); - } - - log.debug("ByteBuf readableBytes: {}", in.readableBytes()); - in.skipBytes(in.readableBytes()); - } -} diff --git a/src/main/java/mc/core/netty/proto_1122/PacketEncoder.java b/src/main/java/mc/core/netty/proto_1122/PacketEncoder.java deleted file mode 100644 index e080df0..0000000 --- a/src/main/java/mc/core/netty/proto_1122/PacketEncoder.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * DmitriyMX - * 2018-03-25 - */ -package mc.core.netty.proto_1122; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToByteEncoder; -import lombok.extern.slf4j.Slf4j; -import mc.core.NetStream; -import mc.core.SCPacket; - -@Slf4j -public class PacketEncoder extends MessageToByteEncoder { - @Override - protected void encode(ChannelHandlerContext ctx, SCPacket pkt, ByteBuf out) throws Exception { - State state = ctx.channel().attr(State.ATTR_STATE).get(); - Integer id = state.getServerSidePaclet(pkt.getClass()); - if (id == null) { - log.error("Packet not found: {}:{}", state.name(), pkt.getClass().getSimpleName()); - return; - } - - byte[] bytes = pkt.toByteArray(); - NetStream netStream = new WrapperNetStream(out); - - netStream.writeVarInt(bytes.length + NetStream.sizeVarInt(id)); - netStream.writeVarInt(id); - netStream.writeBytes(bytes); - } -} diff --git a/src/main/java/mc/core/netty/proto_1122/PacketHandler.java b/src/main/java/mc/core/netty/proto_1122/PacketHandler.java deleted file mode 100644 index 8dfd1e1..0000000 --- a/src/main/java/mc/core/netty/proto_1122/PacketHandler.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * DmitriyMX - * 2018-03-25 - */ -package mc.core.netty.proto_1122; - -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import lombok.extern.slf4j.Slf4j; -import mc.core.CSPacket; -import mc.core.Config; -import mc.core.Main; -import mc.core.netty.proto_1122.packets.PingPacket; -import mc.core.netty.proto_1122.packets.StatusRequest; -import mc.core.netty.proto_1122.packets.StatusResponse; - -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.Optional; - -@Slf4j -public class PacketHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, CSPacket packet) throws Exception { - log.debug("{}: {}", packet.getClass().getSimpleName(), packet.toString()); - - Optional optionalMethod = Arrays.stream(this.getClass().getDeclaredMethods()) - .filter(method -> method.getName().equals("on" + packet.getClass().getSimpleName()) - && method.getParameterCount() == 2 - && method.getParameterTypes()[0].isAssignableFrom(Channel.class) - && method.getParameterTypes()[1].isAssignableFrom(packet.getClass())) - .findFirst(); - - if (optionalMethod.isPresent()) { - Method method = optionalMethod.get(); - method.invoke(this, ctx.channel(), packet); - } - } - - public void onStatusRequest(Channel channel, StatusRequest packet) { - if (!packet.getNextState().equals(State.UNKNOWN)) { - channel.attr(State.ATTR_STATE).set(packet.getNextState()); - } - - if (packet.getNextState().equals(State.STATUS)) { - Config config = Main.appContext.getBean("config", Config.class); //FIXME - StatusResponse pkt = new StatusResponse(); - pkt.setDescription(config.getDescriptionServer()); - pkt.setMaxOnline(config.getMaxPlayers()); - pkt.setFaviconBase64(config.getFaviconBase64()); - - channel.writeAndFlush(pkt); - } - } - - public void onPingPacket(Channel channel, PingPacket packet) { - channel.writeAndFlush(packet); - } -} diff --git a/src/main/java/mc/core/netty/proto_1122/State.java b/src/main/java/mc/core/netty/proto_1122/State.java deleted file mode 100644 index f4e07ce..0000000 --- a/src/main/java/mc/core/netty/proto_1122/State.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * DmitriyMX - * 2018-03-25 - */ -package mc.core.netty.proto_1122; - -import com.google.common.collect.ImmutableMap; -import io.netty.util.AttributeKey; -import lombok.RequiredArgsConstructor; -import mc.core.CSPacket; -import mc.core.SCPacket; -import mc.core.netty.proto_1122.packets.PingPacket; -import mc.core.netty.proto_1122.packets.StatusRequest; -import mc.core.netty.proto_1122.packets.StatusResponse; - -import java.util.Arrays; -import java.util.Map; -import java.util.Optional; - -@RequiredArgsConstructor -public enum State { - UNKNOWN(0, ImmutableMap.of(), ImmutableMap.of()), - STATUS(1, - ImmutableMap.of( - 0, StatusRequest.class, - 1, PingPacket.class - ), - ImmutableMap.of( - StatusResponse.class, 0, - PingPacket.class, 1 - ) - ); - - public static final AttributeKey ATTR_STATE = AttributeKey.newInstance("ATTR_STATE"); - - public static State getStateById(final int id) { - Optional optionalState = Arrays.stream(State.values()) - .filter(state -> state.id == id) - .findFirst(); - - return optionalState.orElse(UNKNOWN); - } - - private final int id; - private final Map> clientSidePackets; - private final Map, Integer> serverSidePackets; - - public Class getClientSidePacket(final int packetId) { - return clientSidePackets.get(packetId); - } - - public Integer getServerSidePaclet(final Class clazz) { - return serverSidePackets.get(clazz); - } -} diff --git a/src/main/java/mc/core/netty/proto_1122/WrapperNetStream.java b/src/main/java/mc/core/netty/proto_1122/WrapperNetStream.java deleted file mode 100644 index e840a15..0000000 --- a/src/main/java/mc/core/netty/proto_1122/WrapperNetStream.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * DmitriyMX - * 2018-04-08 - */ -package mc.core.netty.proto_1122; - -import io.netty.buffer.ByteBuf; -import lombok.RequiredArgsConstructor; -import mc.core.NetStream; - -@RequiredArgsConstructor -public class WrapperNetStream extends NetStream { - private final ByteBuf byteBuf; - - @Override - public byte readByte() { - return byteBuf.readByte(); - } - - @Override - public void readBytes(byte[] buffer) { - byteBuf.readBytes(buffer); - } - - @Override - public int readUnsignedShort() { - return byteBuf.readUnsignedShort(); - } - - @Override - public void writeByte(int value) { - byteBuf.writeByte(value); - } - - @Override - public void writeBytes(byte[] buffer) { - byteBuf.writeBytes(buffer); - } -} diff --git a/src/main/java/mc/core/netty/proto_1122/packets/PingPacket.java b/src/main/java/mc/core/netty/proto_1122/packets/PingPacket.java deleted file mode 100644 index 6607b77..0000000 --- a/src/main/java/mc/core/netty/proto_1122/packets/PingPacket.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * DmitriyMX - * 2018-03-26 - */ -package mc.core.netty.proto_1122.packets; - -import mc.core.CSPacket; -import mc.core.NetStream; -import mc.core.SCPacket; - -public class PingPacket implements CSPacket, SCPacket { - private byte[] rawData; - - @Override - public void readSelf(NetStream netStream) { - rawData = new byte[netStream.getExpectedSize()]; - netStream.readBytes(rawData); - } - - @Override - public byte[] toByteArray() { - return rawData; - } -} diff --git a/src/main/java/mc/core/netty/proto_1122/packets/RawPacket.java b/src/main/java/mc/core/netty/proto_1122/packets/RawPacket.java deleted file mode 100644 index d573e0e..0000000 --- a/src/main/java/mc/core/netty/proto_1122/packets/RawPacket.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * DmitriyMX - * 2018-04-08 - */ -package mc.core.netty.proto_1122.packets; - -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; -import mc.core.CSPacket; - -@ToString -public class RawPacket implements CSPacket { - @Getter - @Setter - private byte[] rawData; -} diff --git a/src/main/java/mc/core/netty/proto_1122/packets/StatusRequest.java b/src/main/java/mc/core/netty/proto_1122/packets/StatusRequest.java deleted file mode 100644 index f7494ef..0000000 --- a/src/main/java/mc/core/netty/proto_1122/packets/StatusRequest.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * DmitriyMX - * 2018-04-08 - */ -package mc.core.netty.proto_1122.packets; - -import lombok.Getter; -import lombok.ToString; -import lombok.extern.slf4j.Slf4j; -import mc.core.CSPacket; -import mc.core.NetStream; -import mc.core.netty.proto_1122.State; - -@Slf4j -@Getter -@ToString -public class StatusRequest implements CSPacket { - private int protocolVersion; - private String serverAddress; - private int serverPort; - private State nextState; - - @Override - public void readSelf(NetStream netStream) { - protocolVersion = netStream.readVarInt(); - serverAddress = netStream.readString(); - serverPort = netStream.readUnsignedShort(); - - int nextStateId = netStream.readVarInt(); - nextState = State.getStateById(nextStateId); - if (nextState.equals(State.UNKNOWN)){ - log.warn("Unknown state ({})!", nextStateId); - } - } -} diff --git a/src/main/java/mc/core/netty/proto_1122/packets/StatusResponse.java b/src/main/java/mc/core/netty/proto_1122/packets/StatusResponse.java deleted file mode 100644 index ec722e9..0000000 --- a/src/main/java/mc/core/netty/proto_1122/packets/StatusResponse.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * DmitriyMX - * 2018-04-08 - */ -package mc.core.netty.proto_1122.packets; - -import com.google.gson.JsonObject; -import lombok.Setter; -import lombok.ToString; -import mc.core.ByteArrayOutputNetStream; -import mc.core.SCPacket; - -@ToString -public class StatusResponse implements SCPacket { - private static final String name = "1.12.2"; - private static final int protocol = 340; - - @Setter - private int maxOnline; - @Setter - private int online; - @Setter - private String description; - @Setter - private byte[] faviconBase64; - - @Override - public byte[] toByteArray() { - ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); - - JsonObject versionObj = new JsonObject(); - versionObj.addProperty("name", name); - versionObj.addProperty("protocol", protocol); - - JsonObject playersObj = new JsonObject(); - playersObj.addProperty("max", maxOnline); - playersObj.addProperty("online", online); - - JsonObject descriptionObj = new JsonObject(); - descriptionObj.addProperty("text", description); - - JsonObject rootObj = new JsonObject(); - rootObj.add("version", versionObj); - rootObj.add("players", playersObj); - rootObj.add("description", descriptionObj); - - if (faviconBase64 != null && faviconBase64.length > 0) { - rootObj.addProperty("favicon", - "data:image/png;base64," + new String(faviconBase64) - ); - } - - netStream.writeString(rootObj.toString()); - return netStream.toByteArray(); - } -}