Archived
0

refactoring

This commit is contained in:
2021-06-15 23:56:53 +03:00
parent 475f1a28ca
commit e7b5120661
10 changed files with 138 additions and 65 deletions

View File

@@ -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);
});
}
}

View File

@@ -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));
}
});

View 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);
}
}

View File

@@ -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();
}

View File

@@ -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);
}
}

View File

@@ -0,0 +1,8 @@
package mc.server.processor;
import mc.protocol.handler.ProtocolHandlersBus;
public interface PacketProcessor {
void setup(ProtocolHandlersBus protocolHandlersBus);
}

View File

@@ -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());
}
}

View File

@@ -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);
}
}