diff --git a/libs.gradle b/libs.gradle index fc2589b..a4eb76f 100644 --- a/libs.gradle +++ b/libs.gradle @@ -16,7 +16,8 @@ ext { netty : 'io.netty:netty-all:4.1.22.Final', reactor : 'io.projectreactor:reactor-core:3.4.5', yaml : 'org.yaml:snakeyaml:1.28', - json : 'com.eclipsesource.minimal-json:minimal-json:0.9.5' + json : 'com.eclipsesource.minimal-json:minimal-json:0.9.5', + ioutils : 'commons-io:commons-io:2.6' ] libs.logger = [ 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 a238d20..32b26c7 100644 --- a/protocol/src/main/java/mc/protocol/packets/server/StatusServerResponse.java +++ b/protocol/src/main/java/mc/protocol/packets/server/StatusServerResponse.java @@ -48,6 +48,8 @@ import java.util.stream.Collector; * "favicon": "data:image/png;base64,<data>" * } * + * + *

`$.favicon` должен быть формата PNG и размеры 64x64 px

*/ @Data public class StatusServerResponse implements ServerSidePacket { @@ -59,11 +61,16 @@ public class StatusServerResponse implements ServerSidePacket { @Override public void writeSelf(NetByteBuf netByteBuf) { - netByteBuf.writeString(Json.object() + JsonObject jsonObject = Json.object() .add("version", createVersionObj()) .add("players", createPlayersObj()) - .add("description", Json.object().add("text", info.description())) - .toString()); + .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() { diff --git a/server/build.gradle b/server/build.gradle index 46c8b98..3854cf5 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -20,4 +20,5 @@ dependencies { implementation libs.reactor implementation libs.guava implementation libs.yaml + implementation libs.ioutils } diff --git a/server/src/main/java/mc/server/Main.java b/server/src/main/java/mc/server/Main.java index 0592fa1..c07e3c1 100644 --- a/server/src/main/java/mc/server/Main.java +++ b/server/src/main/java/mc/server/Main.java @@ -14,8 +14,13 @@ import mc.server.config.Config; import mc.server.di.ConfigModule; import mc.server.di.DaggerServerComponent; import mc.server.di.ServerComponent; +import org.apache.commons.io.IOUtils; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Base64; import java.util.Collections; @Slf4j @@ -58,6 +63,10 @@ public class Main { serverInfo.players().sample(Collections.emptyList()); serverInfo.description(config.motd()); + if (config.iconPath() != null) { + serverInfo.favicon(faviconToBase64(config.iconPath())); + } + StatusServerResponse response = new StatusServerResponse(); response.setInfo(serverInfo); @@ -75,4 +84,15 @@ public class Main { server.bind(config.server().host(), config.server().port()); } + + 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 ""; + } + } } diff --git a/server/src/main/resources/config.yml b/server/src/main/resources/config.yml index af6b6aa..81df62d 100644 --- a/server/src/main/resources/config.yml +++ b/server/src/main/resources/config.yml @@ -9,5 +9,5 @@ players: online: 0 icon: - enable: false - path: favicon.png \ No newline at end of file + enable: true + path: src/main/resources/favicon.png \ No newline at end of file diff --git a/server/src/main/resources/favicon.png b/server/src/main/resources/favicon.png new file mode 100644 index 0000000..d512fc5 Binary files /dev/null and b/server/src/main/resources/favicon.png differ