перенос обработчиков пакетов в отдельный класс
This commit is contained in:
@@ -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)) {
|
||||||
|
|||||||
74
server/src/main/java/mc/server/PacketHandler.java
Normal file
74
server/src/main/java/mc/server/PacketHandler.java
Normal 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 "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
15
server/src/main/java/mc/server/di/PacketHandlerModule.java
Normal file
15
server/src/main/java/mc/server/di/PacketHandlerModule.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user