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