diff --git a/build.gradle b/build.gradle index 42319e2..f0690b4 100644 --- a/build.gradle +++ b/build.gradle @@ -26,6 +26,7 @@ dependencies { /* COMPONENTS */ compile (group: 'com.google.guava', name: 'guava', version: '28.0-jre') + compile (group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.11.0') /* LOMBOK */ annotationProcessor (group: 'org.projectlombok', name: 'lombok', version: lombok_version) diff --git a/src/main/java/mc/protocol/dto/ServerInfo.java b/src/main/java/mc/protocol/dto/ServerInfo.java new file mode 100644 index 0000000..8a0abcd --- /dev/null +++ b/src/main/java/mc/protocol/dto/ServerInfo.java @@ -0,0 +1,49 @@ +package mc.protocol.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRawValue; +import com.fasterxml.jackson.databind.JsonNode; +import lombok.Data; + +import java.util.List; +import java.util.UUID; + +@JsonIgnoreProperties(ignoreUnknown = true) +@Data +public class ServerInfo { + + private Version version; + + @JsonProperty("players") + private PlayersInfo playersInfo; + + //TODO необходимо реализовать объект типа Chat (см. https://wiki.vg/index.php?title=Chat&oldid=8329) + private JsonNode description; + + @JsonProperty("favicon") + private String faviconBase64; + + @Data + public static class Version { + private String name; + private int protocol; + } + + @Data + public static class PlayersInfo { + + private int max; + + private int online; + + @JsonProperty("sample") + private List samplePlayers; + } + + @Data + public static class SamplePlayer { + private UUID id; + private String name; + } +} diff --git a/src/main/java/mc/protocol/status/server/StatusServerResponse.java b/src/main/java/mc/protocol/status/server/StatusServerResponse.java index 5f99641..4d6a6a0 100644 --- a/src/main/java/mc/protocol/status/server/StatusServerResponse.java +++ b/src/main/java/mc/protocol/status/server/StatusServerResponse.java @@ -1,7 +1,10 @@ package mc.protocol.status.server; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Data; import mc.protocol.Packet; +import mc.protocol.dto.ServerInfo; import mc.protocol.io.NetInputStream; import mc.protocol.io.NetOutputStream; @@ -49,15 +52,41 @@ public class StatusServerResponse implements Packet { * } * */ - private String info; + private String serverInfo; + + private ServerInfo serverInfoDto; + + public ServerInfo getServerInfoDto() { + if (serverInfoDto == null) { + try { + ObjectMapper mapper = new ObjectMapper(); + serverInfoDto = mapper.readValue(serverInfo, ServerInfo.class); + } catch (JsonProcessingException e) { + e.printStackTrace(); + return new ServerInfo(); + } + } + + return serverInfoDto; + } @Override public void readSelf(NetInputStream netInputStream) { - info = netInputStream.readString(); + serverInfo = netInputStream.readString(); } @Override public void writeSelf(NetOutputStream netOutputStream) { - netOutputStream.writeString(info); + if (serverInfo == null) { + try { + ObjectMapper mapper = new ObjectMapper(); + serverInfo = mapper.writeValueAsString(serverInfoDto); + } catch (JsonProcessingException e) { + e.printStackTrace(); + serverInfo = "{}"; + } + } + + netOutputStream.writeString(serverInfo); } }