diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandafk.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandafk.java index 51ec11841f8..95ac1809169 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandafk.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandafk.java @@ -106,7 +106,7 @@ private void toggleAfk(final User sender, final User user, final String message) @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1 && sender.isAuthorized("essentials.afk.others")) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandback.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandback.java index a8894912746..32345b48eba 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandback.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandback.java @@ -77,7 +77,7 @@ private void teleportBack(final CommandSource sender, final User user, final Str @Override protected List getTabCompleteOptions(final Server server, final User user, final String commandLabel, final String[] args) { if (user.isAuthorized("essentials.back.others") && args.length == 1) { - return getPlayers(server, user); + return getPlayers(user); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbalance.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbalance.java index 4e94a735afd..4b8efd217ad 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbalance.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbalance.java @@ -39,7 +39,7 @@ public void run(final Server server, final User user, final String commandLabel, @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1 && sender.isAuthorized("essentials.balance.others")) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandban.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandban.java index 633140c6340..c0c16d397d5 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandban.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandban.java @@ -68,7 +68,7 @@ public void run(final Server server, final CommandSource sender, final String co @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbanip.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbanip.java index a9cc79ed1ad..f0eef7be0f6 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbanip.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbanip.java @@ -70,7 +70,7 @@ public void run(final Server server, final CommandSource sender, final String co protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { // TODO: Also list IP addresses? - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbook.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbook.java index d7fd13ec040..1df69caf58d 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbook.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbook.java @@ -106,7 +106,7 @@ protected List getTabCompleteOptions(final Server server, final User use } return options; } else if (args.length == 2 && args[0].equalsIgnoreCase("author") && user.isAuthorized("essentials.book.author")) { - final List options = getPlayers(server, user); + final List options = getPlayers(user); options.add("Herobrine"); // #EasterEgg return options; } else { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandburn.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandburn.java index 0455e2dad36..e3f90303189 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandburn.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandburn.java @@ -26,7 +26,7 @@ protected void run(final Server server, final CommandSource sender, final String @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else if (args.length == 2) { return COMMON_DURATIONS; } else { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandclearinventory.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandclearinventory.java index c3b19adb8ff..abe54678e39 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandclearinventory.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandclearinventory.java @@ -153,7 +153,7 @@ protected void clearHandler(final CommandSource sender, final Player player, fin protected List getTabCompleteOptions(final Server server, final User user, final String commandLabel, final String[] args) { if (user.isAuthorized("essentials.clearinventory.others")) { if (args.length == 1) { - final List options = getPlayers(server, user); + final List options = getPlayers(user); if (user.isAuthorized("essentials.clearinventory.all") || user.isAuthorized("essentials.clearinventory.multiple")) { // Assume that nobody will have the 'all' permission without the 'others' permission options.add("*"); @@ -182,7 +182,7 @@ protected List getTabCompleteOptions(final Server server, final User use @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - final List options = getPlayers(server, sender); + final List options = getPlayers(sender); options.add("*"); return options; } else if (args.length == 2) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commanddelhome.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commanddelhome.java index 20500ef45d2..e1b9dab0077 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commanddelhome.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commanddelhome.java @@ -87,7 +87,7 @@ protected List getTabCompleteOptions(final Server server, final CommandS if (canDelOthers) { final int sepIndex = args[0].indexOf(':'); if (sepIndex < 0) { - getPlayers(server, sender).forEach(player -> homes.add(player + ":")); + getPlayers(sender).forEach(player -> homes.add(player + ":")); } else { final String namePart = args[0].substring(0, sepIndex); final User otherUser; diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandeco.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandeco.java index d8576a475dd..3517f69937f 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandeco.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandeco.java @@ -87,7 +87,7 @@ protected List getTabCompleteOptions(final Server server, final CommandS } return options; } else if (args.length == 2) { - return getPlayers(server, sender); + return getPlayers(sender); } else if (args.length == 3 && !args[0].equalsIgnoreCase(EcoCommands.RESET.name())) { if (args[0].equalsIgnoreCase(EcoCommands.SET.name())) { return Lists.newArrayList("0", ess.getSettings().getStartingBalance().toString()); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandenderchest.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandenderchest.java index 478e7209236..51c46a394d3 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandenderchest.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandenderchest.java @@ -26,7 +26,7 @@ protected void run(final Server server, final User user, final String commandLab @Override protected List getTabCompleteOptions(final Server server, final User user, final String commandLabel, final String[] args) { if (args.length == 1 && user.isAuthorized("essentials.enderchest.others")) { - return getPlayers(server, user); + return getPlayers(user); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java index fa97ff2ff9f..74070bb43c6 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java @@ -1,962 +1,29 @@ package com.earth2me.essentials.commands; -import com.earth2me.essentials.CommandSource; -import com.earth2me.essentials.EssentialsUpgrade; -import com.earth2me.essentials.User; -import com.earth2me.essentials.craftbukkit.Inventories; -import com.earth2me.essentials.economy.EconomyLayer; -import com.earth2me.essentials.economy.EconomyLayers; -import com.earth2me.essentials.userstorage.ModernUserMap; -import com.earth2me.essentials.utils.AdventureUtil; -import com.earth2me.essentials.utils.CommandMapUtil; -import com.earth2me.essentials.utils.DateUtil; -import com.earth2me.essentials.utils.FloatUtil; -import com.earth2me.essentials.utils.NumberUtil; -import com.earth2me.essentials.utils.PasteUtil; -import com.earth2me.essentials.utils.RegistryUtil; -import com.earth2me.essentials.utils.VersionUtil; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Lists; -import com.google.gson.JsonArray; -import com.google.gson.JsonNull; -import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; -import net.ess3.api.TranslatableException; -import net.ess3.provider.KnownCommandsProvider; -import net.ess3.provider.OnlineModeProvider; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Server; -import org.bukkit.Sound; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.PluginDescriptionFile; -import org.bukkit.plugin.PluginManager; -import org.bukkit.scheduler.BukkitRunnable; - -import java.io.File; -import java.io.IOException; -import java.lang.management.ManagementFactory; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; -import java.util.function.Supplier; -import java.util.logging.Level; -import java.util.stream.Collectors; - -import static com.earth2me.essentials.I18n.tlLiteral; +import com.earth2me.essentials.commands.essentials.CleanupCommand; +import com.earth2me.essentials.commands.essentials.CommandMapCommand; +import com.earth2me.essentials.commands.essentials.DebugCommand; +import com.earth2me.essentials.commands.essentials.DumpCommand; +import com.earth2me.essentials.commands.essentials.HomesCommand; +import com.earth2me.essentials.commands.essentials.ItemTestCommand; +import com.earth2me.essentials.commands.essentials.MooCommand; +import com.earth2me.essentials.commands.essentials.NyanCommand; +import com.earth2me.essentials.commands.essentials.UsermapCommand; +import com.earth2me.essentials.commands.essentials.VersionCommand; // This command has 4 undocumented behaviours #EasterEgg -public class Commandessentials extends EssentialsCommand { - - private static final Sound NOTE_HARP = RegistryUtil.valueOf(Sound.class, "BLOCK_NOTE_BLOCK_HARP", "BLOCK_NOTE_HARP", "NOTE_PIANO"); - private static final Sound MOO_SOUND = RegistryUtil.valueOf(Sound.class, "COW_IDLE", "ENTITY_COW_MILK"); - - private static final String HOMES_USAGE = "/ homes (fix | delete [world])"; - - private static final String NYAN_TUNE = "1D#,1E,2F#,,2A#,1E,1D#,1E,2F#,2B,2D#,2E,2D#,2A#,2B,,2F#,,1D#,1E,2F#,2B,2C#,2A#,2B,2C#,2E,2D#,2E,2C#,,2F#,,2G#,,1D,1D#,,1C#,1D,1C#,1B,,1B,,1C#,,1D,,1D,1C#,1B,1C#,1D#,2F#,2G#,1D#,2F#,1C#,1D#,1B,1C#,1B,1D#,,2F#,,2G#,1D#,2F#,1C#,1D#,1B,1D,1D#,1D,1C#,1B,1C#,1D,,1B,1C#,1D#,2F#,1C#,1D,1C#,1B,1C#,,1B,,1C#,,2F#,,2G#,,1D,1D#,,1C#,1D,1C#,1B,,1B,,1C#,,1D,,1D,1C#,1B,1C#,1D#,2F#,2G#,1D#,2F#,1C#,1D#,1B,1C#,1B,1D#,,2F#,,2G#,1D#,2F#,1C#,1D#,1B,1D,1D#,1D,1C#,1B,1C#,1D,,1B,1C#,1D#,2F#,1C#,1D,1C#,1B,1C#,,1B,,1B,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1B,,"; - private static final String[] CONSOLE_MOO = new String[] {" (__)", " (oo)", " /------\\/", " / | ||", " * /\\---/\\", " ~~ ~~", "....\"Have you mooed today?\"..."}; - private static final String[] PLAYER_MOO = new String[] {" (__)", " (oo)", " /------\\/", " / | | |", " * /\\---/\\", " ~~ ~~", "....\"Have you mooed today?\"..."}; - private static final List versionPlugins = Arrays.asList( - "Vault", // API - "Reserve", // API - "PlaceholderAPI", // API - "CMI", // potential for issues - "Towny", // past issues; admins should ensure latest - "ChestShop", // past issues; admins should ensure latest - "Citizens", // fires player events - "LuckPerms", // permissions (recommended) - "UltraPermissions", - "PermissionsEx", // permissions (unsupported) - "GroupManager", // permissions (unsupported) - "bPermissions", // permissions (unsupported) - "DiscordSRV", // potential for issues if EssentialsXDiscord is installed - - // Chat signing bypass plugins that can potentially break EssentialsChat - "AntiPopup", - "NoChatReports", - "NoEncryption" - ); - private static final List officialPlugins = Arrays.asList( - "EssentialsAntiBuild", - "EssentialsChat", - "EssentialsDiscord", - "EssentialsDiscordLink", - "EssentialsGeoIP", - "EssentialsProtect", - "EssentialsSpawn", - "EssentialsXMPP" - ); - private static final List warnPlugins = Arrays.asList( - "PermissionsEx", - "GroupManager", - "bPermissions", - - // Brain-dead chat signing bypass that break EssentialsChat - "NoChatReports", - "NoEncryption" - ); - private transient TuneRunnable currentTune = null; - +public class Commandessentials extends EssentialsTreeCommand { public Commandessentials() { super("essentials"); - } - - @Override - public void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { - if (args.length == 0) { - showUsage(sender); - } - - switch (args[0]) { - // Info commands - case "debug": - case "verbose": - runDebug(server, sender, commandLabel, args); - break; - case "ver": - case "version": - runVersion(server, sender, commandLabel, args); - break; - case "cmd": - case "commands": - runCommands(server, sender, commandLabel, args); - break; - case "dump": - runDump(server, sender, commandLabel, args); - break; - - // Data commands - case "reload": - runReload(server, sender, commandLabel, args); - break; - case "reset": - runReset(server, sender, commandLabel, args); - break; - case "cleanup": - runCleanup(server, sender, commandLabel, args); - break; - case "homes": - runHomes(server, sender, commandLabel, args); - break; - case "usermap": - runUserMap(sender, args); - break; - - case "itemtest": - runItemTest(server, sender, commandLabel, args); - break; - - // "#EasterEgg" - case "nya": - case "nyan": - runNya(server, sender, commandLabel, args); - break; - case "moo": - runMoo(server, sender, commandLabel, args); - break; - default: - showUsage(sender); - break; - } - } - - public void runItemTest(Server server, CommandSource sender, String commandLabel, String[] args) { - if (!sender.isAuthorized("essentials.itemtest") || args.length < 2 || !sender.isPlayer()) { - return; - } - - final Player player = sender.getPlayer(); - assert player != null; - - switch (args[1]) { - case "slot": { - if (args.length < 3) { - return; - } - player.getInventory().setItem(Integer.parseInt(args[2]), new ItemStack(Material.DIRT)); - break; - } - case "overfill": { - sender.sendMessage(Inventories.addItem(player, 42, false, new ItemStack(Material.DIAMOND_SWORD, 1), new ItemStack(Material.DIRT, 32), new ItemStack(Material.DIRT, 32)).toString()); - break; - } - case "overfill2": { - if (args.length < 4) { - return; - } - final boolean armor = Boolean.parseBoolean(args[2]); - final boolean add = Boolean.parseBoolean(args[3]); - final ItemStack[] items = new ItemStack[]{new ItemStack(Material.DIAMOND_SWORD, 1), new ItemStack(Material.DIRT, 32), new ItemStack(Material.DIRT, 32), new ItemStack(Material.DIAMOND_HELMET, 4), new ItemStack(Material.CHAINMAIL_LEGGINGS, 1)}; - if (Inventories.hasSpace(player, 0, armor, items)) { - if (add) { - sender.sendMessage(Inventories.addItem(player, 0, armor, items).toString()); - } - sender.sendMessage("SO MUCH SPACE!"); - } else { - sender.sendMessage("No space!"); - } - break; - } - case "remove": { - if (args.length < 3) { - return; - } - Inventories.removeItemExact(player, new ItemStack(Material.PUMPKIN, 1), Boolean.parseBoolean(args[2])); - break; - } - default: { - break; - } - } - } - - // Displays the command's usage. - private void showUsage(final CommandSource sender) throws Exception { - throw new NotEnoughArgumentsException(); - } - - // Lists commands that are being handed over to other plugins. - private void runCommands(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { - if (ess.getAlternativeCommandsHandler().disabledCommands().size() == 0) { - sender.sendTl("blockListEmpty"); - return; - } - - sender.sendTl("blockList"); - for (final Map.Entry entry : ess.getAlternativeCommandsHandler().disabledCommands().entrySet()) { - sender.sendMessage(entry.getKey() + " => " + entry.getValue()); - } - } - - // Generates a paste of useful information - private void runDump(Server server, CommandSource sender, String commandLabel, String[] args) { - sender.sendTl("dumpCreating"); - - final JsonObject dump = new JsonObject(); - - final JsonObject meta = new JsonObject(); - meta.addProperty("timestamp", Instant.now().toEpochMilli()); - meta.addProperty("sender", sender.getPlayer() != null ? sender.getPlayer().getName() : null); - meta.addProperty("senderUuid", sender.getPlayer() != null ? sender.getPlayer().getUniqueId().toString() : null); - dump.add("meta", meta); - - final JsonObject serverData = new JsonObject(); - serverData.addProperty("bukkit-version", Bukkit.getBukkitVersion()); - serverData.addProperty("server-version", Bukkit.getVersion()); - serverData.addProperty("server-brand", Bukkit.getName()); - serverData.addProperty("online-mode", ess.provider(OnlineModeProvider.class).getOnlineModeString()); - final JsonObject supportStatus = new JsonObject(); - final VersionUtil.SupportStatus status = VersionUtil.getServerSupportStatus(); - supportStatus.addProperty("status", status.name()); - supportStatus.addProperty("supported", status.isSupported()); - supportStatus.addProperty("trigger", VersionUtil.getSupportStatusClass()); - serverData.add("support-status", supportStatus); - dump.add("server-data", serverData); - - final JsonObject environment = new JsonObject(); - environment.addProperty("java-version", System.getProperty("java.version")); - environment.addProperty("operating-system", System.getProperty("os.name")); - environment.addProperty("uptime", DateUtil.formatDateDiff(ManagementFactory.getRuntimeMXBean().getStartTime())); - environment.addProperty("allocated-memory", (Runtime.getRuntime().totalMemory() / 1024 / 1024) + "MB"); - dump.add("environment", environment); - - final JsonObject essData = new JsonObject(); - essData.addProperty("version", ess.getDescription().getVersion()); - final JsonObject updateData = new JsonObject(); - updateData.addProperty("id", ess.getUpdateChecker().getVersionIdentifier()); - updateData.addProperty("branch", ess.getUpdateChecker().getVersionBranch()); - updateData.addProperty("dev", ess.getUpdateChecker().isDevBuild()); - essData.add("update-data", updateData); - final JsonObject econLayer = new JsonObject(); - econLayer.addProperty("enabled", !ess.getSettings().isEcoDisabled()); - econLayer.addProperty("selected-layer", EconomyLayers.isLayerSelected()); - final EconomyLayer layer = EconomyLayers.getSelectedLayer(); - econLayer.addProperty("name", layer == null ? "null" : layer.getName()); - econLayer.addProperty("layer-version", layer == null ? "null" : layer.getPluginVersion()); - econLayer.addProperty("backend-name", layer == null ? "null" : layer.getBackendName()); - essData.add("economy-layer", econLayer); - final JsonArray addons = new JsonArray(); - final JsonArray plugins = new JsonArray(); - final ArrayList alphabetical = new ArrayList<>(); - Collections.addAll(alphabetical, Bukkit.getPluginManager().getPlugins()); - alphabetical.sort(Comparator.comparing(o -> o.getName().toUpperCase(Locale.ENGLISH))); - for (final Plugin plugin : alphabetical) { - final JsonObject pluginData = new JsonObject(); - final PluginDescriptionFile info = plugin.getDescription(); - final String name = info.getName(); - - pluginData.addProperty("name", name); - pluginData.addProperty("version", info.getVersion()); - pluginData.addProperty("description", info.getDescription()); - pluginData.addProperty("main", info.getMain()); - pluginData.addProperty("enabled", plugin.isEnabled()); - pluginData.addProperty("official", plugin == ess || officialPlugins.contains(name)); - pluginData.addProperty("unsupported", warnPlugins.contains(name)); - - final JsonArray authors = new JsonArray(); - for (final String author : info.getAuthors()) { - authors.add(author == null ? JsonNull.INSTANCE : new JsonPrimitive(author)); - } - pluginData.add("authors", authors); - - if (name.startsWith("Essentials") && !name.equals("Essentials")) { - addons.add(pluginData); - } - plugins.add(pluginData); - } - essData.add("addons", addons); - dump.add("ess-data", essData); - dump.add("plugins", plugins); - - final List files = new ArrayList<>(); - files.add(new PasteUtil.PasteFile("dump.json", dump.toString())); - - final Plugin essDiscord = Bukkit.getPluginManager().getPlugin("EssentialsDiscord"); - final Plugin essDiscordLink = Bukkit.getPluginManager().getPlugin("EssentialsDiscordLink"); - final Plugin essSpawn = Bukkit.getPluginManager().getPlugin("EssentialsSpawn"); - - final Map knownCommandsCopy = new HashMap<>(ess.provider(KnownCommandsProvider.class).getKnownCommands()); - final Map disabledCommandsCopy = new HashMap<>(ess.getAlternativeCommandsHandler().disabledCommands()); - - // Further operations will be heavy IO - ess.runTaskAsynchronously(() -> { - boolean config = false; - boolean discord = false; - boolean kits = false; - boolean log = false; - boolean worth = false; - boolean tpr = false; - boolean spawns = false; - boolean commands = false; - for (final String arg : args) { - if (arg.equals("*") || arg.equalsIgnoreCase("all")) { - config = true; - discord = true; - kits = true; - log = true; - worth = true; - tpr = true; - spawns = true; - commands = true; - break; - } else if (arg.equalsIgnoreCase("config")) { - config = true; - } else if (arg.equalsIgnoreCase("discord")) { - discord = true; - } else if (arg.equalsIgnoreCase("kits")) { - kits = true; - } else if (arg.equalsIgnoreCase("log")) { - log = true; - } else if (arg.equalsIgnoreCase("worth")) { - worth = true; - } else if (arg.equalsIgnoreCase("tpr")) { - tpr = true; - } else if (arg.equalsIgnoreCase("spawns")) { - spawns = true; - } else if (arg.equalsIgnoreCase("commands")) { - commands = true; - } - } - - if (config) { - try { - files.add(new PasteUtil.PasteFile("config.yml", new String(Files.readAllBytes(ess.getSettings().getConfigFile().toPath()), StandardCharsets.UTF_8))); - } catch (IOException e) { - sender.sendTl("dumpErrorUpload", "config.yml", e.getMessage()); - } - } - - if (discord && essDiscord != null) { - try { - files.add(new PasteUtil.PasteFile("discord-config.yml", - new String(Files.readAllBytes(essDiscord.getDataFolder().toPath().resolve("config.yml")), StandardCharsets.UTF_8) - .replaceAll("[A-Za-z\\d]{24}\\.[\\w-]{6}\\.[\\w-]{27}", ""))); - } catch (IOException e) { - sender.sendTl("dumpErrorUpload", "discord-config.yml", e.getMessage()); - } - - if (essDiscordLink != null) { - try { - files.add(new PasteUtil.PasteFile("discord-link-config.yml", - new String(Files.readAllBytes(essDiscordLink.getDataFolder().toPath().resolve("config.yml")), StandardCharsets.UTF_8))); - } catch (IOException e) { - sender.sendTl("dumpErrorUpload", "discord-link-config.yml", e.getMessage()); - } - } - } - - if (kits) { - try { - files.add(new PasteUtil.PasteFile("kits.yml", new String(Files.readAllBytes(ess.getKits().getFile().toPath()), StandardCharsets.UTF_8))); - } catch (IOException e) { - sender.sendTl("dumpErrorUpload", "kits.yml", e.getMessage()); - } - } - - if (log) { - try { - files.add(new PasteUtil.PasteFile("latest.log", new String(Files.readAllBytes(Paths.get("logs", "latest.log")), StandardCharsets.UTF_8) - .replaceAll("(?m)^\\[\\d\\d:\\d\\d:\\d\\d] \\[.+/(?:DEBUG|TRACE)]: .+\\s(?:[A-Za-z.]+:.+\\s(?:\\t.+\\s)*)?\\s*(?:\"[A-Za-z]+\" : .+[\\s}\\]]+)*", "") - .replaceAll("(?:[0-9]{1,3}\\.){3}[0-9]{1,3}", ""))); - } catch (IOException e) { - sender.sendTl("dumpErrorUpload", "latest.log", e.getMessage()); - } - } - - if (worth) { - try { - files.add(new PasteUtil.PasteFile("worth.yml", new String(Files.readAllBytes(ess.getWorth().getFile().toPath()), StandardCharsets.UTF_8))); - } catch (IOException e) { - sender.sendTl("dumpErrorUpload", "worth.yml", e.getMessage()); - } - } - - if (tpr) { - try { - files.add(new PasteUtil.PasteFile("tpr.yml", new String(Files.readAllBytes(ess.getRandomTeleport().getFile().toPath()), StandardCharsets.UTF_8))); - } catch (IOException e) { - sender.sendTl("dumpErrorUpload", "tpr.yml", e.getMessage()); - } - } - - if (spawns && essSpawn != null) { - try { - files.add(new PasteUtil.PasteFile("spawn.yml", new String(Files.readAllBytes(ess.getDataFolder().toPath().resolve("spawn.yml")), StandardCharsets.UTF_8))); - } catch (IOException e) { - sender.sendTl("dumpErrorUpload", "spawn.yml", e.getMessage()); - } - } - - if (commands) { - try { - files.add(new PasteUtil.PasteFile("commands.yml", new String(Files.readAllBytes(Paths.get("commands.yml")), StandardCharsets.UTF_8))); - files.add(new PasteUtil.PasteFile("commandmap.json", CommandMapUtil.toJsonPretty(ess, knownCommandsCopy))); - files.add(new PasteUtil.PasteFile("commandoverride.json", disabledCommandsCopy.toString())); - } catch (IOException e) { - sender.sendTl("dumpErrorUpload", "commands.yml", e.getMessage()); - } - } - - final CompletableFuture future = PasteUtil.createPaste(files); - future.thenAccept(result -> { - if (result != null) { - final String dumpUrl = "https://essentialsx.net/dump.html?bytebin=" + result.getPasteId(); - sender.sendTl("dumpUrl", dumpUrl); - // pastes.dev doesn't support deletion keys - //sender.sendTl("dumpDeleteKey", result.getDeletionKey()); - if (sender.isPlayer()) { - ess.getLogger().info(AdventureUtil.miniToLegacy(tlLiteral("dumpConsoleUrl", dumpUrl))); - // pastes.dev doesn't support deletion keys - //ess.getLogger().info(AdventureUtil.miniToLegacy(tlLiteral("dumpDeleteKey", result.getDeletionKey()))); - } - } - files.clear(); - }); - future.exceptionally(throwable -> { - sender.sendTl("dumpError", throwable.getMessage()); - return null; - }); - }); - } - - // Resets the given player's user data. - private void runReset(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { - if (args.length < 2) { - throw new Exception("/ reset "); - } - final User user = getPlayer(server, args, 1, true, true); - user.reset(); - sender.sendMessage("Reset Essentials userdata for player: " + user.getDisplayName()); - } - - // Toggles debug mode. - private void runDebug(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { - ess.getSettings().setDebug(!ess.getSettings().isDebug()); - sender.sendMessage("Essentials " + ess.getDescription().getVersion() + " debug mode " + (ess.getSettings().isDebug() ? "enabled" : "disabled")); - } - - // Reloads all reloadable configs. - private void runReload(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { - ess.reload(); - sender.sendTl("essentialsReload", ess.getDescription().getVersion()); - } - - // Pop tarts. - private void runNya(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { - if (currentTune != null) { - currentTune.cancel(); - } - - currentTune = new TuneRunnable(NYAN_TUNE, NOTE_HARP, ess::getOnlinePlayers); - currentTune.runTaskTimer(ess, 20, 2); - } - - // Cow farts. - private void runMoo(final Server server, final CommandSource sender, final String command, final String[] args) { - if (args.length == 2 && args[1].equals("moo")) { - for (final String s : CONSOLE_MOO) { - ess.getLogger().info(s); - } - for (final Player player : ess.getOnlinePlayers()) { - player.sendMessage(PLAYER_MOO); - player.playSound(player.getLocation(), MOO_SOUND, 1, 1.0f); - } - } else { - if (sender.isPlayer()) { - sender.getSender().sendMessage(PLAYER_MOO); - final Player player = sender.getPlayer(); - player.playSound(player.getLocation(), MOO_SOUND, 1, 1.0f); - - } else { - sender.getSender().sendMessage(CONSOLE_MOO); - } - } - } - - // Cleans up inactive users. - private void runCleanup(final Server server, final CommandSource sender, final String command, final String[] args) throws Exception { - if (args.length < 2 || !NumberUtil.isInt(args[1])) { - sender.sendMessage("This sub-command will delete users who haven't logged in in the last days."); - sender.sendMessage("Optional parameters define the minimum amount required to prevent deletion."); - sender.sendMessage("Unless you define larger default values, this command will ignore people who have more than 0 money/homes."); - throw new Exception("/ cleanup [money] [homes]"); - } - - sender.sendTl("cleaning"); - - final long daysArg = Long.parseLong(args[1]); - final double moneyArg = args.length >= 3 ? FloatUtil.parseDouble(args[2].replaceAll("[^0-9.]", "")) : 0; - final int homesArg = args.length >= 4 && NumberUtil.isInt(args[3]) ? Integer.parseInt(args[3]) : 0; - - ess.runTaskAsynchronously(() -> { - final long currTime = System.currentTimeMillis(); - for (final UUID u : ess.getUsers().getAllUserUUIDs()) { - final User user = ess.getUsers().loadUncachedUser(u); - if (user == null) { - continue; - } - - long lastLog = user.getLastLogout(); - if (lastLog == 0) { - lastLog = user.getLastLogin(); - } - if (lastLog == 0) { - user.setLastLogin(currTime); - } - - if (user.isNPC()) { - continue; - } - - final long timeDiff = currTime - lastLog; - final long milliDays = daysArg * 24L * 60L * 60L * 1000L; - final int homeCount = user.getHomes().size(); - final double moneyCount = user.getMoney().doubleValue(); - - if ((lastLog == 0) || (timeDiff < milliDays) || (homeCount > homesArg) || (moneyCount > moneyArg)) { - continue; - } - - if (ess.getSettings().isDebug()) { - ess.getLogger().info("Deleting user: " + user.getName() + " Money: " + moneyCount + " Homes: " + homeCount + " Last seen: " + DateUtil.formatDateDiff(lastLog)); - } - - user.reset(); - } - sender.sendTl("cleaned"); - }); - } - - private void runHomes(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { - if (args.length < 2) { - sender.sendMessage("This sub-command provides a utility to mass-delete homes based on user options:"); - sender.sendMessage("Use \"fix\" to delete all homes inside non-existent or unloaded worlds."); - sender.sendMessage("Use \"delete\" to delete all existing homes."); - sender.sendMessage("Use \"delete \" to delete all homes inside a specific world."); - throw new Exception(HOMES_USAGE); - } - - switch (args[1]) { - case "fix": - sender.sendTl("fixingHomes"); - ess.runTaskAsynchronously(() -> { - for (final UUID u : ess.getUsers().getAllUserUUIDs()) { - final User user = ess.getUsers().loadUncachedUser(u); - if (user == null) { - continue; - } - for (String homeName : user.getHomes()) { - try { - if (user.getHome(homeName) == null) { - user.delHome(homeName); - } - } catch (Exception e) { - ess.getLogger().info("Unable to delete home " + homeName + " for " + user.getName()); - } - } - } - sender.sendTl("fixedHomes"); - }); - break; - case "delete": - final boolean filterByWorld = args.length >= 3; - if (filterByWorld && server.getWorld(args[2]) == null) { - throw new TranslatableException("invalidWorld"); - } - if (filterByWorld) { - sender.sendTl("deletingHomesWorld", args[2]); - } else { - sender.sendTl("deletingHomes"); - } - ess.runTaskAsynchronously(() -> { - for (final UUID u : ess.getUsers().getAllUserUUIDs()) { - final User user = ess.getUsers().loadUncachedUser(u); - if (user == null) { - continue; - } - for (String homeName : user.getHomes()) { - try { - final Location home = user.getHome(homeName); - if (!filterByWorld || (home != null && home.getWorld() != null && home.getWorld().getName().equals(args[2]))) { - user.delHome(homeName); - } - } catch (Exception e) { - ess.getLogger().info("Unable to delete home " + homeName + " for " + user.getName()); - } - } - } - - if (filterByWorld) { - sender.sendTl("deletedHomesWorld", args[2]); - } else { - sender.sendTl("deletedHomes"); - } - }); - break; - default: - throw new Exception(HOMES_USAGE); - } - } - - // Gets information about cached users - private void runUserMap(final CommandSource sender, final String[] args) { - if (!sender.isAuthorized("essentials.usermap")) { - return; - } - - final ModernUserMap userMap = (ModernUserMap) ess.getUsers(); - sender.sendTl("usermapSize", userMap.getCachedCount(), userMap.getUserCount(), ess.getSettings().getMaxUserCacheCount()); - if (args.length > 1) { - if (args[1].equals("full")) { - for (final Map.Entry entry : userMap.getNameCache().entrySet()) { - sender.sendTl("usermapEntry", entry.getKey(), entry.getValue().toString()); - } - } else if (args[1].equals("purge")) { - final boolean seppuku = args.length > 2 && args[2].equals("iknowwhatimdoing"); - - sender.sendTl("usermapPurge", String.valueOf(seppuku)); - - final Set uuids = new HashSet<>(ess.getUsers().getAllUserUUIDs()); - ess.runTaskAsynchronously(() -> { - final File userdataFolder = new File(ess.getDataFolder(), "userdata"); - final File backupFolder = new File(ess.getDataFolder(), "userdata-npc-backup-boogaloo-" + System.currentTimeMillis()); - - if (!userdataFolder.isDirectory()) { - ess.getLogger().warning("Missing userdata folder, aborting usermap purge."); - return; - } - - if (seppuku && !backupFolder.mkdir()) { - ess.getLogger().warning("Unable to create backup folder, aborting usermap purge."); - return; - } - - int total = 0; - final File[] files = userdataFolder.listFiles(EssentialsUpgrade.YML_FILTER); - if (files != null) { - for (final File file : files) { - try { - final String fileName = file.getName(); - final UUID uuid = UUID.fromString(fileName.substring(0, fileName.length() - 4)); - if (!uuids.contains(uuid)) { - total++; - ess.getLogger().warning("Found orphaned userdata file: " + file.getName()); - if (seppuku) { - try { - com.google.common.io.Files.move(file, new File(backupFolder, file.getName())); - } catch (IOException e) { - ess.getLogger().log(Level.WARNING, "Unable to move orphaned userdata file: " + file.getName(), e); - } - } - } - } catch (IllegalArgumentException ignored) { - } - } - } - ess.getLogger().info("Found " + total + " orphaned userdata files."); - }); - } else if (args[1].equalsIgnoreCase("cache")) { - sender.sendTl("usermapKnown", ess.getUsers().getAllUserUUIDs().size(), ess.getUsers().getNameCache().size()); - } else { - try { - final UUID uuid = UUID.fromString(args[1]); - for (final Map.Entry entry : userMap.getNameCache().entrySet()) { - if (entry.getValue().equals(uuid)) { - sender.sendTl("usermapEntry", entry.getKey(), args[1]); - } - } - } catch (IllegalArgumentException ignored) { - final String sanitizedName = userMap.getSanitizedName(args[1]); - sender.sendTl("usermapEntry", sanitizedName, userMap.getNameCache().get(sanitizedName).toString()); - } - } - } - } - - // Displays versions of EssentialsX and related plugins. - private void runVersion(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { - if (sender.isPlayer() && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.version")) return; - - boolean isMismatched = false; - boolean isVaultInstalled = false; - boolean isUnsupported = false; - final VersionUtil.SupportStatus supportStatus = VersionUtil.getServerSupportStatus(); - final PluginManager pm = server.getPluginManager(); - final String essVer = pm.getPlugin("Essentials").getDescription().getVersion(); - - final String serverMessageKey; - if (supportStatus.isSupported()) { - serverMessageKey = "versionOutputFine"; - } else if (supportStatus == VersionUtil.SupportStatus.UNSTABLE) { - serverMessageKey = "versionOutputUnsupported"; - } else { - serverMessageKey = "versionOutputWarn"; - } - - sender.sendTl(serverMessageKey, "Server", server.getBukkitVersion() + " " + server.getVersion()); - sender.sendTl(serverMessageKey, "Brand", server.getName()); - sender.sendTl("versionOutputFine", "EssentialsX", essVer); - - for (final Plugin plugin : pm.getPlugins()) { - final PluginDescriptionFile desc = plugin.getDescription(); - String name = desc.getName(); - final String version = desc.getVersion(); - - if (name.startsWith("Essentials") && !name.equalsIgnoreCase("Essentials")) { - if (officialPlugins.contains(name)) { - name = name.replace("Essentials", "EssentialsX"); - - if (!version.equalsIgnoreCase(essVer)) { - isMismatched = true; - sender.sendTl("versionOutputWarn", name, version); - } else { - sender.sendTl("versionOutputFine", name, version); - } - } else { - sender.sendTl("versionOutputUnsupported", name, version); - isUnsupported = true; - } - } - - if (versionPlugins.contains(name)) { - if (warnPlugins.contains(name)) { - sender.sendTl("versionOutputUnsupported", name, version); - isUnsupported = true; - } else { - sender.sendTl("versionOutputFine", name, version); - } - } - - if (name.equals("Vault")) isVaultInstalled = true; - } - - final String layer; - if (ess.getSettings().isEcoDisabled()) { - layer = "Disabled"; - } else if (EconomyLayers.isLayerSelected()) { - final EconomyLayer economyLayer = EconomyLayers.getSelectedLayer(); - layer = economyLayer.getName() + " (" + economyLayer.getBackendName() + ")"; - } else { - layer = "None"; - } - sender.sendTl("versionOutputEconLayer", layer); - - if (isMismatched) { - sender.sendTl("versionMismatchAll"); - } - - if (!isVaultInstalled) { - sender.sendTl("versionOutputVaultMissing"); - } - - if (isUnsupported) { - sender.sendTl("versionOutputUnsupportedPlugins"); - } - - switch (supportStatus) { - case NMS_CLEANROOM: - sender.sendComponent(sender.tlComponent("serverUnsupportedCleanroom").color(NamedTextColor.DARK_RED)); - break; - case DANGEROUS_FORK: - sender.sendComponent(sender.tlComponent("serverUnsupportedDangerous").color(NamedTextColor.DARK_RED)); - break; - case STUPID_PLUGIN: - sender.sendComponent(sender.tlComponent("serverUnsupportedDumbPlugins").color(NamedTextColor.DARK_RED)); - break; - case UNSTABLE: - sender.sendComponent(sender.tlComponent("serverUnsupportedMods").color(NamedTextColor.DARK_RED)); - break; - case OUTDATED: - sender.sendComponent(sender.tlComponent("serverUnsupported").color(NamedTextColor.RED)); - break; - case LIMITED: - sender.sendComponent(sender.tlComponent("serverUnsupportedLimitedApi").color(NamedTextColor.RED)); - break; - } - if (VersionUtil.getSupportStatusClass() != null) { - sender.sendComponent(sender.tlComponent("serverUnsupportedClass").color(NamedTextColor.RED)); - } - - sender.sendTl("versionFetching"); - ess.runTaskAsynchronously(() -> { - for (final Component component : ess.getUpdateChecker().getVersionMessages(true, true, sender)) { - sender.sendComponent(component); - } - }); - } - - @Override - protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { - if (args.length == 1) { - final List options = Lists.newArrayList(); - options.add("reload"); - options.add("version"); - options.add("dump"); - options.add("commands"); - options.add("debug"); - options.add("reset"); - options.add("cleanup"); - options.add("homes"); - //options.add("uuidconvert"); - //options.add("nya"); - //options.add("moo"); - return options; - } - - switch (args[0]) { - case "moo": - if (args.length == 2) { - return Lists.newArrayList("moo"); - } - break; - case "reset": - if (args.length == 2) { - return getPlayers(server, sender); - } - break; - case "cleanup": - if (args.length == 2) { - return COMMON_DURATIONS; - } else if (args.length == 3 || args.length == 4) { - return Lists.newArrayList("-1", "0"); - } - break; - case "homes": - if (args.length == 2) { - return Lists.newArrayList("fix", "delete"); - } else if (args.length == 3 && args[1].equalsIgnoreCase("delete")) { - return server.getWorlds().stream().map(World::getName).collect(Collectors.toList()); - } - break; - case "dump": - final List list = Lists.newArrayList("config", "kits", "log", "discord", "worth", "tpr", "spawns", "commands", "all"); - for (String arg : args) { - if (arg.equals("*") || arg.equalsIgnoreCase("all")) { - list.clear(); - return list; - } - list.remove(arg.toLowerCase(Locale.ENGLISH)); - } - return list; - } - - return Collections.emptyList(); - } - - private static class TuneRunnable extends BukkitRunnable { - private static final Map noteMap = ImmutableMap.builder() - .put("1F#", 0.5f) - .put("1G", 0.53f) - .put("1G#", 0.56f) - .put("1A", 0.6f) - .put("1A#", 0.63f) - .put("1B", 0.67f) - .put("1C", 0.7f) - .put("1C#", 0.76f) - .put("1D", 0.8f) - .put("1D#", 0.84f) - .put("1E", 0.9f) - .put("1F", 0.94f) - .put("2F#", 1.0f) - .put("2G", 1.06f) - .put("2G#", 1.12f) - .put("2A", 1.18f) - .put("2A#", 1.26f) - .put("2B", 1.34f) - .put("2C", 1.42f) - .put("2C#", 1.5f) - .put("2D", 1.6f) - .put("2D#", 1.68f) - .put("2E", 1.78f) - .put("2F", 1.88f) - .build(); - - private final String[] tune; - private final Sound sound; - private final Supplier> players; - private int i = 0; - - TuneRunnable(final String tuneStr, final Sound sound, final Supplier> players) { - this.tune = tuneStr.split(","); - this.sound = sound; - this.players = players; - } - - @Override - public void run() { - final String note = tune[i]; - i++; - if (i >= tune.length) { - cancel(); - } - if (note == null || note.isEmpty()) { - return; - } - - for (final Player onlinePlayer : players.get()) { - onlinePlayer.playSound(onlinePlayer.getLocation(), sound, 1, noteMap.get(note)); - } - } + registerNode(new VersionCommand()); + registerNode(new DebugCommand()); + registerNode(new CommandMapCommand()); + registerNode(new DumpCommand()); + registerNode(new CleanupCommand()); + registerNode(new HomesCommand()); + registerNode(new UsermapCommand()); + registerNode(new ItemTestCommand()); + registerNode(new NyanCommand()); + registerNode(new MooCommand()); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandexp.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandexp.java index 9f4270aa0f1..c104c43646d 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandexp.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandexp.java @@ -154,7 +154,7 @@ protected List getTabCompleteOptions(final Server server, final User use } } if (user.isAuthorized("essentials.exp.others")) { - return getPlayers(server, user); + return getPlayers(user); } } else if (args.length == 3 && !(args[0].equalsIgnoreCase("show") || args[0].equalsIgnoreCase("reset"))) { final String levellessArg = args[2].toLowerCase(Locale.ENGLISH).replaceAll("l", ""); @@ -182,10 +182,10 @@ protected List getTabCompleteOptions(final Server server, final CommandS return Collections.emptyList(); } } else { // even without 'show' - return getPlayers(server, sender); + return getPlayers(sender); } } else if (args.length == 3 && (args[0].equalsIgnoreCase("set") || args[0].equalsIgnoreCase("give"))) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandext.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandext.java index ba3df39f4f0..0b9601f94b3 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandext.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandext.java @@ -46,7 +46,7 @@ private void extPlayer(final Player player) { @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandfeed.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandfeed.java index 72efa62ac85..fcf97889cc9 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandfeed.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandfeed.java @@ -65,7 +65,7 @@ private void feedPlayer(final Player player) throws QuietAbortException { @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1 && sender.isAuthorized("essentials.feed.others")) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgamemode.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgamemode.java index b5c6d05d77c..bb9860c80c5 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgamemode.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgamemode.java @@ -105,12 +105,12 @@ protected List getTabCompleteOptions(final Server server, final CommandS try { // Direct command? Don't ask for the mode matchGameMode(commandLabel); - return getPlayers(server, sender); + return getPlayers(sender); } catch (final NotEnoughArgumentsException e) { return STANDARD_OPTIONS; } } else if (args.length == 2) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } @@ -128,12 +128,12 @@ protected List getTabCompleteOptions(final Server server, final User use } if (args.length == 1) { if (user.isAuthorized("essentials.gamemode.others") && isDirectGamemodeCommand) { - return getPlayers(server, user); + return getPlayers(user); } else { return STANDARD_OPTIONS; } } else if (args.length == 2 && user.isAuthorized("essentials.gamemode.others") && !isDirectGamemodeCommand) { - return getPlayers(server, user); + return getPlayers(user); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgetpos.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgetpos.java index 388bab68cd7..7b45607a8af 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgetpos.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgetpos.java @@ -47,7 +47,7 @@ private void outputPosition(final CommandSource sender, final Location coords, f @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1 && sender.isAuthorized("essentials.getpos.others")) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgive.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgive.java index 9991e826a46..14cfa7e0fe2 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgive.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgive.java @@ -99,7 +99,7 @@ public void run(final Server server, final CommandSource sender, final String co @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else if (args.length == 2) { return getItems(); } else if (args.length == 3) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandheal.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandheal.java index e65eed7524e..8ca6d905b82 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandheal.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandheal.java @@ -78,7 +78,7 @@ protected void updatePlayer(final Server server, final CommandSource sender, fin @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1 && sender.isAuthorized("essentials.heal.others")) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhome.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhome.java index a8017dcbf8a..e147bdcfdb3 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhome.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhome.java @@ -155,7 +155,7 @@ protected List getTabCompleteOptions(final Server server, final User use if (canVisitOthers) { final int sepIndex = args[0].indexOf(':'); if (sepIndex < 0) { - getPlayers(server, user).forEach(player -> homes.add(player + ":")); + getPlayers(user).forEach(player -> homes.add(player + ":")); } else { final String namePart = args[0].substring(0, sepIndex); final User otherUser; diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandice.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandice.java index 4c802a79f94..be8f9a6d35a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandice.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandice.java @@ -49,7 +49,7 @@ private void freezePlayer(final IUser user) { @Override protected List getTabCompleteOptions(Server server, CommandSource sender, String commandLabel, String[] args) { if (args.length == 1 && sender.isAuthorized("essentials.ice.others")) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandignore.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandignore.java index d50815af015..8142b6df75c 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandignore.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandignore.java @@ -53,7 +53,7 @@ protected void run(final Server server, final User user, final String commandLab @Override protected List getTabCompleteOptions(final Server server, final User user, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, user); + return getPlayers(user); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandinvsee.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandinvsee.java index f4666dd90a9..d1fe45b1a01 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandinvsee.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandinvsee.java @@ -45,7 +45,7 @@ protected void run(final Server server, final User user, final String commandLab @Override protected List getTabCompleteOptions(final Server server, final User user, final String commandLabel, final String[] args) { if (args.length == 1) { - final List suggestions = getPlayers(server, user); + final List suggestions = getPlayers(user); suggestions.remove(user.getName()); return suggestions; } else { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkick.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkick.java index 0efb0fd0754..c0b2a3c176f 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkick.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkick.java @@ -62,7 +62,7 @@ public void run(final Server server, final CommandSource sender, final String co @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkill.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkill.java index e5145852616..80b9983bba2 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkill.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkill.java @@ -44,7 +44,7 @@ protected void updatePlayer(final Server server, final CommandSource sender, fin @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkit.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkit.java index 1394a3c5e86..adba5434be3 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkit.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkit.java @@ -108,7 +108,7 @@ protected List getTabCompleteOptions(final Server server, final User use } return options; } else if (args.length == 2 && user.isAuthorized("essentials.kit.others")) { - return getPlayers(server, user); + return getPlayers(user); } else { return Collections.emptyList(); } @@ -119,7 +119,7 @@ protected List getTabCompleteOptions(final Server server, final CommandS if (args.length == 1) { return new ArrayList<>(ess.getKits().getKitKeys()); // TODO: Move this to its own method } else if (args.length == 2) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkitreset.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkitreset.java index 70c8873f7b9..fafed4dc3e4 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkitreset.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkitreset.java @@ -59,7 +59,7 @@ protected List getTabCompleteOptions(Server server, CommandSource sender if (args.length == 1) { return new ArrayList<>(ess.getKits().getKitKeys()); } else if (args.length == 2 && sender.isAuthorized("essentials.kitreset.others")) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandlightning.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandlightning.java index a8a53db6242..046923c684a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandlightning.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandlightning.java @@ -63,7 +63,7 @@ protected List getTabCompleteOptions(final Server server, final User use @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else if (args.length == 2) { return Lists.newArrayList("5"); } else { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmail.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmail.java index 7dad7306325..683fce75332 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmail.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmail.java @@ -334,7 +334,7 @@ protected List getTabCompleteOptions(final Server server, final User use return options; } else if (args.length == 2) { if ((args[0].equalsIgnoreCase("send") && user.isAuthorized("essentials.mail.send")) || (args[0].equalsIgnoreCase("sendtemp") && user.isAuthorized("essentials.mail.sendtemp")) || ((args[0].equalsIgnoreCase("clear"))&& user.isAuthorized("essentials.mail.clear.others"))) { - return getPlayers(server, user); + return getPlayers(user); } else if (args[0].equalsIgnoreCase("sendtempall") && user.isAuthorized("essentials.mail.sendtempall")) { return COMMON_DATE_DIFFS; } else if (args[0].equalsIgnoreCase("read")) { @@ -374,7 +374,7 @@ protected List getTabCompleteOptions(final Server server, final CommandS return Lists.newArrayList("send", "sendall", "sendtemp", "sendtempall", "clearall", "clear"); } else if (args.length == 2) { if (args[0].equalsIgnoreCase("send") || args[0].equalsIgnoreCase("sendtemp") || args[0].equalsIgnoreCase("clear")) { - return getPlayers(server, sender); + return getPlayers(sender); } else if (args[0].equalsIgnoreCase("sendtempall")) { return COMMON_DATE_DIFFS; } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmsg.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmsg.java index ad662ca0437..9b15254c964 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmsg.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmsg.java @@ -58,7 +58,7 @@ protected void updatePlayer(final Server server, final CommandSource sender, fin @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); // It's a chat message, send an empty list. } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmute.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmute.java index 53d1b21755e..e8cf37fbe31 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmute.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmute.java @@ -129,7 +129,7 @@ public void run(final Server server, final CommandSource sender, final String co @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return COMMON_DATE_DIFFS; // Date diff can span multiple words } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnear.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnear.java index 34bc3aaa9c0..c17ff324923 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnear.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnear.java @@ -117,7 +117,7 @@ private String getLocal(final CommandSource source, final User user, final long protected List getTabCompleteOptions(final Server server, final User user, final String commandLabel, final String[] args) { if (user.isAuthorized("essentials.near.others")) { if (args.length == 1) { - return getPlayers(server, user); + return getPlayers(user); } else if (args.length == 2) { return Lists.newArrayList(Integer.toString(ess.getSettings().getNearRadius())); } else { @@ -135,7 +135,7 @@ protected List getTabCompleteOptions(final Server server, final User use @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else if (args.length == 2) { return Lists.newArrayList(Integer.toString(ess.getSettings().getNearRadius())); } else { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnick.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnick.java index 9716816e126..af35c30781b 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnick.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnick.java @@ -120,7 +120,7 @@ private void setNickname(final Server server, final CommandSource sender, final @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1 && sender.isAuthorized("essentials.nick.others")) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnuke.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnuke.java index c06d2f16eb0..58ae8da0f71 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnuke.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnuke.java @@ -52,7 +52,7 @@ protected void run(final Server server, final CommandSource sender, final String @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpay.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpay.java index 3f7d353af6f..daa227391a6 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpay.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpay.java @@ -109,7 +109,7 @@ protected void updatePlayer(final Server server, final CommandSource sender, fin @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else if (args.length == 2) { return Lists.newArrayList(ess.getSettings().getMinimumPayAmount().toString()); } else { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandplaytime.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandplaytime.java index 7ef841f3e8a..cd424207a4d 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandplaytime.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandplaytime.java @@ -28,7 +28,7 @@ protected void run(Server server, CommandSource sender, String commandLabel, Str String displayName; long playtime; final String key; - + if (args.length > 0 && sender.isAuthorized("essentials.playtime.others")) { try { final IUser user = getPlayer(server, sender, args, 0); @@ -59,14 +59,14 @@ protected void run(Server server, CommandSource sender, String commandLabel, Str final long playtimeMs = System.currentTimeMillis() - (playtime * 50L); sender.sendTl(key, DateUtil.formatDateDiff(playtimeMs), AdventureUtil.parsed(AdventureUtil.legacyToMini(displayName))); } - + @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1 && sender.isAuthorized("essentials.playtime.others")) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } } - + } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpowertool.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpowertool.java index cd6808b639e..5d0b47030c0 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpowertool.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpowertool.java @@ -129,7 +129,7 @@ protected List getTabCompleteOptions(final Server server, final User use @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else if (args.length == 2) { return getItems(); } else if (args.length == 3) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandptime.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandptime.java index 9e66b0e2a5f..92ed2bce0e1 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandptime.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandptime.java @@ -122,7 +122,7 @@ protected List getTabCompleteOptions(final Server server, final CommandS if (args.length == 1) { return Lists.newArrayList("get", "reset", "sunrise", "day", "morning", "noon", "afternoon", "sunset", "night", "midnight"); } else if (args.length == 2 && (getAliases.contains(args[0]) || user == null || user.isAuthorized("essentials.ptime.others"))) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpweather.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpweather.java index 962dd445168..c9eb4c2a425 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpweather.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpweather.java @@ -107,7 +107,7 @@ protected List getTabCompleteOptions(final Server server, final User use if (args.length == 1) { return Lists.newArrayList("get", "reset", "storm", "sun"); } else if (args.length == 2 && (getAliases.contains(args[0]) || user == null || user.isAuthorized("essentials.pweather.others"))) { - return getPlayers(server, user); + return getPlayers(user); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrenamehome.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrenamehome.java index 4bf8e3cbc45..753fdc87a0f 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrenamehome.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrenamehome.java @@ -89,7 +89,7 @@ protected List getTabCompleteOptions(final Server server, final CommandS if (canRenameOthers) { final int sepIndex = args[0].indexOf(':'); if (sepIndex < 0) { - getPlayers(server, sender).forEach(player -> homes.add(player + ":")); + getPlayers(sender).forEach(player -> homes.add(player + ":")); } else { final String namePart = args[0].substring(0, sepIndex); final User otherUser; diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrest.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrest.java index 82946b4f008..3ff41da670b 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrest.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrest.java @@ -45,7 +45,7 @@ private void restPlayer(final IUser user) { @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1 && sender.isAuthorized("essentials.rest.others")) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandseen.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandseen.java index 6827650c5ef..3cd405f49c0 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandseen.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandseen.java @@ -228,7 +228,7 @@ private void seenIP(final CommandSource sender, final String ipAddress, final St @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandskull.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandskull.java index 1adcefe8f2e..b279b477c5c 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandskull.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandskull.java @@ -178,13 +178,13 @@ private void editSkull(final User user, final User receive, final ItemStack stac protected List getTabCompleteOptions(final Server server, final User user, final String commandLabel, final String[] args) { if (args.length == 1) { if (user.isAuthorized("essentials.skull.others")) { - return getPlayers(server, user); + return getPlayers(user); } else { return Lists.newArrayList(user.getName()); } } else if (args.length == 2){ if (user.isAuthorized("essentials.skull.others")) { - return getPlayers(server, user); + return getPlayers(user); } else { return Lists.newArrayList(user.getName()); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandspeed.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandspeed.java index 6eb6975ad46..69f9c195d5a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandspeed.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandspeed.java @@ -140,7 +140,7 @@ protected List getTabCompleteOptions(final Server server, final CommandS } else if (args.length == 2) { return speeds; } else if (args.length == 3 && sender.isAuthorized("essentials.speed.others")) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtempban.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtempban.java index fde30d244ce..8ce0b996dab 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtempban.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtempban.java @@ -64,7 +64,7 @@ public void run(final Server server, final CommandSource sender, final String co @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else { // Note: following args are both date diffs _and_ messages; ideally we'd mix with the vanilla handler return COMMON_DATE_DIFFS; diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtempbanip.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtempbanip.java index e3105dfa94f..51897dfbb9e 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtempbanip.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtempbanip.java @@ -80,7 +80,7 @@ public void run(final Server server, final CommandSource sender, final String co protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { // TODO: Also list IP addresses? - return getPlayers(server, sender); + return getPlayers(sender); } else { // Note: following args are both date diffs _and_ messages; ideally we'd mix with the vanilla handler return COMMON_DATE_DIFFS; diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtogglejail.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtogglejail.java index ce777f67f72..d77a55b51da 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtogglejail.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtogglejail.java @@ -171,7 +171,7 @@ public void run(final Server server, final CommandSource sender, final String co @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else if (args.length == 2) { try { return new ArrayList<>(ess.getJails().getList()); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtp.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtp.java index 747775d4afe..1fc8a9df1ec 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtp.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtp.java @@ -147,7 +147,7 @@ public void run(final Server server, final CommandSource sender, final String co protected List getTabCompleteOptions(final Server server, final User user, final String commandLabel, final String[] args) { // Don't handle coords if (args.length == 1 || (args.length == 2 && user.isAuthorized("essentials.tp.others"))) { - return getPlayers(server, user); + return getPlayers(user); } else { return Collections.emptyList(); } @@ -157,7 +157,7 @@ protected List getTabCompleteOptions(final Server server, final User use protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { // Don't handle coords if (args.length == 1 || args.length == 2) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpa.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpa.java index f33e8324638..151d5654130 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpa.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpa.java @@ -81,7 +81,7 @@ public void run(final Server server, final User user, final String commandLabel, @Override protected List getTabCompleteOptions(final Server server, final User user, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, user); + return getPlayers(user); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpaall.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpaall.java index 9cc135294c2..722fd11083d 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpaall.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpaall.java @@ -62,7 +62,7 @@ private void tpaAll(final CommandSource sender, final User target) { @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpahere.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpahere.java index 54383495c28..71b35889e79 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpahere.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpahere.java @@ -59,7 +59,7 @@ public void run(final Server server, final User user, final String commandLabel, @Override protected List getTabCompleteOptions(final Server server, final User user, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, user); + return getPlayers(user); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpall.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpall.java index 5a007165dcc..5d18cb2becc 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpall.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpall.java @@ -45,7 +45,7 @@ private void teleportAllPlayers(final Server server, final CommandSource sender, @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtphere.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtphere.java index c18609c5dc9..895bad58c27 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtphere.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtphere.java @@ -30,7 +30,7 @@ public void run(final Server server, final User user, final String commandLabel, @Override protected List getTabCompleteOptions(final Server server, final User user, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, user); + return getPlayers(user); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpo.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpo.java index 448628187b9..8ff98843485 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpo.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpo.java @@ -54,7 +54,7 @@ public void run(final Server server, final User user, final String commandLabel, protected List getTabCompleteOptions(final Server server, final User user, final String commandLabel, final String[] args) { // Don't handle coords if (args.length == 1 || (args.length == 2 && user.isAuthorized("essentials.tp.others"))) { - return getPlayers(server, user); + return getPlayers(user); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpohere.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpohere.java index f7321855fc5..5937a5b908a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpohere.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpohere.java @@ -32,7 +32,7 @@ public void run(final Server server, final User user, final String commandLabel, @Override protected List getTabCompleteOptions(final Server server, final User user, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, user); + return getPlayers(user); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtppos.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtppos.java index 288eeaafb4e..48a73cfe054 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtppos.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtppos.java @@ -107,7 +107,7 @@ protected List getTabCompleteOptions(final Server server, final User use @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else if (args.length == 2 || args.length == 3 || args.length == 4) { return Lists.newArrayList("~0"); } else if (args.length == 5 || args.length == 6) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpr.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpr.java index fd524bb99c9..e1aa96c071a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpr.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpr.java @@ -118,7 +118,7 @@ protected List getTabCompleteOptions(final Server server, final CommandS return randomTeleport.listLocations(); } } else if (args.length == 2 && sender.isAuthorized("essentials.tpr.others")) { - return getPlayers(server, sender); + return getPlayers(sender); } return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandwarp.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandwarp.java index 79f54f8f76e..ce0860156e4 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandwarp.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandwarp.java @@ -114,7 +114,7 @@ protected List getTabCompleteOptions(final Server server, final User use return getAvailableWarpsFor(user); } else if (args.length == 2 && (user.isAuthorized("essentials.warp.otherplayers") || user.isAuthorized("essentials.warp.others"))) { //TODO: Remove 'otherplayers' permission. - return getPlayers(server, user); + return getPlayers(user); } else { return Collections.emptyList(); } @@ -125,7 +125,7 @@ protected List getTabCompleteOptions(final Server server, final CommandS if (args.length == 1) { return new ArrayList<>(ess.getWarps().getList()); } else if (args.length == 2) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandwhois.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandwhois.java index b3eb0ca1877..d7869e38fe7 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandwhois.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandwhois.java @@ -77,7 +77,7 @@ public void run(final Server server, final CommandSource sender, final String co @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java index 897c3d98101..6f7091d90db 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java @@ -36,7 +36,7 @@ public abstract class EssentialsCommand implements IEssentialsCommand { /** * Common time durations (in seconds), for use in tab completion. */ - protected static final List COMMON_DURATIONS = ImmutableList.of("1", "60", "600", "3600", "86400"); + public static final List COMMON_DURATIONS = ImmutableList.of("1", "60", "600", "3600", "86400"); /** * Common date diffs, for use in tab completion */ @@ -219,7 +219,7 @@ public final List tabComplete(final Server server, final CommandSource s // Doesn't need to do any starts-with checks protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { // No tab completion results - return getPlayers(server, sender); + return getPlayers(sender); } boolean canInteractWith(final CommandSource interactor, final User interactee) { @@ -230,7 +230,7 @@ boolean canInteractWith(final CommandSource interactor, final User interactee) { * Gets a list of all player names that can be seen with by the given CommandSource, * for tab completion. */ - protected List getPlayers(final Server server, final CommandSource interactor) { + protected List getPlayers(final CommandSource interactor) { final List players = Lists.newArrayList(); for (final User user : ess.getOnlineUsers()) { if (canInteractWith(interactor, user)) { @@ -244,14 +244,8 @@ protected List getPlayers(final Server server, final CommandSource inter * Gets a list of all player names that can be seen with by the given User, * for tab completion. */ - protected List getPlayers(final Server server, final User interactor) { - final List players = Lists.newArrayList(); - for (final User user : ess.getOnlineUsers()) { - if (canInteractWith(interactor, user)) { - players.add(ess.getSettings().changeTabCompleteName() ? FormatUtil.stripFormat(user.getDisplayName()) : user.getName()); - } - } - return players; + protected List getPlayers(final User interactor) { + return getPlayers(interactor.getSource()); } /** diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsLoopCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsLoopCommand.java index 18418c58734..b2bc9039d78 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsLoopCommand.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsLoopCommand.java @@ -128,16 +128,16 @@ protected void loopOnlinePlayersConsumer(final Server server, final CommandSourc protected abstract void updatePlayer(Server server, CommandSource sender, User user, String[] args) throws NotEnoughArgumentsException, PlayerExemptException, ChargeException, MaxMoneyException; @Override - protected List getPlayers(final Server server, final CommandSource interactor) { - final List players = super.getPlayers(server, interactor); + protected List getPlayers(final CommandSource interactor) { + final List players = super.getPlayers(interactor); players.add("**"); players.add("*"); return players; } @Override - protected List getPlayers(final Server server, final User interactor) { - final List players = super.getPlayers(server, interactor); + protected List getPlayers(final User interactor) { + final List players = super.getPlayers(interactor); players.add("**"); players.add("*"); return players; diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsToggleCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsToggleCommand.java index 5d8ff2a89dd..617664024c8 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsToggleCommand.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsToggleCommand.java @@ -74,7 +74,7 @@ protected void toggleOtherPlayers(final Server server, final CommandSource sende protected List getTabCompleteOptions(final Server server, final User user, final String commandLabel, final String[] args) { if (args.length == 1) { if (user.isAuthorized(othersPermission)) { - return getPlayers(server, user); + return getPlayers(user); } else { return Lists.newArrayList("enable", "disable"); } @@ -88,7 +88,7 @@ protected List getTabCompleteOptions(final Server server, final User use @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { - return getPlayers(server, sender); + return getPlayers(sender); } else if (args.length == 2) { return Lists.newArrayList("enable", "disable"); } else { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsTreeCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsTreeCommand.java new file mode 100644 index 00000000000..acac81251b5 --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsTreeCommand.java @@ -0,0 +1,94 @@ +package com.earth2me.essentials.commands; + +import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.User; +import org.bukkit.Server; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class EssentialsTreeCommand extends EssentialsCommand { + private final Map nodes = new HashMap<>(); + private final List publicNodes = new ArrayList<>(); + + public EssentialsTreeCommand(final String command) { + super(command); + } + + protected void registerNode(final EssentialsTreeNode node) { + for (final String name : node.names()) { + nodes.put(name, node); + if (!node.hidden()) { + publicNodes.add(name); + } + } + + node.setEssentials(ess); + node.setEssentialsModule(module); + node.setParent(this); + } + + public void runDefault(final User user, final String commandLabel) throws Exception { + runDefault(user.getSource(), commandLabel); + } + + public void runDefault(final CommandSource sender, final String commandLabel) throws Exception { + throw new NotEnoughArgumentsException(); + } + + @Override + protected final void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { + run(server, user.getSource(), commandLabel, args); + } + + @Override + protected final void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { + if (args.length == 0) { + if (sender.isPlayer() && sender.getUser() != null) { + runDefault((User) sender.getUser(), commandLabel); + } else { + runDefault(sender, commandLabel); + } + } else { + final EssentialsTreeNode node = nodes.get(args[0]); + if (node != null) { + final String[] newArgs = Arrays.copyOfRange(args, 1, args.length); + if (sender.isPlayer() && sender.getUser() != null) { + node.run((User) sender.getUser(), commandLabel, newArgs); + } else { + node.run(sender, commandLabel, newArgs); + } + } else { + throw new NotEnoughArgumentsException(); + } + } + } + + @Override + protected final List getTabCompleteOptions(final Server server, final User user, final String commandLabel, final String[] args) { + return getTabCompleteOptions(server, user.getSource(), commandLabel, args); + } + + @Override + protected final List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { + if (args.length == 1) { + return publicNodes; + } + + final EssentialsTreeNode node = nodes.get(args[0]); + if (node != null) { + final String[] newArgs = Arrays.copyOfRange(args, 1, args.length); + if (sender.isPlayer() && sender.getUser() != null) { + return node.tabComplete((User) sender.getUser(), commandLabel, newArgs); + } else { + return node.tabComplete(sender, commandLabel, newArgs); + } + } + + return Collections.emptyList(); + } +} diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsTreeNode.java b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsTreeNode.java new file mode 100644 index 00000000000..17247f3fdf4 --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsTreeNode.java @@ -0,0 +1,62 @@ +package com.earth2me.essentials.commands; + +import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.IEssentialsModule; +import com.earth2me.essentials.User; +import net.ess3.api.IEssentials; +import net.ess3.api.TranslatableException; + +import java.util.List; + +public class EssentialsTreeNode { + private final String[] names; + private final boolean hidden; + protected transient IEssentials ess; + protected transient IEssentialsModule module; + protected transient EssentialsTreeCommand parent; + + public EssentialsTreeNode(final String... names) { + this(names, false); + } + + public EssentialsTreeNode(final String[] names, final boolean hidden) { + this.names = names; + this.hidden = hidden; + } + + protected void setEssentials(final IEssentials ess) { + this.ess = ess; + } + + protected void setEssentialsModule(final IEssentialsModule module) { + this.module = module; + } + + protected void setParent(final EssentialsTreeCommand parent) { + this.parent = parent; + } + + public String[] names() { + return names; + } + + public boolean hidden() { + return hidden; + } + + protected void run(final User user, final String commandLabel, final String[] args) throws Exception { + run(user.getSource(), commandLabel, args); + } + + protected void run(final CommandSource sender, final String commandLabel, final String[] args) throws Exception { + throw new TranslatableException("onlyPlayers", commandLabel); + } + + protected List tabComplete(final User user, final String commandLabel, final String[] args) { + return tabComplete(user.getSource(), commandLabel, args); + } + + protected List tabComplete(final CommandSource sender, final String commandLabel, final String[] args) { + return parent.getPlayers(sender); + } +} diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/CleanupCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/CleanupCommand.java new file mode 100644 index 00000000000..b7eba8ff058 --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/CleanupCommand.java @@ -0,0 +1,86 @@ +package com.earth2me.essentials.commands.essentials; + +import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.User; +import com.earth2me.essentials.commands.EssentialsCommand; +import com.earth2me.essentials.commands.EssentialsTreeNode; +import com.earth2me.essentials.utils.DateUtil; +import com.earth2me.essentials.utils.FloatUtil; +import com.earth2me.essentials.utils.NumberUtil; +import com.google.common.collect.Lists; + +import java.util.Collections; +import java.util.List; +import java.util.UUID; + +public class CleanupCommand extends EssentialsTreeNode { + + public CleanupCommand() { + super("cleanup"); + } + + @Override + protected void run(final CommandSource sender, final String commandLabel, final String[] args) throws Exception { + if (args.length < 1 || !NumberUtil.isInt(args[0])) { + sender.sendMessage("This sub-command will delete users who haven't logged in in the last days."); + sender.sendMessage("Optional parameters define the minimum amount required to prevent deletion."); + sender.sendMessage("Unless you define larger default values, this command will ignore people who have more than 0 money/homes."); + throw new Exception("/" + commandLabel + " cleanup [money] [homes]"); + } + + sender.sendTl("cleaning"); + + final long daysArg = Long.parseLong(args[0]); + final double moneyArg = args.length >= 2 ? FloatUtil.parseDouble(args[1].replaceAll("[^0-9.]", "")) : 0; + final int homesArg = args.length >= 3 && NumberUtil.isInt(args[2]) ? Integer.parseInt(args[2]) : 0; + + ess.runTaskAsynchronously(() -> { + final long currTime = System.currentTimeMillis(); + for (final UUID u : ess.getUsers().getAllUserUUIDs()) { + final User user = ess.getUsers().loadUncachedUser(u); + if (user == null) { + continue; + } + + long lastLog = user.getLastLogout(); + if (lastLog == 0) { + lastLog = user.getLastLogin(); + } + if (lastLog == 0) { + user.setLastLogin(currTime); + } + + if (user.isNPC()) { + continue; + } + + final long timeDiff = currTime - lastLog; + final long milliDays = daysArg * 24L * 60L * 60L * 1000L; + final int homeCount = user.getHomes().size(); + final double moneyCount = user.getMoney().doubleValue(); + + if (lastLog == 0 || timeDiff < milliDays || homeCount > homesArg || moneyCount > moneyArg) { + continue; + } + + if (ess.getSettings().isDebug()) { + ess.getLogger().info("Deleting user: " + user.getName() + " Money: " + moneyCount + " Homes: " + homeCount + " Last seen: " + DateUtil.formatDateDiff(lastLog)); + } + + user.reset(); + } + sender.sendTl("cleaned"); + }); + } + + @Override + protected List tabComplete(CommandSource sender, String commandLabel, String[] args) { + if (args.length == 1) { + return EssentialsCommand.COMMON_DURATIONS; + } else if (args.length == 2 || args.length == 3) { + return Lists.newArrayList("-1", "0"); + } + + return Collections.emptyList(); + } +} diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/CommandMapCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/CommandMapCommand.java new file mode 100644 index 00000000000..806bc501c88 --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/CommandMapCommand.java @@ -0,0 +1,25 @@ +package com.earth2me.essentials.commands.essentials; + +import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.commands.EssentialsTreeNode; + +import java.util.Map; + +public class CommandMapCommand extends EssentialsTreeNode { + public CommandMapCommand() { + super("cmd", "commands"); + } + + @Override + protected void run(CommandSource sender, String commandLabel, String[] args) throws Exception { + if (ess.getAlternativeCommandsHandler().disabledCommands().size() == 0) { + sender.sendTl("blockListEmpty"); + return; + } + + sender.sendTl("blockList"); + for (final Map.Entry entry : ess.getAlternativeCommandsHandler().disabledCommands().entrySet()) { + sender.sendMessage(entry.getKey() + " => " + entry.getValue()); + } + } +} diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/DebugCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/DebugCommand.java new file mode 100644 index 00000000000..be805bf0822 --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/DebugCommand.java @@ -0,0 +1,16 @@ +package com.earth2me.essentials.commands.essentials; + +import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.commands.EssentialsTreeNode; + +public class DebugCommand extends EssentialsTreeNode { + public DebugCommand() { + super("debug", "verbose"); + } + + @Override + protected void run(CommandSource sender, String commandLabel, String[] args) throws Exception { + ess.getSettings().setDebug(!ess.getSettings().isDebug()); + sender.sendMessage("Essentials " + ess.getDescription().getVersion() + " debug mode " + (ess.getSettings().isDebug() ? "enabled" : "disabled")); + } +} diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/DumpCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/DumpCommand.java new file mode 100644 index 00000000000..cb3155b825b --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/DumpCommand.java @@ -0,0 +1,289 @@ +package com.earth2me.essentials.commands.essentials; + +import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.commands.EssentialsTreeNode; +import com.earth2me.essentials.economy.EconomyLayer; +import com.earth2me.essentials.economy.EconomyLayers; +import com.earth2me.essentials.utils.AdventureUtil; +import com.earth2me.essentials.utils.CommandMapUtil; +import com.earth2me.essentials.utils.DateUtil; +import com.earth2me.essentials.utils.PasteUtil; +import com.earth2me.essentials.utils.VersionUtil; +import com.google.common.collect.Lists; +import com.google.gson.JsonArray; +import com.google.gson.JsonNull; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import net.ess3.provider.KnownCommandsProvider; +import net.ess3.provider.OnlineModeProvider; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginDescriptionFile; + +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +import static com.earth2me.essentials.I18n.tlLiteral; + +public class DumpCommand extends EssentialsTreeNode { + public DumpCommand() { + super("dump"); + } + + @Override + protected void run(CommandSource sender, String commandLabel, String[] args) throws Exception { + sender.sendTl("dumpCreating"); + + final JsonObject dump = new JsonObject(); + + final JsonObject meta = new JsonObject(); + meta.addProperty("timestamp", Instant.now().toEpochMilli()); + meta.addProperty("sender", sender.getPlayer() != null ? sender.getPlayer().getName() : null); + meta.addProperty("senderUuid", sender.getPlayer() != null ? sender.getPlayer().getUniqueId().toString() : null); + dump.add("meta", meta); + + final JsonObject serverData = new JsonObject(); + serverData.addProperty("bukkit-version", Bukkit.getBukkitVersion()); + serverData.addProperty("server-version", Bukkit.getVersion()); + serverData.addProperty("server-brand", Bukkit.getName()); + serverData.addProperty("online-mode", ess.provider(OnlineModeProvider.class).getOnlineModeString()); + final JsonObject supportStatus = new JsonObject(); + final VersionUtil.SupportStatus status = VersionUtil.getServerSupportStatus(); + supportStatus.addProperty("status", status.name()); + supportStatus.addProperty("supported", status.isSupported()); + supportStatus.addProperty("trigger", VersionUtil.getSupportStatusClass()); + serverData.add("support-status", supportStatus); + dump.add("server-data", serverData); + + final JsonObject environment = new JsonObject(); + environment.addProperty("java-version", System.getProperty("java.version")); + environment.addProperty("operating-system", System.getProperty("os.name")); + environment.addProperty("uptime", DateUtil.formatDateDiff(ManagementFactory.getRuntimeMXBean().getStartTime())); + environment.addProperty("allocated-memory", (Runtime.getRuntime().totalMemory() / 1024 / 1024) + "MB"); + dump.add("environment", environment); + + final JsonObject essData = new JsonObject(); + essData.addProperty("version", ess.getDescription().getVersion()); + final JsonObject updateData = new JsonObject(); + updateData.addProperty("id", ess.getUpdateChecker().getVersionIdentifier()); + updateData.addProperty("branch", ess.getUpdateChecker().getVersionBranch()); + updateData.addProperty("dev", ess.getUpdateChecker().isDevBuild()); + essData.add("update-data", updateData); + final JsonObject econLayer = new JsonObject(); + econLayer.addProperty("enabled", !ess.getSettings().isEcoDisabled()); + econLayer.addProperty("selected-layer", EconomyLayers.isLayerSelected()); + final EconomyLayer layer = EconomyLayers.getSelectedLayer(); + econLayer.addProperty("name", layer == null ? "null" : layer.getName()); + econLayer.addProperty("layer-version", layer == null ? "null" : layer.getPluginVersion()); + econLayer.addProperty("backend-name", layer == null ? "null" : layer.getBackendName()); + essData.add("economy-layer", econLayer); + final JsonArray addons = new JsonArray(); + final JsonArray plugins = new JsonArray(); + final ArrayList alphabetical = new ArrayList<>(); + Collections.addAll(alphabetical, Bukkit.getPluginManager().getPlugins()); + alphabetical.sort(Comparator.comparing(o -> o.getName().toUpperCase(Locale.ENGLISH))); + for (final Plugin plugin : alphabetical) { + final JsonObject pluginData = new JsonObject(); + final PluginDescriptionFile info = plugin.getDescription(); + final String name = info.getName(); + + pluginData.addProperty("name", name); + pluginData.addProperty("version", info.getVersion()); + pluginData.addProperty("description", info.getDescription()); + pluginData.addProperty("main", info.getMain()); + pluginData.addProperty("enabled", plugin.isEnabled()); + pluginData.addProperty("official", plugin == ess || VersionUtil.officialPlugins.contains(name)); + pluginData.addProperty("unsupported", VersionUtil.warnPlugins.contains(name)); + + final JsonArray authors = new JsonArray(); + for (final String author : info.getAuthors()) { + authors.add(author == null ? JsonNull.INSTANCE : new JsonPrimitive(author)); + } + pluginData.add("authors", authors); + + if (name.startsWith("Essentials") && !name.equals("Essentials")) { + addons.add(pluginData); + } + plugins.add(pluginData); + } + essData.add("addons", addons); + dump.add("ess-data", essData); + dump.add("plugins", plugins); + + final List files = new ArrayList<>(); + files.add(new PasteUtil.PasteFile("dump.json", dump.toString())); + + final Plugin essDiscord = Bukkit.getPluginManager().getPlugin("EssentialsDiscord"); + final Plugin essDiscordLink = Bukkit.getPluginManager().getPlugin("EssentialsDiscordLink"); + final Plugin essSpawn = Bukkit.getPluginManager().getPlugin("EssentialsSpawn"); + + final Map knownCommandsCopy = new HashMap<>(ess.provider(KnownCommandsProvider.class).getKnownCommands()); + final Map disabledCommandsCopy = new HashMap<>(ess.getAlternativeCommandsHandler().disabledCommands()); + + // Further operations will be heavy IO + ess.runTaskAsynchronously(() -> { + boolean config = false; + boolean discord = false; + boolean kits = false; + boolean log = false; + boolean worth = false; + boolean tpr = false; + boolean spawns = false; + boolean commands = false; + for (final String arg : args) { + if (arg.equals("*") || arg.equalsIgnoreCase("all")) { + config = true; + discord = true; + kits = true; + log = true; + worth = true; + tpr = true; + spawns = true; + commands = true; + break; + } else if (arg.equalsIgnoreCase("config")) { + config = true; + } else if (arg.equalsIgnoreCase("discord")) { + discord = true; + } else if (arg.equalsIgnoreCase("kits")) { + kits = true; + } else if (arg.equalsIgnoreCase("log")) { + log = true; + } else if (arg.equalsIgnoreCase("worth")) { + worth = true; + } else if (arg.equalsIgnoreCase("tpr")) { + tpr = true; + } else if (arg.equalsIgnoreCase("spawns")) { + spawns = true; + } else if (arg.equalsIgnoreCase("commands")) { + commands = true; + } + } + + if (config) { + try { + files.add(new PasteUtil.PasteFile("config.yml", new String(Files.readAllBytes(ess.getSettings().getConfigFile().toPath()), StandardCharsets.UTF_8))); + } catch (IOException e) { + sender.sendTl("dumpErrorUpload", "config.yml", e.getMessage()); + } + } + + if (discord && essDiscord != null) { + try { + files.add(new PasteUtil.PasteFile("discord-config.yml", + new String(Files.readAllBytes(essDiscord.getDataFolder().toPath().resolve("config.yml")), StandardCharsets.UTF_8) + .replaceAll("[A-Za-z\\d]{24}\\.[\\w-]{6}\\.[\\w-]{27}", ""))); + } catch (IOException e) { + sender.sendTl("dumpErrorUpload", "discord-config.yml", e.getMessage()); + } + + if (essDiscordLink != null) { + try { + files.add(new PasteUtil.PasteFile("discord-link-config.yml", + new String(Files.readAllBytes(essDiscordLink.getDataFolder().toPath().resolve("config.yml")), StandardCharsets.UTF_8))); + } catch (IOException e) { + sender.sendTl("dumpErrorUpload", "discord-link-config.yml", e.getMessage()); + } + } + } + + if (kits) { + try { + files.add(new PasteUtil.PasteFile("kits.yml", new String(Files.readAllBytes(ess.getKits().getFile().toPath()), StandardCharsets.UTF_8))); + } catch (IOException e) { + sender.sendTl("dumpErrorUpload", "kits.yml", e.getMessage()); + } + } + + if (log) { + try { + files.add(new PasteUtil.PasteFile("latest.log", new String(Files.readAllBytes(Paths.get("logs", "latest.log")), StandardCharsets.UTF_8) + .replaceAll("(?m)^\\[\\d\\d:\\d\\d:\\d\\d] \\[.+/(?:DEBUG|TRACE)]: .+\\s(?:[A-Za-z.]+:.+\\s(?:\\t.+\\s)*)?\\s*(?:\"[A-Za-z]+\" : .+[\\s}\\]]+)*", "") + .replaceAll("(?:[0-9]{1,3}\\.){3}[0-9]{1,3}", ""))); + } catch (IOException e) { + sender.sendTl("dumpErrorUpload", "latest.log", e.getMessage()); + } + } + + if (worth) { + try { + files.add(new PasteUtil.PasteFile("worth.yml", new String(Files.readAllBytes(ess.getWorth().getFile().toPath()), StandardCharsets.UTF_8))); + } catch (IOException e) { + sender.sendTl("dumpErrorUpload", "worth.yml", e.getMessage()); + } + } + + if (tpr) { + try { + files.add(new PasteUtil.PasteFile("tpr.yml", new String(Files.readAllBytes(ess.getRandomTeleport().getFile().toPath()), StandardCharsets.UTF_8))); + } catch (IOException e) { + sender.sendTl("dumpErrorUpload", "tpr.yml", e.getMessage()); + } + } + + if (spawns && essSpawn != null) { + try { + files.add(new PasteUtil.PasteFile("spawn.yml", new String(Files.readAllBytes(ess.getDataFolder().toPath().resolve("spawn.yml")), StandardCharsets.UTF_8))); + } catch (IOException e) { + sender.sendTl("dumpErrorUpload", "spawn.yml", e.getMessage()); + } + } + + if (commands) { + try { + files.add(new PasteUtil.PasteFile("commands.yml", new String(Files.readAllBytes(Paths.get("commands.yml")), StandardCharsets.UTF_8))); + files.add(new PasteUtil.PasteFile("commandmap.json", CommandMapUtil.toJsonPretty(ess, knownCommandsCopy))); + files.add(new PasteUtil.PasteFile("commandoverride.json", disabledCommandsCopy.toString())); + } catch (IOException e) { + sender.sendTl("dumpErrorUpload", "commands.yml", e.getMessage()); + } + } + + final CompletableFuture future = PasteUtil.createPaste(files); + future.thenAccept(result -> { + if (result != null) { + final String dumpUrl = "https://essentialsx.net/dump.html?bytebin=" + result.getPasteId(); + sender.sendTl("dumpUrl", dumpUrl); + // pastes.dev doesn't support deletion keys + //sender.sendTl("dumpDeleteKey", result.getDeletionKey()); + if (sender.isPlayer()) { + ess.getLogger().info(AdventureUtil.miniToLegacy(tlLiteral("dumpConsoleUrl", dumpUrl))); + // pastes.dev doesn't support deletion keys + //ess.getLogger().info(AdventureUtil.miniToLegacy(tlLiteral("dumpDeleteKey", result.getDeletionKey()))); + } + } + files.clear(); + }); + future.exceptionally(throwable -> { + sender.sendTl("dumpError", throwable.getMessage()); + return null; + }); + }); + } + + @Override + protected List tabComplete(CommandSource sender, String commandLabel, String[] args) { + final List list = Lists.newArrayList("config", "kits", "log", "discord", "worth", "tpr", "spawns", "commands", "all"); + for (String arg : args) { + if (arg.equals("*") || arg.equalsIgnoreCase("all")) { + list.clear(); + return list; + } + list.remove(arg.toLowerCase(Locale.ENGLISH)); + } + return list; + } +} diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/HomesCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/HomesCommand.java new file mode 100644 index 00000000000..5a84c401c3f --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/HomesCommand.java @@ -0,0 +1,106 @@ +package com.earth2me.essentials.commands.essentials; + +import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.User; +import com.earth2me.essentials.commands.EssentialsTreeNode; +import com.google.common.collect.Lists; +import net.ess3.api.TranslatableException; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; + +import java.util.Collections; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +public class HomesCommand extends EssentialsTreeNode { + private static final String HOMES_USAGE = "/ homes (fix | delete [world])"; + + public HomesCommand() { + super("homes"); + } + + @Override + protected void run(final CommandSource sender, final String commandLabel, final String[] args) throws Exception { + if (args.length < 1) { + sender.sendMessage("This sub-command provides a utility to mass-delete homes based on user options:"); + sender.sendMessage("Use \"fix\" to delete all homes inside non-existent or unloaded worlds."); + sender.sendMessage("Use \"delete\" to delete all existing homes."); + sender.sendMessage("Use \"delete \" to delete all homes inside a specific world."); + throw new Exception(HOMES_USAGE); + } + + switch (args[0]) { + case "fix": + sender.sendTl("fixingHomes"); + ess.runTaskAsynchronously(() -> { + for (final UUID u : ess.getUsers().getAllUserUUIDs()) { + final User user = ess.getUsers().loadUncachedUser(u); + if (user == null) { + continue; + } + for (String homeName : user.getHomes()) { + try { + if (user.getHome(homeName) == null) { + user.delHome(homeName); + } + } catch (Exception e) { + ess.getLogger().info("Unable to delete home " + homeName + " for " + user.getName()); + } + } + } + sender.sendTl("fixedHomes"); + }); + break; + case "delete": + final boolean filterByWorld = args.length >= 2; + if (filterByWorld && Bukkit.getWorld(args[1]) == null) { + throw new TranslatableException("invalidWorld"); + } + if (filterByWorld) { + sender.sendTl("deletingHomesWorld", args[1]); + } else { + sender.sendTl("deletingHomes"); + } + ess.runTaskAsynchronously(() -> { + for (final UUID u : ess.getUsers().getAllUserUUIDs()) { + final User user = ess.getUsers().loadUncachedUser(u); + if (user == null) { + continue; + } + for (String homeName : user.getHomes()) { + try { + final Location home = user.getHome(homeName); + if (!filterByWorld || home != null && home.getWorld() != null && home.getWorld().getName().equals(args[1])) { + user.delHome(homeName); + } + } catch (Exception e) { + ess.getLogger().info("Unable to delete home " + homeName + " for " + user.getName()); + } + } + } + + if (filterByWorld) { + sender.sendTl("deletedHomesWorld", args[1]); + } else { + sender.sendTl("deletedHomes"); + } + }); + break; + default: + throw new Exception(HOMES_USAGE); + } + } + + @Override + protected List tabComplete(CommandSource sender, String commandLabel, String[] args) { + if (args.length == 1) { + return Lists.newArrayList("fix", "delete"); + } else if (args.length == 2 && args[0].equalsIgnoreCase("delete")) { + return Bukkit.getWorlds().stream().map(World::getName).collect(Collectors.toList()); + } + + return Collections.emptyList(); + } +} diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/ItemTestCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/ItemTestCommand.java new file mode 100644 index 00000000000..1b876265bc9 --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/ItemTestCommand.java @@ -0,0 +1,65 @@ +package com.earth2me.essentials.commands.essentials; + +import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.commands.EssentialsTreeNode; +import com.earth2me.essentials.craftbukkit.Inventories; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class ItemTestCommand extends EssentialsTreeNode { + public ItemTestCommand() { + super(new String[]{"itemtest"}, true); + } + + @Override + protected void run(final CommandSource sender, final String commandLabel, final String[] args) throws Exception { + if (!sender.isAuthorized("essentials.itemtest") || args.length < 1 || !sender.isPlayer()) { + return; + } + + final Player player = sender.getPlayer(); + assert player != null; + + switch (args[0]) { + case "slot": { + if (args.length < 2) { + return; + } + player.getInventory().setItem(Integer.parseInt(args[1]), new ItemStack(Material.DIRT)); + break; + } + case "overfill": { + sender.sendMessage(Inventories.addItem(player, 42, false, new ItemStack(Material.DIAMOND_SWORD, 1), new ItemStack(Material.DIRT, 32), new ItemStack(Material.DIRT, 32)).toString()); + break; + } + case "overfill2": { + if (args.length < 3) { + return; + } + final boolean armor = Boolean.parseBoolean(args[1]); + final boolean add = Boolean.parseBoolean(args[2]); + final ItemStack[] items = new ItemStack[]{new ItemStack(Material.DIAMOND_SWORD, 1), new ItemStack(Material.DIRT, 32), new ItemStack(Material.DIRT, 32), new ItemStack(Material.DIAMOND_HELMET, 4), new ItemStack(Material.CHAINMAIL_LEGGINGS, 1)}; + if (Inventories.hasSpace(player, 0, armor, items)) { + if (add) { + sender.sendMessage(Inventories.addItem(player, 0, armor, items).toString()); + } + sender.sendMessage("SO MUCH SPACE!"); + } else { + sender.sendMessage("No space!"); + } + break; + } + case "remove": { + if (args.length < 2) { + return; + } + Inventories.removeItemExact(player, new ItemStack(Material.PUMPKIN, 1), Boolean.parseBoolean(args[1])); + break; + } + default: { + break; + } + } + } +} diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/MooCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/MooCommand.java new file mode 100644 index 00000000000..cb435d3f4c9 --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/MooCommand.java @@ -0,0 +1,51 @@ +package com.earth2me.essentials.commands.essentials; + +import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.commands.EssentialsTreeNode; +import com.earth2me.essentials.utils.RegistryUtil; +import com.google.common.collect.Lists; +import org.bukkit.Sound; +import org.bukkit.entity.Player; + +import java.util.Collections; +import java.util.List; + +public class MooCommand extends EssentialsTreeNode { + private static final Sound MOO_SOUND = RegistryUtil.valueOf(Sound.class, "COW_IDLE", "ENTITY_COW_MILK"); + private static final String[] CONSOLE_MOO = new String[] {" (__)", " (oo)", " /------\\/", " / | ||", " * /\\---/\\", " ~~ ~~", "....\"Have you mooed today?\"..."}; + private static final String[] PLAYER_MOO = new String[] {" (__)", " (oo)", " /------\\/", " / | | |", " * /\\---/\\", " ~~ ~~", "....\"Have you mooed today?\"..."}; + + public MooCommand() { + super("moo"); + } + + @Override + protected void run(final CommandSource sender, final String commandLabel, final String[] args) { + if (args.length == 1 && args[0].equals("moo")) { + for (final String s : CONSOLE_MOO) { + ess.getLogger().info(s); + } + for (final Player player : ess.getOnlinePlayers()) { + player.sendMessage(PLAYER_MOO); + player.playSound(player.getLocation(), MOO_SOUND, 1, 1.0f); + } + } else { + if (sender.isPlayer()) { + sender.getSender().sendMessage(PLAYER_MOO); + final Player player = sender.getPlayer(); + player.playSound(player.getLocation(), MOO_SOUND, 1, 1.0f); + + } else { + sender.getSender().sendMessage(CONSOLE_MOO); + } + } + } + + @Override + protected List tabComplete(CommandSource sender, String commandLabel, String[] args) { + if (args.length == 1) { + return Lists.newArrayList("moo"); + } + return Collections.emptyList(); + } +} diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/NyanCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/NyanCommand.java new file mode 100644 index 00000000000..9e42fc503e9 --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/NyanCommand.java @@ -0,0 +1,90 @@ +package com.earth2me.essentials.commands.essentials; + +import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.commands.EssentialsTreeNode; +import com.earth2me.essentials.utils.RegistryUtil; +import com.google.common.collect.ImmutableMap; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.Collection; +import java.util.Map; +import java.util.function.Supplier; + +public class NyanCommand extends EssentialsTreeNode { + private static final Sound NOTE_HARP = RegistryUtil.valueOf(Sound.class, "BLOCK_NOTE_BLOCK_HARP", "BLOCK_NOTE_HARP", "NOTE_PIANO"); + private static final String NYAN_TUNE = "1D#,1E,2F#,,2A#,1E,1D#,1E,2F#,2B,2D#,2E,2D#,2A#,2B,,2F#,,1D#,1E,2F#,2B,2C#,2A#,2B,2C#,2E,2D#,2E,2C#,,2F#,,2G#,,1D,1D#,,1C#,1D,1C#,1B,,1B,,1C#,,1D,,1D,1C#,1B,1C#,1D#,2F#,2G#,1D#,2F#,1C#,1D#,1B,1C#,1B,1D#,,2F#,,2G#,1D#,2F#,1C#,1D#,1B,1D,1D#,1D,1C#,1B,1C#,1D,,1B,1C#,1D#,2F#,1C#,1D,1C#,1B,1C#,,1B,,1C#,,2F#,,2G#,,1D,1D#,,1C#,1D,1C#,1B,,1B,,1C#,,1D,,1D,1C#,1B,1C#,1D#,2F#,2G#,1D#,2F#,1C#,1D#,1B,1C#,1B,1D#,,2F#,,2G#,1D#,2F#,1C#,1D#,1B,1D,1D#,1D,1C#,1B,1C#,1D,,1B,1C#,1D#,2F#,1C#,1D,1C#,1B,1C#,,1B,,1B,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1B,,"; + + private transient TuneRunnable currentTune = null; + + public NyanCommand() { + super(new String[]{"nyan", "nya"}, true); + } + + @Override + protected void run(final CommandSource sender, final String commandLabel, final String[] args) throws Exception { + if (currentTune != null) { + currentTune.cancel(); + } + + currentTune = new TuneRunnable(NYAN_TUNE, NOTE_HARP, ess::getOnlinePlayers); + currentTune.runTaskTimer(ess, 20, 2); + } + + private static class TuneRunnable extends BukkitRunnable { + private static final Map noteMap = ImmutableMap.builder() + .put("1F#", 0.5f) + .put("1G", 0.53f) + .put("1G#", 0.56f) + .put("1A", 0.6f) + .put("1A#", 0.63f) + .put("1B", 0.67f) + .put("1C", 0.7f) + .put("1C#", 0.76f) + .put("1D", 0.8f) + .put("1D#", 0.84f) + .put("1E", 0.9f) + .put("1F", 0.94f) + .put("2F#", 1.0f) + .put("2G", 1.06f) + .put("2G#", 1.12f) + .put("2A", 1.18f) + .put("2A#", 1.26f) + .put("2B", 1.34f) + .put("2C", 1.42f) + .put("2C#", 1.5f) + .put("2D", 1.6f) + .put("2D#", 1.68f) + .put("2E", 1.78f) + .put("2F", 1.88f) + .build(); + + private final String[] tune; + private final Sound sound; + private final Supplier> players; + private int i = 0; + + TuneRunnable(final String tuneStr, final Sound sound, final Supplier> players) { + this.tune = tuneStr.split(","); + this.sound = sound; + this.players = players; + } + + @Override + public void run() { + final String note = tune[i]; + i++; + if (i >= tune.length) { + cancel(); + } + if (note == null || note.isEmpty()) { + return; + } + + for (final Player onlinePlayer : players.get()) { + onlinePlayer.playSound(onlinePlayer.getLocation(), sound, 1, noteMap.get(note)); + } + } + } +} diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/ReloadCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/ReloadCommand.java new file mode 100644 index 00000000000..999ad8ac2b5 --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/ReloadCommand.java @@ -0,0 +1,17 @@ +package com.earth2me.essentials.commands.essentials; + +import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.commands.EssentialsTreeNode; + +public class ReloadCommand extends EssentialsTreeNode { + + public ReloadCommand() { + super("reload"); + } + + @Override + protected void run(final CommandSource sender, final String commandLabel, final String[] args) throws Exception { + ess.reload(); + sender.sendTl("essentialsReload", ess.getDescription().getVersion()); + } +} diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/UsermapCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/UsermapCommand.java new file mode 100644 index 00000000000..a7f80ec8c1c --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/UsermapCommand.java @@ -0,0 +1,107 @@ +package com.earth2me.essentials.commands.essentials; + +import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.EssentialsUpgrade; +import com.earth2me.essentials.commands.EssentialsTreeNode; +import com.earth2me.essentials.userstorage.ModernUserMap; +import com.google.common.collect.Lists; + +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.logging.Level; + +public class UsermapCommand extends EssentialsTreeNode { + + public UsermapCommand() { + super("usermap"); + } + + @Override + protected void run(final CommandSource sender, final String commandLabel, final String[] args) throws Exception { + if (!sender.isAuthorized("essentials.usermap")) { + return; + } + + final ModernUserMap userMap = (ModernUserMap) ess.getUsers(); + sender.sendTl("usermapSize", userMap.getCachedCount(), userMap.getUserCount(), ess.getSettings().getMaxUserCacheCount()); + if (args.length > 0) { + if (args[0].equals("full")) { + for (final Map.Entry entry : userMap.getNameCache().entrySet()) { + sender.sendTl("usermapEntry", entry.getKey(), entry.getValue().toString()); + } + } else if (args[0].equals("purge")) { + final boolean seppuku = args.length > 1 && args[1].equals("iknowwhatimdoing"); + + sender.sendTl("usermapPurge", String.valueOf(seppuku)); + + final Set uuids = new HashSet<>(ess.getUsers().getAllUserUUIDs()); + ess.runTaskAsynchronously(() -> { + final File userdataFolder = new File(ess.getDataFolder(), "userdata"); + final File backupFolder = new File(ess.getDataFolder(), "userdata-npc-backup-boogaloo-" + System.currentTimeMillis()); + + if (!userdataFolder.isDirectory()) { + ess.getLogger().warning("Missing userdata folder, aborting usermap purge."); + return; + } + + if (seppuku && !backupFolder.mkdir()) { + ess.getLogger().warning("Unable to create backup folder, aborting usermap purge."); + return; + } + + int total = 0; + final File[] files = userdataFolder.listFiles(EssentialsUpgrade.YML_FILTER); + if (files != null) { + for (final File file : files) { + try { + final String fileName = file.getName(); + final UUID uuid = UUID.fromString(fileName.substring(0, fileName.length() - 4)); + if (!uuids.contains(uuid)) { + total++; + ess.getLogger().warning("Found orphaned userdata file: " + file.getName()); + if (seppuku) { + try { + com.google.common.io.Files.move(file, new File(backupFolder, file.getName())); + } catch (IOException e) { + ess.getLogger().log(Level.WARNING, "Unable to move orphaned userdata file: " + file.getName(), e); + } + } + } + } catch (IllegalArgumentException ignored) { + } + } + } + ess.getLogger().info("Found " + total + " orphaned userdata files."); + }); + } else if (args[0].equalsIgnoreCase("cache")) { + sender.sendTl("usermapKnown", ess.getUsers().getAllUserUUIDs().size(), ess.getUsers().getNameCache().size()); + } else { + try { + final UUID uuid = UUID.fromString(args[0]); + for (final Map.Entry entry : userMap.getNameCache().entrySet()) { + if (entry.getValue().equals(uuid)) { + sender.sendTl("usermapEntry", entry.getKey(), args[0]); + } + } + } catch (IllegalArgumentException ignored) { + final String sanitizedName = userMap.getSanitizedName(args[0]); + sender.sendTl("usermapEntry", sanitizedName, userMap.getNameCache().get(sanitizedName).toString()); + } + } + } + } + + @Override + protected List tabComplete(CommandSource sender, String commandLabel, String[] args) { + if (args.length == 1) { + return Lists.newArrayList("full", "purge", "cache"); + } + return Collections.emptyList(); + } +} diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/VersionCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/VersionCommand.java new file mode 100644 index 00000000000..8287691ad63 --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/VersionCommand.java @@ -0,0 +1,155 @@ +package com.earth2me.essentials.commands.essentials; + +import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.commands.EssentialsTreeNode; +import com.earth2me.essentials.economy.EconomyLayer; +import com.earth2me.essentials.economy.EconomyLayers; +import com.earth2me.essentials.utils.VersionUtil; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.plugin.PluginManager; + +import java.util.Arrays; +import java.util.List; + +public class VersionCommand extends EssentialsTreeNode { + private static final List versionPlugins = Arrays.asList( + "Vault", // API + "Reserve", // API + "PlaceholderAPI", // API + "CMI", // potential for issues + "Towny", // past issues; admins should ensure latest + "ChestShop", // past issues; admins should ensure latest + "Citizens", // fires player events + "LuckPerms", // permissions (recommended) + "UltraPermissions", + "PermissionsEx", // permissions (unsupported) + "GroupManager", // permissions (unsupported) + "bPermissions", // permissions (unsupported) + "DiscordSRV", // potential for issues if EssentialsXDiscord is installed + + // Chat signing bypass plugins that can potentially break EssentialsChat + "AntiPopup", + "NoChatReports", + "NoEncryption" + ); + + public VersionCommand() { + super("version"); + } + + @Override + protected void run(CommandSource sender, String commandLabel, String[] args) throws Exception { + if (sender.isPlayer() && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.version")) return; + + boolean isMismatched = false; + boolean isVaultInstalled = false; + boolean isUnsupported = false; + final VersionUtil.SupportStatus supportStatus = VersionUtil.getServerSupportStatus(); + final PluginManager pm = Bukkit.getPluginManager(); + final String essVer = pm.getPlugin("Essentials").getDescription().getVersion(); + + final String serverMessageKey; + if (supportStatus.isSupported()) { + serverMessageKey = "versionOutputFine"; + } else if (supportStatus == VersionUtil.SupportStatus.UNSTABLE) { + serverMessageKey = "versionOutputUnsupported"; + } else { + serverMessageKey = "versionOutputWarn"; + } + + sender.sendTl(serverMessageKey, "Server", Bukkit.getBukkitVersion() + " " + Bukkit.getVersion()); + sender.sendTl(serverMessageKey, "Brand", Bukkit.getName()); + sender.sendTl("versionOutputFine", "EssentialsX", essVer); + + for (final Plugin plugin : pm.getPlugins()) { + final PluginDescriptionFile desc = plugin.getDescription(); + String name = desc.getName(); + final String version = desc.getVersion(); + + if (name.startsWith("Essentials") && !name.equalsIgnoreCase("Essentials")) { + if (VersionUtil.officialPlugins.contains(name)) { + name = name.replace("Essentials", "EssentialsX"); + + if (!version.equalsIgnoreCase(essVer)) { + isMismatched = true; + sender.sendTl("versionOutputWarn", name, version); + } else { + sender.sendTl("versionOutputFine", name, version); + } + } else { + sender.sendTl("versionOutputUnsupported", name, version); + isUnsupported = true; + } + } + + if (versionPlugins.contains(name)) { + if (VersionUtil.warnPlugins.contains(name)) { + sender.sendTl("versionOutputUnsupported", name, version); + isUnsupported = true; + } else { + sender.sendTl("versionOutputFine", name, version); + } + } + + if (name.equals("Vault")) isVaultInstalled = true; + } + + final String layer; + if (ess.getSettings().isEcoDisabled()) { + layer = "Disabled"; + } else if (EconomyLayers.isLayerSelected()) { + final EconomyLayer economyLayer = EconomyLayers.getSelectedLayer(); + layer = economyLayer.getName() + " (" + economyLayer.getBackendName() + ")"; + } else { + layer = "None"; + } + sender.sendTl("versionOutputEconLayer", layer); + + if (isMismatched) { + sender.sendTl("versionMismatchAll"); + } + + if (!isVaultInstalled) { + sender.sendTl("versionOutputVaultMissing"); + } + + if (isUnsupported) { + sender.sendTl("versionOutputUnsupportedPlugins"); + } + + switch (supportStatus) { + case NMS_CLEANROOM: + sender.sendComponent(sender.tlComponent("serverUnsupportedCleanroom").color(NamedTextColor.DARK_RED)); + break; + case DANGEROUS_FORK: + sender.sendComponent(sender.tlComponent("serverUnsupportedDangerous").color(NamedTextColor.DARK_RED)); + break; + case STUPID_PLUGIN: + sender.sendComponent(sender.tlComponent("serverUnsupportedDumbPlugins").color(NamedTextColor.DARK_RED)); + break; + case UNSTABLE: + sender.sendComponent(sender.tlComponent("serverUnsupportedMods").color(NamedTextColor.DARK_RED)); + break; + case OUTDATED: + sender.sendComponent(sender.tlComponent("serverUnsupported").color(NamedTextColor.RED)); + break; + case LIMITED: + sender.sendComponent(sender.tlComponent("serverUnsupportedLimitedApi").color(NamedTextColor.RED)); + break; + } + if (VersionUtil.getSupportStatusClass() != null) { + sender.sendComponent(sender.tlComponent("serverUnsupportedClass").color(NamedTextColor.RED)); + } + + sender.sendTl("versionFetching"); + ess.runTaskAsynchronously(() -> { + for (final Component component : ess.getUpdateChecker().getVersionMessages(true, true, sender)) { + sender.sendComponent(component); + } + }); + } +} diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/VersionUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/VersionUtil.java index bc502d803bf..24666076fd6 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/VersionUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/VersionUtil.java @@ -9,6 +9,8 @@ import org.bukkit.Bukkit; import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; @@ -48,6 +50,26 @@ public final class VersionUtil { public static final boolean PRE_FLATTENING = VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01); + public static final List officialPlugins = Arrays.asList( + "EssentialsAntiBuild", + "EssentialsChat", + "EssentialsDiscord", + "EssentialsDiscordLink", + "EssentialsGeoIP", + "EssentialsProtect", + "EssentialsSpawn", + "EssentialsXMPP" + ); + public static final List warnPlugins = Arrays.asList( + "PermissionsEx", + "GroupManager", + "bPermissions", + + // Brain-dead chat signing bypass that break EssentialsChat + "NoChatReports", + "NoEncryption" + ); + private static final Map unsupportedServerClasses; static { diff --git a/EssentialsSpawn/src/main/java/com/earth2me/essentials/spawn/Commandspawn.java b/EssentialsSpawn/src/main/java/com/earth2me/essentials/spawn/Commandspawn.java index 8b2ebcab9e6..561180daa4f 100644 --- a/EssentialsSpawn/src/main/java/com/earth2me/essentials/spawn/Commandspawn.java +++ b/EssentialsSpawn/src/main/java/com/earth2me/essentials/spawn/Commandspawn.java @@ -61,7 +61,7 @@ protected void run(final Server server, final CommandSource sender, final String @Override protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1 && sender.isAuthorized("essentials.spawn.others")) { - return getPlayers(server, sender); + return getPlayers(sender); } return Collections.emptyList(); }