diff --git a/src/main/java/MelonUtilities/config/datatypes/jsonadapters/ConfigJsonAdapter.java b/src/main/java/MelonUtilities/config/datatypes/jsonadapters/ConfigJsonAdapter.java index 39b1ee9..da9bd20 100644 --- a/src/main/java/MelonUtilities/config/datatypes/jsonadapters/ConfigJsonAdapter.java +++ b/src/main/java/MelonUtilities/config/datatypes/jsonadapters/ConfigJsonAdapter.java @@ -24,69 +24,81 @@ public Config deserialize(JsonElement json, Type typeOfT, JsonDeserializationCon } //Extra Categories - JsonObject mainConfig = obj.getAsJsonObject("Main Config"); - JsonObject roleConfig = obj.getAsJsonObject("Role Config"); - JsonObject rollbackConfig = obj.getAsJsonObject("Rollback Config"); - JsonObject elevatorConfig = obj.getAsJsonObject("Elevator Config"); - JsonObject sqlLogConfig = obj.getAsJsonObject("SQL Log Config"); - JsonObject warpConfig = obj.getAsJsonObject("Warp Data"); - JsonObject spawnConfig = obj.getAsJsonObject("Spawn Data"); - JsonObject discordIntegrationConfig = obj.getAsJsonObject("Discord Integration Config"); + JsonObject mainConfig = obj.has("Main Config") ? obj.getAsJsonObject("Main Config") : null; + JsonObject roleConfig = obj.has("Role Config") ? obj.getAsJsonObject("Role Config") : null; + JsonObject rollbackConfig = obj.has("Rollback Config") ? obj.getAsJsonObject("Rollback Config") : null; + JsonObject elevatorConfig = obj.has("Elevator Config") ? obj.getAsJsonObject("Elevator Config") : null; + JsonObject sqlLogConfig = obj.has("SQL Log Config") ? obj.getAsJsonObject("SQL Log Config") : null; + JsonObject warpConfig = obj.has("Warp Data") ? obj.getAsJsonObject("Warp Data") : null; + JsonObject spawnConfig = obj.has("Spawn Data") ? obj.getAsJsonObject("Spawn Data") : null; + JsonObject discordIntegrationConfig = obj.has("Discord Integration Config") ? obj.getAsJsonObject("Discord Integration Config") : null; //Main Options - config.enableContainerLocking = mainConfig.get("enableContainerLocking").getAsBoolean(); - config.enableRoles = mainConfig.get("enableRoles").getAsBoolean(); - config.enableRollback = mainConfig.get("enableRollback").getAsBoolean(); - config.enableTPA = mainConfig.get("enableTPA").getAsBoolean(); - config.enableHomes = mainConfig.get("enableHomes").getAsBoolean(); - config.enableWarps = mainConfig.get("enableWarps").getAsBoolean(); - config.enableSpawn = mainConfig.get("enableSpawn").getAsBoolean(); - config.enableElevators = mainConfig.get("enableElevators").getAsBoolean(); - config.enableKits = mainConfig.get("enableKits").getAsBoolean(); - config.enableRules = mainConfig.get("enableRules").getAsBoolean(); - config.enableSmite = mainConfig.get("enableSmite").getAsBoolean(); - config.enableCrews = mainConfig.get("enableCrews").getAsBoolean(); - config.enableSQLPlayerLogging = mainConfig.get("enableSQLPlayerLogging").getAsBoolean(); - config.enableTXTPlayerLogging = mainConfig.get("enableTXTPlayerLogging").getAsBoolean(); - config.enableDiscordIntegration = mainConfig.get("enableDiscordIntegration").getAsBoolean(); - config.enableMagnets = mainConfig.get("enableMagnets").getAsBoolean(); + if(mainConfig != null){ + config.enableContainerLocking = mainConfig.has("enableContainerLocking") ? mainConfig.get("enableContainerLocking").getAsBoolean() : config.enableContainerLocking; + config.enableRoles = mainConfig.has("enableRoles") ? mainConfig.get("enableRoles").getAsBoolean() : config.enableRoles; + config.enableRollback = mainConfig.has("enableRollback") ? mainConfig.get("enableRollback").getAsBoolean() : config.enableRollback; + config.enableTPA = mainConfig.has("enableTPA") ? mainConfig.get("enableTPA").getAsBoolean() : config.enableTPA; + config.enableHomes = mainConfig.has("enableHomes") ? mainConfig.get("enableHomes").getAsBoolean() : config.enableHomes; + config.enableWarps = mainConfig.has("enableWarps") ? mainConfig.get("enableWarps").getAsBoolean() : config.enableWarps; + config.enableSpawn = mainConfig.has("enableSpawn") ? mainConfig.get("enableSpawn").getAsBoolean() : config.enableSpawn; + config.enableElevators = mainConfig.has("enableElevators") ? mainConfig.get("enableElevators").getAsBoolean() : config.enableElevators; + config.enableKits = mainConfig.has("enableKits") ? mainConfig.get("enableKits").getAsBoolean() : config.enableKits; + config.enableRules = mainConfig.has("enableRules") ? mainConfig.get("enableRules").getAsBoolean() : config.enableRules; + config.enableSmite = mainConfig.has("enableSmite") ? mainConfig.get("enableSmite").getAsBoolean() : config.enableSmite; + config.enableCrews = mainConfig.has("enableCrews") ? mainConfig.get("enableCrews").getAsBoolean() : config.enableCrews; + config.enableSQLPlayerLogging = mainConfig.has("enableSQLPlayerLogging") ? mainConfig.get("enableSQLPlayerLogging").getAsBoolean() : config.enableSQLPlayerLogging; + config.enableTXTPlayerLogging = mainConfig.has("enableTXTPlayerLogging") ? mainConfig.get("enableTXTPlayerLogging").getAsBoolean() : config.enableTXTPlayerLogging; + config.enableDiscordIntegration = mainConfig.has("enableDiscordIntegration") ? mainConfig.get("enableDiscordIntegration").getAsBoolean() : config.enableDiscordIntegration; + config.enableMagnets = mainConfig.has("enableMagnets") ? mainConfig.get("enableMagnets").getAsBoolean() : config.enableMagnets; + } //Role Options - if(roleConfig.has("defaultRole")){ - config.defaultRole = roleConfig.get("defaultRole").getAsString(); + if(roleConfig != null){ + if(roleConfig.has("defaultRole")){ + config.defaultRole = roleConfig.get("defaultRole").getAsString(); + } + config.displayMode = roleConfig.has("displayMode") ? roleConfig.get("displayMode").getAsString() : config.displayMode; } - config.displayMode = roleConfig.get("displayMode").getAsString(); //Rollback Options - config.snapshotsEnabled = rollbackConfig.get("snapshotsEnabled").getAsBoolean(); - config.backupsEnabled = rollbackConfig.get("backupsEnabled").getAsBoolean(); - config.snapshotsImmune = rollbackConfig.get("snapshotsImmune").getAsInt(); - config.backupsImmune = rollbackConfig.get("backupsImmune").getAsInt(); - config.snapshotsLimit = rollbackConfig.get("snapshotsLimit").getAsInt(); - config.backupsLimit = rollbackConfig.get("backupsLimit").getAsInt(); - config.sizeLimit = rollbackConfig.get("sizeLimit").getAsString(); - config.timeBetweenSnapshots = rollbackConfig.get("timeBetweenSnapshots").getAsInt(); - config.timeBetweenBackups = rollbackConfig.get("timeBetweenBackups").getAsInt(); - config.timeBetweenBackupPruning = rollbackConfig.get("timeBetweenBackupPruning").getAsInt(); - config.timeBetweenSnapshotPruning = rollbackConfig.get("timeBetweenSnapshotPruning").getAsInt(); - config.lastSnapshot = rollbackConfig.get("lastSnapshot").getAsDouble(); - config.lastBackup = rollbackConfig.get("lastBackup").getAsDouble(); - config.lastBackupPrune = rollbackConfig.get("lastBackupPrune").getAsDouble(); - config.lastSnapshotPrune = rollbackConfig.get("lastSnapshotPrune").getAsDouble(); + if(rollbackConfig != null){ + config.snapshotsEnabled = rollbackConfig.has("snapshotsEnabled") ? rollbackConfig.get("snapshotsEnabled").getAsBoolean() : config.snapshotsEnabled; + config.backupsEnabled = rollbackConfig.has("backupsEnabled") ? rollbackConfig.get("backupsEnabled").getAsBoolean() : config.backupsEnabled; + config.snapshotsImmune = rollbackConfig.has("snapshotsImmune") ? rollbackConfig.get("snapshotsImmune").getAsInt() : config.snapshotsImmune; + config.backupsImmune = rollbackConfig.has("backupsImmune") ? rollbackConfig.get("backupsImmune").getAsInt() : config.backupsImmune; + config.snapshotsLimit = rollbackConfig.has("snapshotsLimit") ? rollbackConfig.get("snapshotsLimit").getAsInt() : config.snapshotsLimit; + config.backupsLimit = rollbackConfig.has("backupsLimit") ? rollbackConfig.get("backupsLimit").getAsInt() : config.backupsLimit; + config.sizeLimit = rollbackConfig.has("sizeLimit") ? rollbackConfig.get("sizeLimit").getAsString() : config.sizeLimit; + config.timeBetweenSnapshots = rollbackConfig.has("timeBetweenSnapshots") ? rollbackConfig.get("timeBetweenSnapshots").getAsInt() : config.timeBetweenSnapshots; + config.timeBetweenBackups = rollbackConfig.has("timeBetweenBackups") ? rollbackConfig.get("timeBetweenBackups").getAsInt() : config.timeBetweenBackups; + config.timeBetweenBackupPruning = rollbackConfig.has("timeBetweenBackupPruning") ? rollbackConfig.get("timeBetweenBackupPruning").getAsInt() : config.timeBetweenBackupPruning; + config.timeBetweenSnapshotPruning = rollbackConfig.has("timeBetweenSnapshotPruning") ? rollbackConfig.get("timeBetweenSnapshotPruning").getAsInt() : config.timeBetweenSnapshotPruning; + config.lastSnapshot = rollbackConfig.has("lastSnapshot") ? rollbackConfig.get("lastSnapshot").getAsDouble() : config.lastSnapshot; + config.lastBackup = rollbackConfig.has("lastBackup") ? rollbackConfig.get("lastBackup").getAsDouble() : config.lastBackup; + config.lastBackupPrune = rollbackConfig.has("lastBackupPrune") ? rollbackConfig.get("lastBackupPrune").getAsDouble() : config.lastBackupPrune; + config.lastSnapshotPrune = rollbackConfig.has("lastSnapshotPrune") ? rollbackConfig.get("lastSnapshotPrune").getAsDouble() : config.lastSnapshotPrune; + } //Elevator Options - config.allowObstructions = elevatorConfig.get("allowObstructions").getAsBoolean(); - config.elevatorCooldown = elevatorConfig.get("elevatorCooldown").getAsInt(); + if(elevatorConfig != null){ + config.allowObstructions = elevatorConfig.has("allowObstructions") ? elevatorConfig.get("allowObstructions").getAsBoolean() : config.allowObstructions; + config.elevatorCooldown = elevatorConfig.has("elevatorCooldown") ? elevatorConfig.get("elevatorCooldown").getAsInt() : config.elevatorCooldown; + } //SQL Options - config.JDBCConnectionUrl = sqlLogConfig.get("JDBCConnectionUrl").getAsString(); + if(sqlLogConfig != null){ + config.JDBCConnectionUrl = sqlLogConfig.has("JDBCConnectionUrl") ? sqlLogConfig.get("JDBCConnectionUrl").getAsString() : config.JDBCConnectionUrl; + } //Discord Options - config.token = discordIntegrationConfig.get("token").getAsString(); - config.channelID = discordIntegrationConfig.get("channelID").getAsString(); - config.serverPFPURL = discordIntegrationConfig.get("serverPFPURL").getAsString(); - config.serverName = discordIntegrationConfig.get("serverName").getAsString(); + if(discordIntegrationConfig != null){ + config.token = discordIntegrationConfig.has("token") ? discordIntegrationConfig.get("token").getAsString() : config.token; + config.channelID = discordIntegrationConfig.has("channelID") ? discordIntegrationConfig.get("channelID").getAsString() : config.channelID; + config.serverPFPURL = discordIntegrationConfig.has("serverPFPURL") ? discordIntegrationConfig.get("serverPFPURL").getAsString() : config.serverPFPURL; + config.serverName = discordIntegrationConfig.has("serverName") ? discordIntegrationConfig.get("serverName").getAsString() : config.serverName; + } //Warp Options if(warpConfig != null){ diff --git a/src/main/java/MelonUtilities/mixins/MinecraftServerMixinDiscord.java b/src/main/java/MelonUtilities/mixins/MinecraftServerMixinDiscord.java index 65da186..38dc481 100644 --- a/src/main/java/MelonUtilities/mixins/MinecraftServerMixinDiscord.java +++ b/src/main/java/MelonUtilities/mixins/MinecraftServerMixinDiscord.java @@ -1,5 +1,6 @@ package MelonUtilities.mixins; +import MelonUtilities.config.Data; import MelonUtilities.utility.discord.DiscordChatRelay; import net.minecraft.server.MinecraftServer; import org.spongepowered.asm.mixin.Mixin; @@ -12,9 +13,15 @@ public class MinecraftServerMixinDiscord { @Inject( method = "initiateShutdown", - at = @At("HEAD") + at = @At("HEAD"), + require = 0 ) - public void sendStopMessage(CallbackInfo ci) { + private void sendStopMessage(CallbackInfo ci) { + // Only process if Discord integration is enabled + if (!Data.MainConfig.config.enableDiscordIntegration) { + return; + } + DiscordChatRelay.sendServerStoppedMessage(); } diff --git a/src/main/java/MelonUtilities/mixins/PacketHandlerLoginMixinDiscord.java b/src/main/java/MelonUtilities/mixins/PacketHandlerLoginMixinDiscord.java index 9be11e6..8b5ad04 100644 --- a/src/main/java/MelonUtilities/mixins/PacketHandlerLoginMixinDiscord.java +++ b/src/main/java/MelonUtilities/mixins/PacketHandlerLoginMixinDiscord.java @@ -1,5 +1,6 @@ package MelonUtilities.mixins; +import MelonUtilities.config.Data; import MelonUtilities.utility.discord.DiscordChatRelay; import net.minecraft.core.net.packet.PacketLogin; import net.minecraft.server.entity.player.PlayerServer; @@ -20,10 +21,24 @@ public class PacketHandlerLoginMixinDiscord { shift = At.Shift.BEFORE, ordinal = 0 ), - locals = LocalCapture.CAPTURE_FAILHARD + locals = LocalCapture.CAPTURE_FAILHARD, + require = 0 ) - void sendJoinMessage(PacketLogin packet1login, CallbackInfo ci, PlayerServer player) { + private void sendJoinMessage(PacketLogin packet1login, CallbackInfo ci, PlayerServer player) { + // Only process if Discord integration is enabled + if (!Data.MainConfig.config.enableDiscordIntegration) { + return; + } + + if (player == null) { + return; + } + String username = player.username; + if (username == null || username.isEmpty()) { + return; + } + DiscordChatRelay.sendJoinLeaveMessage(username, true); } } diff --git a/src/main/java/MelonUtilities/mixins/PacketHandlerServerMixinDiscord.java b/src/main/java/MelonUtilities/mixins/PacketHandlerServerMixinDiscord.java index 50a8c21..f07c3bc 100644 --- a/src/main/java/MelonUtilities/mixins/PacketHandlerServerMixinDiscord.java +++ b/src/main/java/MelonUtilities/mixins/PacketHandlerServerMixinDiscord.java @@ -2,41 +2,65 @@ import MelonUtilities.config.Data; import MelonUtilities.utility.discord.DiscordChatRelay; -import net.minecraft.core.net.ChatEmotes; +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.core.net.packet.PacketChat; import net.minecraft.server.entity.player.PlayerServer; import net.minecraft.server.net.handler.PacketHandlerServer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = PacketHandlerServer.class, remap = false) public class PacketHandlerServerMixinDiscord { @Shadow private PlayerServer playerEntity; - @Redirect(method = "handleChat", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/net/ChatEmotes;process(Ljava/lang/String;)Ljava/lang/String;")) - String redirectChatHandle(String s) { - String message = ChatEmotes.process(s); - + @Inject( + method = "handleChat", + at = @At(value = "INVOKE", target = "Lnet/minecraft/core/net/ChatEmotes;process(Ljava/lang/String;)Ljava/lang/String;", shift = At.Shift.AFTER), + require = 0 + ) + private void onChatProcessed(PacketChat packet, CallbackInfo ci, @Local String message) { + // Only process if Discord integration is enabled if (!Data.MainConfig.config.enableDiscordIntegration) { - return message; + return; + } + + if (playerEntity == null) { + return; } String username = playerEntity.username; + if (username == null || username.isEmpty()) { + return; + } + // 'message' is the processed message from ChatEmotes.process + // Send to Discord DiscordChatRelay.sendToDiscord(username, message); - - return message; } @Inject( method = "handleErrorMessage", - at = @At("HEAD") + at = @At("HEAD"), + require = 0 ) - void sendLeaveMessage(String s, Object[] aobj, CallbackInfo ci) { + private void sendLeaveMessage(String s, Object[] aobj, CallbackInfo ci) { + // Only process if Discord integration is enabled + if (!Data.MainConfig.config.enableDiscordIntegration) { + return; + } + + if (playerEntity == null) { + return; + } + String username = playerEntity.username; + if (username == null || username.isEmpty()) { + return; + } + DiscordChatRelay.sendJoinLeaveMessage(username, false); } } diff --git a/src/main/resources/MelonUtilities.mixins.json b/src/main/resources/MelonUtilities.mixins.json index fa3cef4..d7fefee 100644 --- a/src/main/resources/MelonUtilities.mixins.json +++ b/src/main/resources/MelonUtilities.mixins.json @@ -5,7 +5,7 @@ "compatibilityLevel": "JAVA_8", "mixins": [ "CommandManagerMixin", - "SpawnCommandMixin" + "SpawnCommandMixin", "PaintBrushMixin", "PlayerMixinElevator" ],