From bbb5eab2269cc5ce5d2b9f873aa8f9f1e3fd9a9a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 31 Mar 2026 23:04:20 +0000 Subject: [PATCH 1/3] Initial plan From 74967210c1878c2270a41d1de72e53c079df7396 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 31 Mar 2026 23:15:00 +0000 Subject: [PATCH 2/3] fix: ensure config reloads fully apply (API key, log level, and more) Agent-Logs-Url: https://github.com/PixelMindMC/PixelChatGuardian/sessions/ab9087c2-485b-4c49-8040-6292f52e9084 Co-authored-by: ToothyDev <55001472+ToothyDev@users.noreply.github.com> --- gradlew | 0 .../de/pixelmindmc/pixelchat/PixelChat.java | 32 +++++++++++++++++++ .../pixelchat/commands/PixelChatCommand.java | 30 ++++++++--------- .../listener/AsyncPlayerChatListener.java | 10 ++---- .../pixelchat/utils/APIHelper.java | 16 ++-------- .../pixelchat/utils/ChatGuardHelper.java | 14 ++++---- 6 files changed, 56 insertions(+), 46 deletions(-) mode change 100644 => 100755 gradlew diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/src/main/java/de/pixelmindmc/pixelchat/PixelChat.java b/src/main/java/de/pixelmindmc/pixelchat/PixelChat.java index d9cd3f6..1ec5fde 100644 --- a/src/main/java/de/pixelmindmc/pixelchat/PixelChat.java +++ b/src/main/java/de/pixelmindmc/pixelchat/PixelChat.java @@ -109,6 +109,36 @@ private void loadConfigs() { } } + /** + * Reloads all plugin configurations and re-initializes dependent components + */ + public void reloadPlugin() { + getLoggingHelper().debug("Reloading plugin"); + + // Reload all configuration files + configHelper.loadConfig(); + configHelperPlayerStrikes.loadConfig(); + configHelperEmojiList.loadConfig(); + configHelperChatCodesList.loadConfig(); + configHelperLangCustom.loadConfig(); + configHelperLangGerman.loadConfig(); + configHelperLangEnglish.loadConfig(); + configHelperLangSpanish.loadConfig(); + configHelperLangFrench.loadConfig(); + configHelperLangDutch.loadConfig(); + configHelperLangSimplifiedChinese.loadConfig(); + configHelperLangTraditionalChinese.loadConfig(); + + // Update the log level from the reloaded config + loggingHelper.setLogLevel(getConfigHelper().getString(ConfigConstants.General.LOG_LEVEL)); + + // Re-initialize the API helper so new API key / endpoint / model values take effect + registerAPIHelper(); + + // Re-initialize the ChatGuard helper so it picks up the refreshed language config + registerChatGuardHelper(); + } + /** * Retrieves the plugin configuration * @@ -217,12 +247,14 @@ private void registerAPIHelper() { // Check if the Chatguard module is active if (!getConfigHelper().getBoolean(ConfigConstants.Modules.CHATGUARD)) { + apiHelper = null; return; } // Check if the config file exists and API key is either unset or still at its default value if (apiKey.isEmpty() || getConfigHelper().getFileExist() && Objects.equals(apiKey, "API-KEY")) { getLoggingHelper().warning(getConfigHelperLanguage().getString(LangConstants.Global.NO_API_KEY_SET)); + apiHelper = null; return; } diff --git a/src/main/java/de/pixelmindmc/pixelchat/commands/PixelChatCommand.java b/src/main/java/de/pixelmindmc/pixelchat/commands/PixelChatCommand.java index 2effb84..3404bf4 100644 --- a/src/main/java/de/pixelmindmc/pixelchat/commands/PixelChatCommand.java +++ b/src/main/java/de/pixelmindmc/pixelchat/commands/PixelChatCommand.java @@ -35,7 +35,6 @@ public class PixelChatCommand implements CommandExecutor { private final @NotNull LoggingHelper loggingHelper; private final @NotNull ConfigHelper configHelper; private final @NotNull ConfigHelper configHelperPlayerStrikes; - private final @NotNull ConfigHelper configHelperLanguage; /** * Constructs a PixelChatCommand object @@ -47,7 +46,6 @@ public PixelChatCommand(@NotNull PixelChat plugin) { this.loggingHelper = plugin.getLoggingHelper(); this.configHelper = plugin.getConfigHelper(); this.configHelperPlayerStrikes = plugin.getConfigHelperPlayerStrikes(); - this.configHelperLanguage = plugin.getConfigHelperLanguage(); } /** @@ -63,7 +61,7 @@ public PixelChatCommand(@NotNull PixelChat plugin) { public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String @NotNull [] args) { // Display usage information if no arguments are provided if (args.length == 0) { - sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + configHelperLanguage.getString(LangConstants.Global.INVALID_SYNTAX) + " " + ChatColor.RESET + configHelperLanguage.getString(LangConstants.Global.INVALID_SYNTAX_USAGE) + label + " "); + sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.Global.INVALID_SYNTAX) + " " + ChatColor.RESET + plugin.getConfigHelperLanguage().getString(LangConstants.Global.INVALID_SYNTAX_USAGE) + label + " "); return true; } @@ -73,7 +71,7 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command case "version" -> handleVersionSubcommand(sender, label, args); case "reload" -> handleReloadSubcommand(sender, label, args); default -> - sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + configHelperLanguage.getString(LangConstants.Global.INVALID_SYNTAX) + " " + ChatColor.RESET + configHelperLanguage.getString(LangConstants.Global.INVALID_SYNTAX_USAGE) + " " + label + " "); + sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.Global.INVALID_SYNTAX) + " " + ChatColor.RESET + plugin.getConfigHelperLanguage().getString(LangConstants.Global.INVALID_SYNTAX_USAGE) + " " + label + " "); } return true; @@ -89,14 +87,14 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command private void handleVersionSubcommand(@NotNull CommandSender sender, @NotNull String label, @NotNull String @NotNull [] args) { // Check if the player has the required permission if (!sender.hasPermission(PermissionConstants.Commands.VERSION) & sender.hasPermission(PermissionConstants.Commands.RELOAD) & !sender.hasPermission(PermissionConstants.Commands.VERSION) & !sender.hasPermission(PermissionConstants.Commands.VERSION)) { - sender.sendMessage(ChatColor.RED + configHelperLanguage.getString(LangConstants.Global.NO_PERMISSION)); + sender.sendMessage(ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.Global.NO_PERMISSION)); return; } // Check if the command syntax is correct if (args.length != 1) { - sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + configHelperLanguage.getString(LangConstants.Global.INVALID_SYNTAX) + " " + ChatColor.RESET + configHelperLanguage.getString(LangConstants.Global.INVALID_SYNTAX_USAGE) + " " + label + " version"); + sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.Global.INVALID_SYNTAX) + " " + ChatColor.RESET + plugin.getConfigHelperLanguage().getString(LangConstants.Global.INVALID_SYNTAX_USAGE) + " " + label + " version"); return; } @@ -109,11 +107,11 @@ private void handleVersionSubcommand(@NotNull CommandSender sender, @NotNull Str // Display plugin information sender.sendMessage(LangConstants.PLUGIN_PREFIX + headerFooter); sender.sendMessage(LangConstants.PLUGIN_PREFIX); - sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + configHelperLanguage.getString(LangConstants.PixelChatCommand.VERSION) + " " + ChatColor.WHITE + description.getVersion()); - sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + configHelperLanguage.getString(LangConstants.PixelChatCommand.DEVELOPER) + " " + ChatColor.WHITE + authors); - sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + configHelperLanguage.getString(LangConstants.PixelChatCommand.PLUGIN_WEBSITE)); + sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.PixelChatCommand.VERSION) + " " + ChatColor.WHITE + description.getVersion()); + sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.PixelChatCommand.DEVELOPER) + " " + ChatColor.WHITE + authors); + sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.PixelChatCommand.PLUGIN_WEBSITE)); sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.WHITE + description.getWebsite()); - sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + configHelperLanguage.getString(LangConstants.PixelChatCommand.REPORT_BUGS)); + sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.PixelChatCommand.REPORT_BUGS)); sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.WHITE + "https://github.com/PixelMindMC/PixelChatGuardian/issues"); sender.sendMessage(LangConstants.PLUGIN_PREFIX); sender.sendMessage(LangConstants.PLUGIN_PREFIX + headerFooter); @@ -134,28 +132,26 @@ private void handleVersionSubcommand(@NotNull CommandSender sender, @NotNull Str private void handleReloadSubcommand(@NotNull CommandSender sender, @NotNull String label, @NotNull String @NotNull [] args) { // Check if the player has the required permission if (!sender.hasPermission(PermissionConstants.Commands.RELOAD)) { - sender.sendMessage(ChatColor.RED + configHelperLanguage.getString(LangConstants.Global.NO_PERMISSION)); + sender.sendMessage(ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.Global.NO_PERMISSION)); return; } // Check if the command syntax is correct if (args.length != 1) { - sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + configHelperLanguage.getString(LangConstants.Global.INVALID_SYNTAX) + " " + ChatColor.RESET + configHelperLanguage.getString(LangConstants.Global.INVALID_SYNTAX_USAGE) + " " + label + " " + "reload"); + sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.Global.INVALID_SYNTAX) + " " + ChatColor.RESET + plugin.getConfigHelperLanguage().getString(LangConstants.Global.INVALID_SYNTAX_USAGE) + " " + label + " " + "reload"); return; } - // Reload the plugin configurations - configHelper.loadConfig(); - configHelperPlayerStrikes.loadConfig(); - configHelperLanguage.loadConfig(); + // Reload all plugin configurations and re-initialize dependent components + plugin.reloadPlugin(); // Debug logger message loggingHelper.debug("Configuration files successfully reloaded"); // Send a message after successfully reloading the configurations - sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.GREEN + configHelperLanguage.getString(LangConstants.PixelChatCommand.RELOAD)); + sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.GREEN + plugin.getConfigHelperLanguage().getString(LangConstants.PixelChatCommand.RELOAD)); } /** diff --git a/src/main/java/de/pixelmindmc/pixelchat/listener/AsyncPlayerChatListener.java b/src/main/java/de/pixelmindmc/pixelchat/listener/AsyncPlayerChatListener.java index 263311e..25fbf4d 100644 --- a/src/main/java/de/pixelmindmc/pixelchat/listener/AsyncPlayerChatListener.java +++ b/src/main/java/de/pixelmindmc/pixelchat/listener/AsyncPlayerChatListener.java @@ -33,7 +33,6 @@ public class AsyncPlayerChatListener implements Listener { private final @NotNull LoggingHelper loggingHelper; private final @NotNull ConfigHelper configHelper; private final @NotNull ChatGuardHelper chatGuardHelper; - private boolean chatGuardEnabled = false; private boolean emojiEnabled = false; private boolean chatCodesEnabled = false; @@ -54,13 +53,8 @@ public AsyncPlayerChatListener(@NotNull PixelChat plugin) { @NotNull ConfigHelper configHelperEmojiList = plugin.getConfigHelperEmojiList(); @NotNull ConfigHelper configHelperChatCodesList = plugin.getConfigHelperChatCodesList(); - // Chatguard module - if (plugin.getAPIHelper() != null) { - this.chatGuardEnabled = true; - } - // Initialize CarbonChat integration if available - if (chatGuardEnabled && configHelper.getBoolean(ConfigConstants.PluginSupport.CARBONCHAT) && setupCarbonChatIntegration()) { + if (plugin.getAPIHelper() != null && configHelper.getBoolean(ConfigConstants.PluginSupport.CARBONCHAT) && setupCarbonChatIntegration()) { carbonChatIntegration.registerCarbonChatListener(); } @@ -109,7 +103,7 @@ private void onAsyncPlayerChat(@NotNull AsyncPlayerChatEvent event) { boolean chatGuardMessageBlocked = false; // AI based chat guard module - if (chatGuardEnabled && carbonChatIntegration == null && !player.hasPermission(PermissionConstants.Moderation.BYPASS_CHAT_MODERATION)) { + if (plugin.getAPIHelper() != null && carbonChatIntegration == null && !player.hasPermission(PermissionConstants.Moderation.BYPASS_CHAT_MODERATION)) { chatGuardMessageBlocked = checkIfMessageShouldBeBlocked(event, message, player); } diff --git a/src/main/java/de/pixelmindmc/pixelchat/utils/APIHelper.java b/src/main/java/de/pixelmindmc/pixelchat/utils/APIHelper.java index b6eefc3..896e18d 100644 --- a/src/main/java/de/pixelmindmc/pixelchat/utils/APIHelper.java +++ b/src/main/java/de/pixelmindmc/pixelchat/utils/APIHelper.java @@ -33,11 +33,6 @@ public class APIHelper { private final @NotNull LoggingHelper loggingHelper; private final @NotNull ConfigHelper configHelper; - private final String aiModel; - private final String apiUrl; - private final String apiKey; - private final String sysPrompt; - /** * Constructs a APIHelper object * @@ -46,11 +41,6 @@ public class APIHelper { public APIHelper(@NotNull PixelChat plugin) { this.loggingHelper = plugin.getLoggingHelper(); this.configHelper = plugin.getConfigHelper(); - - this.apiUrl = configHelper.getString(ConfigConstants.API.ENDPOINT); - this.aiModel = configHelper.getString(ConfigConstants.API.MODEL); - this.apiKey = configHelper.getString(ConfigConstants.API.KEY); - this.sysPrompt = configHelper.getString(ConfigConstants.API.SYSTEM_PROMPT); } /** @@ -92,11 +82,11 @@ public APIHelper(@NotNull PixelChat plugin) { * @throws URISyntaxException Thrown if the set API URL isn't valid */ private @NotNull HttpURLConnection createConnection() throws IOException, URISyntaxException { - URL url = new URI(apiUrl).toURL(); + URL url = new URI(configHelper.getString(ConfigConstants.API.ENDPOINT)).toURL(); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json"); - connection.setRequestProperty("Authorization", "Bearer " + apiKey); + connection.setRequestProperty("Authorization", "Bearer " + configHelper.getString(ConfigConstants.API.KEY)); connection.setDoOutput(true); return connection; @@ -110,7 +100,7 @@ public APIHelper(@NotNull PixelChat plugin) { * @throws IOException If any issue happens, an exception is thrown */ private void sendRequest(@NotNull HttpURLConnection connection, @NotNull String message) throws IOException { - Map json = Map.of("model", aiModel, "messages", new Map[]{Map.of("role", "system", APIConstants.General.CONTENT, sysPrompt + "Language: " + configHelper.getString(ConfigConstants.General.LANGUAGE)), Map.of("role", "user", APIConstants.General.CONTENT, message)}, "response_format", Map.of("type", "json_object")); + Map json = Map.of("model", configHelper.getString(ConfigConstants.API.MODEL), "messages", new Map[]{Map.of("role", "system", APIConstants.General.CONTENT, configHelper.getString(ConfigConstants.API.SYSTEM_PROMPT) + "Language: " + configHelper.getString(ConfigConstants.General.LANGUAGE)), Map.of("role", "user", APIConstants.General.CONTENT, message)}, "response_format", Map.of("type", "json_object")); String jsonInputString = new Gson().toJson(json); diff --git a/src/main/java/de/pixelmindmc/pixelchat/utils/ChatGuardHelper.java b/src/main/java/de/pixelmindmc/pixelchat/utils/ChatGuardHelper.java index cddf28a..e95fe0d 100644 --- a/src/main/java/de/pixelmindmc/pixelchat/utils/ChatGuardHelper.java +++ b/src/main/java/de/pixelmindmc/pixelchat/utils/ChatGuardHelper.java @@ -27,7 +27,6 @@ public class ChatGuardHelper { private final @NotNull PixelChat plugin; private final @NotNull LoggingHelper loggingHelper; private final @NotNull ConfigHelper configHelper; - private final @NotNull ConfigHelper configHelperLanguage; /** * Constructs a ChatGuardHelper object @@ -36,7 +35,6 @@ public ChatGuardHelper(@NotNull PixelChat plugin) { this.plugin = plugin; this.loggingHelper = plugin.getLoggingHelper(); this.configHelper = plugin.getConfigHelper(); - this.configHelperLanguage = plugin.getConfigHelperLanguage(); } /** @@ -55,7 +53,7 @@ public void notifyAndStrikePlayer(@NotNull Player player, @NotNull String userMe // Debug logger message loggingHelper.debug("Notify player"); - String playerMessage = chatGuardPrefix + configHelperLanguage.getString(blockOrCensor ? LangConstants.ChatGuard.Player.MESSAGE_BLOCKED : LangConstants.ChatGuard.Player.MESSAGE_CENSORED) + " " + ChatColor.RED + classification.reason(); + String playerMessage = chatGuardPrefix + plugin.getConfigHelperLanguage().getString(blockOrCensor ? LangConstants.ChatGuard.Player.MESSAGE_BLOCKED : LangConstants.ChatGuard.Player.MESSAGE_CENSORED) + " " + ChatColor.RED + classification.reason(); player.sendMessage(playerMessage); } @@ -64,7 +62,7 @@ public void notifyAndStrikePlayer(@NotNull Player player, @NotNull String userMe // Debug logger message loggingHelper.debug("Notify online admins with the 'pixelchat.strike-notify' permission"); - String adminMessage = chatGuardPrefix + configHelperLanguage.getString(blockOrCensor ? LangConstants.ChatGuard.Admin.MESSAGE_BLOCKED : LangConstants.ChatGuard.Admin.MESSAGE_CENSORED).replace("[message]", ChatColor.GRAY + userMessage + ChatColor.RESET).replace("[player]", ChatColor.RED + player.getName() + ChatColor.RESET) + " " + ChatColor.RED + classification.reason(); + String adminMessage = chatGuardPrefix + plugin.getConfigHelperLanguage().getString(blockOrCensor ? LangConstants.ChatGuard.Admin.MESSAGE_BLOCKED : LangConstants.ChatGuard.Admin.MESSAGE_CENSORED).replace("[message]", ChatColor.GRAY + userMessage + ChatColor.RESET).replace("[player]", ChatColor.RED + player.getName() + ChatColor.RESET) + " " + ChatColor.RED + classification.reason(); Collection onlinePlayers = Bukkit.getOnlinePlayers(); for (Player admin : onlinePlayers) { @@ -74,7 +72,7 @@ public void notifyAndStrikePlayer(@NotNull Player player, @NotNull String userMe } } - String loggerMessage = configHelperLanguage.getString(blockOrCensor ? LangConstants.ChatGuard.Admin.MESSAGE_BLOCKED : LangConstants.ChatGuard.Admin.MESSAGE_CENSORED).replace("[MESSAGE]", userMessage).replace("[PLAYER]", player.getName()) + " " + ChatColor.RED + classification.reason(); + String loggerMessage = plugin.getConfigHelperLanguage().getString(blockOrCensor ? LangConstants.ChatGuard.Admin.MESSAGE_BLOCKED : LangConstants.ChatGuard.Admin.MESSAGE_CENSORED).replace("[MESSAGE]", userMessage).replace("[PLAYER]", player.getName()) + " " + ChatColor.RED + classification.reason(); loggingHelper.info(loggerMessage); @@ -118,15 +116,15 @@ public void runStrikeSystem(@NotNull UUID playerUUID, @NotNull String playerName // Check if the player has reached the threshold for punishment if (strikes >= strikesToKick && strikes < strikesToTempBan) { // Player has enough strikes to be kicked - executeCommand(configHelper.getString(ConfigConstants.ChatGuard.StrikeSystem.Commands.KICK), playerName, configHelperLanguage.getString(LangConstants.ChatGuard.Player.KICK) + " " + reason); + executeCommand(configHelper.getString(ConfigConstants.ChatGuard.StrikeSystem.Commands.KICK), playerName, plugin.getConfigHelperLanguage().getString(LangConstants.ChatGuard.Player.KICK) + " " + reason); action = "KICK"; } else if (strikes >= strikesToTempBan && strikes < strikesToBan) { // Player has enough strikes to be temporarily banned - executeCommand(plugin.getConfigHelper().getString(ConfigConstants.ChatGuard.StrikeSystem.Commands.TEMP_BAN), playerName, configHelperLanguage.getString(LangConstants.ChatGuard.Player.BAN_TEMPORARY) + " " + reason); + executeCommand(plugin.getConfigHelper().getString(ConfigConstants.ChatGuard.StrikeSystem.Commands.TEMP_BAN), playerName, plugin.getConfigHelperLanguage().getString(LangConstants.ChatGuard.Player.BAN_TEMPORARY) + " " + reason); action = "TEMP-BAN"; } else if (strikes >= strikesToBan) { // Player has enough strikes to be permanently banned - executeCommand(plugin.getConfigHelper().getString(ConfigConstants.ChatGuard.StrikeSystem.Commands.BAN), playerName, configHelperLanguage.getString(LangConstants.ChatGuard.Player.BAN_PERMANENT) + " " + reason); + executeCommand(plugin.getConfigHelper().getString(ConfigConstants.ChatGuard.StrikeSystem.Commands.BAN), playerName, plugin.getConfigHelperLanguage().getString(LangConstants.ChatGuard.Player.BAN_PERMANENT) + " " + reason); action = "BAN"; } From dedaef1ff38cfade0351cd1673b23de4d8381673 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 12 May 2026 17:42:42 +0000 Subject: [PATCH 3/3] refactor: resolve language ConfigHelper as local variable per method instead of inline getter calls Agent-Logs-Url: https://github.com/PixelMindMC/PixelChatGuardian/sessions/54e9aa28-56d1-4d25-8493-a6fcf24c8704 Co-authored-by: ToothyDev <55001472+ToothyDev@users.noreply.github.com> --- .../pixelchat/commands/PixelChatCommand.java | 31 ++++++++++++------- .../pixelchat/utils/APIHelper.java | 2 +- .../pixelchat/utils/ChatGuardHelper.java | 14 +++++---- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/main/java/de/pixelmindmc/pixelchat/commands/PixelChatCommand.java b/src/main/java/de/pixelmindmc/pixelchat/commands/PixelChatCommand.java index 8e983b6..819dfff 100644 --- a/src/main/java/de/pixelmindmc/pixelchat/commands/PixelChatCommand.java +++ b/src/main/java/de/pixelmindmc/pixelchat/commands/PixelChatCommand.java @@ -71,9 +71,11 @@ public PixelChatCommand(@NotNull PixelChat plugin) { */ @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String @NotNull [] args) { + ConfigHelper configHelperLanguage = plugin.getConfigHelperLanguage(); + // Display usage information if no arguments are provided if (args.length == 0) { - sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.Global.INVALID_SYNTAX) + " " + ChatColor.RESET + plugin.getConfigHelperLanguage().getString(LangConstants.Global.INVALID_SYNTAX_USAGE) + label + " "); + sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + configHelperLanguage.getString(LangConstants.Global.INVALID_SYNTAX) + " " + ChatColor.RESET + configHelperLanguage.getString(LangConstants.Global.INVALID_SYNTAX_USAGE) + label + " "); return true; } @@ -83,7 +85,7 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command case "version" -> handleVersionSubcommand(sender, label, args); case "reload" -> handleReloadSubcommand(sender, label, args); default -> - sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.Global.INVALID_SYNTAX) + " " + ChatColor.RESET + plugin.getConfigHelperLanguage().getString(LangConstants.Global.INVALID_SYNTAX_USAGE) + " " + label + " "); + sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + configHelperLanguage.getString(LangConstants.Global.INVALID_SYNTAX) + " " + ChatColor.RESET + configHelperLanguage.getString(LangConstants.Global.INVALID_SYNTAX_USAGE) + " " + label + " "); } return true; @@ -97,16 +99,18 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command * @param args The arguments */ private void handleVersionSubcommand(@NotNull CommandSender sender, @NotNull String label, @NotNull String @NotNull [] args) { + ConfigHelper configHelperLanguage = plugin.getConfigHelperLanguage(); + // Check if the player has the required permission if (!sender.hasPermission(PermissionConstants.Commands.VERSION) && sender.hasPermission(PermissionConstants.Commands.RELOAD) && !sender.hasPermission(PermissionConstants.Commands.VERSION) && !sender.hasPermission(PermissionConstants.Commands.VERSION)) { - sender.sendMessage(ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.Global.NO_PERMISSION)); + sender.sendMessage(ChatColor.RED + configHelperLanguage.getString(LangConstants.Global.NO_PERMISSION)); return; } // Check if the command syntax is correct if (args.length != 1) { - sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.Global.INVALID_SYNTAX) + " " + ChatColor.RESET + plugin.getConfigHelperLanguage().getString(LangConstants.Global.INVALID_SYNTAX_USAGE) + " " + label + " version"); + sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + configHelperLanguage.getString(LangConstants.Global.INVALID_SYNTAX) + " " + ChatColor.RESET + configHelperLanguage.getString(LangConstants.Global.INVALID_SYNTAX_USAGE) + " " + label + " version"); return; } @@ -119,11 +123,11 @@ private void handleVersionSubcommand(@NotNull CommandSender sender, @NotNull Str // Display plugin information sender.sendMessage(LangConstants.PLUGIN_PREFIX + headerFooter); sender.sendMessage(LangConstants.PLUGIN_PREFIX); - sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.PixelChatCommand.VERSION) + " " + ChatColor.WHITE + description.getVersion()); - sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.PixelChatCommand.DEVELOPER) + " " + ChatColor.WHITE + authors); - sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.PixelChatCommand.PLUGIN_WEBSITE)); + sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + configHelperLanguage.getString(LangConstants.PixelChatCommand.VERSION) + " " + ChatColor.WHITE + description.getVersion()); + sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + configHelperLanguage.getString(LangConstants.PixelChatCommand.DEVELOPER) + " " + ChatColor.WHITE + authors); + sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + configHelperLanguage.getString(LangConstants.PixelChatCommand.PLUGIN_WEBSITE)); sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.WHITE + description.getWebsite()); - sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.PixelChatCommand.REPORT_BUGS)); + sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + configHelperLanguage.getString(LangConstants.PixelChatCommand.REPORT_BUGS)); sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.WHITE + "https://github.com/PixelMindMC/PixelChatGuardian/issues"); sender.sendMessage(LangConstants.PLUGIN_PREFIX); sender.sendMessage(LangConstants.PLUGIN_PREFIX + headerFooter); @@ -142,16 +146,18 @@ private void handleVersionSubcommand(@NotNull CommandSender sender, @NotNull Str * @param args The arguments */ private void handleReloadSubcommand(@NotNull CommandSender sender, @NotNull String label, @NotNull String @NotNull [] args) { + ConfigHelper configHelperLanguage = plugin.getConfigHelperLanguage(); + // Check if the player has the required permission if (!sender.hasPermission(PermissionConstants.Commands.RELOAD)) { - sender.sendMessage(ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.Global.NO_PERMISSION)); + sender.sendMessage(ChatColor.RED + configHelperLanguage.getString(LangConstants.Global.NO_PERMISSION)); return; } // Check if the command syntax is correct if (args.length != 1) { - sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + plugin.getConfigHelperLanguage().getString(LangConstants.Global.INVALID_SYNTAX) + " " + ChatColor.RESET + plugin.getConfigHelperLanguage().getString(LangConstants.Global.INVALID_SYNTAX_USAGE) + " " + label + " " + "reload"); + sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.RED + configHelperLanguage.getString(LangConstants.Global.INVALID_SYNTAX) + " " + ChatColor.RESET + configHelperLanguage.getString(LangConstants.Global.INVALID_SYNTAX_USAGE) + " " + label + " " + "reload"); return; } @@ -162,8 +168,11 @@ private void handleReloadSubcommand(@NotNull CommandSender sender, @NotNull Stri // Debug logger message loggingHelper.debug("Configuration files successfully reloaded"); + // Re-resolve after reload in case the configured language changed + configHelperLanguage = plugin.getConfigHelperLanguage(); + // Send a message after successfully reloading the configurations - sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.GREEN + plugin.getConfigHelperLanguage().getString(LangConstants.PixelChatCommand.RELOAD)); + sender.sendMessage(LangConstants.PLUGIN_PREFIX + ChatColor.GREEN + configHelperLanguage.getString(LangConstants.PixelChatCommand.RELOAD)); } /** diff --git a/src/main/java/de/pixelmindmc/pixelchat/utils/APIHelper.java b/src/main/java/de/pixelmindmc/pixelchat/utils/APIHelper.java index 19270b1..b39a328 100644 --- a/src/main/java/de/pixelmindmc/pixelchat/utils/APIHelper.java +++ b/src/main/java/de/pixelmindmc/pixelchat/utils/APIHelper.java @@ -82,7 +82,7 @@ public APIHelper(@NotNull PixelChat plugin) { } catch (IOException e) { throw new MessageClassificationException("Failed to classify message due to an IO issue.", e); } catch (URISyntaxException e) { - throw new MessageClassificationException("Failed to classify message: invalid API endpoint URL '" + apiUrl + "'", e); + throw new MessageClassificationException("Failed to classify message: invalid API endpoint URL '" + configHelper.getString(ConfigConstants.API.ENDPOINT) + "'", e); } catch (Exception e) { throw new MessageClassificationException("Failed to classify message due to an unexpected error.", e); } diff --git a/src/main/java/de/pixelmindmc/pixelchat/utils/ChatGuardHelper.java b/src/main/java/de/pixelmindmc/pixelchat/utils/ChatGuardHelper.java index 08868f1..354b4ce 100644 --- a/src/main/java/de/pixelmindmc/pixelchat/utils/ChatGuardHelper.java +++ b/src/main/java/de/pixelmindmc/pixelchat/utils/ChatGuardHelper.java @@ -58,6 +58,7 @@ public ChatGuardHelper(@NotNull PixelChat plugin) { * @param blockOrCensor Whether the message should be blocked ({@code true}) or censored ({@code false}) */ public void notifyAndStrikePlayer(@NotNull Player player, @NotNull String userMessage, @NotNull MessageClassification classification, boolean blockOrCensor) { + ConfigHelper configHelperLanguage = plugin.getConfigHelperLanguage(); String chatGuardPrefix = (configHelper.getBoolean(ConfigConstants.ChatGuard.CustomPrefix.ENABLED) ? configHelper.getString(ConfigConstants.ChatGuard.CustomPrefix.FORMAT) + ChatColor.RESET + " " : LangConstants.PLUGIN_PREFIX); // Notify player if enabled @@ -65,7 +66,7 @@ public void notifyAndStrikePlayer(@NotNull Player player, @NotNull String userMe // Debug logger message loggingHelper.debug("Notify player"); - String playerMessage = chatGuardPrefix + plugin.getConfigHelperLanguage().getString(blockOrCensor ? LangConstants.ChatGuard.Player.MESSAGE_BLOCKED : LangConstants.ChatGuard.Player.MESSAGE_CENSORED) + " " + ChatColor.RED + classification.reason(); + String playerMessage = chatGuardPrefix + configHelperLanguage.getString(blockOrCensor ? LangConstants.ChatGuard.Player.MESSAGE_BLOCKED : LangConstants.ChatGuard.Player.MESSAGE_CENSORED) + " " + ChatColor.RED + classification.reason(); player.sendMessage(playerMessage); } @@ -74,7 +75,7 @@ public void notifyAndStrikePlayer(@NotNull Player player, @NotNull String userMe // Debug logger message loggingHelper.debug("Notify online admins with the 'pixelchat.strike-notify' permission"); - String adminMessage = chatGuardPrefix + plugin.getConfigHelperLanguage().getString(blockOrCensor ? LangConstants.ChatGuard.Admin.MESSAGE_BLOCKED : LangConstants.ChatGuard.Admin.MESSAGE_CENSORED).replace("[message]", ChatColor.GRAY + userMessage + ChatColor.RESET).replace("[player]", ChatColor.RED + player.getName() + ChatColor.RESET) + " " + ChatColor.RED + classification.reason(); + String adminMessage = chatGuardPrefix + configHelperLanguage.getString(blockOrCensor ? LangConstants.ChatGuard.Admin.MESSAGE_BLOCKED : LangConstants.ChatGuard.Admin.MESSAGE_CENSORED).replace("[message]", ChatColor.GRAY + userMessage + ChatColor.RESET).replace("[player]", ChatColor.RED + player.getName() + ChatColor.RESET) + " " + ChatColor.RED + classification.reason(); Collection onlinePlayers = Bukkit.getOnlinePlayers(); for (Player admin : onlinePlayers) { @@ -84,7 +85,7 @@ public void notifyAndStrikePlayer(@NotNull Player player, @NotNull String userMe } } - String loggerMessage = plugin.getConfigHelperLanguage().getString(blockOrCensor ? LangConstants.ChatGuard.Admin.MESSAGE_BLOCKED : LangConstants.ChatGuard.Admin.MESSAGE_CENSORED).replace("[MESSAGE]", userMessage).replace("[PLAYER]", player.getName()) + " " + ChatColor.RED + classification.reason(); + String loggerMessage = configHelperLanguage.getString(blockOrCensor ? LangConstants.ChatGuard.Admin.MESSAGE_BLOCKED : LangConstants.ChatGuard.Admin.MESSAGE_CENSORED).replace("[MESSAGE]", userMessage).replace("[PLAYER]", player.getName()) + " " + ChatColor.RED + classification.reason(); loggingHelper.info(loggerMessage); @@ -111,6 +112,7 @@ public void runStrikeSystem(@NotNull UUID playerUUID, @NotNull String playerName // Debug logger message loggingHelper.debug("Run strike system on " + playerName); + ConfigHelper configHelperLanguage = plugin.getConfigHelperLanguage(); ConfigHelper configHelperPlayerStrikes = plugin.getConfigHelperPlayerStrikes(); String action = "NOTHING"; @@ -128,15 +130,15 @@ public void runStrikeSystem(@NotNull UUID playerUUID, @NotNull String playerName // Check if the player has reached the threshold for punishment if (strikes >= strikesToKick && strikes < strikesToTempBan) { // Player has enough strikes to be kicked - executeCommand(configHelper.getString(ConfigConstants.ChatGuard.StrikeSystem.Commands.KICK), playerName, plugin.getConfigHelperLanguage().getString(LangConstants.ChatGuard.Player.KICK) + " " + reason); + executeCommand(configHelper.getString(ConfigConstants.ChatGuard.StrikeSystem.Commands.KICK), playerName, configHelperLanguage.getString(LangConstants.ChatGuard.Player.KICK) + " " + reason); action = "KICK"; } else if (strikes >= strikesToTempBan && strikes < strikesToBan) { // Player has enough strikes to be temporarily banned - executeCommand(plugin.getConfigHelper().getString(ConfigConstants.ChatGuard.StrikeSystem.Commands.TEMP_BAN), playerName, plugin.getConfigHelperLanguage().getString(LangConstants.ChatGuard.Player.BAN_TEMPORARY) + " " + reason); + executeCommand(configHelper.getString(ConfigConstants.ChatGuard.StrikeSystem.Commands.TEMP_BAN), playerName, configHelperLanguage.getString(LangConstants.ChatGuard.Player.BAN_TEMPORARY) + " " + reason); action = "TEMP-BAN"; } else if (strikes >= strikesToBan) { // Player has enough strikes to be permanently banned - executeCommand(plugin.getConfigHelper().getString(ConfigConstants.ChatGuard.StrikeSystem.Commands.BAN), playerName, plugin.getConfigHelperLanguage().getString(LangConstants.ChatGuard.Player.BAN_PERMANENT) + " " + reason); + executeCommand(configHelper.getString(ConfigConstants.ChatGuard.StrikeSystem.Commands.BAN), playerName, configHelperLanguage.getString(LangConstants.ChatGuard.Player.BAN_PERMANENT) + " " + reason); action = "BAN"; }