Newer
Older
TreasureChest / src / main / java / de / iani / treasurechest / TreasureChestCommandExecutor.java
@Brokkonaut Brokkonaut on 8 Oct 2018 13 KB Completed database storage
package de.iani.treasurechest;

import java.sql.SQLException;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;

import org.bukkit.ChatColor;
import org.bukkit.Effect;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;

import de.iani.playerUUIDCache.CachedPlayer;
import de.iani.treasurechest.PlayerTreasureChestContent.LoadState;
import de.iani.treasurechest.database.DatabaseTreasureChestItem;

public class TreasureChestCommandExecutor implements CommandExecutor {
    private TreasureChest plugin;

    public TreasureChestCommandExecutor(TreasureChest plugin) {
        this.plugin = plugin;
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (args.length == 0) {
            displayHelp(sender, label);
        } else {
            String subcommand = args[0].toLowerCase();
            if (subcommand.equals("setchest")) {
                if (!checkPlayer(sender) || !checkPermission(sender, "treasurechest.setchest")) {
                    return true;
                }
                Player player = ((Player) sender);
                Block target = player.getTargetBlock((Set<Material>) null, 5);
                plugin.setChestLocation(target == null ? null : target.getLocation());
                if (target != null) {
                    player.playEffect(target.getLocation(), Effect.MOBSPAWNER_FLAMES, null);
                    player.playEffect(target.getLocation(), Effect.MOBSPAWNER_FLAMES, null);
                    player.playEffect(target.getLocation(), Effect.MOBSPAWNER_FLAMES, null);
                    plugin.sendMessage(sender, "Treasurechest location set!");
                } else {
                    plugin.sendMessage(sender, "Treasurechest location removed!");
                }
            } else if (subcommand.equals("create")) {
                if (!checkPlayer(sender) || !checkPermission(sender, "treasurechest.create")) {
                    return true;
                }
                Player player = ((Player) sender);
                ItemStack inHand = player.getInventory().getItemInMainHand();
                if (inHand == null || inHand.getType() == Material.AIR || inHand.getAmount() == 0) {
                    plugin.sendMessage(sender, "You have to hold the display item in hand!", true);
                    return true;
                }
                TreasureChestItem newItem = new TreasureChestItem(inHand.clone(), null, 0);
                plugin.getData().setActiveItem(player.getUniqueId(), newItem);
                plugin.sendMessage(sender, "Created a new Treasurechest item!");
            } else if (subcommand.equals("addmoney")) {
                if (!checkPlayer(sender) || !checkPermission(sender, "treasurechest.create")) {
                    return true;
                }
                if (args.length < 2) {
                    plugin.sendMessage(sender, "/" + label + " addmoney <amount>", true);
                    return true;
                }
                int amount = getIntArgument(args[1], 0);
                Player player = ((Player) sender);
                TreasureChestItem activeItem = plugin.getData().getActiveItem(player.getUniqueId());
                if (activeItem == null) {
                    plugin.sendMessage(sender, "You have no active item!", true);
                    return true;
                }
                activeItem.setPriceMoney(activeItem.getPriceMoney() + amount);
                plugin.sendMessage(sender, "Set the money to " + activeItem.getPriceMoney());
            } else if (subcommand.equals("additem")) {
                if (!checkPlayer(sender) || !checkPermission(sender, "treasurechest.create")) {
                    return true;
                }
                Player player = ((Player) sender);
                ItemStack inHand = player.getInventory().getItemInMainHand();
                if (inHand == null || inHand.getType() == Material.AIR || inHand.getAmount() == 0) {
                    plugin.sendMessage(sender, "You have to hold the item in hand!", true);
                    return true;
                }
                TreasureChestItem activeItem = plugin.getData().getActiveItem(player.getUniqueId());
                if (activeItem == null) {
                    plugin.sendMessage(sender, "You have no active item!", true);
                    return true;
                }
                activeItem.addPriceItem(inHand.clone());
                plugin.sendMessage(sender, "Item added: " + inHand.getAmount() + " " + TreasureChest.capitalize(inHand.getType().name(), true));
            } else if (subcommand.equals("give")) {
                if (!checkPlayer(sender) || !checkPermission(sender, "treasurechest.give")) {
                    return true;
                }
                if (args.length < 2) {
                    plugin.sendMessage(sender, "/" + label + " give <player>", true);
                    return true;
                }
                Player player = ((Player) sender);
                TreasureChestItem activeItem = plugin.getData().getActiveItem(player.getUniqueId());
                if (activeItem == null) {
                    plugin.sendMessage(sender, "You have no active item!", true);
                    return true;
                }

                for (int arg = 1; arg < args.length; arg++) {
                    String nameOrId = args[arg].replace(",", "").trim();
                    CachedPlayer target = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(nameOrId);
                    if (target == null) {
                        plugin.sendMessage(sender, "Unknown player!", true);
                    } else {
                        plugin.addItem(target, activeItem.getDisplayItem(), activeItem.getPriceItems(), activeItem.getPriceMoney());
                        plugin.sendMessage(sender, "Item given to: " + target.getName());
                    }
                }
                return true;
            } else if (subcommand.equals("list")) {
                if (!checkPermission(sender, "treasurechest.list")) {
                    return true;
                }
                if (args.length < 2) {
                    plugin.sendMessage(sender, "/" + label + " list <player>", true);
                    return true;
                }
                CachedPlayer target = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(args[1], true);
                if (target == null) {
                    plugin.sendMessage(sender, "Unknown player!", true);
                    return true;
                }

                PlayerTreasureChestContent content = plugin.getData().getOrCreateChestContent(target.getUniqueId());
                content.loadAsync(new Runnable() {
                    @Override
                    public void run() {
                        plugin.sendMessage(sender, ChatColor.GRAY + "Preise von " + target.getName() + " (" + target.getUniqueId().toString() + "):");
                        List<DatabaseTreasureChestItem> items = content.getItems();
                        if (items.isEmpty()) {
                            plugin.sendMessage(sender, "keine Preise vorhanden");
                        } else {
                            ListedItemsData lid = new ListedItemsData(target.getUniqueId());
                            int nr = 1;
                            for (DatabaseTreasureChestItem i : items) {
                                plugin.sendMessage(sender, nr + ": " + i.getDisplayItem().getItemMeta().getDisplayName());
                                lid.addItem(nr, i.getId());
                                nr++;
                            }
                            if (sender instanceof Player) {
                                Player player = ((Player) sender);
                                plugin.getData().setListedItems(player.getUniqueId(), lid);
                            } else {
                                plugin.getData().setListedItems(null, lid);
                            }
                        }
                    }
                });
            } else if (subcommand.equals("remove")) {
                if (!checkPermission(sender, "treasurechest.remove")) {
                    return true;
                }
                if (args.length < 3) {
                    plugin.sendMessage(sender, "/" + label + " remove <player> <nr>", true);
                    return true;
                }

                CachedPlayer target = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(args[1], true);

                if (target == null) {
                    plugin.sendMessage(sender, "Unknown player!", true);
                    return true;
                }
                int nr = getIntArgument(args[2], -1);

                ListedItemsData lid;
                if (sender instanceof Player) {
                    Player player = ((Player) sender);
                    lid = plugin.getData().getListedItems(player.getUniqueId());
                } else {
                    lid = plugin.getData().getListedItems(null);
                }
                if (lid == null || !lid.getOwner().equals(target.getUniqueId())) {
                    plugin.sendMessage(sender, "Nicht der gelistete Spieler", true);
                    return true;
                }
                Integer key = lid.getItemDatabaseKey(nr);
                if (key == null) {
                    plugin.sendMessage(sender, "Ungültige ID", true);
                    return true;
                }
                try {
                    if (plugin.getDatabase().deleteItem(target.getUniqueId(), key)) {
                        PlayerTreasureChestContent content = plugin.getData().getChestContent(target.getUniqueId());
                        if (content != null && content.getLoadState() == LoadState.LOADED) {
                            content.removeItem(key);
                        }
                    } else {
                        plugin.sendMessage(sender, "Ungültige ID", true);
                        return true;
                    }
                } catch (SQLException e) {
                    plugin.sendMessage(sender, ChatColor.DARK_RED + "Datenbankfehler");
                    plugin.getLogger().log(Level.SEVERE, "Could not delete item " + key + " for " + target.getName() + ": " + e.getMessage(), e);
                    return true;
                }
                plugin.sendMessage(sender, "Der Preis wurde entfernt!");
            } else {
                plugin.sendMessage(sender, "Unknown subcommand!", true);
                return true;
            }
        }
        return true;
    }

