diff --git a/src/main/java/de/iani/treasurechest/Permissions.java b/src/main/java/de/iani/treasurechest/Permissions.java index 5dbe0c2..7844f7b 100644 --- a/src/main/java/de/iani/treasurechest/Permissions.java +++ b/src/main/java/de/iani/treasurechest/Permissions.java @@ -7,4 +7,5 @@ public static final String LIST = "treasurechest.list"; public static final String REMOVE = "treasurechest.remove"; public static final String UPDATEALL = "treasurechest.updateall"; + public static final String TRANSFER = "treasurechest.transfer"; } diff --git a/src/main/java/de/iani/treasurechest/TreasureChest.java b/src/main/java/de/iani/treasurechest/TreasureChest.java index 3b47b34..54bafd3 100644 --- a/src/main/java/de/iani/treasurechest/TreasureChest.java +++ b/src/main/java/de/iani/treasurechest/TreasureChest.java @@ -13,6 +13,7 @@ import de.iani.treasurechest.commands.ListCommand; import de.iani.treasurechest.commands.RemoveCommand; import de.iani.treasurechest.commands.SetChestCommand; +import de.iani.treasurechest.commands.TransferCommand; import de.iani.treasurechest.commands.UpdateAllCommand; import de.iani.treasurechest.database.DatabaseTreasureChestItem; import de.iani.treasurechest.database.SQLConfig; @@ -89,6 +90,7 @@ treasurechestCommand.addCommandMapping(new ListCommand(this), "list"); treasurechestCommand.addCommandMapping(new RemoveCommand(this), "remove"); treasurechestCommand.addCommandMapping(new UpdateAllCommand(this), "updateall"); + treasurechestCommand.addCommandMapping(new TransferCommand(this), "transfer"); getServer().getPluginManager().registerEvents(new ChestInventoryListener(this), this); getServer().getPluginManager().registerEvents(new PlayerEventListener(this), this); diff --git a/src/main/java/de/iani/treasurechest/commands/TransferCommand.java b/src/main/java/de/iani/treasurechest/commands/TransferCommand.java new file mode 100644 index 0000000..332d6ad --- /dev/null +++ b/src/main/java/de/iani/treasurechest/commands/TransferCommand.java @@ -0,0 +1,93 @@ +package de.iani.treasurechest.commands; + +import de.iani.cubesideutils.bukkit.commands.SubCommand; +import de.iani.cubesideutils.bukkit.commands.exceptions.DisallowsCommandBlockException; +import de.iani.cubesideutils.bukkit.commands.exceptions.IllegalSyntaxException; +import de.iani.cubesideutils.bukkit.commands.exceptions.InternalCommandException; +import de.iani.cubesideutils.bukkit.commands.exceptions.NoPermissionException; +import de.iani.cubesideutils.bukkit.commands.exceptions.RequiresPlayerException; +import de.iani.cubesideutils.commands.ArgsParser; +import de.iani.playerUUIDCache.CachedPlayer; +import de.iani.treasurechest.Permissions; +import de.iani.treasurechest.TreasureChest; +import java.sql.SQLException; +import java.util.Collection; +import java.util.List; +import java.util.logging.Level; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; + +public class TransferCommand extends SubCommand { + private TreasureChest plugin; + + public TransferCommand(TreasureChest plugin) { + this.plugin = plugin; + } + + @Override + public String getRequiredPermission() { + return Permissions.TRANSFER; + } + + @Override + public boolean requiresPlayer() { + return false; + } + + @Override + public String getUsage() { + return " CONFIRM"; + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String alias, String commandString, ArgsParser args) throws DisallowsCommandBlockException, RequiresPlayerException, NoPermissionException, IllegalSyntaxException, InternalCommandException { + if (args.remaining() != 3) { + plugin.sendMessage(sender, commandString + getUsage(), true); + return true; + } + CachedPlayer fromPlayer = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(args.getNext(), true); + if (fromPlayer == null) { + plugin.sendMessage(sender, "Unknown old player!", true); + return true; + } + CachedPlayer toPlayer = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(args.getNext(), true); + if (toPlayer == null) { + plugin.sendMessage(sender, "Unknown new player!", true); + return true; + } + + if (!args.getNext().equals("CONFIRM")) { + plugin.sendMessage(sender, commandString + getUsage(), true); + return true; + } + + try { + int transfered = plugin.getDatabase().transferItems(fromPlayer.getUniqueId(), toPlayer.getUniqueId()); + if (plugin.getServer().getPlayer(fromPlayer.getUniqueId()) != null) { + plugin.getData().reloadTreasureChest(fromPlayer.getUniqueId()); + } else { + plugin.getData().unloadTreasureChest(fromPlayer.getUniqueId()); + } + if (plugin.getServer().getPlayer(toPlayer.getUniqueId()) != null) { + plugin.getData().reloadTreasureChest(toPlayer.getUniqueId()); + } else { + plugin.getData().unloadTreasureChest(toPlayer.getUniqueId()); + } + + plugin.sendMessage(sender, transfered == 0 ? (fromPlayer.getName() + " hatte keine Items in seiner Schatztruhe!") : (transfered + " Items wurden von " + fromPlayer.getName() + " zu " + toPlayer.getName() + " übertragen!")); + } catch (SQLException e) { + plugin.sendMessage(sender, "Datenbankfehler", true); + plugin.getLogger().log(Level.SEVERE, "Could not transfer items from " + fromPlayer.getUniqueId() + " to " + toPlayer.getUniqueId() + ": " + e.getMessage(), e); + return true; + } + return true; + } + + @Override + public Collection onTabComplete(CommandSender sender, Command command, String alias, ArgsParser args) { + if (args.remaining() < 3) { + return null; + } + return List.of(); + } +} diff --git a/src/main/java/de/iani/treasurechest/database/TreasureChestDatabase.java b/src/main/java/de/iani/treasurechest/database/TreasureChestDatabase.java index b83e7c9..a88c220 100644 --- a/src/main/java/de/iani/treasurechest/database/TreasureChestDatabase.java +++ b/src/main/java/de/iani/treasurechest/database/TreasureChestDatabase.java @@ -29,6 +29,7 @@ private final String removeOldContent; private final String selectAllContent; private final String updateContent; + private final String transferContent; public TreasureChestDatabase(TreasureChest plugin, SQLConfig config) throws SQLException { this.plugin = plugin; @@ -47,6 +48,8 @@ updateContent = "UPDATE " + tableName + " SET content = ? WHERE id = ?"; + transferContent = "UPDATE " + tableName + " SET uuid = ? WHERE uuid = ?"; + this.connection.runCommands((connection, sqlConnection) -> { if (!sqlConnection.hasTable(tableName)) { Statement smt = connection.createStatement(); @@ -213,6 +216,15 @@ }); } + public int transferItems(UUID oldOwner, UUID newOwner) throws SQLException { + return this.connection.runCommands((connection, sqlConnection) -> { + PreparedStatement smt = sqlConnection.getOrCreateStatement(transferContent); + smt.setString(1, newOwner.toString()); + smt.setString(2, oldOwner.toString()); + return smt.executeUpdate(); + }); + } + public int deleteOldItems(long days) throws SQLException { return this.connection.runCommands((connection, sqlConnection) -> { PreparedStatement smt = sqlConnection.getOrCreateStatement(removeOldContent);