diff --git a/.idea/misc.xml b/.idea/misc.xml index 00ae26f..ab16b42 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index 1ae8dd9..8fc8ab9 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -52,7 +52,7 @@ com.mojang authlib - 1.5.21 + 3.4.40 provided diff --git a/pom.xml b/pom.xml index 3fd4538..e366a0d 100644 --- a/pom.xml +++ b/pom.xml @@ -24,12 +24,12 @@ com.discord4j discord4j-core - 3.2.3 + 3.2.6 com.mojang authlib - 1.5.21 + 3.4.40 provided diff --git a/src/main/java/com/leon/bugreport/BugReportCommand.java b/src/main/java/com/leon/bugreport/BugReportCommand.java index 57a4562..41846fa 100644 --- a/src/main/java/com/leon/bugreport/BugReportCommand.java +++ b/src/main/java/com/leon/bugreport/BugReportCommand.java @@ -29,19 +29,20 @@ public class BugReportCommand implements CommandExecutor, Listener { public BugReportCommand(BugReportManager reportManager) { this.reportManager = reportManager; this.categorySelectionMap = new HashMap<>(); - } + } @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, + String[] args) { if (!(sender instanceof Player player)) { - sender.sendMessage("This command can only be run by a player."); // TODO: Language support + sender.sendMessage("This command can only be run by a player."); return true; } if (config.getBoolean("enablePluginReportCategories", true)) { if (!BugReportManager.checkCategoryConfig()) { - String message = BugReportLanguage.getText(language, "bugReportCategoriesNotConfiguredMessage"); - player.sendMessage (Objects.requireNonNullElseGet (message, () -> pluginColor + pluginTitle + " " + ChatColor.RED + "Bug report categories are not configured")); + player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.RED + DefaultLanguageSelector + .getTextElseDefault(language, "bugReportCategoriesNotConfiguredMessage")); return true; } openCategorySelectionGUI(player); @@ -49,7 +50,7 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command } if (args.length < 1) { - player.sendMessage(ChatColor.RED + "Usage: /bugreport "); // TODO: Language support + player.sendMessage(ChatColor.RED + "Usage: /bugreport "); return true; } @@ -57,22 +58,22 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command if (maxReports != 0) { int reportsLeft = maxReports - getReportCount(player.getUniqueId()); if (reportsLeft <= 0) { - String maxReportsMessage = BugReportLanguage.getText(language, "maxReportsPerPlayerMessage"); - player.sendMessage(Objects.requireNonNullElse(maxReportsMessage, pluginColor + pluginTitle + " " + ChatColor.RED + "You have reached the maximum amount of reports you can submit")); + player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.RED + + DefaultLanguageSelector.getTextElseDefault(language, "maxReportsPerPlayerMessage")); return true; } } reportManager.submitBugReport(player, String.join(" ", args), null); - String confirmationMessage = BugReportLanguage.getText(player.getLocale(), "bugReportConfirmationMessage"); - player.sendMessage(Objects.requireNonNullElse(confirmationMessage, pluginColor + pluginTitle + " " + ChatColor.GREEN + " Bug report submitted successfully!")); + player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.GREEN + + DefaultLanguageSelector.getTextElseDefault(language, "bugReportConfirmationMessage")); return true; } private int getReportCount(UUID playerId) { int count = 0; - List reports = bugReports.getOrDefault(playerId, new ArrayList<>()); + List reports = bugReports.getOrDefault(playerId, new ArrayList<>(Collections.singletonList("DUMMY"))); for (String report : reports) { if (report.contains(playerId.toString())) { count++; @@ -87,7 +88,7 @@ private void openCategorySelectionGUI(Player player) { List categories = reportManager.getReportCategories(); for (Category category : categories) { - ItemStack categoryItem = createCategoryItem (category); + ItemStack categoryItem = createCategoryItem(category); gui.addItem(categoryItem); } @@ -128,15 +129,14 @@ public void onInventoryClick(InventoryClickEvent event) { if (selectedCategory != null) { categorySelectionMap.put(player.getUniqueId(), selectedCategory.getId()); player.closeInventory(); - if (BugReportLanguage.getText (language, "enterBugReportMessageCategory") == null) { - player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.YELLOW + "Please enter your bug report in chat. Type 'cancel' to cancel"); - } else { - player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.YELLOW + BugReportLanguage.getText(language, "enterBugReportMessageCategory")); - } + player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.YELLOW + + DefaultLanguageSelector.getTextElseDefault(language, "enterBugReportMessageCategory")); + } else { + player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.RED + + "Something went wrong while selecting the category"); } } - @EventHandler(priority = EventPriority.NORMAL) public void onPlayerChat(@NotNull AsyncPlayerChatEvent event) { Player player = event.getPlayer(); @@ -151,20 +151,20 @@ public void onPlayerChat(@NotNull AsyncPlayerChatEvent event) { String message = event.getMessage(); if (message.equalsIgnoreCase("cancel")) { - String cancelMessage = BugReportLanguage.getText(language, "cancelledBugReportMessage"); - player.sendMessage(pluginColor + pluginTitle + " " + Objects.requireNonNullElse(cancelMessage, ChatColor.RED + "Bug report cancelled.")); + player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.RED + + DefaultLanguageSelector.getTextElseDefault(language, "cancelledBugReportMessage")); return; } reportManager.submitBugReport(player, message, categoryId); - String confirmationMessage = BugReportLanguage.getText(language, "bugReportConfirmationMessage"); - player.sendMessage(pluginColor + pluginTitle + " " + Objects.requireNonNullElse(confirmationMessage, ChatColor.GREEN + "Bug report submitted successfully!")); + player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.GREEN + + DefaultLanguageSelector.getTextElseDefault(language, "bugReportConfirmationMessage")); } private @NotNull ItemStack createCategoryItem(Category category) { ItemStack itemStack = new ItemStack(category.getItem()); ItemMeta itemMeta = itemStack.getItemMeta(); - itemMeta.setDisplayName(stringColorToColorCode(category.getColor()) + category.getName()); + itemMeta.setDisplayName(stringColorToColorCode(category.getColor()) + category.getName()); itemMeta.setLore(List.of(ChatColor.GRAY + category.getDescription())); itemStack.setItemMeta(itemMeta); return itemStack; @@ -200,7 +200,7 @@ class Category { private final String name; private final ItemStack itemStack; - public Category(int id, String name, String color, ItemStack itemStack) { + Category(int id, String name, String color, ItemStack itemStack) { this.id = id; this.name = name; this.color = color; diff --git a/src/main/java/com/leon/bugreport/BugReportDatabase.java b/src/main/java/com/leon/bugreport/BugReportDatabase.java index 57947b0..e9bb8d0 100644 --- a/src/main/java/com/leon/bugreport/BugReportDatabase.java +++ b/src/main/java/com/leon/bugreport/BugReportDatabase.java @@ -19,6 +19,7 @@ public BugReportDatabase() { connectLocalOrRemote(); addMissingTables(); fixReportID(); + makeAllHeadersEqualReport_ID(); } private void addMissingTables() { @@ -42,6 +43,34 @@ private void addMissingTables() { } } + private void makeAllHeadersEqualReport_ID() { + try { + ResultSet resultSet = connection.createStatement().executeQuery("SELECT * FROM bug_reports"); + while (resultSet.next()) { + int report_id = resultSet.getInt("report_id"); + String header = resultSet.getString("header"); + String[] lines = header.split("\n"); + StringBuilder newHeader = new StringBuilder(); + for (String line : lines) { + if (line.startsWith("Report ID:")) { + newHeader.append("Report ID: ").append(report_id); + } else { + newHeader.append(line); + } + newHeader.append("\n"); + } + PreparedStatement statement = connection.prepareStatement("UPDATE bug_reports SET header = ? WHERE report_id = ?"); + statement.setString(1, newHeader.toString().trim()); + statement.setInt(2, report_id); + statement.executeUpdate(); + statement.close(); + } + } catch (SQLException e) { + plugin.getLogger().severe("Failed to make all headers equal report_id."); + plugin.getLogger().severe(e.getMessage()); + } + } + private void fixReportID() { try { ResultSet resultSet = connection.createStatement().executeQuery("SELECT * FROM bug_reports WHERE report_id IS NULL OR report_id = 0"); @@ -121,15 +150,15 @@ public void addBugReport(String username, @NotNull UUID playerId, String world, ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { - UUID playerId = UUID.fromString(resultSet.getString("player_id")); - String header = resultSet.getString("header"); - String fullMessage = resultSet.getString("message"); - String username = resultSet.getString("username"); - String world = resultSet.getString("world"); - String archived = resultSet.getString("archived"); - String report_id = resultSet.getString("report_id"); - - List reports = bugReports.getOrDefault(playerId, new ArrayList<>()); + UUID playerId = UUID.fromString (resultSet.getString ("player_id")); + String header = resultSet.getString ("header"); + String fullMessage = resultSet.getString ("message"); + String username = resultSet.getString ("username"); + String world = resultSet.getString ("world"); + String archived = resultSet.getString ("archived"); + String report_id = resultSet.getString ("report_id"); + + List reports = bugReports.getOrDefault(playerId, new ArrayList<>(Collections.singletonList ("DUMMY"))); reports.add( "Username: " + username + "\n" + "UUID: " + playerId + "\n" + @@ -192,14 +221,14 @@ private void createTables() { public void updateBugReportHeader(UUID playerId, int reportIndex) { try { - PreparedStatement statement = connection.prepareStatement("UPDATE bug_reports SET header = ? WHERE player_id = ? AND rowid = ?"); + PreparedStatement statement = connection.prepareStatement("UPDATE bug_reports SET header = ? WHERE player_id = ? AND report_id = ?"); String existingHeader = bugReports.get(playerId).get(reportIndex); String[] lines = existingHeader.split("\n"); StringBuilder newHeader = new StringBuilder(); for (String line : lines) { if (line.startsWith("hasBeenRead:")) { - newHeader.append("hasBeenRead: ").append(1); + newHeader.append("hasBeenRead: 1"); } else { newHeader.append(line); } @@ -208,9 +237,10 @@ public void updateBugReportHeader(UUID playerId, int reportIndex) { statement.setString(1, newHeader.toString().trim()); statement.setString(2, playerId.toString()); - statement.setInt(3, reportIndex + 1); + statement.setInt(3, reportIndex); statement.executeUpdate(); statement.close(); + loadBugReports(); } catch (SQLException e) { plugin.getLogger().severe("Failed to update bug report read status."); plugin.getLogger().severe(e.getMessage()); @@ -218,7 +248,6 @@ public void updateBugReportHeader(UUID playerId, int reportIndex) { } public static void updateBugReportArchive(@NotNull UUID playerId, int reportIndex, int archived) { - int bugReportIndex = reportIndex - 1; System.out.println("Updating bug report " + reportIndex + " for " + playerId + " to " + archived); try { @@ -228,9 +257,14 @@ public static void updateBugReportArchive(@NotNull UUID playerId, int reportInde statement.setInt(3, reportIndex); statement.executeUpdate(); statement.close(); + loadBugReports(); - String existingHeader = bugReports.get(playerId).get(bugReportIndex); - System.out.println("Existing header: " + existingHeader); + List reports = bugReports.getOrDefault(playerId, new ArrayList<>(Collections.singletonList("DUMMY"))); + String existingHeader = reports.stream() + .filter(reportString -> reportString.contains("Report ID: " + reportIndex)) + .findFirst() + .orElse(null); + int existingHeaderPosition = reports.indexOf(existingHeader); String[] lines = existingHeader.split("\n"); StringBuilder newHeader = new StringBuilder(); @@ -242,11 +276,10 @@ public static void updateBugReportArchive(@NotNull UUID playerId, int reportInde } newHeader.append("\n"); } - List reports = bugReports.get(playerId); - reports.set(bugReportIndex, newHeader.toString().trim()); + reports.set(existingHeaderPosition, newHeader.toString().trim()); bugReports.put(playerId, reports); - } catch (SQLException e) { + } catch (SQLException e) { plugin.getLogger().severe("Failed to update bug report archive status."); plugin.getLogger().severe(e.getMessage()); } @@ -260,6 +293,7 @@ public static void deleteBugReport(@NotNull UUID playerId, int reportIndex) { statement.setInt(2, reportIndex); statement.executeUpdate(); statement.close(); + loadBugReports(); } catch (SQLException e) { plugin.getLogger().severe("Failed to delete bug report."); plugin.getLogger().severe(e.getMessage()); diff --git a/src/main/java/com/leon/bugreport/BugReportLanguage.java b/src/main/java/com/leon/bugreport/BugReportLanguage.java index a3a6968..076cae3 100644 --- a/src/main/java/com/leon/bugreport/BugReportLanguage.java +++ b/src/main/java/com/leon/bugreport/BugReportLanguage.java @@ -59,9 +59,9 @@ public static String getEnglishVersionFromLanguage(String displayName) { return ChatColor.stripColor(displayName); } - public static String getText(String language, String textName) { + public static @Nullable String getText(String language, String textName) { ConfigurationSection texts = languageTexts.get(language); - return texts != null ? texts.getString(textName) : null; + return texts != null ? texts.getString(textName) : null; } public static @Nullable String getTitleFromLanguage(String key) { diff --git a/src/main/java/com/leon/bugreport/BugReportManager.java b/src/main/java/com/leon/bugreport/BugReportManager.java index feb6f05..6abbf80 100644 --- a/src/main/java/com/leon/bugreport/BugReportManager.java +++ b/src/main/java/com/leon/bugreport/BugReportManager.java @@ -1,6 +1,5 @@ package com.leon.bugreport; -import jdk.javadoc.doclet.Reporter; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -19,13 +18,9 @@ import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; - import java.io.File; import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static com.leon.bugreport.BugReportDatabase.deleteBugReport; +import static com.leon.bugreport.BugReportCommand.stringColorToColorCode; import static com.leon.bugreport.BugReportSettings.createCustomPlayerHead; import static com.leon.bugreport.BugReportSettings.getSettingsGUI; @@ -57,40 +52,32 @@ public BugReportManager(Plugin plugin) { String webhookURL = config.getString("webhookURL", ""); pluginTitle = Objects.requireNonNull(config.getString("pluginTitle", "[Bug Report]")); - pluginColor = BugReportCommand.stringColorToColorCode(Objects.requireNonNull(Objects.requireNonNull(config.getString ("pluginColor", "Yellow")).toUpperCase())); + pluginColor = stringColorToColorCode(Objects.requireNonNull(config.getString ("pluginColor", "Yellow").toUpperCase())); discord = new LinkDiscord(webhookURL); reportCategories = loadReportCategories(); } - public static boolean checkCategoryConfig() { - if (config.contains("reportCategories")) { - List> categoryList = config.getMapList("reportCategories"); - for (Map categoryMap : categoryList) { - Object[] keys = categoryMap.keySet().toArray(); - Object[] values = categoryMap.values().toArray(); - - for (int i = 0; i < keys.length; i++) { - if (values[i] == null) { - if (BugReportLanguage.getText (language, "missingValueMessage") != null) { - plugin.getLogger().warning(BugReportLanguage.getText (language, "missingValueMessage").replace("%key%", keys[i].toString())); - } else { - plugin.getLogger().warning("Error: Missing " + keys[i] + " in reportCategories in config."); - } - return false; - } - } - } - } else { - if (BugReportLanguage.getText (language, "missingReportCategoryMessage") != null) { - plugin.getLogger().warning(BugReportLanguage.getText (language, "missingReportCategoryMessage")); - } else { - plugin.getLogger().warning("Error: Missing reportCategories in config."); - } - return false; - } - return true; - } + public static boolean checkCategoryConfig() { + if (!config.contains("reportCategories")) { + plugin.getLogger().warning(DefaultLanguageSelector.getTextElseDefault(language, "missingReportCategoryMessage")); + return false; + } + + List> categoryList = config.getMapList("reportCategories"); + for (Map categoryMap : categoryList) { + Object[] keys = categoryMap.keySet().toArray(); + Object[] values = categoryMap.values().toArray(); + + for (int i = 0; i < keys.length; i++) { + if (values[i] == null) { + plugin.getLogger().warning(DefaultLanguageSelector.getTextElseDefault(language, "missingValueMessage").replace("%key%", keys[i].toString())); + return false; + } + } + } + return true; + } public static void loadConfig() { configFile = new File(plugin.getDataFolder(), "config.yml"); @@ -134,11 +121,7 @@ private List loadReportCategories() { return categories; } else { - if (BugReportLanguage.getText (language, "wentWrongLoadingCategoriesMessage") != null) { - plugin.getLogger().warning(BugReportLanguage.getText (language, "wentWrongLoadingCategoriesMessage")); - } else { - plugin.getLogger().warning("Error: Something went wrong while loading the report categories."); - } + plugin.getLogger().warning(DefaultLanguageSelector.getTextElseDefault(language, "wentWrongLoadingCategoriesMessage")); return null; } } @@ -151,7 +134,7 @@ public static void saveConfig() { try { config.save(configFile); } catch (Exception e) { - e.printStackTrace(); + plugin.getLogger().warning("Error saving config.yml: " + e.getMessage()); } } @@ -163,12 +146,23 @@ public void setWebhookURL(String webhookURL) { public void submitBugReport(@NotNull Player player, String message, Integer categoryId) { UUID playerId = player.getUniqueId(); - List reports = bugReports.getOrDefault(playerId, new ArrayList<>()); + List reports = bugReports.getOrDefault(playerId, new ArrayList<>(Collections.singletonList("DUMMY"))); String playerName = player.getName(); String playerUUID = playerId.toString(); String worldName = player.getWorld().getName(); + String reportID = reports.stream() + .filter(report -> report.contains("Report ID: ")) + .reduce((first, second) -> second) + .map(report -> Arrays.stream(report.split("\n")) + .filter(line -> line.contains("Report ID:")) + .findFirst() + .orElse("Report ID: 0")) + .map(reportIDLine -> reportIDLine.split(": ")[1].trim()) + .orElse("0"); + + String reportIDInt = String.valueOf(Integer.parseInt(reportID) + 1); String header = "Username: " + playerName + "\n" + "UUID: " + playerUUID + "\n" + @@ -177,7 +171,7 @@ public void submitBugReport(@NotNull Player player, String message, Integer cate "Category ID: " + categoryId + "\n" + "Full Message: " + message + "\n" + "Archived: 0" + "\n" + - "Report ID: " + (reports.size() + 1); + "Report ID: " + reportIDInt; reports.add(header); bugReports.put(playerId, reports); @@ -185,45 +179,40 @@ public void submitBugReport(@NotNull Player player, String message, Integer cate database.addBugReport(playerName, playerId, worldName, header, message); if (config.getBoolean("enableBugReportNotifications", true)) { - String defaultMessage = pluginColor + pluginTitle + " " + ChatColor.GRAY + "A new bug report has been submitted by " + ChatColor.YELLOW + playerName + ChatColor.GRAY + "."; - String languageMessage = BugReportLanguage.getText(language, "bugReportNotificationMessage"); - String notificationMessage = (languageMessage != null) - ? pluginColor + pluginTitle + " " + ChatColor.GRAY + languageMessage.replace("%player%", playerName) + ChatColor.GRAY + "." - : defaultMessage; + String defaultMessage = pluginColor + pluginTitle + " " + ChatColor.GRAY + DefaultLanguageSelector.getTextElseDefault(language, "bugReportNotificationMessage") + .replace("%player%", ChatColor.AQUA + playerName + ChatColor.GRAY); for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { if (onlinePlayer.hasPermission("bugreport.notify")) { - onlinePlayer.sendMessage(notificationMessage); + onlinePlayer.sendMessage(defaultMessage); } } } if (config.getBoolean("enableDiscordWebhook", true)) { String webhookURL = config.getString("webhookURL", ""); + if (webhookURL.isEmpty()) { + plugin.getLogger().warning(DefaultLanguageSelector.getTextElseDefault(language, "missingDiscordWebhookURLMessage")); + } - if (!webhookURL.isEmpty()) { - try { - discord.sendBugReport(message, playerId, worldName, playerName); - } catch (Exception e) { - plugin.getLogger().warning("Error sending bug report to Discord: " + e.getMessage()); - } - } else { - String warningMessage = BugReportLanguage.getText (language, "missingDiscordWebhookURLMessage"); - plugin.getLogger().warning(Objects.requireNonNullElse(warningMessage, "Missing webhookURL in config.yml")); + try { + discord.sendBugReport(message, playerId, worldName, playerName); + } catch (Exception e) { + plugin.getLogger().warning("Error sending bug report to Discord: " + e.getMessage()); } } } - public static @NotNull Inventory getArchivedBugReportsGUI(@NotNull Player player) { + public static @NotNull Inventory generateBugReportGUI(@NotNull Player player, boolean showArchived) { int itemsPerPage = 27; int navigationRow = 36; UUID playerId = player.getUniqueId(); - List reports = bugReports.getOrDefault(playerId, new ArrayList<>()); + List reports = bugReports.getOrDefault(playerId, new ArrayList<>(Collections.singletonList("DUMMY"))); List filteredReports = new ArrayList<>(); for (String report : reports) { - if (report.contains("Archived: 1")) { + if ((showArchived && report.contains("Archived: 1")) || (!showArchived && !report.contains("DUMMY") && !report.contains("Archived: 1"))) { filteredReports.add(report); } } @@ -231,7 +220,13 @@ public void submitBugReport(@NotNull Player player, String message, Integer cate int totalPages = (int) Math.ceil((double) filteredReports.size() / itemsPerPage); int currentPage = Math.max(1, Math.min(getCurrentPage(player), totalPages)); - Inventory gui = Bukkit.createInventory(null, 45, ChatColor.YELLOW + "Archived Bugs - " + BugReportLanguage.getTitleFromLanguage("pageInfo").replace("%currentPage%", String.valueOf(currentPage)).replace("%totalPages%", String.valueOf(totalPages))); + Inventory gui = Bukkit.createInventory( + null, + 45, + ChatColor.YELLOW + (showArchived ? "Archived Bugs" : "Bug Report") + " - " + Objects.requireNonNull(BugReportLanguage.getTitleFromLanguage("pageInfo")) + .replace("%currentPage%", String.valueOf(currentPage)) + .replace("%totalPages%", String.valueOf(totalPages)) + ); int startIndex = (currentPage - 1) * itemsPerPage; int endIndex = Math.min(startIndex + itemsPerPage, filteredReports.size()); @@ -251,19 +246,19 @@ public void submitBugReport(@NotNull Player player, String message, Integer cate } } - String reportID = reportData.get("Report ID"); // Extract the Report ID directly from the report data - + String reportID = reportData.get("Report ID"); String firstLine = report.split("\n")[0]; + ItemStack reportItem; - if (report.contains("Archived: 1")) { - reportItem = new ItemStack(Material.ENCHANTED_BOOK); - } else { - reportItem = new ItemStack(Material.BOOK); - } + if (report.contains("hasBeenRead: 0")) { + reportItem = new ItemStack(Material.ENCHANTED_BOOK); + } else { + reportItem = new ItemStack(Material.BOOK); + } - ItemMeta itemMeta = reportItem.getItemMeta(); - itemMeta.setDisplayName(ChatColor.YELLOW + "Bug Report #" + reportID); // Use the extracted Report ID here + ItemMeta itemMeta = reportItem.getItemMeta(); + itemMeta.setDisplayName(ChatColor.YELLOW + "Bug Report #" + reportID); itemMeta.setLore(Collections.singletonList(ChatColor.GRAY + firstLine)); reportItem.setItemMeta(itemMeta); @@ -274,9 +269,12 @@ public void submitBugReport(@NotNull Player player, String message, Integer cate ItemStack backButton = createButton(Material.ARROW, ChatColor.YELLOW + BugReportLanguage.getTitleFromLanguage("back")); ItemStack forwardButton = createButton(Material.ARROW, ChatColor.YELLOW + BugReportLanguage.getTitleFromLanguage("forward")); - ItemStack pageIndicator = createButton(Material.PAPER, ChatColor.YELLOW + BugReportLanguage.getTitleFromLanguage("pageInfo").replace("%currentPage%", String.valueOf(currentPage)).replace("%totalPages%", String.valueOf(totalPages))); ItemStack settingsButton = createButton(Material.CHEST, ChatColor.YELLOW + BugReportLanguage.getTitleFromLanguage("settings")); ItemStack closeButton = createButton(Material.BARRIER, ChatColor.RED + BugReportLanguage.getTitleFromLanguage("close")); + ItemStack pageIndicator = createButton(Material.PAPER, ChatColor.YELLOW + Objects.requireNonNull(BugReportLanguage.getTitleFromLanguage("pageInfo")) + .replace("%currentPage%", String.valueOf(currentPage)) + .replace("%totalPages%", String.valueOf(totalPages)) + ); if (currentPage > 1) { gui.setItem(navigationRow, backButton); @@ -292,85 +290,12 @@ public void submitBugReport(@NotNull Player player, String message, Integer cate return gui; } - public static Inventory getBugReportGUI(Player player) { - int itemsPerPage = 27; - int navigationRow = 36; - - UUID playerId = player.getUniqueId(); - List reports = bugReports.getOrDefault(playerId, new ArrayList<>()); - - List filteredReports = new ArrayList<>(); - for (String report : reports) { - if (!report.contains("Archived: 1")) { - filteredReports.add(report); - } - } - - int totalPages = (int) Math.ceil((double) filteredReports.size() / itemsPerPage); - int currentPage = Math.max(1, Math.min(getCurrentPage(player), totalPages)); - - Inventory gui = Bukkit.createInventory(null, 45, ChatColor.YELLOW + "Bug Report - " + BugReportLanguage.getTitleFromLanguage("pageInfo").replace("%currentPage%", String.valueOf(currentPage)).replace("%totalPages%", String.valueOf(totalPages))); - - int startIndex = (currentPage - 1) * itemsPerPage; - int endIndex = Math.min(startIndex + itemsPerPage, filteredReports.size()); - - int slotIndex = 0; - for (int i = startIndex; i < endIndex; i++) { - String report = filteredReports.get(i); - String[] reportLines = report.split("\n"); - - Map reportData = new HashMap<>(); - for (String line : reportLines) { - int colonIndex = line.indexOf(":"); - if (colonIndex >= 0) { - String key = line.substring(0, colonIndex).trim(); - String value = line.substring(colonIndex + 1).trim(); - reportData.put(key, value); - } - } - - String reportID = reportData.get("Report ID"); // Extract the Report ID directly from the report data - - String firstLine = report.split("\n")[0]; - ItemStack reportItem; - - if (report.contains("Archived: 1")) { - continue; - } else if (report.contains("hasBeenRead: 0")) { - reportItem = new ItemStack(Material.ENCHANTED_BOOK); - } else { - reportItem = new ItemStack(Material.BOOK); - } - - ItemMeta itemMeta = reportItem.getItemMeta(); - itemMeta.setDisplayName(ChatColor.YELLOW + "Bug Report #" + reportID); // Use the extracted Report ID here - itemMeta.setLore(Collections.singletonList(ChatColor.GRAY + firstLine)); - - reportItem.setItemMeta(itemMeta); - - gui.setItem(slotIndex, reportItem); - slotIndex++; - } - - - ItemStack backButton = createButton(Material.ARROW, ChatColor.YELLOW + BugReportLanguage.getTitleFromLanguage("back")); - ItemStack forwardButton = createButton(Material.ARROW, ChatColor.YELLOW + BugReportLanguage.getTitleFromLanguage("forward")); - ItemStack pageIndicator = createButton(Material.PAPER, ChatColor.YELLOW + BugReportLanguage.getTitleFromLanguage("pageInfo").replace("%currentPage%", String.valueOf(currentPage)).replace("%totalPages%", String.valueOf(totalPages))); - ItemStack settingsButton = createButton(Material.CHEST, ChatColor.YELLOW + BugReportLanguage.getTitleFromLanguage("settings")); - ItemStack closeButton = createButton(Material.BARRIER, ChatColor.RED + BugReportLanguage.getTitleFromLanguage("close")); - - if (currentPage > 1) { - gui.setItem(navigationRow, backButton); - } - if (currentPage < totalPages) { - gui.setItem(navigationRow + 8, forwardButton); - } - - gui.setItem(navigationRow + 2, settingsButton); - gui.setItem(navigationRow + 4, pageIndicator); - gui.setItem(navigationRow + 6, closeButton); + public static @NotNull Inventory getArchivedBugReportsGUI(Player player) { + return generateBugReportGUI(player, true); + } - return gui; + public static @NotNull Inventory getBugReportGUI(Player player) { + return generateBugReportGUI(player, false); } private static @NotNull ItemStack createButton(Material material, String displayName) { @@ -452,18 +377,22 @@ public void onInventoryClick(InventoryClickEvent event) { if (displayName.startsWith(ChatColor.YELLOW + "Bug Report #")) { int reportID = Integer.parseInt(displayName.substring(14)); UUID playerId = player.getUniqueId(); - List reports = bugReports.getOrDefault(playerId, new ArrayList<>()); - String report = reports.stream().filter(r -> r.contains("Report ID: " + reportID)).findFirst().orElse(null); + List reports = bugReports.getOrDefault(playerId, new ArrayList<>(Collections.singletonList("DUMMY"))); + + String report = reports.stream() + .filter(reportString -> reportString.contains("Report ID: " + reportID)) + .findFirst() + .orElse(null); + if (report.contains("hasBeenRead: 0")) { report = report.replace("hasBeenRead: 0", "hasBeenRead: 1"); reports.set(reportID, report); bugReports.put(playerId, reports); database.updateBugReportHeader(playerId, reportID); } - if (report != null) { - openBugReportDetailsGUI(player, report, reportID, isArchivedGUI); - } - } + + openBugReportDetailsGUI(player, report, reportID, isArchivedGUI); + } if (customDisplayName.equals("Settings")) { player.openInventory(getSettingsGUI()); @@ -497,18 +426,15 @@ public static int getCurrentPage(@NotNull Player player) { public int getTotalPages(@NotNull Player player) { UUID playerId = player.getUniqueId(); - List reports = bugReports.getOrDefault(playerId, new ArrayList<>()); - int totalPages = (int) Math.ceil((double) reports.size() / 27); - return totalPages; + List reports = bugReports.getOrDefault(playerId, new ArrayList<>(Collections.singletonList("DUMMY"))); + return (int) Math.ceil((double) reports.size() / 27); } public static void setCurrentPage(@NotNull Player player, int page) { player.setMetadata("currentPage", new FixedMetadataValue(plugin, page)); } - private static void openBugReportDetailsGUI(Player player, @NotNull String report, Integer reportId, Boolean isArchivedGUI) { - int reportIDGUI = reportId; - + private static void openBugReportDetailsGUI(Player player, @NotNull String report, Integer reportIDGUI, Boolean isArchivedGUI) { String bugReportTitle = isArchivedGUI ? "Archived Bug Details - #" : "Bug Report Details - #"; Inventory gui = Bukkit.createInventory(player, 36, ChatColor.YELLOW + bugReportTitle + reportIDGUI); @@ -558,11 +484,11 @@ private static void openBugReportDetailsGUI(Player player, @NotNull String repor gui.setItem(33, deleteButton); if (!"null".equals(category) && !"".equals(category)) { - List> categoryList = config.getMapList ("reportCategories"); + List> categoryList = config.getMapList("reportCategories"); Optional categoryNameOptional = categoryList.stream() - .filter(categoryMap -> Integer.parseInt (categoryMap.get ("id").toString()) == Integer.parseInt(category)) - .map(categoryMap -> categoryMap.get ("name").toString()) + .filter(categoryMap -> Integer.parseInt(categoryMap.get("id").toString()) == Integer.parseInt(category)) + .map(categoryMap -> categoryMap.get("name").toString()) .findFirst(); if (categoryNameOptional.isPresent ()) { @@ -582,8 +508,7 @@ private record BugReportDetailsListener(Inventory gui, Integer reportIDGUI) impl public void onInventoryClick(@NotNull InventoryClickEvent event) { String title = event.getView().getTitle(); boolean isArchivedDetails = title.startsWith(ChatColor.YELLOW + "Archived Bug Details"); - - if (!title.startsWith(ChatColor.YELLOW + "Bug Report Details - #") && !isArchivedDetails) { + if (!title.startsWith(ChatColor.YELLOW + "Bug Report Details - #") && !title.startsWith(ChatColor.YELLOW + "Archived Bug Details")) { return; } @@ -593,54 +518,36 @@ public void onInventoryClick(@NotNull InventoryClickEvent event) { UUID playerId = player.getUniqueId(); Inventory clickedInventory = event.getClickedInventory(); - if (clickedInventory == null) { - return; - } - ItemStack clickedItem = event.getCurrentItem(); - if (clickedItem == null || clickedItem.getType() == Material.AIR) { - return; - } - ItemMeta itemMeta = clickedItem.getItemMeta(); - if (itemMeta == null || !itemMeta.hasDisplayName()) { + if (clickedInventory == null || clickedItem == null || clickedItem.getType() == Material.AIR) { return; } - String displayName = itemMeta.getDisplayName(); + ItemMeta itemMeta = clickedItem.getItemMeta(); - if (displayName.equals(" ")) { + if (itemMeta == null || !itemMeta.hasDisplayName() || itemMeta.getDisplayName().equals(" ")) { return; } - String customDisplayName = BugReportLanguage.getEnglishVersionFromLanguage(displayName); + String customDisplayName = BugReportLanguage.getEnglishVersionFromLanguage(itemMeta.getDisplayName()); switch (customDisplayName) { - case "Back" -> { - player.openInventory(isArchivedDetails ? getArchivedBugReportsGUI (player) : getBugReportGUI (player)); - } + case "Back" -> player.openInventory(isArchivedDetails ? getArchivedBugReportsGUI (player) : getBugReportGUI (player)); case "Archive" -> { BugReportDatabase.updateBugReportArchive(playerId, reportIDGUI, 1); - player.openInventory(isArchivedDetails ? getArchivedBugReportsGUI (player) : getBugReportGUI (player)); + + player.openInventory(isArchivedDetails ? getArchivedBugReportsGUI(player) : getBugReportGUI(player)); player.sendMessage(ChatColor.YELLOW + "Bug Report #" + reportIDGUI + " has been archived."); + + HandlerList.unregisterAll(this); } case "Delete" -> { - List playerReports = bugReports.get(playerId); - int reportIndex = -1; - - for (int i = 0; i < playerReports.size(); i++) { - if (playerReports.get(i).contains("Report ID: " + reportIDGUI)) { - reportIndex = i; - break; - } - } + BugReportDatabase.deleteBugReport(playerId, reportIDGUI); - if (reportIndex != -1) { - playerReports.remove(reportIndex); - bugReports.put(playerId, playerReports); - } - - deleteBugReport(playerId, reportIDGUI); + List reports = bugReports.getOrDefault(playerId, new ArrayList<>(Collections.singletonList("DUMMY"))); + reports.removeIf(report -> report.contains("Report ID: " + reportIDGUI)); + bugReports.put(playerId, reports); player.openInventory(isArchivedDetails ? getArchivedBugReportsGUI (player) : getBugReportGUI (player)); player.sendMessage(ChatColor.RED + "Bug Report #" + reportIDGUI + " has been deleted."); diff --git a/src/main/java/com/leon/bugreport/BugReportSettings.java b/src/main/java/com/leon/bugreport/BugReportSettings.java index bde2064..c1b85b5 100644 --- a/src/main/java/com/leon/bugreport/BugReportSettings.java +++ b/src/main/java/com/leon/bugreport/BugReportSettings.java @@ -216,11 +216,8 @@ public Object onInventoryClick(InventoryClickEvent event) { case "Enable Category Selection" -> setCategorySelectionToggle(player); case "Set Max Reports Per Player" -> { player.closeInventory(); - if (BugReportLanguage.getText (BugReportManager.config.getString("language"), "enterMaxReportsPerPlayer") != null) { - player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.YELLOW + BugReportLanguage.getText (BugReportManager.config.getString("language"), "enterMaxReportsPerPlayer")); - } else { - player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.YELLOW + "Enter the max reports a player can submit. Or type 'cancel' to cancel."); - } + player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.YELLOW + DefaultLanguageSelector.getTextElseDefault(BugReportManager.language, "setMaxReportsPerPlayer")); + setMaxReportsClickMap.put(player.getUniqueId(), String.valueOf(true)); setMaxReportsClickMap.put(player.getUniqueId(), customItemDisplayName); } @@ -274,11 +271,7 @@ public Object onInventoryClick(InventoryClickEvent event) { private static void setLanguage(String languageCode, String languageName, Player player) { player.closeInventory(); - if (BugReportLanguage.getText(languageCode, "languageSetTo") != null) { - player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.GREEN + BugReportLanguage.getText(languageCode, "languageSetTo").replace("%language%", languageName)); - } else { - player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.GREEN + "Language set to " + languageName + "."); - } + player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.GREEN + DefaultLanguageSelector.getTextElseDefault(languageCode, "languageSetTo").replace("%language%", languageName)); BugReportManager.config.set("language", languageCode); BugReportManager.saveConfig(); BugReportManager.loadConfig(); @@ -297,21 +290,13 @@ public void onPlayerChat(AsyncPlayerChatEvent event) { try { maxReports = Integer.parseInt(value); } catch (NumberFormatException e) { - if (BugReportLanguage.getText (BugReportManager.config.getString("language"), "enterValidNumber") != null) { - player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.RED + BugReportLanguage.getText (BugReportManager.config.getString("language"), "enterValidNumber")); - } else { - player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.RED + "Please enter a valid number."); - } + player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.RED + DefaultLanguageSelector.getTextElseDefault(BugReportManager.config.getString("language"), "enterValidNumber")); return; } BugReportManager.config.set("max-reports-per-player", maxReports); BugReportManager.saveConfig(); - if (BugReportLanguage.getText (BugReportManager.config.getString("language"), "maxReportsPerPlayerSuccessMessage") != null) { - player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.GREEN + BugReportLanguage.getText (BugReportManager.config.getString("language"), "maxReportsPerPlayerSuccessMessage").replace("%amount%", String.valueOf(maxReports))); - } else { - player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.GREEN + "Max reports per player has been set to " + maxReports + "."); - } + player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.GREEN + DefaultLanguageSelector.getTextElseDefault(BugReportManager.config.getString("language"), "maxReportsPerPlayerSuccessMessage").replace("%amount%", String.valueOf(maxReports))); } else { value = value.substring(0, 1).toUpperCase() + value.substring(1).toLowerCase(); String customDisplayName = BugReportLanguage.getEnglishVersionFromLanguage(value); @@ -319,11 +304,7 @@ public void onPlayerChat(AsyncPlayerChatEvent event) { if (customDisplayName.contains("Cancel")) { player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.GREEN + BugReportLanguage.getTitleFromLanguage("cancelled")); } else { - if (BugReportLanguage.getText (BugReportManager.config.getString("language"), "enterValidNumber") != null) { - player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.RED + BugReportLanguage.getText (BugReportManager.config.getString("language"), "enterValidNumber")); - } else { - player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.RED + "Please enter a valid number."); - } + player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.RED + DefaultLanguageSelector.getTextElseDefault(BugReportManager.config.getString("language"), "enterValidNumber")); } } }); @@ -334,21 +315,14 @@ public void onPlayerChat(AsyncPlayerChatEvent event) { try { reportCooldown = Integer.parseInt(value); } catch (NumberFormatException e) { - if (BugReportLanguage.getText (BugReportManager.config.getString("language"), "enterValidNumber") != null) { - player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.RED + BugReportLanguage.getText (BugReportManager.config.getString("language"), "enterValidNumber")); - } else { - player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.RED + "Please enter a valid number."); - } + player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.RED + DefaultLanguageSelector.getTextElseDefault(BugReportManager.config.getString("language"), "enterValidNumber")); return; } BugReportManager.config.set("report-cooldown", reportCooldown); BugReportManager.saveConfig(); - if (BugReportLanguage.getText (BugReportManager.config.getString("language"), "reportCooldownSuccessMessage") != null) { - player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.GREEN + BugReportLanguage.getText (BugReportManager.config.getString("language"), "reportCooldownSuccessMessage").replace("%cooldown%", String.valueOf(reportCooldown))); - } else { - player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.GREEN + "Report cooldown has been set to " + reportCooldown + " seconds."); - } + player.sendMessage(pluginColor + pluginTitle + " " + ChatColor.GREEN + DefaultLanguageSelector.getTextElseDefault(BugReportManager.config.getString("language"), "reportCooldownSuccessMessage") + .replace("%time%", String.valueOf(reportCooldown))); }); } } diff --git a/src/main/java/com/leon/bugreport/DefaultLanguageSelector.java b/src/main/java/com/leon/bugreport/DefaultLanguageSelector.java new file mode 100644 index 0000000..5310437 --- /dev/null +++ b/src/main/java/com/leon/bugreport/DefaultLanguageSelector.java @@ -0,0 +1,53 @@ +package com.leon.bugreport; + +import java.util.HashMap; +import java.util.Map; +import org.jetbrains.annotations.NotNull; + +import static com.leon.bugreport.BugReportLanguage.getText; + +public class DefaultLanguageSelector { + public static final Map defaultLanguagesLocal = new HashMap () {{ + put("back" ,"Back"); + put("forward" ,"Forward"); + put("pageInfo" ,"Page %currentPage% of %totalPages%"); + put("settings" ,"Settings"); + put("close" ,"Close"); + put("page" ,"Page"); + put("enableDiscordWebhook" ,"Enable Discord Webhook"); + put("enableBugReportNotifications" ,"Enable Bug Report Notifications"); + put("enableCategorySelection" ,"Enable Category Selection"); + put("setMaxReportsPerPlayer" ,"Set Max Reports Per Player"); + put("setLanguage" ,"Set Language"); + put("on" ,"On"); + put("off" ,"Off"); + put("language" ,"Language"); + put("cancelled" ,"Cancelled"); + put("cancel" ,"Cancel"); + put("archive" ,"Archive"); + put("delete" ,"Delete"); + put("missingValueMessage" ,"Missing '%key%' in reportCategories in config.yml"); + put("missingReportCategoryMessage" ,"Missing reportCategories in config.yml"); + put("wentWrongLoadingCategoriesMessage" ,"Something went wrong while loading the report categories"); + put("bugReportNotificationMessage" ,"A new bug report has been submitted by %player%!"); + put("missingDiscordWebhookURLMessage" ,"Missing webhookURL in config.yml"); + put("bugReportConfirmationMessage" ,"Bug report submitted successfully!"); + put("enterBugReportMessageCategory" ,"Please enter your bug report in chat. Type 'cancel' to cancel"); + put("cancelledBugReportMessage" ,"Bug report cancelled"); + put("maxReportsPerPlayerMessage" ,"You have reached the maximum amount of reports you can submit"); + put("bugReportCategoriesNotConfiguredMessage" ,"Bug report categories are not configured"); + put("enterValidNumber" ,"Please enter a valid number"); + put("reportCooldownSuccessMessage" ,"Report cooldown has been set to %time% seconds"); + put("maxReportsPerPlayerSuccessMessage" ,"Max reports per player has been set to %amount%"); + put("languageSetTo" ,"Language set to %language%"); + put("enterMaxReportsPerPlayer" ,"Enter the max reports a player can submit. Or type 'cancel' to cancel"); + }}; + + public static @NotNull String getTextElseDefault(String language, String key) { + String text = getText(language, key); + if (text != null) { + return text; + } + return DefaultLanguageSelector.defaultLanguagesLocal.get(key); + } +}