Archived
0

перенос обработчиков пакетов в отдельный класс

This commit is contained in:
2021-05-02 15:05:27 +03:00
parent 3282a3e9c0
commit 19c1666c2e
4 changed files with 99 additions and 45 deletions

View File

@@ -8,15 +8,10 @@ import joptsimple.OptionSet;
import joptsimple.util.PathConverter; import joptsimple.util.PathConverter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import mc.protocol.NettyServer; import mc.protocol.NettyServer;
import mc.protocol.ProtocolConstant;
import mc.protocol.model.ServerInfo;
import mc.protocol.packets.PingPacket; import mc.protocol.packets.PingPacket;
import mc.protocol.packets.client.HandshakePacket; import mc.protocol.packets.client.HandshakePacket;
import mc.protocol.packets.client.LoginStartPacket; import mc.protocol.packets.client.LoginStartPacket;
import mc.protocol.packets.client.StatusServerRequestPacket; import mc.protocol.packets.client.StatusServerRequestPacket;
import mc.protocol.packets.server.DisconnectPacket;
import mc.protocol.packets.server.StatusServerResponse;
import mc.protocol.serializer.TextSerializer;
import mc.server.config.Config; import mc.server.config.Config;
import mc.server.di.ConfigModule; import mc.server.di.ConfigModule;
import mc.server.di.DaggerServerComponent; import mc.server.di.DaggerServerComponent;
@@ -30,8 +25,6 @@ import java.io.OutputStream;
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.Base64;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@@ -53,44 +46,23 @@ public class Main {
Config config = serverComponent.getConfig(); Config config = serverComponent.getConfig();
NettyServer server = NettyServer.createServer(); NettyServer server = NettyServer.createServer();
PacketHandler packetHandler = serverComponent.getPacketHandler();
server.packetFlux(HandshakePacket.class) server.packetFlux(HandshakePacket.class)
.doOnNext(channel -> log.info("{}", channel.getPacket())) .doOnNext(channel -> log.info("{}", channel.getPacket()))
.subscribe(channel -> channel.setState(channel.getPacket().getNextState())); .subscribe(packetHandler::onHandshake);
server.packetFlux(PingPacket.class) server.packetFlux(PingPacket.class)
.doOnNext(channel -> log.info("{}", channel.getPacket())) .doOnNext(channel -> log.info("{}", channel.getPacket()))
.subscribe(channel -> channel.getCtx().writeAndFlush(channel.getPacket()).channel().disconnect()); .subscribe(packetHandler::onKeepAlive);
server.packetFlux(StatusServerRequestPacket.class) server.packetFlux(StatusServerRequestPacket.class)
.doOnNext(channel -> log.info("{}", channel.getPacket())) .doOnNext(channel -> log.info("{}", channel.getPacket()))
.subscribe(channel -> { .subscribe(packetHandler::onServerStatus);
ServerInfo serverInfo = new ServerInfo();
serverInfo.version().name(ProtocolConstant.PROTOCOL_NAME);
serverInfo.version().protocol(ProtocolConstant.PROTOCOL_NUMBER);
serverInfo.players().max(config.players().maxOnlile());
serverInfo.players().online(config.players().onlile());
serverInfo.players().sample(Collections.emptyList());
serverInfo.description(TextSerializer.fromPlain(config.motd()));
if (config.iconPath() != null) {
serverInfo.favicon(faviconToBase64(config.iconPath()));
}
StatusServerResponse response = new StatusServerResponse();
response.setInfo(serverInfo);
channel.getCtx().writeAndFlush(response);
});
server.packetFlux(LoginStartPacket.class) server.packetFlux(LoginStartPacket.class)
.doOnNext(channel -> log.info("{}", channel.getPacket())) .doOnNext(channel -> log.info("{}", channel.getPacket()))
.subscribe(channel -> { .subscribe(packetHandler::onLoginStart);
DisconnectPacket disconnectPacket = new DisconnectPacket();
disconnectPacket.setReason(TextSerializer.fromPlain(config.disconnectReason()));
channel.getCtx().writeAndFlush(disconnectPacket).channel().disconnect();
});
server.bind(config.server().host(), config.server().port()); server.bind(config.server().host(), config.server().port());
} }
@@ -159,17 +131,6 @@ public class Main {
return optionParser; return optionParser;
} }
private static String faviconToBase64(Path iconPath) {
try {
return "data:image/png;base64," +
Base64.getEncoder().encodeToString(
IOUtils.toByteArray(Files.newInputStream(iconPath)));
} catch (IOException e) {
log.error("Can't read icon '{}'", iconPath.toAbsolutePath(), e);
return "";
}
}
private static boolean initializeCheckFiles(Path... paths) { private static boolean initializeCheckFiles(Path... paths) {
for (Path path : paths) { for (Path path : paths) {
if (Files.exists(path)) { if (Files.exists(path)) {

View File

@@ -0,0 +1,74 @@
package mc.server;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import mc.protocol.ChannelContext;
import mc.protocol.ProtocolConstant;
import mc.protocol.model.ServerInfo;
import mc.protocol.packets.PingPacket;
import mc.protocol.packets.client.HandshakePacket;
import mc.protocol.packets.client.LoginStartPacket;
import mc.protocol.packets.client.StatusServerRequestPacket;
import mc.protocol.packets.server.DisconnectPacket;
import mc.protocol.packets.server.StatusServerResponse;
import mc.protocol.serializer.TextSerializer;
import mc.server.config.Config;
import org.apache.commons.io.IOUtils;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;
import java.util.Collections;
@Slf4j
@RequiredArgsConstructor
public class PacketHandler {
private final Config config;
public void onHandshake(ChannelContext<HandshakePacket> channel) {
channel.setState(channel.getPacket().getNextState());
}
public void onKeepAlive(ChannelContext<PingPacket> channel) {
channel.getCtx().writeAndFlush(channel.getPacket()).channel().disconnect();
}
public void onServerStatus(ChannelContext<StatusServerRequestPacket> channel) {
ServerInfo serverInfo = new ServerInfo();
serverInfo.version().name(ProtocolConstant.PROTOCOL_NAME);
serverInfo.version().protocol(ProtocolConstant.PROTOCOL_NUMBER);
serverInfo.players().max(config.players().maxOnlile());
serverInfo.players().online(config.players().onlile());
serverInfo.players().sample(Collections.emptyList());
serverInfo.description(TextSerializer.fromPlain(config.motd()));
if (config.iconPath() != null) {
serverInfo.favicon(faviconToBase64(config.iconPath()));
}
StatusServerResponse response = new StatusServerResponse();
response.setInfo(serverInfo);
channel.getCtx().writeAndFlush(response);
}
public void onLoginStart(ChannelContext<LoginStartPacket> channel) {
DisconnectPacket disconnectPacket = new DisconnectPacket();
disconnectPacket.setReason(TextSerializer.fromPlain(config.disconnectReason()));
channel.getCtx().writeAndFlush(disconnectPacket).channel().disconnect();
}
private static String faviconToBase64(Path iconPath) {
try {
return "data:image/png;base64," +
Base64.getEncoder().encodeToString(
IOUtils.toByteArray(Files.newInputStream(iconPath)));
} catch (IOException e) {
log.error("Can't read icon '{}'", iconPath.toAbsolutePath(), e);
return "";
}
}
}

View File

@@ -0,0 +1,15 @@
package mc.server.di;
import dagger.Module;
import dagger.Provides;
import mc.server.PacketHandler;
import mc.server.config.Config;
@Module
public class PacketHandlerModule {
@Provides
public PacketHandler providePacketHandler(Config config) {
return new PacketHandler(config);
}
}

View File

@@ -1,10 +1,14 @@
package mc.server.di; package mc.server.di;
import dagger.Component; import dagger.Component;
import mc.server.PacketHandler;
import mc.server.config.Config; import mc.server.config.Config;
@Component(modules = ConfigModule.class) @Component(modules = {
ConfigModule.class, PacketHandlerModule.class
})
public interface ServerComponent { public interface ServerComponent {
Config getConfig(); Config getConfig();
PacketHandler getPacketHandler();
} }