diff --git a/protocol/src/main/java/mc/protocol/model/ServerInfo.java b/protocol/src/main/java/mc/protocol/model/ServerInfo.java index 6924d14..e5a7af7 100644 --- a/protocol/src/main/java/mc/protocol/model/ServerInfo.java +++ b/protocol/src/main/java/mc/protocol/model/ServerInfo.java @@ -6,6 +6,7 @@ import lombok.ToString; import lombok.RequiredArgsConstructor; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import mc.protocol.model.text.Text; import java.util.List; @@ -18,7 +19,7 @@ public class ServerInfo { private final Version version = new Version(); private final Players players = new Players(); - private String description; + private Text description; private String favicon; @Getter diff --git a/protocol/src/main/java/mc/protocol/model/text/Text.java b/protocol/src/main/java/mc/protocol/model/text/Text.java index 0b5a8c3..11d1d50 100644 --- a/protocol/src/main/java/mc/protocol/model/text/Text.java +++ b/protocol/src/main/java/mc/protocol/model/text/Text.java @@ -1,12 +1,16 @@ package mc.protocol.model.text; import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.ToString; +import lombok.experimental.Accessors; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +@Accessors(fluent = true) +@Getter @EqualsAndHashCode @ToString public class Text { diff --git a/protocol/src/main/java/mc/protocol/packets/server/DisconnectPacket.java b/protocol/src/main/java/mc/protocol/packets/server/DisconnectPacket.java index c45891c..7eae3aa 100644 --- a/protocol/src/main/java/mc/protocol/packets/server/DisconnectPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/server/DisconnectPacket.java @@ -1,10 +1,11 @@ package mc.protocol.packets.server; -import com.eclipsesource.json.Json; import lombok.Data; import mc.protocol.State; import mc.protocol.io.NetByteBuf; +import mc.protocol.model.text.Text; import mc.protocol.packets.ServerSidePacket; +import mc.protocol.serializer.TextSerializer; /** * Diconnect packet. @@ -34,10 +35,10 @@ public class DisconnectPacket implements ServerSidePacket { /** * Причина отключения. */ - private String reason; + private Text reason; @Override public void writeSelf(NetByteBuf netByteBuf) { - netByteBuf.writeString(Json.object().add("text", reason).toString()); + netByteBuf.writeString(TextSerializer.toJsonObject(reason).toString()); } } diff --git a/protocol/src/main/java/mc/protocol/packets/server/StatusServerResponse.java b/protocol/src/main/java/mc/protocol/packets/server/StatusServerResponse.java index 32b26c7..35973c1 100644 --- a/protocol/src/main/java/mc/protocol/packets/server/StatusServerResponse.java +++ b/protocol/src/main/java/mc/protocol/packets/server/StatusServerResponse.java @@ -1,15 +1,10 @@ package mc.protocol.packets.server; -import com.eclipsesource.json.Json; -import com.eclipsesource.json.JsonArray; -import com.eclipsesource.json.JsonObject; -import com.google.common.collect.Streams; import lombok.Data; import mc.protocol.io.NetByteBuf; import mc.protocol.model.ServerInfo; import mc.protocol.packets.ServerSidePacket; - -import java.util.stream.Collector; +import mc.protocol.serializer.ServerInfoSerializer; /** * Status server packet, response. @@ -61,39 +56,6 @@ public class StatusServerResponse implements ServerSidePacket { @Override public void writeSelf(NetByteBuf netByteBuf) { - JsonObject jsonObject = Json.object() - .add("version", createVersionObj()) - .add("players", createPlayersObj()) - .add("description", Json.object().add("text", info.description())); - - if (info.favicon() != null && !info.favicon().isEmpty()) { - jsonObject.add("favicon", info.favicon()); - } - - netByteBuf.writeString(jsonObject.toString()); - } - - private JsonObject createVersionObj() { - return Json.object() - .add("name", info.version().name()) - .add("protocol", info.version().protocol()); - } - - private JsonObject createPlayersObj() { - JsonArray sampleArr = info.players().sample().stream() - .map(samplePlayer -> Json.object() - .add("name", samplePlayer.name()) - .add("id", samplePlayer.id())) - .collect(Collector.of(Json::array, JsonArray::add, StatusServerResponse::jsonArrayAddAll)); - - return Json.object() - .add("max", info.players().max()) - .add("online", info.players().online()) - .add("sample", sampleArr); - } - - private static JsonArray jsonArrayAddAll(JsonArray jsonArrayTo, JsonArray jsonArrayFrom) { - Streams.stream(jsonArrayFrom).forEach(jsonArrayTo::add); - return jsonArrayTo; + netByteBuf.writeString(ServerInfoSerializer.toJsonObject(info).toString()); } } diff --git a/protocol/src/main/java/mc/protocol/serializer/ServerInfoSerializer.java b/protocol/src/main/java/mc/protocol/serializer/ServerInfoSerializer.java new file mode 100644 index 0000000..3b98b3d --- /dev/null +++ b/protocol/src/main/java/mc/protocol/serializer/ServerInfoSerializer.java @@ -0,0 +1,51 @@ +package mc.protocol.serializer; + +import com.eclipsesource.json.Json; +import com.eclipsesource.json.JsonArray; +import com.eclipsesource.json.JsonObject; +import com.google.common.collect.Streams; +import lombok.experimental.UtilityClass; +import mc.protocol.model.ServerInfo; + +import java.util.stream.Collector; + +@UtilityClass +public class ServerInfoSerializer { + + public JsonObject toJsonObject(ServerInfo info) { + JsonObject jsonObject = Json.object() + .add("version", createVersionObj(info)) + .add("players", createPlayersObj(info)) + .add("description", TextSerializer.toJsonObject(info.description())); + + if (info.favicon() != null && !info.favicon().isEmpty()) { + jsonObject.add("favicon", info.favicon()); + } + + return jsonObject; + } + + private JsonObject createVersionObj(ServerInfo info) { + return Json.object() + .add("name", info.version().name()) + .add("protocol", info.version().protocol()); + } + + private JsonObject createPlayersObj(ServerInfo info) { + JsonArray sampleArr = info.players().sample().stream() + .map(samplePlayer -> Json.object() + .add("name", samplePlayer.name()) + .add("id", samplePlayer.id())) + .collect(Collector.of(Json::array, JsonArray::add, ServerInfoSerializer::jsonArrayAddAll)); + + return Json.object() + .add("max", info.players().max()) + .add("online", info.players().online()) + .add("sample", sampleArr); + } + + private static JsonArray jsonArrayAddAll(JsonArray jsonArrayTo, JsonArray jsonArrayFrom) { + Streams.stream(jsonArrayFrom).forEach(jsonArrayTo::add); + return jsonArrayTo; + } +} diff --git a/protocol/src/main/java/mc/protocol/serializer/TextSerializer.java b/protocol/src/main/java/mc/protocol/serializer/TextSerializer.java new file mode 100644 index 0000000..69f2ff3 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/serializer/TextSerializer.java @@ -0,0 +1,41 @@ +package mc.protocol.serializer; + +import com.eclipsesource.json.Json; +import com.eclipsesource.json.JsonArray; +import com.eclipsesource.json.JsonObject; +import lombok.experimental.UtilityClass; +import mc.protocol.model.text.Text; + +@UtilityClass +public class TextSerializer { + + public JsonObject toJsonObject(Text text) { + JsonObject jsonObject = Json.object(); + + if (text.content() != null) { + jsonObject.add("text", text.content()); + } + + if (text.color() != null) { + jsonObject.add("color", text.color().getName()); + } + + if (text.style() != null) { + //@formatter:off + if (text.style().bold() != null) jsonObject.add("bold", text.style().bold()); + if (text.style().italic() != null) jsonObject.add("italic", text.style().italic()); + if (text.style().underline() != null) jsonObject.add("underline", text.style().underline()); + if (text.style().strikethrough() != null) jsonObject.add("strikethrough", text.style().strikethrough()); + if (text.style().obfuscated() != null) jsonObject.add("obfuscated", text.style().obfuscated()); + //@formatter:on + } + + if (text.children() != null && !text.children().isEmpty()) { + JsonArray extra = Json.array(); + text.children().forEach(child -> extra.add(toJsonObject(child))); + jsonObject.add("extra", extra); + } + + return jsonObject; + } +} diff --git a/server/src/main/java/mc/server/Main.java b/server/src/main/java/mc/server/Main.java index c07e3c1..5b38960 100644 --- a/server/src/main/java/mc/server/Main.java +++ b/server/src/main/java/mc/server/Main.java @@ -4,6 +4,7 @@ import lombok.extern.slf4j.Slf4j; import mc.protocol.NettyServer; import mc.protocol.ProtocolConstant; import mc.protocol.model.ServerInfo; +import mc.protocol.model.text.Text; import mc.protocol.packets.PingPacket; import mc.protocol.packets.client.HandshakePacket; import mc.protocol.packets.client.LoginStartPacket; @@ -61,7 +62,7 @@ public class Main { serverInfo.players().max(config.players().maxOnlile()); serverInfo.players().online(config.players().onlile()); serverInfo.players().sample(Collections.emptyList()); - serverInfo.description(config.motd()); + serverInfo.description(Text.of(config.motd())); if (config.iconPath() != null) { serverInfo.favicon(faviconToBase64(config.iconPath())); @@ -77,7 +78,7 @@ public class Main { .doOnNext(channel -> log.info("{}", channel.getPacket())) .subscribe(channel -> { DisconnectPacket disconnectPacket = new DisconnectPacket(); - disconnectPacket.setReason("Server is not available."); + disconnectPacket.setReason(Text.of("Server is not available.")); channel.getCtx().writeAndFlush(disconnectPacket).channel().disconnect(); }); diff --git a/server/src/main/java/mc/server/config/Config.java b/server/src/main/java/mc/server/config/Config.java index f8f5f14..310adf6 100644 --- a/server/src/main/java/mc/server/config/Config.java +++ b/server/src/main/java/mc/server/config/Config.java @@ -3,9 +3,11 @@ package mc.server.config; import lombok.Getter; import lombok.Setter; import lombok.ToString; +import lombok.experimental.Accessors; import java.nio.file.Path; +@Accessors(fluent = true) @Getter @Setter @ToString diff --git a/server/src/main/java/mc/server/config/lombok.config b/server/src/main/java/mc/server/config/lombok.config deleted file mode 100644 index f4387a7..0000000 --- a/server/src/main/java/mc/server/config/lombok.config +++ /dev/null @@ -1 +0,0 @@ -lombok.accessors.fluent=true \ No newline at end of file