    private void displayHelp(CommandSender sender, String label) {
        plugin.sendMessage(sender, ChatColor.GREEN + "Commands");
        if (checkPlayer(sender, true) && checkPermission(sender, "treasurechest.setchest", true)) {
            plugin.sendMessage(sender, "/" + label + " setchest");
            plugin.sendMessage(sender, ChatColor.GREEN + "  Set the treasure chest location to the location you are looking at.");
        }
        if (checkPlayer(sender, true) && checkPermission(sender, "treasurechest.create", true)) {
            plugin.sendMessage(sender, "/" + label + " create");
            plugin.sendMessage(sender, ChatColor.GREEN + "  Creates a price with the item in hand as display item.");
            plugin.sendMessage(sender, "/" + label + " additem");
            plugin.sendMessage(sender, ChatColor.GREEN + "  Adds the item in hand to the price.");
            plugin.sendMessage(sender, "/" + label + " addmoney <amount>");
            plugin.sendMessage(sender, ChatColor.GREEN + "  Adds money to a price.");
        }
        if (checkPlayer(sender, true) && checkPermission(sender, "treasurechest.give", true)) {
            plugin.sendMessage(sender, "/" + label + " give <player>");
            plugin.sendMessage(sender, ChatColor.GREEN + "  Gives a price to a player.");
        }
        if (checkPermission(sender, "treasurechest.list")) {
            plugin.sendMessage(sender, "/" + label + " list <player>");
            plugin.sendMessage(sender, ChatColor.GREEN + "  Gives price for a player.");
        }
        if (checkPermission(sender, "treasurechest.remove")) {
            plugin.sendMessage(sender, "/" + label + " remove <player> <id>");
            plugin.sendMessage(sender, ChatColor.GREEN + "  Removes a price from a players chest.");
        }
    }

    private int getIntArgument(String value, int defaultValue) {
        try {
            return Integer.parseInt(value);
        } catch (Exception e) {
            // ignore - return default
        }
        return defaultValue;
    }

    private boolean checkPermission(CommandSender sender, String perm) {
        return checkPermission(sender, perm, false);
    }

    private boolean checkPermission(CommandSender sender, String perm, boolean silent) {
        boolean hasPermission = sender.hasPermission(perm);
        if (!silent && !hasPermission) {
            plugin.sendMessage(sender, "No permission!", true);
        }
        return hasPermission;
    }

    private boolean checkPlayer(CommandSender sender) {
        return checkPlayer(sender, false);
    }

    private boolean checkPlayer(CommandSender sender, boolean silent) {
        boolean isPlayer = sender instanceof Player;
        if (!isPlayer && !silent) {
            plugin.sendMessage(sender, "You must be a player!", true);
        }
        return isPlayer;
    }
}