/*
* Copyright (C) 2013-2016 Gonçalo Baltazar <me@goncalomb.com>
*
* This file is part of NBTEditor.
*
* NBTEditor is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* NBTEditor is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with NBTEditor. If not, see <http://www.gnu.org/licenses/>.
*/
package com.goncalomb.bukkit.nbteditor.commands;
import java.text.MessageFormat;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import com.goncalomb.bukkit.mylib.command.MyCommand;
import com.goncalomb.bukkit.mylib.command.MyCommandException;
import com.goncalomb.bukkit.mylib.utils.Utils;
import com.goncalomb.bukkit.nbteditor.ItemStorage;
public class CommandItemStorage extends MyCommand {
public CommandItemStorage() {
super("itemstorage", "is");
}
private static void validateName(String name) throws MyCommandException {
if (!ItemStorage.isValidName(name)) {
throw new MyCommandException("§cInvalid name. Use [0-9a-zA-Z_-], 64 characters max.");
}
}
private static void checkItemExistance(String name) throws MyCommandException {
if (!ItemStorage.existsItem(name)) {
throw new MyCommandException("§cThat item does not exist.");
}
}
@Command(args = "store", type = CommandType.PLAYER_ONLY, minargs = 1, usage = "<name>")
public boolean command_store(CommandSender sender, String[] args) throws MyCommandException {
ItemStack item = ((Player) sender).getInventory().getItemInMainHand();
if (item == null || item.getType() == Material.AIR) {
sender.sendMessage("§cYou must be holding an item.");
} else {
validateName(args[0]);
if (ItemStorage.addItem(item, args[0])) {
sender.sendMessage("§aStored.");
} else {
sender.sendMessage("§cDuplicate name.");
}
}
return true;
}
@Command(args = "get", type = CommandType.DEFAULT, minargs = 1, maxargs = 2, usage = "<name> [player]")
public boolean command_get(CommandSender sender, String[] args) throws MyCommandException {
validateName(args[0]);
checkItemExistance(args[0]);
Player player;
if (args.length == 2) {
player = CommandUtils.findPlayer(args[1]);
} else if (sender instanceof Player) {
player = (Player) sender;
} else {
sender.sendMessage("§cArgument 'player' missing!");
return false;
}
CommandUtils.giveItem(player, ItemStorage.getItem(args[0]));
sender.sendMessage("§aDone.");
return true;
}
@TabComplete(args = "get")
public List<String> tabcomplete_get(CommandSender sender, String[] args) {
if (args.length == 1) {
return Utils.getElementsWithPrefix(ItemStorage.listItems(), args[0]);
}
return CommandUtils.playerTabComplete(sender, args[1]);
}
@Command(args = "info", type = CommandType.DEFAULT, minargs = 1, usage = "<name>")
public boolean command_info(CommandSender sender, String[] args) throws MyCommandException {
validateName(args[0]);
checkItemExistance(args[0]);
ItemUtils.sendItemStackInformation(ItemStorage.getItem(args[0]), sender);
return true;
}
@TabComplete(args = "info")
public List<String> tabcomplete_info(CommandSender sender, String[] args) {
return Utils.getElementsWithPrefix(ItemStorage.listItems(), args[0]);
}
@Command(args = "update", type = CommandType.DEFAULT, minargs = 1, usage = "<name>")
public boolean command_update(CommandSender sender, String[] args) throws MyCommandException {
ItemStack item = ((Player) sender).getInventory().getItemInMainHand();
if (item == null || item.getType() == Material.AIR) {
sender.sendMessage("§cYou must be holding an item.");
} else {
validateName(args[0]);
checkItemExistance(args[0]);
ItemStack storedItem = ItemStorage.getItem(args[0]);
if (item.getType() != storedItem.getType()) {
sender.sendMessage(MessageFormat.format("§cThe stored item is from a different type, §e{0}§c, cannot update. Remove it first.", storedItem.getType()));
return true;
}
String itemName = item.getItemMeta().getDisplayName();
String storedItemName = storedItem.getItemMeta().getDisplayName();
itemName = (itemName == null ? "" : itemName);
storedItemName = (storedItemName == null ? "" : storedItemName);
if (!itemName.equals(storedItemName)) {
sender.sendMessage(MessageFormat.format("§cThe stored item has a different name, §e\"§r{0}§r§e\"§c, cannot update. Remove it first.", storedItemName));
return true;
}
ItemStorage.removeItem(args[0]);
ItemStorage.addItem(item, args[0]);
sender.sendMessage("§aUpdated.");
}
return true;
}
@TabComplete(args = "update")
public List<String> tabcomplete_update(CommandSender sender, String[] args) {
return Utils.getElementsWithPrefix(ItemStorage.listItems(), args[0]);
}
@Command(args = "remove", type = CommandType.PLAYER_ONLY, minargs = 1, usage = "<name>")
public boolean command_remove(CommandSender sender, String[] args) throws MyCommandException {
validateName(args[0]);
checkItemExistance(args[0]);
ItemStorage.removeItem(args[0]);
sender.sendMessage("§aRemoved.");
return true;
}
@TabComplete(args = "remove")
public List<String> tabcomplete_remove(CommandSender sender, String[] args) {
return Utils.getElementsWithPrefix(ItemStorage.listItems(), args[0]);
}
@Command(args = "list", type = CommandType.PLAYER_ONLY)
public boolean command_list(CommandSender sender, String[] args) throws MyCommandException {
sender.sendMessage("§7Stored items: " + StringUtils.join(ItemStorage.listItems(), ", "));
return true;
}
}