/*
* Copyright (C) 2016 eccentric_nz
*
* This program 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.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
package me.eccentric_nz.TARDIS.commands.admin;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import me.eccentric_nz.TARDIS.TARDIS;
import me.eccentric_nz.TARDIS.arch.TARDISArchCommand;
import me.eccentric_nz.TARDIS.commands.TARDISCommandHelper;
import me.eccentric_nz.TARDIS.enumeration.DIFFICULTY;
import me.eccentric_nz.TARDIS.enumeration.PRESET;
import me.eccentric_nz.TARDIS.planets.TARDISSkaro;
import me.eccentric_nz.TARDIS.utility.TARDISMessage;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
/**
* Command /tardisadmin [arguments].
*
* The Lord President was the most powerful member of the Time Lord Council and
* had near absolute authority, and used a link to the Matrix, a vast computer
* network containing the knowledge and experiences of all past generations of
* Time Lords, to set Time Lord policy and remain alert to potential threats
* from lesser civilisations.
*
* @author eccentric_nz
*/
public class TARDISAdminCommands implements CommandExecutor {
private final TARDIS plugin;
public HashMap<String, String> firstsStr = new HashMap<String, String>();
public List<String> firstsStrArtron = new ArrayList<String>();
public HashMap<String, String> firstsBool = new HashMap<String, String>();
public HashMap<String, String> firstsInt = new HashMap<String, String>();
public List<String> firstsIntArtron = new ArrayList<String>();
public TARDISAdminCommands(TARDIS plugin) {
this.plugin = plugin;
// add first arguments
firstsStr.put("add_regions", "");
firstsStr.put("arch", "");
firstsStr.put("area", "creation");
firstsStr.put("assemble", "");
firstsStr.put("chunks", "");
firstsStr.put("condenser", "");
firstsStr.put("config", "");
firstsStr.put("custom_schematic_seed", "creation");
firstsStr.put("database", "storage");
firstsStr.put("decharge", "");
firstsStr.put("default_key", "preferences");
firstsStr.put("default_preset", "police_box");
firstsStr.put("default_sonic", "preferences");
firstsStr.put("default_world_name", "creation");
firstsStr.put("delete", "");
firstsStr.put("desiege", "");
firstsStr.put("difficulty", "preferences");
firstsStr.put("enter", "");
firstsStr.put("exclude", "");
firstsStr.put("find", "");
firstsStr.put("gamemode", "creation");
firstsStr.put("include", "");
firstsStr.put("inventory_group", "creation");
firstsStr.put("key", "preferences");
firstsStr.put("language", "preferences");
firstsStr.put("list", "");
firstsStr.put("make_preset", "");
firstsStr.put("playercount", "");
firstsStr.put("prune", "");
firstsStr.put("prunelist", "");
firstsStr.put("purge", "");
firstsStr.put("purge_portals", "");
firstsStr.put("recharger", "");
firstsStr.put("region_flag", "");
firstsStr.put("reload", "");
firstsStr.put("remove_flag", "");
firstsStr.put("respect_towny", "preferences");
firstsStr.put("respect_worldguard", "preferences");
firstsStr.put("siege", "siege");
firstsStr.put("sign_colour", "police_box");
firstsStr.put("skaro", "");
firstsStr.put("tardis_lamp", "police_box");
firstsStr.put("vortex_fall", "preferences");
firstsStrArtron.add("full_charge_item");
firstsStrArtron.add("jettison_seed");
// boolean
firstsBool.put("3d_doors", "allow");
firstsBool.put("abandon", "abandon.enable");
firstsBool.put("achievements", "allow");
firstsBool.put("add_perms", "creation");
firstsBool.put("all_blocks", "allow");
firstsBool.put("autonomous", "allow");
firstsBool.put("chameleon", "travel");
firstsBool.put("check_blocks_before_upgrade", "desktop");
firstsBool.put("create_worlds", "creation");
firstsBool.put("create_worlds_with_perms", "creation");
firstsBool.put("custom_schematic", "creation");
firstsBool.put("damage", "circuits");
firstsBool.put("debug", "");
firstsBool.put("default_world", "creation");
firstsBool.put("emergency_npc", "allow");
firstsBool.put("exile", "travel");
firstsBool.put("external_gravity", "allow");
firstsBool.put("give_key", "travel");
firstsBool.put("guardians", "allow");
firstsBool.put("hads", "allow");
firstsBool.put("invisibility", "allow");
firstsBool.put("include_default_world", "travel");
firstsBool.put("keep_night", "creation");
firstsBool.put("land_on_water", "travel");
firstsBool.put("materialise", "police_box");
firstsBool.put("mob_farming", "allow");
firstsBool.put("name_tardis", "police_box");
firstsBool.put("nether", "travel");
firstsBool.put("open_door_policy", "preferences");
firstsBool.put("particles", "artron_furnace");
firstsBool.put("per_world_perms", "travel");
firstsBool.put("perception_filter", "allow");
firstsBool.put("power_down", "allow");
firstsBool.put("power_down_on_quit", "allow");
firstsBool.put("redefine", "travel.terminal");
firstsBool.put("reduce_count", "abandon");
firstsBool.put("render_entities", "preferences");
firstsBool.put("respect_factions", "preferences");
firstsBool.put("respect_grief_prevention", "preferences");
firstsBool.put("respect_worldborder", "preferences");
firstsBool.put("return_room_seed", "growth");
firstsBool.put("rooms_require_blocks", "growth");
firstsBool.put("set_biome", "police_box");
firstsBool.put("sfx", "allow");
firstsBool.put("sky_biome", "creation");
firstsBool.put("spawn_eggs", "allow");
firstsBool.put("spawn_random_monsters", "preferences");
firstsBool.put("strike_lightning", "preferences");
firstsBool.put("switch_resource_packs", "");
firstsBool.put("the_end", "travel");
firstsBool.put("tp_switch", "allow");
firstsBool.put("use_block_stack", "creation");
firstsBool.put("use_clay", "creation");
firstsBool.put("use_worldguard", "preferences");
firstsBool.put("village_travel", "allow");
firstsBool.put("walk_in_tardis", "preferences");
firstsBool.put("wg_flag_set", "allow");
firstsBool.put("zero_room", "allow");
// integer
firstsInt.put("ars_limit", "growth");
firstsInt.put("block_change_percent", "desktop");
firstsInt.put("border_radius", "creation");
firstsInt.put("confirm_timeout", "police_box");
firstsInt.put("count", "creation");
firstsInt.put("custom_creeper_id", "creation");
firstsInt.put("grace_period", "travel");
firstsInt.put("gravity_max_distance", "growth");
firstsInt.put("gravity_max_velocity", "growth");
firstsInt.put("hads_damage", "preferences");
firstsInt.put("hads_distance", "preferences");
firstsInt.put("heal_speed", "preferences");
firstsInt.put("ARS", "circuits.uses");
firstsInt.put("chameleon_uses", "circuits.uses");
firstsInt.put("input", "circuits.uses");
firstsInt.put("invisibility_uses", "circuits.uses");
firstsInt.put("materialisation", "circuits.uses");
firstsInt.put("memory", "circuits.uses");
firstsInt.put("randomiser", "circuits.uses");
firstsInt.put("scanner", "circuits.uses");
firstsInt.put("temporal", "circuits.uses");
firstsInt.put("malfunction", "preferences");
firstsInt.put("malfunction_end", "preferences");
firstsInt.put("malfunction_nether", "preferences");
firstsInt.put("min_time", "arch");
firstsInt.put("random_attempts", "travel");
firstsInt.put("random_circuit", "travel");
firstsInt.put("room_speed", "growth");
firstsInt.put("rooms_condenser_percent", "growth");
firstsInt.put("sfx_volume", "preferences");
firstsInt.put("terminal_step", "travel");
firstsInt.put("timeout", "travel");
firstsInt.put("timeout_height", "travel");
firstsInt.put("tips_limit", "creation");
firstsInt.put("tp_radius", "travel");
firstsInt.put("wall_data", "police_box");
firstsInt.put("wall_id", "police_box");
firstsIntArtron.add("autonomous");
firstsIntArtron.add("backdoor");
firstsIntArtron.add("comehere");
firstsIntArtron.add("creeper_recharge");
firstsIntArtron.add("full_charge");
firstsIntArtron.add("hide");
firstsIntArtron.add("jettison");
firstsIntArtron.add("lightning_recharge");
firstsIntArtron.add("nether_min");
firstsIntArtron.add("player");
firstsIntArtron.add("random");
firstsIntArtron.add("recharge_distance");
firstsIntArtron.add("the_end_min");
firstsIntArtron.add("travel");
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
// If the player typed /tardisadmin then do the following...
if (cmd.getName().equalsIgnoreCase("tardisadmin")) {
if (sender instanceof ConsoleCommandSender || sender.hasPermission("tardis.admin")) {
if (args.length == 0) {
new TARDISCommandHelper(plugin).getCommand("tardisadmin", sender);
return true;
}
String first = args[0].toLowerCase(Locale.ENGLISH);
if (!firstsStr.containsKey(first) && !firstsBool.containsKey(first) && !firstsInt.containsKey(first) && !firstsIntArtron.contains(first) && !firstsStrArtron.contains(first)) {
TARDISMessage.send(sender, "ARG_NOT_VALID");
return false;
}
if (args.length == 1) {
if (first.equals("skaro")) {
if (plugin.getServer().getWorld("Skaro") == null) {
new TARDISSkaro(plugin).createDalekWorld();
plugin.getPlanetsConfig().set("planets.Skaro.enabled", true);
} else {
TARDISMessage.send(sender, "WORLD_EXISTS", "Skaro");
}
return true;
}
if (first.equals("chunks")) {
return new TARDISChunksCommand(plugin).listChunks(sender);
}
if (first.equals("condenser")) {
return new TARDISCondenserCommand(plugin).set(sender);
}
if (first.equals("reload")) {
return new TARDISReloadCommand(plugin).reloadConfig(sender);
}
if (first.equals("add_regions")) {
return new TARDISAddRegionsCommand(plugin).doCheck(sender);
}
if (first.equals("remove_flag")) {
return new TARDISRemoveMobSpawnDeny(plugin).doAllowMobSpawning(sender);
}
}
if (first.equals("list")) {
return new TARDISListTardisesCommand(plugin).listTardises(sender, args);
}
if (first.equals("purge_portals")) {
return new TARDISPortalCommand(plugin).clearAll(sender);
}
if (args.length < 2) {
TARDISMessage.send(sender, "TOO_FEW_ARGS");
return false;
}
if (first.equals("arch")) {
if (args.length > 2) {
return new TARDISArchCommand(plugin).force(sender, args);
} else {
return new TARDISArchCommand(plugin).whois(sender, args);
}
}
if (first.equals("area")) {
plugin.getConfig().set("creation.area", args[1]);
}
if (first.equals("assemble")) {
return new TARDISAssembleCommand(plugin).assemble(sender, args[1]);
}
if (first.equals("config")) {
return new TARDISConfigCommand(plugin).showConfigOptions(sender, args);
}
if (first.equals("desiege")) {
return new TARDISDesiegeCommand(plugin).restore(sender, args);
}
if (first.equals("language")) {
return new TARDISLanguageCommand(plugin).setLanguage(sender, args);
}
if (first.equals("power_down")) {
return new TARDISPowerDownCommand(plugin).togglePowerDown(sender, args);
}
if (first.equals("database")) {
String dbtype = args[1].toLowerCase(Locale.ENGLISH);
if (!dbtype.equals("mysql") && !dbtype.equals("sqlite")) {
TARDISMessage.send(sender, "ARG_DB");
return true;
}
plugin.getConfig().set("database", dbtype);
}
if (first.equals("siege")) {
return new TARDISSiegeCommand(plugin).setOption(sender, args);
}
if (first.equals("sign_colour")) {
return new TARDISSignColourCommand(plugin).setColour(sender, args);
}
if (first.equals("make_preset")) {
return new TARDISMakePresetCommand(plugin).scanBlocks(sender, args);
}
if (first.equals("playercount")) {
return new TARDISPlayerCountCommand(plugin).countPlayers(sender, args);
}
if (first.equals("prune")) {
return new TARDISPruneCommand(plugin).startPruning(sender, args);
}
if (first.equals("prunelist")) {
return new TARDISPruneCommand(plugin).listPrunes(sender, args);
}
if (first.equals("purge")) {
return new TARDISPurgeCommand(plugin).clearAll(sender, args);
}
if (first.equals("recharger")) {
return new TARDISRechargerCommand(plugin).setRecharger(sender, args);
}
if (first.equals("decharge")) {
return new TARDISDechargeCommand(plugin).removeChragerStatus(sender, args);
}
if (first.equals("enter")) {
return new TARDISEnterCommand(plugin).enterTARDIS(sender, args);
}
if (first.equals("delete")) {
return new TARDISDeleteCommand(plugin).deleteTARDIS(sender, args);
}
if (first.equals("key") || first.equals("custom_schematic_seed") || first.equals("tardis_lamp")) {
return new TARDISSetMaterialCommand(plugin).setConfigMaterial(sender, args, firstsStr.get(first));
}
if (first.equals("full_charge_item") || first.equals("jettison_seed")) {
return new TARDISSetMaterialCommand(plugin).setConfigMaterial(sender, args);
}
if (first.equals("default_key") || first.equals("default_sonic")) {
return new TARDISDefaultCommand(plugin).setDefaultItem(sender, args);
}
if (first.equals("default_world_name")) {
return new TARDISDefaultWorldNameCommand(plugin).setName(sender, args);
}
if (first.equals("respect_towny")) {
return new TARDISSetRespectCommand(plugin).setRegion(sender, args);
}
if (first.equals("respect_worldguard")) {
return new TARDISSetRespectCommand(plugin).setFlag(sender, args);
}
if (first.equals("difficulty")) {
if (!args[1].equalsIgnoreCase("easy") && !args[1].equalsIgnoreCase("medium") && !args[1].equalsIgnoreCase("hard")) {
TARDISMessage.send(sender, "ARG_DIFF");
return true;
}
plugin.getConfig().set("preferences.difficulty", args[1].toLowerCase(Locale.ENGLISH));
plugin.setDifficulty(DIFFICULTY.valueOf(args[1].toUpperCase()));
}
if (first.equals("default_preset")) {
try {
PRESET preset = PRESET.valueOf(args[1].toUpperCase(Locale.ENGLISH));
} catch (IllegalArgumentException e) {
TARDISMessage.send(sender, "ARG_PRESET");
return true;
}
plugin.getConfig().set("police_box.default_preset", args[1].toUpperCase(Locale.ENGLISH));
}
if (first.equals("gamemode")) {
if (!args[1].equalsIgnoreCase("creative") && !args[1].equalsIgnoreCase("survival")) {
TARDISMessage.send(sender, "ARG_GAMEMODE");
return true;
}
plugin.getConfig().set("creation.gamemode", args[1].toLowerCase(Locale.ENGLISH));
}
if (first.equals("inventory_group")) {
plugin.getConfig().set("creation.inventory_group", args[1]);
}
if (first.equals("exclude") || first.equals("include")) {
return new TARDISSetWorldInclusionCommand(plugin).setWorldStatus(sender, args);
}
if (first.equals("region_flag")) {
return new TARDISRegionFlagCommand(plugin).toggleEntryExit(sender, args);
}
if (first.equals("vortex_fall")) {
if (!args[1].equalsIgnoreCase("kill") && !args[1].equalsIgnoreCase("teleport")) {
TARDISMessage.send(sender, "ARG_VORTEX");
return true;
}
plugin.getConfig().set("preferences.vortex_fall", args[1].toLowerCase(Locale.ENGLISH));
}
// checks if its a boolean config option
if (firstsBool.containsKey(first)) {
if (first.equals("zero_room")) {
return new TARDISSetZeroRoomCommand(plugin).setConfigZero(sender, args);
} else {
return new TARDISSetBooleanCommand(plugin).setConfigBool(sender, args, firstsBool.get(first));
}
}
// checks if its a number config option
if (firstsInt.containsKey(first)) {
if (first.equalsIgnoreCase("random_circuit")) {
return new TARDISSetIntegerCommand(plugin).setRandomInt(sender, args);
} else {
return new TARDISSetIntegerCommand(plugin).setConfigInt(sender, args, firstsInt.get(first));
}
}
if (firstsIntArtron.contains(first)) {
return new TARDISSetIntegerCommand(plugin).setConfigInt(sender, args);
}
plugin.saveConfig();
TARDISMessage.send(sender, "CONFIG_UPDATED");
return true;
} else {
TARDISMessage.send(sender, "CMD_ADMIN");
return false;
}
}
return false;
}
}