refactoring
This commit is contained in:
@@ -8,17 +8,6 @@ import lombok.SneakyThrows;
|
||||
import mc.cliparser.CommandLine;
|
||||
import mc.cliparser.CommandLineParser;
|
||||
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 org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -31,7 +20,6 @@ import java.net.URL;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Collections;
|
||||
import java.util.Objects;
|
||||
|
||||
public class Main {
|
||||
@@ -64,6 +52,7 @@ public class Main {
|
||||
.configModule(configModule).build();
|
||||
//endregion
|
||||
|
||||
//region Debug log config
|
||||
Logger log = LoggerFactory.getLogger("LAUNCHER");
|
||||
if (log.isDebugEnabled()) {
|
||||
Config config = configComponent.getConfig();
|
||||
@@ -75,15 +64,20 @@ public class Main {
|
||||
.sorted()
|
||||
.forEach(log::debug);
|
||||
}
|
||||
//endregion
|
||||
|
||||
ServerComponent serverComponent = DaggerServerComponent.create();
|
||||
setupPacketProcessor(serverComponent, configComponent);
|
||||
ServerComponent serverComponent = DaggerServerComponent.builder()
|
||||
.processorModule(new ProcessorModule(configComponent.getConfig()))
|
||||
.build();
|
||||
serverComponent.getProcessors().forEach(processor -> processor.setup(serverComponent.getProtocolHandlersBus()));
|
||||
|
||||
Config config = configComponent.getConfig();
|
||||
NettyServer server = serverComponent.getNettyServer();
|
||||
|
||||
log.info("Server starting: {}:{}", config.getString("server.host"), config.getInt("server.port"));
|
||||
server.start(config.getString("server.host"), config.getInt("server.port"));
|
||||
String host = configComponent.getConfig().getString("server.host");
|
||||
int port = configComponent.getConfig().getInt("server.port");
|
||||
|
||||
log.info("Server starting: {}:{}", host, port);
|
||||
server.start(host, port);
|
||||
}
|
||||
|
||||
//TODO нужно продумать как этот метод сделать доступным для расширенных версий сервера
|
||||
@@ -114,37 +108,4 @@ public class Main {
|
||||
URL url = Objects.requireNonNull(Main.class.getResource("/logback-default.xml"));
|
||||
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 lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import mc.protocol.handler.PacketProcessor;
|
||||
import mc.protocol.handler.ProtocolHandlersBus;
|
||||
import mc.protocol.handler.ProtocolInboundHandler;
|
||||
import mc.protocol.handler.codec.ProtocolDecoder;
|
||||
import mc.protocol.handler.codec.ProtocolEncoder;
|
||||
@@ -21,7 +21,7 @@ import javax.annotation.Nonnull;
|
||||
@RequiredArgsConstructor
|
||||
public class NettyServer {
|
||||
|
||||
private final PacketProcessor packetProcessor;
|
||||
private final ProtocolHandlersBus protocolHandlersBus;
|
||||
|
||||
public void start(String host, int port) {
|
||||
try {
|
||||
@@ -46,7 +46,7 @@ public class NettyServer {
|
||||
.addLast("logger", new LoggingHandler(LogLevel.DEBUG))
|
||||
.addLast("packet_decoder", new ProtocolDecoder())
|
||||
.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;
|
||||
|
||||
import dagger.Component;
|
||||
import mc.protocol.handler.PacketProcessor;
|
||||
import mc.protocol.handler.ProtocolHandlersBus;
|
||||
import mc.server.NettyServer;
|
||||
import mc.server.processor.PacketProcessor;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
import java.util.Set;
|
||||
|
||||
@Component(modules = ServerModule.class)
|
||||
@Component(modules = {ServerModule.class, ProcessorModule.class})
|
||||
@Singleton
|
||||
public interface ServerComponent {
|
||||
|
||||
PacketProcessor getPacketProcessor();
|
||||
ProtocolHandlersBus getProtocolHandlersBus();
|
||||
NettyServer getNettyServer();
|
||||
Set<PacketProcessor> getProcessors();
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ package mc.server.di;
|
||||
|
||||
import dagger.Module;
|
||||
import dagger.Provides;
|
||||
import mc.protocol.handler.PacketProcessor;
|
||||
import mc.protocol.handler.ProtocolHandlersBus;
|
||||
import mc.server.NettyServer;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
@@ -12,13 +12,13 @@ public class ServerModule {
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
PacketProcessor providePacketProcessor() {
|
||||
return new PacketProcessor();
|
||||
ProtocolHandlersBus providePacketProcessor() {
|
||||
return new ProtocolHandlersBus();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
NettyServer provideNettyServer(PacketProcessor packetProcessor) {
|
||||
return new NettyServer(packetProcessor);
|
||||
NettyServer provideNettyServer(ProtocolHandlersBus protocolHandlersBus) {
|
||||
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