refactoring
This commit is contained in:
@@ -6,11 +6,11 @@ import mc.protocol.packets.ClientSidePacket;
|
|||||||
import mc.protocol.utils.Table;
|
import mc.protocol.utils.Table;
|
||||||
|
|
||||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||||
public class PacketProcessor {
|
public class ProtocolHandlersBus {
|
||||||
|
|
||||||
private final Table<State, Class<? extends ClientSidePacket>, Handler> table = new Table<>();
|
private final Table<State, Class<? extends ClientSidePacket>, Handler> table = new Table<>();
|
||||||
|
|
||||||
public <P extends ClientSidePacket> PacketProcessor addHandler(State state, Class<P> packetClass, Handler<P> handler) {
|
public <P extends ClientSidePacket> ProtocolHandlersBus addHandler(State state, Class<P> packetClass, Handler<P> handler) {
|
||||||
table.put(state, packetClass, handler);
|
table.put(state, packetClass, handler);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@@ -17,12 +17,12 @@ public class ProtocolInboundHandler extends SimpleChannelInboundHandler<ClientSi
|
|||||||
|
|
||||||
private static final String CLIENT_FORCE_DISCONNECTED_IOEXCEPTION_MESSAGE_RU = "Программа на вашем хост-компьютере разорвала установленное подключение";
|
private static final String CLIENT_FORCE_DISCONNECTED_IOEXCEPTION_MESSAGE_RU = "Программа на вашем хост-компьютере разорвала установленное подключение";
|
||||||
|
|
||||||
private final PacketProcessor packetProcessor;
|
private final ProtocolHandlersBus protocolHandlersBus;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void channelRead0(ChannelHandlerContext ctx, ClientSidePacket packet) {
|
protected void channelRead0(ChannelHandlerContext ctx, ClientSidePacket packet) {
|
||||||
State state = Objects.requireNonNull(ctx.channel().attr(ProtocolAttributes.STATE).get());
|
State state = Objects.requireNonNull(ctx.channel().attr(ProtocolAttributes.STATE).get());
|
||||||
packetProcessor.process(state, ctx, packet);
|
protocolHandlersBus.process(state, ctx, packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -8,17 +8,6 @@ import lombok.SneakyThrows;
|
|||||||
import mc.cliparser.CommandLine;
|
import mc.cliparser.CommandLine;
|
||||||
import mc.cliparser.CommandLineParser;
|
import mc.cliparser.CommandLineParser;
|
||||||
import mc.cliparser.Option;
|
import mc.cliparser.Option;
|
||||||
import mc.protocol.ProtocolAttributes;
|
|
||||||
import mc.protocol.ProtocolConstant;
|
|
||||||
import mc.protocol.State;
|
|
||||||
import mc.protocol.handler.PacketProcessor;
|
|
||||||
import mc.protocol.model.ServerInfo;
|
|
||||||
import mc.protocol.model.ServerInfoSerializer;
|
|
||||||
import mc.protocol.model.text.TextSerializer;
|
|
||||||
import mc.protocol.packets.KeepAlivePacket;
|
|
||||||
import mc.protocol.packets.handshaking.client.HandshakePacket;
|
|
||||||
import mc.protocol.packets.status.client.StatusServerRequestPacket;
|
|
||||||
import mc.protocol.packets.status.server.StatusServerResponse;
|
|
||||||
import mc.server.di.*;
|
import mc.server.di.*;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@@ -31,7 +20,6 @@ import java.net.URL;
|
|||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
public class Main {
|
public class Main {
|
||||||
@@ -64,6 +52,7 @@ public class Main {
|
|||||||
.configModule(configModule).build();
|
.configModule(configModule).build();
|
||||||
//endregion
|
//endregion
|
||||||
|
|
||||||
|
//region Debug log config
|
||||||
Logger log = LoggerFactory.getLogger("LAUNCHER");
|
Logger log = LoggerFactory.getLogger("LAUNCHER");
|
||||||
if (log.isDebugEnabled()) {
|
if (log.isDebugEnabled()) {
|
||||||
Config config = configComponent.getConfig();
|
Config config = configComponent.getConfig();
|
||||||
@@ -75,15 +64,20 @@ public class Main {
|
|||||||
.sorted()
|
.sorted()
|
||||||
.forEach(log::debug);
|
.forEach(log::debug);
|
||||||
}
|
}
|
||||||
|
//endregion
|
||||||
|
|
||||||
ServerComponent serverComponent = DaggerServerComponent.create();
|
ServerComponent serverComponent = DaggerServerComponent.builder()
|
||||||
setupPacketProcessor(serverComponent, configComponent);
|
.processorModule(new ProcessorModule(configComponent.getConfig()))
|
||||||
|
.build();
|
||||||
|
serverComponent.getProcessors().forEach(processor -> processor.setup(serverComponent.getProtocolHandlersBus()));
|
||||||
|
|
||||||
Config config = configComponent.getConfig();
|
|
||||||
NettyServer server = serverComponent.getNettyServer();
|
NettyServer server = serverComponent.getNettyServer();
|
||||||
|
|
||||||
log.info("Server starting: {}:{}", config.getString("server.host"), config.getInt("server.port"));
|
String host = configComponent.getConfig().getString("server.host");
|
||||||
server.start(config.getString("server.host"), config.getInt("server.port"));
|
int port = configComponent.getConfig().getInt("server.port");
|
||||||
|
|
||||||
|
log.info("Server starting: {}:{}", host, port);
|
||||||
|
server.start(host, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO нужно продумать как этот метод сделать доступным для расширенных версий сервера
|
//TODO нужно продумать как этот метод сделать доступным для расширенных версий сервера
|
||||||
@@ -114,37 +108,4 @@ public class Main {
|
|||||||
URL url = Objects.requireNonNull(Main.class.getResource("/logback-default.xml"));
|
URL url = Objects.requireNonNull(Main.class.getResource("/logback-default.xml"));
|
||||||
return Paths.get(url.toURI());
|
return Paths.get(url.toURI());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void setupPacketProcessor(ServerComponent serverComponent, ConfigComponent configComponent) {
|
|
||||||
PacketProcessor packetProcessor = serverComponent.getPacketProcessor();
|
|
||||||
|
|
||||||
packetProcessor.addHandler(State.HANDSHAKING, HandshakePacket.class,
|
|
||||||
(ctx, packet) -> ctx.channel().attr(ProtocolAttributes.STATE).set(packet.getNextState()));
|
|
||||||
|
|
||||||
setupStatusPacketProcessor(packetProcessor, configComponent);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void setupStatusPacketProcessor(PacketProcessor packetProcessor, ConfigComponent configComponent) {
|
|
||||||
Config config = configComponent.getConfig();
|
|
||||||
|
|
||||||
packetProcessor
|
|
||||||
.addHandler(State.STATUS, KeepAlivePacket.class, (ctx, packet) -> {
|
|
||||||
ctx.writeAndFlush(packet);
|
|
||||||
ctx.close();
|
|
||||||
})
|
|
||||||
.addHandler(State.STATUS, StatusServerRequestPacket.class, (ctx, packet) -> {
|
|
||||||
ServerInfo serverInfo = new ServerInfo();
|
|
||||||
serverInfo.version().name(ProtocolConstant.PROTOCOL_NAME);
|
|
||||||
serverInfo.version().protocol(ProtocolConstant.PROTOCOL_NUMBER);
|
|
||||||
serverInfo.players().max(config.getInt("players.max-online"));
|
|
||||||
serverInfo.players().online(config.getInt("players.fake-online.value"));
|
|
||||||
serverInfo.players().sample(Collections.emptyList());
|
|
||||||
serverInfo.description(TextSerializer.fromPlain(config.getString("motd")));
|
|
||||||
|
|
||||||
StatusServerResponse response = new StatusServerResponse();
|
|
||||||
response.setInfo(ServerInfoSerializer.toStringPlain(serverInfo));
|
|
||||||
|
|
||||||
ctx.writeAndFlush(response);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import io.netty.handler.logging.LogLevel;
|
|||||||
import io.netty.handler.logging.LoggingHandler;
|
import io.netty.handler.logging.LoggingHandler;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import mc.protocol.handler.PacketProcessor;
|
import mc.protocol.handler.ProtocolHandlersBus;
|
||||||
import mc.protocol.handler.ProtocolInboundHandler;
|
import mc.protocol.handler.ProtocolInboundHandler;
|
||||||
import mc.protocol.handler.codec.ProtocolDecoder;
|
import mc.protocol.handler.codec.ProtocolDecoder;
|
||||||
import mc.protocol.handler.codec.ProtocolEncoder;
|
import mc.protocol.handler.codec.ProtocolEncoder;
|
||||||
@@ -21,7 +21,7 @@ import javax.annotation.Nonnull;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class NettyServer {
|
public class NettyServer {
|
||||||
|
|
||||||
private final PacketProcessor packetProcessor;
|
private final ProtocolHandlersBus protocolHandlersBus;
|
||||||
|
|
||||||
public void start(String host, int port) {
|
public void start(String host, int port) {
|
||||||
try {
|
try {
|
||||||
@@ -46,7 +46,7 @@ public class NettyServer {
|
|||||||
.addLast("logger", new LoggingHandler(LogLevel.DEBUG))
|
.addLast("logger", new LoggingHandler(LogLevel.DEBUG))
|
||||||
.addLast("packet_decoder", new ProtocolDecoder())
|
.addLast("packet_decoder", new ProtocolDecoder())
|
||||||
.addLast("packet_encoder", new ProtocolEncoder())
|
.addLast("packet_encoder", new ProtocolEncoder())
|
||||||
.addLast("packet_handler", new ProtocolInboundHandler(packetProcessor));
|
.addLast("packet_handler", new ProtocolInboundHandler(protocolHandlersBus));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
33
server-new/src/main/java/mc/server/di/ProcessorModule.java
Normal file
33
server-new/src/main/java/mc/server/di/ProcessorModule.java
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
package mc.server.di;
|
||||||
|
|
||||||
|
import com.typesafe.config.Config;
|
||||||
|
import dagger.Module;
|
||||||
|
import dagger.Provides;
|
||||||
|
import dagger.multibindings.IntoSet;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import mc.server.processor.PacketProcessor;
|
||||||
|
import mc.server.processor.ProcessorHandshake;
|
||||||
|
import mc.server.processor.ProcessorStatus;
|
||||||
|
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
@Module
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class ProcessorModule {
|
||||||
|
|
||||||
|
private final Config config;
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@IntoSet
|
||||||
|
@Singleton
|
||||||
|
PacketProcessor provideProcessorHadshake() {
|
||||||
|
return new ProcessorHandshake();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@IntoSet
|
||||||
|
@Singleton
|
||||||
|
PacketProcessor provideProcessorStatus() {
|
||||||
|
return new ProcessorStatus(config);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,15 +1,18 @@
|
|||||||
package mc.server.di;
|
package mc.server.di;
|
||||||
|
|
||||||
import dagger.Component;
|
import dagger.Component;
|
||||||
import mc.protocol.handler.PacketProcessor;
|
import mc.protocol.handler.ProtocolHandlersBus;
|
||||||
import mc.server.NettyServer;
|
import mc.server.NettyServer;
|
||||||
|
import mc.server.processor.PacketProcessor;
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
@Component(modules = ServerModule.class)
|
@Component(modules = {ServerModule.class, ProcessorModule.class})
|
||||||
@Singleton
|
@Singleton
|
||||||
public interface ServerComponent {
|
public interface ServerComponent {
|
||||||
|
|
||||||
PacketProcessor getPacketProcessor();
|
ProtocolHandlersBus getProtocolHandlersBus();
|
||||||
NettyServer getNettyServer();
|
NettyServer getNettyServer();
|
||||||
|
Set<PacketProcessor> getProcessors();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package mc.server.di;
|
|||||||
|
|
||||||
import dagger.Module;
|
import dagger.Module;
|
||||||
import dagger.Provides;
|
import dagger.Provides;
|
||||||
import mc.protocol.handler.PacketProcessor;
|
import mc.protocol.handler.ProtocolHandlersBus;
|
||||||
import mc.server.NettyServer;
|
import mc.server.NettyServer;
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
@@ -12,13 +12,13 @@ public class ServerModule {
|
|||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
PacketProcessor providePacketProcessor() {
|
ProtocolHandlersBus providePacketProcessor() {
|
||||||
return new PacketProcessor();
|
return new ProtocolHandlersBus();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
NettyServer provideNettyServer(PacketProcessor packetProcessor) {
|
NettyServer provideNettyServer(ProtocolHandlersBus protocolHandlersBus) {
|
||||||
return new NettyServer(packetProcessor);
|
return new NettyServer(protocolHandlersBus);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package mc.server.processor;
|
||||||
|
|
||||||
|
import mc.protocol.handler.ProtocolHandlersBus;
|
||||||
|
|
||||||
|
public interface PacketProcessor {
|
||||||
|
|
||||||
|
void setup(ProtocolHandlersBus protocolHandlersBus);
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package mc.server.processor;
|
||||||
|
|
||||||
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
|
import mc.protocol.ProtocolAttributes;
|
||||||
|
import mc.protocol.State;
|
||||||
|
import mc.protocol.handler.ProtocolHandlersBus;
|
||||||
|
import mc.protocol.packets.handshaking.client.HandshakePacket;
|
||||||
|
|
||||||
|
public class ProcessorHandshake implements PacketProcessor {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setup(ProtocolHandlersBus protocolHandlersBus) {
|
||||||
|
protocolHandlersBus.addHandler(State.HANDSHAKING, HandshakePacket.class, this::handshake);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handshake(ChannelHandlerContext ctx, HandshakePacket packet) {
|
||||||
|
ctx.channel().attr(ProtocolAttributes.STATE).set(packet.getNextState());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
package mc.server.processor;
|
||||||
|
|
||||||
|
import com.typesafe.config.Config;
|
||||||
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import mc.protocol.ProtocolConstant;
|
||||||
|
import mc.protocol.State;
|
||||||
|
import mc.protocol.handler.ProtocolHandlersBus;
|
||||||
|
import mc.protocol.model.ServerInfo;
|
||||||
|
import mc.protocol.model.ServerInfoSerializer;
|
||||||
|
import mc.protocol.model.text.TextSerializer;
|
||||||
|
import mc.protocol.packets.KeepAlivePacket;
|
||||||
|
import mc.protocol.packets.status.client.StatusServerRequestPacket;
|
||||||
|
import mc.protocol.packets.status.server.StatusServerResponse;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class ProcessorStatus implements PacketProcessor {
|
||||||
|
|
||||||
|
private final Config config;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setup(ProtocolHandlersBus protocolHandlersBus) {
|
||||||
|
protocolHandlersBus
|
||||||
|
.addHandler(State.STATUS, KeepAlivePacket.class, this::keepAlive)
|
||||||
|
.addHandler(State.STATUS, StatusServerRequestPacket.class, this::statusRequest);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void keepAlive(ChannelHandlerContext ctx, KeepAlivePacket packet) {
|
||||||
|
ctx.writeAndFlush(packet);
|
||||||
|
ctx.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void statusRequest(ChannelHandlerContext ctx, StatusServerRequestPacket packet) {
|
||||||
|
ServerInfo serverInfo = new ServerInfo();
|
||||||
|
serverInfo.version().name(ProtocolConstant.PROTOCOL_NAME);
|
||||||
|
serverInfo.version().protocol(ProtocolConstant.PROTOCOL_NUMBER);
|
||||||
|
serverInfo.players().max(config.getInt("players.max-online"));
|
||||||
|
serverInfo.players().online(config.getInt("players.fake-online.value"));
|
||||||
|
serverInfo.players().sample(Collections.emptyList());
|
||||||
|
serverInfo.description(TextSerializer.fromPlain(config.getString("motd")));
|
||||||
|
|
||||||
|
StatusServerResponse response = new StatusServerResponse();
|
||||||
|
response.setInfo(ServerInfoSerializer.toStringPlain(serverInfo));
|
||||||
|
|
||||||
|
ctx.writeAndFlush(response);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user