From 0c3801dd52c8bed0750a93697364b5d5a15550a9 Mon Sep 17 00:00:00 2001 From: rafaeltrx <123503841+rafaeltrx@users.noreply.github.com> Date: Fri, 2 Aug 2024 19:52:47 +0200 Subject: [PATCH 1/6] =?UTF-8?q?Impl=C3=A9mente=20la=20V1=20du=20syst=C3=A8?= =?UTF-8?q?me=20de=20signalement.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/communaywen/core/AywenCraftPlugin.java | 4 +- .../java/fr/communaywen/core/Managers.java | 3 + .../core/commands/staff/ReportCommands.java | 137 ++++++++++++ .../core/staff/report/ReportManager.java | 196 ++++++++++++++++++ src/main/resources/plugin.yml | 2 + 5 files changed, 341 insertions(+), 1 deletion(-) create mode 100644 src/main/java/fr/communaywen/core/commands/staff/ReportCommands.java create mode 100644 src/main/java/fr/communaywen/core/staff/report/ReportManager.java diff --git a/src/main/java/fr/communaywen/core/AywenCraftPlugin.java b/src/main/java/fr/communaywen/core/AywenCraftPlugin.java index 3a9acb33..179831c3 100644 --- a/src/main/java/fr/communaywen/core/AywenCraftPlugin.java +++ b/src/main/java/fr/communaywen/core/AywenCraftPlugin.java @@ -16,6 +16,7 @@ import fr.communaywen.core.commands.explosion.ExplodeRandomCommand; import fr.communaywen.core.commands.explosion.FBoomCommand; import fr.communaywen.core.commands.fun.*; +import fr.communaywen.core.commands.staff.ReportCommands; import fr.communaywen.core.commands.utils.*; import fr.communaywen.core.commands.teleport.RTPCommand; import fr.communaywen.core.commands.teleport.SpawnCommand; @@ -200,7 +201,8 @@ public void onEnable() { new AdminShopCommand(), new PayCommands(), new FallBloodCommand(), - new DiscordCommand(this) + new DiscordCommand(this), + new ReportCommands() ); /* -------- */ diff --git a/src/main/java/fr/communaywen/core/Managers.java b/src/main/java/fr/communaywen/core/Managers.java index 6baf580f..64f5e693 100644 --- a/src/main/java/fr/communaywen/core/Managers.java +++ b/src/main/java/fr/communaywen/core/Managers.java @@ -9,6 +9,7 @@ import fr.communaywen.core.levels.LevelsDataManager; import fr.communaywen.core.levels.LevelsManager; import fr.communaywen.core.scoreboard.ScoreboardManager; +import fr.communaywen.core.staff.report.ReportManager; import fr.communaywen.core.teams.Team; import fr.communaywen.core.teams.TeamManager; import fr.communaywen.core.utils.ConfigUtils; @@ -38,6 +39,7 @@ public class Managers { private FallingBlocksExplosionManager fbeManager; private LevelsManager levelsManager; private TransactionsManager transactionsManager; + private ReportManager reportManager; private FileConfiguration bookConfig; private FileConfiguration wikiConfig; @@ -89,6 +91,7 @@ public void init(AywenCraftPlugin plugin) { fbeManager = new FallingBlocksExplosionManager(); levelsManager = new LevelsManager(); transactionsManager = new TransactionsManager(); + reportManager = new ReportManager(); LevelsDataManager.setLevelsFile(levelsConfig, new File(plugin.getDataFolder(), "levels.yml")); LevelsDataManager.setLevelsFile(levelsConfig, new File(plugin.getDataFolder(), "levels.yml")); diff --git a/src/main/java/fr/communaywen/core/commands/staff/ReportCommands.java b/src/main/java/fr/communaywen/core/commands/staff/ReportCommands.java new file mode 100644 index 00000000..e4e9642b --- /dev/null +++ b/src/main/java/fr/communaywen/core/commands/staff/ReportCommands.java @@ -0,0 +1,137 @@ +package fr.communaywen.core.commands.staff; + +import fr.communaywen.core.AywenCraftPlugin; +import fr.communaywen.core.staff.report.ReportManager; +import fr.communaywen.core.credit.Credit; +import fr.communaywen.core.credit.Feature; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import revxrsal.commands.annotation.Command; +import revxrsal.commands.annotation.Subcommand; +import revxrsal.commands.annotation.Description; +import revxrsal.commands.annotation.Named; +import revxrsal.commands.bukkit.annotation.CommandPermission; +import org.bukkit.ChatColor; + +import java.sql.Timestamp; + +@Feature("Report") +@Credit("rafael_trx") +@Command("Report") +public class ReportCommands { + @Subcommand("create") + @Description("Signale un joueur pour un motif spécifique") + @CommandPermission("ayw.command.report") + + public boolean create(CommandSender sender, @Named("Joueur") Player target, @Named("Motif") String reason) { + ReportManager reportManager = AywenCraftPlugin.getInstance().getManagers().getReportManager(); + if (sender instanceof Player) { + Player player = (Player) sender; + String senderName = sender.getName(); + String reportedPlayer = target.getName(); + Timestamp currentTimestamp = new Timestamp(System.currentTimeMillis()); + + if (reportedPlayer.equals(senderName)) { + player.sendMessage("Vous ne pouvez pas vous signaler vous-même"); + return false; + } + if(reportManager.checkReportability(target)) { + if (reportManager.addReport(player, target, reason, currentTimestamp)) { + player.sendMessage("Vous avez signalé " + ChatColor.GREEN + reportedPlayer + ChatColor.WHITE + " pour : " + reason); + /* Insérer ce report dans la base de données */ + return true; + } + } + else{ + player.sendMessage("Votre dernier signalement de " + ChatColor.GREEN + reportedPlayer + ChatColor.WHITE + " est trop récent"); + } + } + else { + return false; + } + return false; + } + + @Subcommand("history") + @Description("Permet de voir son historique de signalement") + @CommandPermission("ayw.command.report") + + public boolean history(CommandSender sender) { + ReportManager reportManager = AywenCraftPlugin.getInstance().getManagers().getReportManager(); + + if (sender instanceof Player) { + Player player = (Player) sender; + + reportManager.seeHistory(player); + return true; + + } + else { + return false; + } + } + + + @Subcommand("see") + @Description("Consulte les signalements d'un joueur") + @CommandPermission("ayw.mods.report") + + public boolean see(CommandSender sender, @Named("Joueur") Player target) { + ReportManager reportManager = AywenCraftPlugin.getInstance().getManagers().getReportManager(); + if (sender instanceof Player) { + Player player = (Player) sender; + + reportManager.seeReports(player, target); + + return true; + } + else { + return false; + } + } + + + @Subcommand("toplist") + @Description("Affiche les 5 joueurs les plus signalés") + @CommandPermission("ayw.mods.report") + + public boolean toplist(CommandSender sender) { + ReportManager reportManager = AywenCraftPlugin.getInstance().getManagers().getReportManager(); + + Player player = (Player) sender; + + reportManager.topReports(player); + return true; + + + } + + @Subcommand("clear") + @Description("Consulte les signalements d'un joueur") + @CommandPermission("ayw.mods.report") + + public boolean clear(CommandSender sender, @Named("Joueur") Player target) { + ReportManager reportManager = AywenCraftPlugin.getInstance().getManagers().getReportManager(); + if (sender instanceof Player) { + Player player = (Player) sender; + if(reportManager.clearReports(target)){ + player.sendMessage("Les signalements de " + player.getName() + " ont été supprimés"); + return true; + } + else { + return false; + } + + + } + else { + return false; + } + } + + + + +} + + diff --git a/src/main/java/fr/communaywen/core/staff/report/ReportManager.java b/src/main/java/fr/communaywen/core/staff/report/ReportManager.java new file mode 100644 index 00000000..1ffabe26 --- /dev/null +++ b/src/main/java/fr/communaywen/core/staff/report/ReportManager.java @@ -0,0 +1,196 @@ +package fr.communaywen.core.staff.report; + +import fr.communaywen.core.utils.database.DatabaseConnector; +import fr.communaywen.core.credit.Credit; +import fr.communaywen.core.credit.Feature; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.bukkit.ChatColor; + +import java.sql.*; +import java.util.UUID; +import java.time.Instant; +import java.time.temporal.ChronoUnit; + +@Feature("Report") +@Credit("rafael_trx") + +public class ReportManager extends DatabaseConnector { + + public boolean addReport(Player player, Player target, String reason, Timestamp timestamp) { + + try { + PreparedStatement statement = connection.prepareStatement("INSERT INTO reports (sender, reported, reason, timestamp) VALUES (?, ?, ?, ?);"); + statement.setString(1, player.getUniqueId().toString()); + statement.setString(2, target.getUniqueId().toString()); + statement.setString(3, reason); + statement.setTimestamp(4, timestamp); + statement.executeUpdate(); + + return true; + + } catch (SQLException ignored) {} + return false; + + } + + public void seeHistory(Player player) { + + try { + PreparedStatement statement = connection.prepareStatement("SELECT * FROM reports WHERE sender = ?"); + statement.setString(1, player.getUniqueId().toString()); + + ResultSet rs = statement.executeQuery(); + StringBuilder historyMessage = new StringBuilder(); + + // Vérifier si des rapports ont été trouvés + if (!rs.isBeforeFirst()) { + player.sendMessage(" \n Vous n'avez effectué aucun signalement"); + return; + } + player.sendMessage("\nVos signalements : \n \n"); + while (rs.next()) { + // Récupérer les données de chaque colonne + String reported = rs.getString("reported"); + String reason = rs.getString("reason"); + String timecode = rs.getString("timecode"); + + OfflinePlayer reportedPlayer = Bukkit.getOfflinePlayer(UUID.fromString(reported)); + String reportedName = reportedPlayer.getName(); + + + // Construire le message à envoyer au joueur + historyMessage.append("Vous avez signalé ").append(ChatColor.GREEN).append(reportedName).append(ChatColor.WHITE).append("\n") + .append("Motif : ").append(reason).append("\n") + .append("Date : ").append(timecode).append("\n") + .append("--------\n"); + } + + // Envoyer tous les rapports au joueur + player.sendMessage(historyMessage.toString()); + + } catch (SQLException ignored) {} + + + } + + public void seeReports(Player player, Player target) { + + try { + PreparedStatement statement = connection.prepareStatement("SELECT * FROM reports WHERE reported = ?"); + statement.setString(1, target.getUniqueId().toString()); + + ResultSet rs = statement.executeQuery(); + StringBuilder reportMessage = new StringBuilder(); + + // Vérifier si des rapports ont été trouvés + if (!rs.isBeforeFirst()) { + player.sendMessage(" \n Aucun signalement pour " + ChatColor.GREEN + player.getName() + ChatColor.WHITE + " !"); + return; + } + player.sendMessage("\n Signalements de " + ChatColor.GREEN + player.getName() + ChatColor.WHITE + " : \n \n"); + while (rs.next()) { + // Récupérer les données de chaque colonne + String sender = rs.getString("sender"); + String reported = rs.getString("reported"); + String reason = rs.getString("reason"); + String timecode = rs.getString("timecode"); + + OfflinePlayer senderPlayer = Bukkit.getOfflinePlayer(UUID.fromString(sender)); + String senderName = senderPlayer.getName(); + + + // Construire le message à envoyer au joueur + reportMessage.append("Signalé par : ").append(senderName).append("\n") + .append("Motif : ").append(reason).append("\n") + .append("Date : ").append(timecode).append("\n") + .append("--------\n"); + } + + // Envoyer tous les rapports au joueur + player.sendMessage(reportMessage.toString()); + + } catch (SQLException ignored) {} + + + } + + public void topReports(Player player) { + + try { + PreparedStatement statement = connection.prepareStatement("SELECT reported, COUNT(*) AS num_reports FROM reports GROUP BY reported ORDER BY num_reports DESC LIMIT 5;"); + + ResultSet rs = statement.executeQuery(); + StringBuilder topreportMessage = new StringBuilder(); + + // Vérifier si des rapports ont été trouvés + if (!rs.isBeforeFirst()) { + player.sendMessage(" \n Aucun joueur n'a de signalement ! "); + return; + } + player.sendMessage("\n Top des signalements : \n \n"); + while (rs.next()) { + // Récupérer les données de chaque colonne + String reported = rs.getString("reported"); + String count = rs.getString("num_reports"); + + OfflinePlayer reportedPlayer = Bukkit.getOfflinePlayer(UUID.fromString(reported)); + String reportedName = reportedPlayer.getName(); + + + // Construire le message à envoyer au joueur + topreportMessage.append("- ").append(ChatColor.GREEN).append(reportedName).append(ChatColor.WHITE).append(" - ") + .append(count).append(" signalement(s)"); + + } + + // Envoyer tous les rapports au joueur + player.sendMessage(topreportMessage.toString()); + player.sendMessage("\n -------- \n"); + + } catch (SQLException ignored) {} + + + } + + public boolean clearReports(Player target) { + + try { + PreparedStatement statement = connection.prepareStatement("DELETE FROM reports WHERE reported = ?;"); + statement.setString(1, target.getUniqueId().toString()); + + statement.executeUpdate(); + + return true; + + } catch (SQLException ignored) {} + return false; + + + } + + public boolean checkReportability(Player target) { + try { + + Timestamp last24Hours = Timestamp.from(Instant.now().minus(24, ChronoUnit.HOURS)); + + PreparedStatement statement = connection.prepareStatement("SELECT COUNT(*) FROM reports WHERE reported = ? AND timestamp > ?"); + statement.setString(1, target.getUniqueId().toString()); + statement.setTimestamp(2, last24Hours); + + ResultSet rs = statement.executeQuery(); + if (rs.next()) { + int count = rs.getInt("COUNT(*)"); + return count == 0; + } + else { + return false; + } + + } catch (SQLException ignored) {return false;} + + } + +} + diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index f7ee4fd5..64088857 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -57,4 +57,6 @@ permissions: default: true ayw.command.bandage: description: 'Donne un bandage' + ayw.command.report: + description: 'Permet de signaler un joueur' From dc10b59f53e65d431ddb2971e613046d9763bb14 Mon Sep 17 00:00:00 2001 From: rafaeltrx <123503841+rafaeltrx@users.noreply.github.com> Date: Fri, 2 Aug 2024 19:55:38 +0200 Subject: [PATCH 2/6] =?UTF-8?q?Impl=C3=A9mente=20la=20V1=20du=20syst=C3=A8?= =?UTF-8?q?me=20de=20signalement.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/fr/communaywen/core/commands/staff/ReportCommands.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/fr/communaywen/core/commands/staff/ReportCommands.java b/src/main/java/fr/communaywen/core/commands/staff/ReportCommands.java index e4e9642b..d4ed430e 100644 --- a/src/main/java/fr/communaywen/core/commands/staff/ReportCommands.java +++ b/src/main/java/fr/communaywen/core/commands/staff/ReportCommands.java @@ -12,7 +12,6 @@ import revxrsal.commands.annotation.Named; import revxrsal.commands.bukkit.annotation.CommandPermission; import org.bukkit.ChatColor; - import java.sql.Timestamp; @Feature("Report") From 60cd3acf1deb84796978972de89e3aed9ab8b1b3 Mon Sep 17 00:00:00 2001 From: rafaeltrx <123503841+rafaeltrx@users.noreply.github.com> Date: Fri, 2 Aug 2024 20:44:16 +0200 Subject: [PATCH 3/6] =?UTF-8?q?Impl=C3=A9mente=20la=20V1=20du=20syst=C3=A8?= =?UTF-8?q?me=20de=20signalement.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/commands/staff/ReportCommands.java | 12 +++++------- .../core/staff/report/ReportManager.java | 14 +++++++------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/main/java/fr/communaywen/core/commands/staff/ReportCommands.java b/src/main/java/fr/communaywen/core/commands/staff/ReportCommands.java index d4ed430e..8ed30c76 100644 --- a/src/main/java/fr/communaywen/core/commands/staff/ReportCommands.java +++ b/src/main/java/fr/communaywen/core/commands/staff/ReportCommands.java @@ -6,23 +6,21 @@ import fr.communaywen.core.credit.Feature; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import revxrsal.commands.annotation.Command; -import revxrsal.commands.annotation.Subcommand; -import revxrsal.commands.annotation.Description; -import revxrsal.commands.annotation.Named; +import revxrsal.commands.annotation.*; import revxrsal.commands.bukkit.annotation.CommandPermission; import org.bukkit.ChatColor; import java.sql.Timestamp; + @Feature("Report") @Credit("rafael_trx") -@Command("Report") +@Command("report") public class ReportCommands { - @Subcommand("create") + @DefaultFor("~") @Description("Signale un joueur pour un motif spécifique") @CommandPermission("ayw.command.report") - public boolean create(CommandSender sender, @Named("Joueur") Player target, @Named("Motif") String reason) { + public boolean report(CommandSender sender, @Named("Joueur") Player target, @Named("Motif") String reason) { ReportManager reportManager = AywenCraftPlugin.getInstance().getManagers().getReportManager(); if (sender instanceof Player) { Player player = (Player) sender; diff --git a/src/main/java/fr/communaywen/core/staff/report/ReportManager.java b/src/main/java/fr/communaywen/core/staff/report/ReportManager.java index 1ffabe26..aeca8365 100644 --- a/src/main/java/fr/communaywen/core/staff/report/ReportManager.java +++ b/src/main/java/fr/communaywen/core/staff/report/ReportManager.java @@ -46,7 +46,7 @@ public void seeHistory(Player player) { // Vérifier si des rapports ont été trouvés if (!rs.isBeforeFirst()) { - player.sendMessage(" \n Vous n'avez effectué aucun signalement"); + player.sendMessage(" \nVous n'avez effectué aucun signalement"); return; } player.sendMessage("\nVos signalements : \n \n"); @@ -54,7 +54,7 @@ public void seeHistory(Player player) { // Récupérer les données de chaque colonne String reported = rs.getString("reported"); String reason = rs.getString("reason"); - String timecode = rs.getString("timecode"); + String timestamp = rs.getString("timestamp"); OfflinePlayer reportedPlayer = Bukkit.getOfflinePlayer(UUID.fromString(reported)); String reportedName = reportedPlayer.getName(); @@ -63,7 +63,7 @@ public void seeHistory(Player player) { // Construire le message à envoyer au joueur historyMessage.append("Vous avez signalé ").append(ChatColor.GREEN).append(reportedName).append(ChatColor.WHITE).append("\n") .append("Motif : ").append(reason).append("\n") - .append("Date : ").append(timecode).append("\n") + .append("Date : ").append(timestamp).append("\n") .append("--------\n"); } @@ -86,16 +86,16 @@ public void seeReports(Player player, Player target) { // Vérifier si des rapports ont été trouvés if (!rs.isBeforeFirst()) { - player.sendMessage(" \n Aucun signalement pour " + ChatColor.GREEN + player.getName() + ChatColor.WHITE + " !"); + player.sendMessage(" \nAucun signalement pour " + ChatColor.GREEN + player.getName() + ChatColor.WHITE + " !"); return; } - player.sendMessage("\n Signalements de " + ChatColor.GREEN + player.getName() + ChatColor.WHITE + " : \n \n"); + player.sendMessage("\nSignalements de " + ChatColor.GREEN + player.getName() + ChatColor.WHITE + " : \n \n"); while (rs.next()) { // Récupérer les données de chaque colonne String sender = rs.getString("sender"); String reported = rs.getString("reported"); String reason = rs.getString("reason"); - String timecode = rs.getString("timecode"); + String timestamp = rs.getString("timestamp"); OfflinePlayer senderPlayer = Bukkit.getOfflinePlayer(UUID.fromString(sender)); String senderName = senderPlayer.getName(); @@ -104,7 +104,7 @@ public void seeReports(Player player, Player target) { // Construire le message à envoyer au joueur reportMessage.append("Signalé par : ").append(senderName).append("\n") .append("Motif : ").append(reason).append("\n") - .append("Date : ").append(timecode).append("\n") + .append("Date : ").append(timestamp).append("\n") .append("--------\n"); } From b8d3509bc6c811892bf11be1679e2afc8384e38e Mon Sep 17 00:00:00 2001 From: rafaeltrx <123503841+rafaeltrx@users.noreply.github.com> Date: Fri, 2 Aug 2024 20:55:38 +0200 Subject: [PATCH 4/6] =?UTF-8?q?Ajoute=20la=20table=20du=20syst=C3=A8me=20d?= =?UTF-8?q?e=20signalements=20dans=20le=20DatabaseManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/communaywen/core/utils/database/DatabaseManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/fr/communaywen/core/utils/database/DatabaseManager.java b/src/main/java/fr/communaywen/core/utils/database/DatabaseManager.java index 1467f10d..f68da282 100644 --- a/src/main/java/fr/communaywen/core/utils/database/DatabaseManager.java +++ b/src/main/java/fr/communaywen/core/utils/database/DatabaseManager.java @@ -51,6 +51,10 @@ public void init() throws SQLException { this.getConnection().prepareStatement("CREATE TABLE IF NOT EXISTS teams (teamName VARCHAR(16) NOT NULL PRIMARY KEY, owner VARCHAR(36) NOT NULL, balance BIGINT UNSIGNED, inventory LONGBLOB)").executeUpdate(); this.getConnection().prepareStatement("CREATE TABLE IF NOT EXISTS transactions (recipient VARCHAR(36), sender VARCHAR(36), amount DOUBLE, reason VARCHAR(255), date TIMESTAMP DEFAULT CURRENT_TIMESTAMP)").executeUpdate(); + //Système de signalements + + this.getConnection().prepareStatement("CREATE TABLE `reports` (`sender` text NOT NULL,`reported` text NOT NULL,`reason` text NOT NULL,`timestamp` timestamp NOT NULL)"); + // Système de claims this.getConnection().prepareStatement("CREATE TABLE IF NOT EXISTS claim (" + " claimID varchar(36) NOT NULL PRIMARY KEY," + From a3dcebe0ca85000875856d08ce1320abac90e149 Mon Sep 17 00:00:00 2001 From: rafaeltrx <123503841+rafaeltrx@users.noreply.github.com> Date: Sat, 3 Aug 2024 07:57:42 +0200 Subject: [PATCH 5/6] Corrige une faute d'orthographe dans un des outputs. --- .../fr/communaywen/core/utils/database/DatabaseManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/communaywen/core/utils/database/DatabaseManager.java b/src/main/java/fr/communaywen/core/utils/database/DatabaseManager.java index f68da282..bf66a2d9 100644 --- a/src/main/java/fr/communaywen/core/utils/database/DatabaseManager.java +++ b/src/main/java/fr/communaywen/core/utils/database/DatabaseManager.java @@ -72,7 +72,7 @@ public void init() throws SQLException { " balance double NOT NULL" + ")").executeUpdate(); - System.out.println("Les tables ont été créer si besoin"); + System.out.println("Les tables ont été créées si besoin"); } public void close() { From 11fb1eda41f594e9b7defc5020f679adcf0f4012 Mon Sep 17 00:00:00 2001 From: rafaeltrx <123503841+rafaeltrx@users.noreply.github.com> Date: Sun, 4 Aug 2024 17:24:12 +0200 Subject: [PATCH 6/6] =?UTF-8?q?Impl=C3=A9mente=20la=20mise=20en=20cache=20?= =?UTF-8?q?pour=20limiter=20les=20requ=C3=AAtes=20=C3=A0=20la=20db.=20Pren?= =?UTF-8?q?d=20=C3=A9galement=20en=20charge=20le=20report=20de=20joueur=20?= =?UTF-8?q?hors-ligne.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/fr/communaywen/core/Managers.java | 3 + .../core/commands/staff/ReportCommands.java | 12 +- .../core/staff/report/ReportCache.java | 4 + .../core/staff/report/ReportManager.java | 275 ++++++++---------- 4 files changed, 143 insertions(+), 151 deletions(-) create mode 100644 src/main/java/fr/communaywen/core/staff/report/ReportCache.java diff --git a/src/main/java/fr/communaywen/core/Managers.java b/src/main/java/fr/communaywen/core/Managers.java index f9012761..e3592d2a 100644 --- a/src/main/java/fr/communaywen/core/Managers.java +++ b/src/main/java/fr/communaywen/core/Managers.java @@ -92,15 +92,18 @@ public void init(AywenCraftPlugin plugin) { levelsManager = new LevelsManager(); transactionsManager = new TransactionsManager(); reportManager = new ReportManager(); + reportManager.loadReports(); LevelsDataManager.setLevelsFile(levelsConfig, new File(plugin.getDataFolder(), "levels.yml")); LevelsDataManager.setLevelsFile(levelsConfig, new File(plugin.getDataFolder(), "levels.yml")); } public void cleanup() { + reportManager.saveReports(); databaseManager.close(); quizManager.close(); corpseManager.removeAll(); teamManager.getTeamCache().saveAllTeamsToDatabase(); + } } diff --git a/src/main/java/fr/communaywen/core/commands/staff/ReportCommands.java b/src/main/java/fr/communaywen/core/commands/staff/ReportCommands.java index 8ed30c76..1f7c5370 100644 --- a/src/main/java/fr/communaywen/core/commands/staff/ReportCommands.java +++ b/src/main/java/fr/communaywen/core/commands/staff/ReportCommands.java @@ -4,6 +4,7 @@ import fr.communaywen.core.staff.report.ReportManager; import fr.communaywen.core.credit.Credit; import fr.communaywen.core.credit.Feature; +import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import revxrsal.commands.annotation.*; @@ -20,8 +21,9 @@ public class ReportCommands { @Description("Signale un joueur pour un motif spécifique") @CommandPermission("ayw.command.report") - public boolean report(CommandSender sender, @Named("Joueur") Player target, @Named("Motif") String reason) { + public boolean report(CommandSender sender, @Named("Joueur") OfflinePlayer target, @Named("Motif") String reason) { ReportManager reportManager = AywenCraftPlugin.getInstance().getManagers().getReportManager(); + if (sender instanceof Player) { Player player = (Player) sender; String senderName = sender.getName(); @@ -35,7 +37,6 @@ public boolean report(CommandSender sender, @Named("Joueur") Player target, @Nam if(reportManager.checkReportability(target)) { if (reportManager.addReport(player, target, reason, currentTimestamp)) { player.sendMessage("Vous avez signalé " + ChatColor.GREEN + reportedPlayer + ChatColor.WHITE + " pour : " + reason); - /* Insérer ce report dans la base de données */ return true; } } @@ -73,7 +74,7 @@ public boolean history(CommandSender sender) { @Description("Consulte les signalements d'un joueur") @CommandPermission("ayw.mods.report") - public boolean see(CommandSender sender, @Named("Joueur") Player target) { + public boolean see(CommandSender sender, @Named("Joueur") OfflinePlayer target) { ReportManager reportManager = AywenCraftPlugin.getInstance().getManagers().getReportManager(); if (sender instanceof Player) { Player player = (Player) sender; @@ -94,12 +95,13 @@ public boolean see(CommandSender sender, @Named("Joueur") Player target) { public boolean toplist(CommandSender sender) { ReportManager reportManager = AywenCraftPlugin.getInstance().getManagers().getReportManager(); - + if (sender instanceof Player) { Player player = (Player) sender; reportManager.topReports(player); return true; - + } + return false; } diff --git a/src/main/java/fr/communaywen/core/staff/report/ReportCache.java b/src/main/java/fr/communaywen/core/staff/report/ReportCache.java new file mode 100644 index 00000000..c00d7fb3 --- /dev/null +++ b/src/main/java/fr/communaywen/core/staff/report/ReportCache.java @@ -0,0 +1,4 @@ +package fr.communaywen.core.staff.report; + +public class ReportCache { +} diff --git a/src/main/java/fr/communaywen/core/staff/report/ReportManager.java b/src/main/java/fr/communaywen/core/staff/report/ReportManager.java index aeca8365..36595175 100644 --- a/src/main/java/fr/communaywen/core/staff/report/ReportManager.java +++ b/src/main/java/fr/communaywen/core/staff/report/ReportManager.java @@ -9,7 +9,7 @@ import org.bukkit.ChatColor; import java.sql.*; -import java.util.UUID; +import java.util.*; import java.time.Instant; import java.time.temporal.ChronoUnit; @@ -18,179 +18,162 @@ public class ReportManager extends DatabaseConnector { - public boolean addReport(Player player, Player target, String reason, Timestamp timestamp) { - - try { - PreparedStatement statement = connection.prepareStatement("INSERT INTO reports (sender, reported, reason, timestamp) VALUES (?, ?, ?, ?);"); - statement.setString(1, player.getUniqueId().toString()); - statement.setString(2, target.getUniqueId().toString()); - statement.setString(3, reason); - statement.setTimestamp(4, timestamp); - statement.executeUpdate(); - - return true; - - } catch (SQLException ignored) {} - return false; - + private final Map> reportCache = new HashMap<>(); + + public class Report { + private final UUID sender; + private final UUID reported; + private final String reason; + private final Timestamp timestamp; + + public Report(UUID sender, UUID reported, String reason, Timestamp timestamp) { + this.sender = sender; + this.reported = reported; + this.reason = reason; + this.timestamp = timestamp; + } + + // Getters + public UUID getSender() { return sender; } + public UUID getReported() { return reported; } + public String getReason() { return reason; } + public Timestamp getTimestamp() { return timestamp; } } - public void seeHistory(Player player) { - + public void loadReports() { try { - PreparedStatement statement = connection.prepareStatement("SELECT * FROM reports WHERE sender = ?"); - statement.setString(1, player.getUniqueId().toString()); - + PreparedStatement statement = connection.prepareStatement("SELECT * FROM reports"); ResultSet rs = statement.executeQuery(); - StringBuilder historyMessage = new StringBuilder(); - - // Vérifier si des rapports ont été trouvés - if (!rs.isBeforeFirst()) { - player.sendMessage(" \nVous n'avez effectué aucun signalement"); - return; - } - player.sendMessage("\nVos signalements : \n \n"); while (rs.next()) { - // Récupérer les données de chaque colonne - String reported = rs.getString("reported"); + UUID sender = UUID.fromString(rs.getString("sender")); + UUID reported = UUID.fromString(rs.getString("reported")); String reason = rs.getString("reason"); - String timestamp = rs.getString("timestamp"); - - OfflinePlayer reportedPlayer = Bukkit.getOfflinePlayer(UUID.fromString(reported)); - String reportedName = reportedPlayer.getName(); + Timestamp timestamp = rs.getTimestamp("timestamp"); - - // Construire le message à envoyer au joueur - historyMessage.append("Vous avez signalé ").append(ChatColor.GREEN).append(reportedName).append(ChatColor.WHITE).append("\n") - .append("Motif : ").append(reason).append("\n") - .append("Date : ").append(timestamp).append("\n") - .append("--------\n"); + Report report = new Report(sender, reported, reason, timestamp); + reportCache.computeIfAbsent(reported, k -> new ArrayList<>()).add(report); } - - // Envoyer tous les rapports au joueur - player.sendMessage(historyMessage.toString()); - } catch (SQLException ignored) {} - - } - public void seeReports(Player player, Player target) { - + public void saveReports() { try { - PreparedStatement statement = connection.prepareStatement("SELECT * FROM reports WHERE reported = ?"); - statement.setString(1, target.getUniqueId().toString()); - - ResultSet rs = statement.executeQuery(); - StringBuilder reportMessage = new StringBuilder(); - - // Vérifier si des rapports ont été trouvés - if (!rs.isBeforeFirst()) { - player.sendMessage(" \nAucun signalement pour " + ChatColor.GREEN + player.getName() + ChatColor.WHITE + " !"); - return; + connection.setAutoCommit(false); + PreparedStatement deleteStatement = connection.prepareStatement("DELETE FROM reports"); + deleteStatement.executeUpdate(); + + PreparedStatement insertStatement = connection.prepareStatement("INSERT INTO reports (sender, reported, reason, timestamp) VALUES (?, ?, ?, ?)"); + for (List reports : reportCache.values()) { + for (Report report : reports) { + insertStatement.setString(1, report.getSender().toString()); + insertStatement.setString(2, report.getReported().toString()); + insertStatement.setString(3, report.getReason()); + insertStatement.setTimestamp(4, report.getTimestamp()); + insertStatement.addBatch(); + } } - player.sendMessage("\nSignalements de " + ChatColor.GREEN + player.getName() + ChatColor.WHITE + " : \n \n"); - while (rs.next()) { - // Récupérer les données de chaque colonne - String sender = rs.getString("sender"); - String reported = rs.getString("reported"); - String reason = rs.getString("reason"); - String timestamp = rs.getString("timestamp"); - - OfflinePlayer senderPlayer = Bukkit.getOfflinePlayer(UUID.fromString(sender)); - String senderName = senderPlayer.getName(); - - - // Construire le message à envoyer au joueur - reportMessage.append("Signalé par : ").append(senderName).append("\n") - .append("Motif : ").append(reason).append("\n") - .append("Date : ").append(timestamp).append("\n") - .append("--------\n"); - } - - // Envoyer tous les rapports au joueur - player.sendMessage(reportMessage.toString()); - + insertStatement.executeBatch(); + connection.commit(); + connection.setAutoCommit(true); } catch (SQLException ignored) {} - - } - public void topReports(Player player) { + public boolean addReport(Player player, OfflinePlayer target, String reason, Timestamp timestamp) { + UUID senderUUID = player.getUniqueId(); + UUID targetUUID = target.getUniqueId(); + Report report = new Report(senderUUID, targetUUID, reason, timestamp); - try { - PreparedStatement statement = connection.prepareStatement("SELECT reported, COUNT(*) AS num_reports FROM reports GROUP BY reported ORDER BY num_reports DESC LIMIT 5;"); - - ResultSet rs = statement.executeQuery(); - StringBuilder topreportMessage = new StringBuilder(); - - // Vérifier si des rapports ont été trouvés - if (!rs.isBeforeFirst()) { - player.sendMessage(" \n Aucun joueur n'a de signalement ! "); - return; - } - player.sendMessage("\n Top des signalements : \n \n"); - while (rs.next()) { - // Récupérer les données de chaque colonne - String reported = rs.getString("reported"); - String count = rs.getString("num_reports"); - - OfflinePlayer reportedPlayer = Bukkit.getOfflinePlayer(UUID.fromString(reported)); - String reportedName = reportedPlayer.getName(); + reportCache.computeIfAbsent(targetUUID, k -> new ArrayList<>()).add(report); + return true; + } + public void seeHistory(Player player) { + UUID playerUUID = player.getUniqueId(); + List reports = reportCache.getOrDefault(playerUUID, new ArrayList<>()); + + if (reports.isEmpty()) { + player.sendMessage(" \nVous n'avez effectué aucun signalement"); + return; + } + + StringBuilder historyMessage = new StringBuilder("\nVos signalements : \n \n"); + for (Report report : reports) { + OfflinePlayer reportedPlayer = Bukkit.getOfflinePlayer(report.getReported()); + String reportedName = reportedPlayer.getName(); + + historyMessage.append("Vous avez signalé ").append(ChatColor.GREEN).append(reportedName).append(ChatColor.WHITE).append("\n") + .append("Motif : ").append(report.getReason()).append("\n") + .append("Date : ").append(report.getTimestamp()).append("\n") + .append("--------\n"); + } + player.sendMessage(historyMessage.toString()); + } - // Construire le message à envoyer au joueur - topreportMessage.append("- ").append(ChatColor.GREEN).append(reportedName).append(ChatColor.WHITE).append(" - ") - .append(count).append(" signalement(s)"); + public void seeReports(Player player, OfflinePlayer target) { + UUID targetUUID = target.getUniqueId(); + List reports = reportCache.getOrDefault(targetUUID, new ArrayList<>()); + + if (reports.isEmpty()) { + player.sendMessage(" \nAucun signalement pour " + ChatColor.GREEN + target.getName() + ChatColor.WHITE + " !"); + return; + } + + StringBuilder reportMessage = new StringBuilder("\nSignalements de " + ChatColor.GREEN + target.getName() + ChatColor.WHITE + " : \n \n"); + for (Report report : reports) { + OfflinePlayer senderPlayer = Bukkit.getOfflinePlayer(report.getSender()); + String senderName = senderPlayer.getName(); + + reportMessage.append("Signalé par : ").append(senderName).append("\n") + .append("Motif : ").append(report.getReason()).append("\n") + .append("Date : ").append(report.getTimestamp()).append("\n") + .append("--------\n"); + } + player.sendMessage(reportMessage.toString()); + } + public void topReports(Player player) { + Map reportCount = new HashMap<>(); + for (List reports : reportCache.values()) { + for (Report report : reports) { + reportCount.put(report.getReported(), reportCount.getOrDefault(report.getReported(), 0) + 1); } - - // Envoyer tous les rapports au joueur - player.sendMessage(topreportMessage.toString()); - player.sendMessage("\n -------- \n"); - - } catch (SQLException ignored) {} - - + } + + List> topReports = new ArrayList<>(reportCount.entrySet()); + topReports.sort((e1, e2) -> e2.getValue() - e1.getValue()); + + if (topReports.isEmpty()) { + player.sendMessage(" \nAucun joueur n'a de signalement ! "); + return; + } + + StringBuilder topReportMessage = new StringBuilder("\nTop des signalements : \n \n"); + for (int i = 0; i < Math.min(5, topReports.size()); i++) { + Map.Entry entry = topReports.get(i); + OfflinePlayer reportedPlayer = Bukkit.getOfflinePlayer(entry.getKey()); + String reportedName = reportedPlayer.getName(); + + topReportMessage.append("- ").append(ChatColor.GREEN).append(reportedName).append(ChatColor.WHITE).append(" - ") + .append(entry.getValue()).append(" signalement(s)\n"); + } + player.sendMessage(topReportMessage.toString()); + player.sendMessage("\n -------- \n"); } public boolean clearReports(Player target) { - - try { - PreparedStatement statement = connection.prepareStatement("DELETE FROM reports WHERE reported = ?;"); - statement.setString(1, target.getUniqueId().toString()); - - statement.executeUpdate(); - + UUID targetUUID = target.getUniqueId(); + if (reportCache.containsKey(targetUUID)) { + reportCache.remove(targetUUID); return true; - - } catch (SQLException ignored) {} + } return false; - - } - public boolean checkReportability(Player target) { - try { - - Timestamp last24Hours = Timestamp.from(Instant.now().minus(24, ChronoUnit.HOURS)); - - PreparedStatement statement = connection.prepareStatement("SELECT COUNT(*) FROM reports WHERE reported = ? AND timestamp > ?"); - statement.setString(1, target.getUniqueId().toString()); - statement.setTimestamp(2, last24Hours); - - ResultSet rs = statement.executeQuery(); - if (rs.next()) { - int count = rs.getInt("COUNT(*)"); - return count == 0; - } - else { - return false; - } - - } catch (SQLException ignored) {return false;} + public boolean checkReportability(OfflinePlayer target) { + UUID targetUUID = target.getUniqueId(); + List reports = reportCache.getOrDefault(targetUUID, new ArrayList<>()); + Timestamp last24Hours = Timestamp.from(Instant.now().minus(24, ChronoUnit.HOURS)); + return reports.stream().noneMatch(report -> report.getTimestamp().after(last24Hours)); } - } -