mirror of
https://github.com/BX-Team/DivineMC.git
synced 2025-12-19 14:59:25 +00:00
310 lines
15 KiB
Diff
310 lines
15 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com>
|
|
Date: Tue, 4 Feb 2025 01:49:17 +0300
|
|
Subject: [PATCH] Implement NoChatReports
|
|
|
|
|
|
diff --git a/net/minecraft/network/FriendlyByteBuf.java b/net/minecraft/network/FriendlyByteBuf.java
|
|
index bef92cfa7eb86fbc6bc1b7d862eaca575eeeadec..b8701c45a6fa635f3ea18616f7c841de9df32877 100644
|
|
--- a/net/minecraft/network/FriendlyByteBuf.java
|
|
+++ b/net/minecraft/network/FriendlyByteBuf.java
|
|
@@ -106,7 +106,28 @@ public class FriendlyByteBuf extends ByteBuf {
|
|
return this;
|
|
}
|
|
|
|
+ @SuppressWarnings({"unchecked", "rawtypes"}) // DivineMC - Implement NoChatReports
|
|
public <T> T readLenientJsonWithCodec(Codec<T> codec) {
|
|
+ // DivineMC start - Implement NoChatReports
|
|
+ if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled) {
|
|
+ if (codec == net.minecraft.network.protocol.status.ServerStatus.CODEC) {
|
|
+ JsonElement jsonElement = LenientJsonParser.parse(this.readUtf());
|
|
+ DataResult dataResult = codec.parse(JsonOps.INSTANCE, jsonElement);
|
|
+ Object result;
|
|
+ try {
|
|
+ result = dataResult.getOrThrow(string -> new DecoderException("Failed to decode json: " + string));
|
|
+ } catch (Throwable e) {
|
|
+ throw new RuntimeException("Unable to decode json!", e);
|
|
+ }
|
|
+
|
|
+ if (jsonElement.getAsJsonObject().has("preventsChatReports")) {
|
|
+ ((net.minecraft.network.protocol.status.ServerStatus) result).setPreventsChatReports(jsonElement.getAsJsonObject().get("preventsChatReports").getAsBoolean());
|
|
+ }
|
|
+
|
|
+ return (T) (result);
|
|
+ }
|
|
+ }
|
|
+ // DivineMC end - Implement NoChatReports
|
|
JsonElement jsonElement = LenientJsonParser.parse(this.readUtf());
|
|
DataResult<T> dataResult = codec.parse(JsonOps.INSTANCE, jsonElement);
|
|
return dataResult.getOrThrow(string -> new DecoderException("Failed to decode JSON: " + string));
|
|
@@ -118,6 +139,19 @@ public class FriendlyByteBuf extends ByteBuf {
|
|
}
|
|
public <T> void writeJsonWithCodec(Codec<T> codec, T value, int maxLength) {
|
|
// Paper end - Adventure; add max length parameter
|
|
+ // DivineMC start - Implement NoChatReports
|
|
+ if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled) {
|
|
+ if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsAddQueryData && codec == net.minecraft.network.protocol.status.ServerStatus.CODEC) {
|
|
+ DataResult<JsonElement> dataResult = codec.encodeStart(JsonOps.INSTANCE, value);
|
|
+ JsonElement element = dataResult.getOrThrow(string -> new EncoderException("Failed to encode: " + string + " " + value));
|
|
+
|
|
+ element.getAsJsonObject().addProperty("preventsChatReports", true);
|
|
+
|
|
+ this.writeUtf(GSON.toJson(element));
|
|
+ return;
|
|
+ }
|
|
+ }
|
|
+ // DivineMC end - Implement NoChatReports
|
|
DataResult<JsonElement> dataResult = codec.encodeStart(JsonOps.INSTANCE, value);
|
|
this.writeUtf(GSON.toJson(dataResult.getOrThrow(exception -> new EncoderException("Failed to encode: " + exception + " " + value))), maxLength); // Paper - Adventure; add max length parameter
|
|
}
|
|
diff --git a/net/minecraft/network/protocol/game/ServerboundChatCommandSignedPacket.java b/net/minecraft/network/protocol/game/ServerboundChatCommandSignedPacket.java
|
|
index 07943553b562b95076bdce232d6f0796f469400f..478c07e8c569d35761ce138cf1deed9511b826d6 100644
|
|
--- a/net/minecraft/network/protocol/game/ServerboundChatCommandSignedPacket.java
|
|
+++ b/net/minecraft/network/protocol/game/ServerboundChatCommandSignedPacket.java
|
|
@@ -36,4 +36,15 @@ public record ServerboundChatCommandSignedPacket(
|
|
public void handle(ServerGamePacketListener handler) {
|
|
handler.handleSignedChatCommand(this);
|
|
}
|
|
+
|
|
+ // DivineMC start - Implement NoChatReports
|
|
+ @Override
|
|
+ public ArgumentSignatures argumentSignatures() {
|
|
+ if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled) {
|
|
+ return ArgumentSignatures.EMPTY;
|
|
+ }
|
|
+
|
|
+ return argumentSignatures;
|
|
+ }
|
|
+ // DivineMC end - Implement NoChatReports
|
|
}
|
|
diff --git a/net/minecraft/network/protocol/game/ServerboundChatPacket.java b/net/minecraft/network/protocol/game/ServerboundChatPacket.java
|
|
index b5afc05924ae899e020c303c8b86398e1d4ab8a0..2a6fdec4faae3512060cbb21a2043129765a480e 100644
|
|
--- a/net/minecraft/network/protocol/game/ServerboundChatPacket.java
|
|
+++ b/net/minecraft/network/protocol/game/ServerboundChatPacket.java
|
|
@@ -36,4 +36,16 @@ public record ServerboundChatPacket(String message, Instant timeStamp, long salt
|
|
public void handle(ServerGamePacketListener handler) {
|
|
handler.handleChat(this);
|
|
}
|
|
+
|
|
+ // DivineMC start - Implement NoChatReports
|
|
+ @Override
|
|
+ @Nullable
|
|
+ public MessageSignature signature() {
|
|
+ if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled) {
|
|
+ return null;
|
|
+ }
|
|
+
|
|
+ return signature;
|
|
+ }
|
|
+ // DivineMC end - Implement NoChatReports
|
|
}
|
|
diff --git a/net/minecraft/network/protocol/game/ServerboundChatSessionUpdatePacket.java b/net/minecraft/network/protocol/game/ServerboundChatSessionUpdatePacket.java
|
|
index 1df628ac0b414511aaed6e09d78f884c4170f730..1543f730843c1736c4db9a6ebe30be9cc9fbe36a 100644
|
|
--- a/net/minecraft/network/protocol/game/ServerboundChatSessionUpdatePacket.java
|
|
+++ b/net/minecraft/network/protocol/game/ServerboundChatSessionUpdatePacket.java
|
|
@@ -26,6 +26,19 @@ public record ServerboundChatSessionUpdatePacket(RemoteChatSession.Data chatSess
|
|
|
|
@Override
|
|
public void handle(ServerGamePacketListener handler) {
|
|
+ // DivineMC start - Implement NoChatReports
|
|
+ if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled) {
|
|
+ var impl = (net.minecraft.server.network.ServerGamePacketListenerImpl) handler;
|
|
+
|
|
+ if (!impl.getPlayer().getServer().isSingleplayerOwner(impl.getPlayer().getGameProfile())) {
|
|
+ if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsDemandOnClient) {
|
|
+ impl.disconnect(net.minecraft.network.chat.Component.literal(org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsDisconnectDemandOnClientMessage));
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return;
|
|
+ }
|
|
+ // DivineMC end - Implement NoChatReports
|
|
handler.handleChatSessionUpdate(this);
|
|
}
|
|
}
|
|
diff --git a/net/minecraft/network/protocol/status/ServerStatus.java b/net/minecraft/network/protocol/status/ServerStatus.java
|
|
index a491be4250de3199c3e1aa9e5482b568692bd2f5..c88826db76c28c536e6c36c5592d69c12de395d0 100644
|
|
--- a/net/minecraft/network/protocol/status/ServerStatus.java
|
|
+++ b/net/minecraft/network/protocol/status/ServerStatus.java
|
|
@@ -15,13 +15,7 @@ import net.minecraft.network.chat.CommonComponents;
|
|
import net.minecraft.network.chat.Component;
|
|
import net.minecraft.network.chat.ComponentSerialization;
|
|
|
|
-public record ServerStatus(
|
|
- Component description,
|
|
- Optional<ServerStatus.Players> players,
|
|
- Optional<ServerStatus.Version> version,
|
|
- Optional<ServerStatus.Favicon> favicon,
|
|
- boolean enforcesSecureChat
|
|
-) {
|
|
+public final class ServerStatus {
|
|
public static final Codec<ServerStatus> CODEC = RecordCodecBuilder.create(
|
|
instance -> instance.group(
|
|
ComponentSerialization.CODEC.lenientOptionalFieldOf("description", CommonComponents.EMPTY).forGetter(ServerStatus::description),
|
|
@@ -33,6 +27,63 @@ public record ServerStatus(
|
|
.apply(instance, ServerStatus::new)
|
|
);
|
|
|
|
+ // DivineMC start - Implement NoChatReports - convert to class
|
|
+ private final Component description;
|
|
+ private final Optional<Players> players;
|
|
+ private final Optional<Version> version;
|
|
+ private final Optional<Favicon> favicon;
|
|
+ private final boolean enforcesSecureChat;
|
|
+ private boolean preventsChatReports;
|
|
+
|
|
+ public ServerStatus(
|
|
+ Component description,
|
|
+ Optional<Players> players,
|
|
+ Optional<Version> version,
|
|
+ Optional<Favicon> favicon,
|
|
+ boolean enforcesSecureChat
|
|
+ ) {
|
|
+ this.description = description;
|
|
+ this.players = players;
|
|
+ this.version = version;
|
|
+ this.favicon = favicon;
|
|
+ this.enforcesSecureChat = enforcesSecureChat;
|
|
+ }
|
|
+
|
|
+ public Component description() {
|
|
+ return description;
|
|
+ }
|
|
+
|
|
+ public Optional<Players> players() {
|
|
+ return players;
|
|
+ }
|
|
+
|
|
+ public Optional<Version> version() {
|
|
+ return version;
|
|
+ }
|
|
+
|
|
+ public Optional<Favicon> favicon() {
|
|
+ return favicon;
|
|
+ }
|
|
+
|
|
+ public boolean enforcesSecureChat() {
|
|
+ return enforcesSecureChat;
|
|
+ }
|
|
+
|
|
+ public boolean preventsChatReports() {
|
|
+ var self = (ServerStatus) (Object) this;
|
|
+
|
|
+ if (self.version().isPresent() && self.version().get().protocol() < 759
|
|
+ && self.version().get().protocol() > 0)
|
|
+ return true;
|
|
+
|
|
+ return this.preventsChatReports;
|
|
+ }
|
|
+
|
|
+ public void setPreventsChatReports(boolean prevents) {
|
|
+ this.preventsChatReports = prevents;
|
|
+ }
|
|
+ // DivineMC end - Implement NoChatReports
|
|
+
|
|
public record Favicon(byte[] iconBytes) {
|
|
private static final String PREFIX = "data:image/png;base64,";
|
|
public static final Codec<ServerStatus.Favicon> CODEC = Codec.STRING.comapFlatMap(string -> {
|
|
diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java
|
|
index 104a9ec97bd39e15f6707f19865fa6fcf47f6e4f..46adbe6ccf1e4291e33a52a6612f624558c18f96 100644
|
|
--- a/net/minecraft/server/dedicated/DedicatedServer.java
|
|
+++ b/net/minecraft/server/dedicated/DedicatedServer.java
|
|
@@ -623,6 +623,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
|
|
|
|
@Override
|
|
public boolean enforceSecureProfile() {
|
|
+ if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled) return false; // DivineMC - Implement NoChatReports
|
|
DedicatedServerProperties properties = this.getProperties();
|
|
// Paper start - Add setting for proxy online mode status
|
|
return properties.enforceSecureProfile
|
|
diff --git a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
|
|
index 1975aeecbfdebaacecae1c43005d4ff26fa6a263..e5d6e5ec12168936d6d50b2f38a3cb58150b0af1 100644
|
|
--- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
|
|
+++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
|
|
@@ -343,10 +343,64 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
|
|
}
|
|
|
|
public void send(Packet<?> packet) {
|
|
+ // DivineMC start - Implement NoChatReports
|
|
+ if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled) {
|
|
+ Object self = this;
|
|
+ boolean cancel = false;
|
|
+
|
|
+ if (self instanceof ServerGamePacketListenerImpl listener) {
|
|
+ if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsDebugLog && packet instanceof net.minecraft.network.protocol.game.ClientboundPlayerChatPacket chat) {
|
|
+ MinecraftServer.LOGGER.info("Sending message: {}", chat.unsignedContent() != null ? chat.unsignedContent()
|
|
+ : chat.body().content());
|
|
+ }
|
|
+
|
|
+ if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsConvertToGameMessage) {
|
|
+ if (packet instanceof net.minecraft.network.protocol.game.ClientboundPlayerChatPacket chat) {
|
|
+ packet = new net.minecraft.network.protocol.game.ClientboundSystemChatPacket(chat.chatType().decorate(
|
|
+ chat.unsignedContent() != null ? chat.unsignedContent()
|
|
+ : Component.literal(chat.body().content())
|
|
+ ), false);
|
|
+
|
|
+ cancel = true;
|
|
+ listener.send(packet);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (cancel) {
|
|
+ return;
|
|
+ }
|
|
+ }
|
|
+ // DivineMC end - Implement NoChatReports
|
|
this.send(packet, null);
|
|
}
|
|
|
|
public void send(Packet<?> packet, @Nullable ChannelFutureListener channelFutureListener) {
|
|
+ // DivineMC start - Implement NoChatReports
|
|
+ if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled) {
|
|
+ Object self = this;
|
|
+ boolean cancel = false;
|
|
+
|
|
+ if (self instanceof ServerGamePacketListenerImpl listenerImpl) {
|
|
+ if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsDebugLog && packet instanceof net.minecraft.network.protocol.game.ClientboundPlayerChatPacket chat) {
|
|
+ MinecraftServer.LOGGER.info("Sending message: {}", chat.unsignedContent() != null ? chat.unsignedContent()
|
|
+ : chat.body().content());
|
|
+ }
|
|
+
|
|
+ if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsConvertToGameMessage) {
|
|
+ if (packet instanceof net.minecraft.network.protocol.game.ClientboundPlayerChatPacket chat && channelFutureListener != null) {
|
|
+ cancel = true;
|
|
+ listenerImpl.send(chat);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ }
|
|
+
|
|
+ if (cancel) {
|
|
+ return;
|
|
+ }
|
|
+ }
|
|
+ // DivineMC end - Implement NoChatReports
|
|
// CraftBukkit start
|
|
if (packet == null || this.processedDisconnect) { // Spigot
|
|
return;
|
|
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
|
|
index 1e4ebfa25e63c148fe7bf6cf5789e602d8e5ca83..259572797f17c3c660de9fd42bb1cebe600fbf27 100644
|
|
--- a/net/minecraft/server/players/PlayerList.java
|
|
+++ b/net/minecraft/server/players/PlayerList.java
|
|
@@ -276,7 +276,7 @@ public abstract class PlayerList {
|
|
!_boolean,
|
|
_boolean2,
|
|
player.createCommonSpawnInfo(serverLevel),
|
|
- this.server.enforceSecureProfile()
|
|
+ org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled || this.server.enforceSecureProfile() // DivineMC - Implement NoChatReports
|
|
)
|
|
);
|
|
player.getBukkitEntity().sendSupportedChannels(); // CraftBukkit
|
|
@@ -1331,6 +1331,7 @@ public abstract class PlayerList {
|
|
}
|
|
|
|
public boolean verifyChatTrusted(PlayerChatMessage message) {
|
|
+ if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled) return true; // DivineMC - Implement NoChatReports
|
|
return message.hasSignature() && !message.hasExpiredServer(Instant.now());
|
|
}
|
|
|