From 1e67db27df3d35304c32346f632b13f711d8eef8 Mon Sep 17 00:00:00 2001 From: MathiasDPX Date: Fri, 26 Jul 2024 23:57:58 +0200 Subject: [PATCH 1/6] Save team's inventory to db --- .../java/fr/communaywen/core/teams/Team.java | 29 ++++++++++++++++--- .../communaywen/core/teams/TeamManager.java | 11 +++++-- .../core/utils/database/DatabaseManager.java | 2 +- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/main/java/fr/communaywen/core/teams/Team.java b/src/main/java/fr/communaywen/core/teams/Team.java index bbf63d09..e4ff745c 100644 --- a/src/main/java/fr/communaywen/core/teams/Team.java +++ b/src/main/java/fr/communaywen/core/teams/Team.java @@ -3,11 +3,14 @@ import fr.communaywen.core.AywenCraftPlugin; import fr.communaywen.core.teams.utils.MethodState; import fr.communaywen.core.utils.database.DatabaseConnector; +import fr.communaywen.core.utils.serializer.BukkitSerializer; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; @@ -17,17 +20,28 @@ import java.sql.SQLException; import java.util.*; -public class Team extends DatabaseConnector { +public class Team extends DatabaseConnector implements Listener{ private UUID owner; private final String name; private final List players = new ArrayList<>(); private final Inventory inventory; - public Team(UUID owner, String name) { + AywenCraftPlugin plugin; + + public Team(UUID owner, String name, AywenCraftPlugin plugin) { + this.plugin = plugin; this.owner = owner; this.name = name; this.inventory = Bukkit.createInventory(null, 27, name + " - Inventory"); + plugin.getServer().getPluginManager().registerEvents(this, plugin); + } + + @EventHandler + public void onInventoryClose(InventoryCloseEvent e) { + if (e.getInventory().equals(inventory)) { + save(); + } } public void delete() throws SQLException { @@ -53,12 +67,13 @@ public void save(){ statement.executeUpdate(); } - PreparedStatement statement = connection.prepareStatement("INSERT INTO teams VALUES (?, ?, 0)"); + PreparedStatement statement = connection.prepareStatement("INSERT INTO teams VALUES (?, ?, 0, ?)"); statement.setString(1, this.name); statement.setString(2, this.owner.toString()); + statement.setBytes(3, new BukkitSerializer().serializeItemStacks(inventory.getContents())); statement.executeUpdate(); - } catch (SQLException e){ + } catch (Exception e){ e.printStackTrace(); System.out.println("\u001B[31mErreur en sauvegardant la team '"+this.name+"'\u001B[0m"); } @@ -96,6 +111,12 @@ public void openInventory(Player player) { player.openInventory(inventory); } + public void setInventory(ItemStack[] newinv) { + // Woooooh dangereux + if (newinv == null) { return; } + inventory.setContents(newinv); + } + public void giveClaimStick(Player player) { ItemStack itemStack = new ItemStack(Material.STICK); ItemMeta itemMeta = itemStack.getItemMeta(); diff --git a/src/main/java/fr/communaywen/core/teams/TeamManager.java b/src/main/java/fr/communaywen/core/teams/TeamManager.java index 95b0a142..22136016 100644 --- a/src/main/java/fr/communaywen/core/teams/TeamManager.java +++ b/src/main/java/fr/communaywen/core/teams/TeamManager.java @@ -5,6 +5,7 @@ import fr.communaywen.core.credit.Feature; import fr.communaywen.core.utils.Queue; import fr.communaywen.core.utils.database.DatabaseConnector; +import fr.communaywen.core.utils.serializer.BukkitSerializer; import lombok.Getter; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -21,7 +22,10 @@ public class TeamManager extends DatabaseConnector { // Zeub - By Xernas 05/07/2024 à 00:05 (UTC+2) // Le createur de ce truc + AywenCraftPlugin plugin; + public TeamManager(AywenCraftPlugin plugin) { + this.plugin = plugin; try { ResultSet rs = connection.prepareStatement("SELECT * FROM teams").executeQuery(); @@ -29,8 +33,11 @@ public TeamManager(AywenCraftPlugin plugin) { Team team = createTeam(UUID.fromString(rs.getString("owner")), rs.getString("teamName")); PreparedStatement query = connection.prepareStatement("SELECT * FROM teams_player WHERE teamName = ?"); query.setString(1, rs.getString("teamName")); - ResultSet players = query.executeQuery(); + ItemStack[] newInventory = new BukkitSerializer().deserializeItemStacks(rs.getBytes("inventory")); + team.setInventory(newInventory); + + ResultSet players = query.executeQuery(); while (players.next()) { System.out.println("Adding "+players.getString("player")); team.addPlayerWithoutSave(UUID.fromString(players.getString("player"))); @@ -51,7 +58,7 @@ public TeamManager(AywenCraftPlugin plugin) { private final Queue pendingInvites = new Queue<>(20); public Team createTeam(UUID owner, String name) { - Team team = new Team(owner, name); + Team team = new Team(owner, name, plugin); if (!teamExists(name)) { teams.add(team); } 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 c971f4c4..c5ede442 100644 --- a/src/main/java/fr/communaywen/core/utils/database/DatabaseManager.java +++ b/src/main/java/fr/communaywen/core/utils/database/DatabaseManager.java @@ -48,7 +48,7 @@ public void init() throws SQLException { this.getConnection().prepareStatement("CREATE TABLE IF NOT EXISTS link_verif (minecraft_uuid VARCHAR(36) NOT NULL, code int(11) NOT NULL)").executeUpdate(); this.getConnection().prepareStatement("CREATE TABLE IF NOT EXISTS events_rewards (player VARCHAR(36) NOT NULL PRIMARY KEY, scope VARCHAR(32) NOT NULL, isClaimed BOOLEAN)").executeUpdate(); this.getConnection().prepareStatement("CREATE TABLE IF NOT EXISTS teams_player (teamName VARCHAR(16) NOT NULL, player VARCHAR(36) NOT NULL)").executeUpdate(); - this.getConnection().prepareStatement("CREATE TABLE IF NOT EXISTS teams (teamName VARCHAR(16) NOT NULL PRIMARY KEY, owner VARCHAR(36) NOT NULL, balance BIGINT UNSIGNED)").executeUpdate(); + 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(); // Système de claims this.getConnection().prepareStatement("CREATE TABLE IF NOT EXISTS claim (" + From cea9abe9a98719e66fc3e4ffbdb54558355f2f01 Mon Sep 17 00:00:00 2001 From: MathiasDPX Date: Sat, 27 Jul 2024 00:03:59 +0200 Subject: [PATCH 2/6] Remove log message --- src/main/java/fr/communaywen/core/teams/TeamManager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/fr/communaywen/core/teams/TeamManager.java b/src/main/java/fr/communaywen/core/teams/TeamManager.java index 22136016..579b36bd 100644 --- a/src/main/java/fr/communaywen/core/teams/TeamManager.java +++ b/src/main/java/fr/communaywen/core/teams/TeamManager.java @@ -39,7 +39,6 @@ public TeamManager(AywenCraftPlugin plugin) { ResultSet players = query.executeQuery(); while (players.next()) { - System.out.println("Adding "+players.getString("player")); team.addPlayerWithoutSave(UUID.fromString(players.getString("player"))); } } From 93cbe10a70d2926884fdffcd8011fa4bba17198e Mon Sep 17 00:00:00 2001 From: MathiasDPX Date: Sat, 27 Jul 2024 00:04:36 +0200 Subject: [PATCH 3/6] Fix: not delete team when saving --- src/main/java/fr/communaywen/core/teams/Team.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/main/java/fr/communaywen/core/teams/Team.java b/src/main/java/fr/communaywen/core/teams/Team.java index e4ff745c..164e749b 100644 --- a/src/main/java/fr/communaywen/core/teams/Team.java +++ b/src/main/java/fr/communaywen/core/teams/Team.java @@ -49,11 +49,6 @@ public void delete() throws SQLException { PreparedStatement statement = connection.prepareStatement("DELETE FROM teams_player WHERE teamName = ?"); statement.setString(1, this.name); statement.executeUpdate(); - - // Remove team from teams - statement = connection.prepareStatement("DELETE FROM teams WHERE teamName = ?"); - statement.setString(1, this.name); - statement.executeUpdate(); } public void save(){ @@ -67,10 +62,9 @@ public void save(){ statement.executeUpdate(); } - PreparedStatement statement = connection.prepareStatement("INSERT INTO teams VALUES (?, ?, 0, ?)"); - statement.setString(1, this.name); - statement.setString(2, this.owner.toString()); - statement.setBytes(3, new BukkitSerializer().serializeItemStacks(inventory.getContents())); + PreparedStatement statement = connection.prepareStatement("UPDATE teams SET inventory = ? WHERE teamName = ?"); + statement.setBytes(1, new BukkitSerializer().serializeItemStacks(inventory.getContents())); + statement.setString(2, name); statement.executeUpdate(); } catch (Exception e){ From 9a37c54daa8ac2711b8ef3e11d68b6dbbcbe513a Mon Sep 17 00:00:00 2001 From: MathiasDPX Date: Sat, 27 Jul 2024 01:00:04 +0200 Subject: [PATCH 4/6] Fix: optimize SQL query --- .../java/fr/communaywen/core/teams/Team.java | 55 +++++++++++-------- .../communaywen/core/teams/TeamManager.java | 12 ++++ 2 files changed, 43 insertions(+), 24 deletions(-) diff --git a/src/main/java/fr/communaywen/core/teams/Team.java b/src/main/java/fr/communaywen/core/teams/Team.java index 164e749b..53431b06 100644 --- a/src/main/java/fr/communaywen/core/teams/Team.java +++ b/src/main/java/fr/communaywen/core/teams/Team.java @@ -40,7 +40,14 @@ public Team(UUID owner, String name, AywenCraftPlugin plugin) { @EventHandler public void onInventoryClose(InventoryCloseEvent e) { if (e.getInventory().equals(inventory)) { - save(); + try { + PreparedStatement statement = connection.prepareStatement("UPDATE teams SET inventory = ? WHERE teamName = ?"); + statement.setBytes(1, new BukkitSerializer().serializeItemStacks(inventory.getContents())); + statement.setString(2, name); + statement.executeUpdate(); + } catch (Exception exc) { + plugin.getLogger().severe("Impossible de sauvegarder l'inventaire de la team '"+this.name+"'"); + } } } @@ -49,28 +56,11 @@ public void delete() throws SQLException { PreparedStatement statement = connection.prepareStatement("DELETE FROM teams_player WHERE teamName = ?"); statement.setString(1, this.name); statement.executeUpdate(); - } - - public void save(){ - try { - delete(); - - for (UUID player : this.getPlayers()){ - PreparedStatement statement = connection.prepareStatement("INSERT INTO teams_player VALUES (?, ?)"); - statement.setString(1, this.name); - statement.setString(2, player.toString()); - statement.executeUpdate(); - } - - PreparedStatement statement = connection.prepareStatement("UPDATE teams SET inventory = ? WHERE teamName = ?"); - statement.setBytes(1, new BukkitSerializer().serializeItemStacks(inventory.getContents())); - statement.setString(2, name); - statement.executeUpdate(); - } catch (Exception e){ - e.printStackTrace(); - System.out.println("\u001B[31mErreur en sauvegardant la team '"+this.name+"'\u001B[0m"); - } + // Delete team from teams + statement = connection.prepareStatement("DELETE FROM teams WHERE teamName = ?"); + statement.setString(1, this.name); + statement.executeUpdate(); } @@ -152,7 +142,16 @@ public boolean addPlayer(UUID player) { return false; } players.add(player); - save(); + + try { + PreparedStatement statement = connection.prepareStatement("INSERT INTO teams_player VALUES (?, ?)"); + statement.setString(1, this.name); + statement.setString(2, player.toString()); + statement.executeUpdate(); + } catch (Exception e) { + plugin.getLogger().severe("Impossible d'ajouter '"+player.toString()+"' dans '"+this.name+"'"); + } + return true; } @@ -176,7 +175,15 @@ public MethodState removePlayer(UUID player) { if (isOwner(player)) { owner = getRandomPlayer(); } - save(); + + try { + PreparedStatement statement = connection.prepareStatement("DELETE FROM teams_player WHERE player = ?"); + statement.setString(2, player.toString()); + statement.executeUpdate(); + } catch (Exception e) { + plugin.getLogger().severe("Impossible de supprimer '"+player.toString()+"' dans '"+this.name+"'"); + } + return MethodState.VALID; } diff --git a/src/main/java/fr/communaywen/core/teams/TeamManager.java b/src/main/java/fr/communaywen/core/teams/TeamManager.java index 579b36bd..db9f800a 100644 --- a/src/main/java/fr/communaywen/core/teams/TeamManager.java +++ b/src/main/java/fr/communaywen/core/teams/TeamManager.java @@ -61,6 +61,18 @@ public Team createTeam(UUID owner, String name) { if (!teamExists(name)) { teams.add(team); } + + try { + PreparedStatement statement = connection.prepareStatement("INSERT INTO teams VALUE (?, ?, 0, ?)"); + statement.setString(1, name); + statement.setString(2, owner.toString()); + statement.setObject(3, null); + + statement.executeUpdate(); + } catch (Exception e) { + plugin.getLogger().severe("Impossible de sauvegarder la team '"+name+"'"); + } + return team; } From 068513a87e7907e493e2b69edd6ce62c5933bd3a Mon Sep 17 00:00:00 2001 From: MathiasDPX Date: Sat, 27 Jul 2024 02:40:24 +0200 Subject: [PATCH 5/6] Fix duplication bug --- src/main/java/fr/communaywen/core/teams/Team.java | 15 ++++++++++++--- .../fr/communaywen/core/teams/TeamManager.java | 7 ++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/main/java/fr/communaywen/core/teams/Team.java b/src/main/java/fr/communaywen/core/teams/Team.java index 53431b06..85d7796f 100644 --- a/src/main/java/fr/communaywen/core/teams/Team.java +++ b/src/main/java/fr/communaywen/core/teams/Team.java @@ -5,12 +5,13 @@ import fr.communaywen.core.utils.database.DatabaseConnector; import fr.communaywen.core.utils.serializer.BukkitSerializer; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; @@ -38,8 +39,16 @@ public Team(UUID owner, String name, AywenCraftPlugin plugin) { } @EventHandler - public void onInventoryClose(InventoryCloseEvent e) { - if (e.getInventory().equals(inventory)) { + public void onInventoryOpen(InventoryOpenEvent e) { + Inventory inv = e.getInventory(); + if (inv.equals(inventory)) { + if (inv.getViewers().size() > 1) { + Player other = (Player) inv.getViewers().getFirst(); + e.getPlayer().sendMessage(ChatColor.RED+other.getName()+" est déjà entrain de regarder l'inventaire de team"); + e.getPlayer().closeInventory(); + e.setCancelled(true); + return; + } try { PreparedStatement statement = connection.prepareStatement("UPDATE teams SET inventory = ? WHERE teamName = ?"); statement.setBytes(1, new BukkitSerializer().serializeItemStacks(inventory.getContents())); diff --git a/src/main/java/fr/communaywen/core/teams/TeamManager.java b/src/main/java/fr/communaywen/core/teams/TeamManager.java index db9f800a..a7172f48 100644 --- a/src/main/java/fr/communaywen/core/teams/TeamManager.java +++ b/src/main/java/fr/communaywen/core/teams/TeamManager.java @@ -35,7 +35,9 @@ public TeamManager(AywenCraftPlugin plugin) { query.setString(1, rs.getString("teamName")); ItemStack[] newInventory = new BukkitSerializer().deserializeItemStacks(rs.getBytes("inventory")); - team.setInventory(newInventory); + if (newInventory != null) { + team.setInventory(newInventory); + } ResultSet players = query.executeQuery(); while (players.next()) { @@ -63,10 +65,9 @@ public Team createTeam(UUID owner, String name) { } try { - PreparedStatement statement = connection.prepareStatement("INSERT INTO teams VALUE (?, ?, 0, ?)"); + PreparedStatement statement = connection.prepareStatement("INSERT INTO teams (teamName, owner, balance) VALUES (?, ?, 0)"); statement.setString(1, name); statement.setString(2, owner.toString()); - statement.setObject(3, null); statement.executeUpdate(); } catch (Exception e) { From f64783814a7843b45b2e93579df4521592da95cd Mon Sep 17 00:00:00 2001 From: MathiasDPX Date: Sat, 27 Jul 2024 03:58:45 +0200 Subject: [PATCH 6/6] [Fix] Move save to InventoryCloseEvent --- src/main/java/fr/communaywen/core/teams/Team.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/communaywen/core/teams/Team.java b/src/main/java/fr/communaywen/core/teams/Team.java index 85d7796f..7b73563b 100644 --- a/src/main/java/fr/communaywen/core/teams/Team.java +++ b/src/main/java/fr/communaywen/core/teams/Team.java @@ -11,6 +11,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemFlag; @@ -47,8 +48,13 @@ public void onInventoryOpen(InventoryOpenEvent e) { e.getPlayer().sendMessage(ChatColor.RED+other.getName()+" est déjà entrain de regarder l'inventaire de team"); e.getPlayer().closeInventory(); e.setCancelled(true); - return; } + } + } + + @EventHandler + public void onInventoryClose(InventoryCloseEvent e) { + if (e.getInventory() == inventory) { try { PreparedStatement statement = connection.prepareStatement("UPDATE teams SET inventory = ? WHERE teamName = ?"); statement.setBytes(1, new BukkitSerializer().serializeItemStacks(inventory.getContents()));