From aef04e79721f61a61f74147ecbfc82b144eb4093 Mon Sep 17 00:00:00 2001
From: Andrew Wong <42793301+md5sha256@users.noreply.github.com>
Date: Tue, 28 Jul 2020 17:04:22 +0200
Subject: [PATCH 1/3] Refactor commands
---
.../hyperverse/commands/HyperCommand.java | 811 ++++++++++++++++++
.../hyperverse/commands/HyperCommandUtil.java | 348 ++++++++
2 files changed, 1159 insertions(+)
create mode 100644 Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommand.java
create mode 100644 Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommandUtil.java
diff --git a/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommand.java b/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommand.java
new file mode 100644
index 00000000..eccb5b90
--- /dev/null
+++ b/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommand.java
@@ -0,0 +1,811 @@
+//
+// Hyperverse - A Minecraft world management plugin
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+//
+
+package se.hyperver.hyperverse.commands;
+
+import co.aikar.commands.*;
+import co.aikar.commands.annotation.Optional;
+import co.aikar.commands.annotation.*;
+import co.aikar.taskchain.TaskChainFactory;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.inject.Inject;
+import me.minidigger.minimessage.bungee.MiniMessageParser;
+import org.apache.commons.lang.StringUtils;
+import org.bukkit.*;
+import org.bukkit.command.CommandException;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.plugin.PluginDescriptionFile;
+import se.hyperver.hyperverse.Hyperverse;
+import se.hyperver.hyperverse.configuration.FileHyperConfiguration;
+import se.hyperver.hyperverse.configuration.Message;
+import se.hyperver.hyperverse.configuration.Messages;
+import se.hyperver.hyperverse.database.PersistentLocation;
+import se.hyperver.hyperverse.exception.HyperWorldValidationException;
+import se.hyperver.hyperverse.flags.FlagParseException;
+import se.hyperver.hyperverse.flags.GlobalWorldFlagContainer;
+import se.hyperver.hyperverse.flags.WorldFlag;
+import se.hyperver.hyperverse.flags.implementation.EndFlag;
+import se.hyperver.hyperverse.flags.implementation.NetherFlag;
+import se.hyperver.hyperverse.flags.implementation.ProfileGroupFlag;
+import se.hyperver.hyperverse.modules.HyperWorldFactory;
+import se.hyperver.hyperverse.util.*;
+import se.hyperver.hyperverse.world.WorldType;
+import se.hyperver.hyperverse.world.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.lang.management.RuntimeMXBean;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.text.DecimalFormat;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Stream;
+
+@CommandAlias("hyperverse|hv|worlds|world")
+@CommandPermission("hyperverse.worlds")
+@SuppressWarnings("unused")
+public class HyperCommand extends BaseCommand {
+
+ private final WorldManager worldManager;
+ private final FileHyperConfiguration fileHyperConfiguration;
+ private final HyperWorldFactory hyperWorldFactory;
+ private final GlobalWorldFlagContainer globalFlagContainer;
+ private final TaskChainFactory taskChainFactory;
+
+ @Inject public HyperCommand(final Hyperverse hyperverse, final WorldManager worldManager,
+ final HyperWorldFactory hyperWorldFactory, final GlobalWorldFlagContainer globalFlagContainer,
+ final TaskChainFactory taskChainFactory, final FileHyperConfiguration hyperConfiguration) {
+ this.worldManager = Objects.requireNonNull(worldManager);
+ this.hyperWorldFactory = Objects.requireNonNull(hyperWorldFactory);
+ this.globalFlagContainer = Objects.requireNonNull(globalFlagContainer);
+ this.taskChainFactory = Objects.requireNonNull(taskChainFactory);
+ this.fileHyperConfiguration = Objects.requireNonNull(hyperConfiguration);
+
+ // Create the command manager
+ BukkitCommandManager bukkitCommandManager = new PaperCommandManager(hyperverse);
+ new HyperCommandUtil(worldManager, globalFlagContainer, bukkitCommandManager);
+ bukkitCommandManager.registerCommand(this);
+ }
+
+ @HelpCommand public void doHelp(final CommandSender sender, final CommandHelp commandHelp) {
+ commandHelp.showHelp();
+ }
+
+ @Category("Management")
+ @Subcommand("create") @Syntax(" [generator: plugin name, vanilla][:[args]] [type: overworld, nether, end] [seed] [generate-structures: true, false] [features: normal, flatland, amplified, bucket] [settings...]")
+ @CommandPermission("hyperverse.create") @Description("{@@command.create}")
+ @CommandCompletion("@null @generators @worldtypes @null @structures @worldfeatures @null")
+ public void createWorld(final CommandSender sender, final String world, String generator,
+ @Default("overworld") final WorldType type, @Optional final Long specifiedSeed,
+ @Default("true") final WorldStructureSetting generateStructures, @Default("normal") final WorldFeatures features,
+ @Default final String settings) {
+ final long seed = specifiedSeed == null ? SeedUtil.randomSeed() : specifiedSeed;
+ // Check if the name already exists
+ for (final HyperWorld hyperWorld : this.worldManager.getWorlds()) {
+ if (hyperWorld.getConfiguration().getName().equalsIgnoreCase(world)) {
+ MessageUtil.sendMessage(sender, Messages.messageWorldExists);
+ return;
+ }
+ }
+ // Double check that Bukkit doesn't have the world stored
+ if (Bukkit.getWorld(world) != null) {
+ MessageUtil.sendMessage(sender, Messages.messageWorldExists);
+ return;
+ }
+ // Now validate the world name
+ if (!WorldUtil.validateName(world)) {
+ MessageUtil.sendMessage(sender, Messages.messageWorldNameInvalid);
+ return;
+ }
+
+ String generatorArgs = "";
+ if (generator.contains(":")) {
+ final String[] split = generator.split(":");
+ generator = split[0];
+ generatorArgs = split[1];
+ }
+
+ // Check if the generator is actually valid
+ final WorldConfiguration worldConfiguration =
+ WorldConfiguration.builder().setName(world).setGenerator(generator).setType(type).setSeed(seed)
+ .setGenerateStructures(generateStructures).setSettings(settings).setWorldFeatures(features)
+ .setGeneratorArg(generatorArgs).createWorldConfiguration();
+ final HyperWorld hyperWorld =
+ hyperWorldFactory.create(UUID.randomUUID(), worldConfiguration);
+ MessageUtil.sendMessage(sender, Messages.messageWorldCreationStarted);
+ hyperWorld.sendWorldInfo(sender);
+
+ // Make sure we don't detect the world load
+ this.worldManager.ignoreWorld(world);
+
+ try {
+ hyperWorld.createBukkitWorld();
+ // Register the world
+ this.worldManager.addWorld(hyperWorld);
+ MessageUtil.sendMessage(sender, Messages.messageWorldCreationFinished);
+ if (sender instanceof Player) {
+ // Attempt to teleport them to the world
+ hyperWorld.teleportPlayer((Player) sender);
+ }
+ } catch (final HyperWorldValidationException validationException) {
+ switch (validationException.getValidationResult()) {
+ case UNKNOWN_GENERATOR:
+ MessageUtil.sendMessage(sender, Messages.messageGeneratorInvalid,
+ "%world%", hyperWorld.getConfiguration().getName(),
+ "%generator%", hyperWorld.getConfiguration().getGenerator());
+ break;
+ case SUCCESS:
+ break;
+ default:
+ MessageUtil.sendMessage(sender, Messages.messageCreationUnknownFailure);
+ break;
+ }
+ } catch (final Exception e) {
+ MessageUtil.sendMessage(sender, Messages.messageWorldCreationFailed,
+ "%reason%", e.getMessage());
+ }
+ }
+
+ @Category("Management") @Subcommand("import") @CommandPermission("hyperverse.import")
+ @CommandAlias("hvimport") @CommandCompletion("@import-candidates @generators @worldtypes") @Description("{@@command.import}")
+ public void importWorld(final CommandSender sender, final String worldName, final String generator, @Default("over_world") final WorldType worldType) {
+ if (worldManager.getWorld(worldName) != null) {
+ MessageUtil.sendMessage(sender, Messages.messageWorldAlreadyImported);
+ return;
+ }
+ if (!WorldUtil.isSuitableImportCandidate(worldName, worldManager)) {
+ MessageUtil.sendMessage(sender, Messages.messageNoSuchWorld);
+ return;
+ }
+ worldManager.ignoreWorld(worldName); //Make sure we don't auto register on init
+ final HyperWorld hyperWorld = hyperWorldFactory.create(UUID.randomUUID(),
+ new WorldConfigurationBuilder().setName(worldName).setGenerator(generator)
+ .setType(worldType).createWorldConfiguration());
+ final World bukkitWorld;
+ try {
+ hyperWorld.createBukkitWorld();
+ bukkitWorld = hyperWorld.getBukkitWorld();
+ assert bukkitWorld != null;
+ } catch (HyperWorldValidationException e) {
+ MessageUtil.sendMessage(sender, Messages.messageWorldImportFailure, "%world%", worldName,
+ "%result%", e.getMessage());
+ return;
+ }
+ worldManager.addWorld(hyperWorld);
+ MessageUtil.sendMessage(sender, Messages.messageWorldImportFinished);
+ if (sender instanceof Player) {
+ //Schedule teleport 1-tick later so the world has a chance to load.
+ Bukkit.getScheduler().runTaskLater(Hyperverse.getPlugin(Hyperverse.class),
+ () -> doTeleport((Player) sender, worldManager.getWorld(bukkitWorld)), 1L);
+ }
+ }
+
+ @Category("Informational") @Subcommand("list|l|worlds") @CommandPermission("hyperverse.list")
+ @CommandAlias("hvl") @Description("{@@command.list}") public void doList(final CommandSender sender) {
+ MessageUtil.sendMessage(sender, Messages.messageListHeader);
+ Stream stream = this.worldManager.getWorlds().stream().sorted(Comparator.comparing(world -> world.getConfiguration().getName()));
+ if (sender instanceof Entity) {
+ stream = stream.sorted(Comparator
+ .comparing(world -> !((Entity) sender).getWorld().equals(world.getBukkitWorld())));
+ }
+ stream.forEachOrdered(hyperWorld -> {
+ final WorldConfiguration configuration = hyperWorld.getConfiguration();
+
+ // Format the generator name a little better
+ String generator = configuration.getGenerator();
+ if (generator.isEmpty()) {
+ generator = "vanilla";
+ } else {
+ generator = generator.toLowerCase();
+ }
+
+ final String loadStatus;
+ if (hyperWorld.isLoaded()) {
+ loadStatus = "Click to unload\">loaded";
+ } else {
+ loadStatus = "Click to load\">unloaded";
+ }
+
+ final Message message;
+ if (sender instanceof Entity && ((Entity) sender).getWorld() == hyperWorld.getBukkitWorld()) {
+ message = Messages.messageListEntryCurrentWorld;
+ } else {
+ message = Messages.messageListEntry;
+ }
+
+ MessageUtil.sendMessage(sender, message, "%name%", configuration.getName(),
+ "%display-name%", hyperWorld.getDisplayName(), "%generator%", generator, "%type%",
+ configuration.getType().name(), "%load_status%", loadStatus);
+ });
+ }
+
+ @Category("Misc") @Subcommand("teleport|tp") @CommandAlias("hvtp") @CommandPermission("hyperverse.teleport")
+ @CommandCompletion("@hyperworlds:player=not_in,state=loaded") @Description("{@@command.teleport}")
+ public void doTeleport(final Player player, final HyperWorld world) {
+ if (world == null) {
+ MessageUtil.sendMessage(player, Messages.messageNoSuchWorld);
+ return;
+ }
+ if (!world.isLoaded()) {
+ MessageUtil.sendMessage(player, Messages.messageWorldNotLoaded);
+ return;
+ }
+ if (world.getBukkitWorld() == player.getWorld()) {
+ MessageUtil.sendMessage(player, Messages.messageAlreadyInWorld);
+ return;
+ }
+ MessageUtil.sendMessage(player, Messages.messageTeleporting, "%world%", world.getDisplayName());
+ world.teleportPlayer(player);
+ }
+
+ @Category("Misc") @Subcommand("teleport|tp") @CommandAlias("hvtp") @CommandPermission("hyperverse.teleport")
+ @CommandCompletion("@hyperworlds:state=loaded @vararg_player_world:pop=0,in_world=true")
+ public void doMassTeleport(final CommandSender sender, final HyperWorld world, String[] players) {
+ if (players.length == 0) {
+ if (sender instanceof Player) {
+ doTeleport((Player) sender, world);
+ } else {
+ MessageUtil.sendMessage(sender, Messages.messageSpecifyPlayer);
+ }
+ return;
+ }
+ if (world == null) {
+ MessageUtil.sendMessage(sender, Messages.messageNoSuchWorld);
+ return;
+ }
+ if (!world.isLoaded()) {
+ MessageUtil.sendMessage(sender, Messages.messageWorldNotLoaded);
+ return;
+ }
+ final List playerList = new ArrayList<>(players.length);
+ for (final String rawPlayer : players) {
+ final Player player = Bukkit.getPlayer(rawPlayer);
+ if (player == null) {
+ MessageUtil.sendMessage(sender, Messages.messageNoPlayerFound, "%name%", rawPlayer);
+ return;
+ }
+ if (!playerList.contains(player)) {
+ playerList.add(player);
+ }
+ }
+ for (final Player player : playerList) {
+ if (world.getBukkitWorld() == player.getWorld()) {
+ MessageUtil.sendMessage(sender, Messages.messagePlayerAlreadyInWorld, "%player%",
+ player.getName());
+ continue;
+ }
+ MessageUtil.sendMessage(player, Messages.messageTeleporting, "%world%", world.getDisplayName());
+ if (player != sender) {
+ MessageUtil.sendMessage(sender, Messages.messageTeleportingPlayer, "%player%",
+ player.getName(), "%world%", world.getDisplayName());
+ }
+ world.teleportPlayer(player);
+ }
+ }
+
+ @Category("Misc") @Subcommand("teleportgroup|tpgroup") @CommandAlias("hvtpgroup")
+ @CommandPermission("hyperverse.teleportgroup")
+ @CommandCompletion("@profile_groups:has_perms=true") @Description("{@command.teleportgroup}")
+ public void doGroupedTeleport(final Player sender, final String profileGroup) {
+ final CompletableFuture> future =
+ (CompletableFuture>) Hyperverse
+ .getPlugin(Hyperverse.class).getDatabase().getLocations(sender.getUniqueId());
+
+ future.thenAccept(persistentLocations -> {
+ final java.util.Optional optional =
+ persistentLocations.stream().filter(persistentLocation -> {
+ final HyperWorld hyperWorld =
+ worldManager.getWorld(persistentLocation.getWorld());
+ if (hyperWorld == null) {
+ return false;
+ }
+ return hyperWorld.getFlag(ProfileGroupFlag.class)
+ .equalsIgnoreCase(profileGroup);
+ }).min(Comparator.comparingInt(PersistentLocation::getId)); //Lowest number is most recent?
+
+ if (!optional.isPresent()) {
+ MessageUtil.sendMessage(sender, Messages.messageInvalidProfileGroup);
+ return;
+ }
+ final PersistentLocation location = optional.get();
+ final HyperWorld hyperWorld = worldManager.getWorld(location.getWorld());
+ assert hyperWorld != null;
+ doTeleport(sender, hyperWorld);
+ });
+ }
+
+ @Category("Informational") @Subcommand("info|i") @CommandAlias("hvi")
+ @CommandPermission("hyperverse.info") @CommandCompletion("@hyperworlds") @Description("View world info")
+ public void doInfo(final CommandSender sender, final HyperWorld world) {
+ if (world == null) {
+ return;
+ }
+ MessageUtil.sendMessage(sender, Messages.messageInfoHeader);
+ world.sendWorldInfo(sender);
+ }
+
+ @Category("Management") @Subcommand("unload") @CommandPermission("hyperverse.unload")
+ @CommandCompletion("@hyperworlds:state=loaded") @Description("{@@command.unload}")
+ public void doUnload(final CommandSender sender, final HyperWorld world) {
+ if (world == null) {
+ return;
+ }
+ if (!world.isLoaded()) {
+ MessageUtil.sendMessage(sender, Messages.messageWorldNotLoaded);
+ return;
+ }
+ final HyperWorld.WorldUnloadResult worldUnloadResult = world.unloadWorld();
+ if (worldUnloadResult == HyperWorld.WorldUnloadResult.SUCCESS) {
+ MessageUtil.sendMessage(sender, Messages.messageWorldUnloaded);
+ } else {
+ MessageUtil.sendMessage(sender, Messages.messageWorldUnloadFailed,
+ "%reason%", worldUnloadResult.getDescription());
+ }
+ }
+
+ @Category("Management") @Subcommand("load") @CommandPermission("hyperverse.load")
+ @CommandCompletion("@hyperworlds:state=unloaded") @Description("{@@command.load}")
+ public void doLoad(final CommandSender sender, final HyperWorld world) {
+ if (world == null) {
+ MessageUtil.sendMessage(sender, Messages.messageNoSuchWorld);
+ return;
+ }
+ if (world.isLoaded()) {
+ MessageUtil.sendMessage(sender, Messages.messageWorldAlreadyLoaded);
+ return;
+ }
+ try {
+ world.createBukkitWorld();
+ } catch (final HyperWorldValidationException e) {
+ MessageUtil.sendMessage(sender, Messages.messageWorldImportFailure,
+ "%world%", world.getConfiguration().getName(), "%result%", e.getMessage());
+ return;
+ }
+
+ world.getConfiguration().setLoaded(true);
+ world.saveConfiguration();
+
+ MessageUtil.sendMessage(sender, Messages.messageWorldLoadedSuccessfully);
+ }
+
+ @Category("Misc") @Subcommand("find|where") @CommandPermission("hyperverse.find") @CommandAlias("hvf|hvfind")
+ @CommandCompletion("@players") @Description("{@@command.find}")
+ //public void findPlayer(final CommandSender sender, final String... players) {
+ public void findPlayer(final CommandSender sender, final String player) {
+ //for (String player : players) {
+ final Player bukkitPlayer = Bukkit.getPlayer(player);
+ if (bukkitPlayer == null) {
+ MessageUtil.sendMessage(sender, Messages.messageNoPlayerFound, "%name%", player);
+ return;
+ }
+ final Location location = bukkitPlayer.getLocation();
+ final DecimalFormat format = Messages.miscCoordinateDecimalFormat;
+ MessageUtil
+ .sendMessage(sender, Messages.messagePlayerCurrentWorld, "%player%", player, "%world%",
+ bukkitPlayer.getWorld().getName(), "%x%",
+ format.format(location.getX()), "%y%", format.format(location.getY()),
+ "%z%", format.format(location.getZ()));
+ //}
+ }
+
+ @Category("Misc") @Subcommand("who") @CommandPermission("hyperverse.who") @CommandAlias("hvwho")
+ @CommandCompletion("@hyperworlds") @Description("{@@command.who}")
+ public void findPlayersPresent(final CommandSender sender, @Optional final String world) {
+ if (world != null) {
+ final World bukkitWorld = Bukkit.getWorld(world);
+ if (bukkitWorld == null) {
+ MessageUtil.sendMessage(sender, Messages.messageNoSuchWorld);
+ return;
+ }
+ final HyperWorld hyperWorld = this.worldManager.getWorld(bukkitWorld);
+ if (hyperWorld == null) {
+ MessageUtil.sendMessage(sender, Messages.messageNoSuchWorld);
+ return;
+ }
+ final DecimalFormat format = Messages.miscCoordinateDecimalFormat;
+ if (bukkitWorld.getPlayers().isEmpty()) {
+ MessageUtil.sendMessage(sender, Messages.messageNoPlayersInWorld, "%world%", hyperWorld.getDisplayName());
+ return;
+ }
+ final StringJoiner players = new StringJoiner(", ");
+ for (final Player player : bukkitWorld.getPlayers()) {
+ final Location location = player.getLocation();
+ players.add(MessageUtil
+ .format(Messages.messageListEntryPlayer.toString(), "%player%",
+ ChatColor.stripColor(player.getDisplayName()), "%world%", world, "%x%",
+ format.format(location.getX()), "%y%", format.format(location.getY()),
+ "%z%", format.format(location.getZ())));
+ }
+ MessageUtil.sendMessage(sender, Messages.messageListEntryWorld, "%players%",
+ players.toString().trim(), "%world%", hyperWorld.getDisplayName());
+ }
+ else {
+ for (final World bukkitWorld : Bukkit.getWorlds()) {
+ findPlayersPresent(sender, bukkitWorld.getName());
+ }
+ }
+ }
+
+ @Category("Management") @Subcommand("flag set") @CommandPermission("hyperverse.flag.set")
+ @CommandCompletion("@hyperworlds @flags @flag") @Description("{@@command.flag.set}")
+ public void doFlagSet(final CommandSender sender, final HyperWorld hyperWorld,
+ final WorldFlag, ?> flag, final String value) {
+ try {
+ hyperWorld.setFlag(flag, value);
+ } catch (final FlagParseException e) {
+ MessageUtil.sendMessage(sender, Messages.messageFlagParseError, "%flag%", e.getFlag().getName(), "%value%", e.getValue(), "%reason%", e.getErrorMessage());
+ return;
+ }
+ MessageUtil.sendMessage(sender, Messages.messageFlagSet);
+ }
+
+ @Category("Management") @Subcommand("flag reset") @CommandPermission("hyperverse.flag.set") @CommandCompletion("@flags|@hyperworlds @flags") @SuppressWarnings("unchecked")
+ public void doFlagReset(final CommandSender sender, final HyperWorld hyperWorld, final WorldFlag,?> flag) {
+ final WorldFlag, ?> toSet;
+ if (flag.getClass() == EndFlag.class) {
+ final World bukkitWorld = hyperWorld.getBukkitWorld();
+ if (bukkitWorld == null) {
+ toSet = globalFlagContainer.getFlag(flag.getClass());
+ } else {
+ WorldFlag, ?> temp;
+ try {
+ temp = EndFlag.END_FLAG_DEFAULT.parse(bukkitWorld.getName() + "_the_end");
+ } catch (FlagParseException ignored) {
+ temp = globalFlagContainer.getFlag(flag.getClass());
+ }
+ toSet = temp;
+ }
+ } else if (flag.getClass() == NetherFlag.class) {
+ final World bukkitWorld = hyperWorld.getBukkitWorld();
+ if (bukkitWorld == null) {
+ toSet = globalFlagContainer.getFlag(flag.getClass());
+ } else {
+ WorldFlag, ?> temp;
+ try {
+ temp = NetherFlag.NETHER_FLAG_DEFAULT.parse(bukkitWorld.getName() + "_nether");
+ } catch (FlagParseException ignored) {
+ temp = globalFlagContainer.getFlag(flag.getClass());
+ }
+ toSet = temp;
+ }
+ } else {
+ toSet = globalFlagContainer.getFlag(flag.getClass());
+ }
+ hyperWorld.setFlagInstance(toSet);
+ MessageUtil.sendMessage(sender, Messages.messageFlagSet);
+ }
+
+ @Category("Management") @Subcommand("flag remove") @CommandPermission("hyperverse.flag.set")
+ @CommandCompletion("@hyperworlds @flags") @Description("{@@command.flag.remove}")
+ public void doFlagRemove(final CommandSender sender, final HyperWorld hyperWorld, final WorldFlag, ?> flag) {
+ hyperWorld.removeFlag(flag);
+ MessageUtil.sendMessage(sender, Messages.messageFlagRemoved);
+ }
+
+ @Category("Management") @Subcommand("flag info") @CommandPermission("hyperverse.flag.info") @CommandCompletion("@flags|@hyperworlds @flags") @SuppressWarnings("unchecked")
+ public void showFlagStatus(final CommandSender sender, final HyperWorld hyperWorld, final WorldFlag flag) {
+ final String value = String.valueOf(hyperWorld.getFlag((Class extends WorldFlag>) flag.getClass())), defaultValue;
+ defaultValue = String.valueOf((globalFlagContainer.getFlag(flag.getClass()).getValue()));
+ MessageUtil.sendMessage(sender, Messages.messageFlagDisplayInfo, "%description%", flag.getFlagDescription().toString(), "%current%", value.isEmpty() ? "Unset" : value, "%default%", defaultValue.isEmpty() ? "Unset" : defaultValue);
+ }
+
+ @Category("Management") @Subcommand("gamerule set") @CommandPermission("hyperverse.gamerule.set")
+ @CommandCompletion("@hyperworlds @gamerules @gamerule") @Description("{@@command.gamerule.set}")
+ public void doGameRuleSet(final CommandSender sender, final HyperWorld hyperWorld,
+ final GameRule gameRule, final String value) {
+ if (!hyperWorld.isLoaded()) {
+ MessageUtil.sendMessage(sender, Messages.messageWorldNotLoaded);
+ return;
+ }
+
+ final Object object;
+ if (gameRule.getType() == Boolean.class) {
+ try {
+ object = Boolean.parseBoolean(value);
+ } catch (final Exception e) {
+ MessageUtil.sendMessage(sender, Messages.messageGameRuleParseError);
+ return;
+ }
+ } else if (gameRule.getType() == Integer.class) {
+ try {
+ object = Integer.parseInt(value);
+ } catch (final Exception e) {
+ MessageUtil.sendMessage(sender, Messages.messageGameRuleParseError);
+ return;
+ }
+ } else {
+ // ??
+ return;
+ }
+
+ hyperWorld.getBukkitWorld().setGameRule(gameRule, object);
+ MessageUtil.sendMessage(sender, Messages.messageGameRuleSet);
+ }
+
+ @Category("Management") @Subcommand("gamerule remove") @CommandPermission("hyperverse.gamerule.set")
+ @CommandCompletion("@hyperworlds @gamerules") @Description("{@@command.gamerule.remove}")
+ public void doGameRuleRemove(final CommandSender sender, final HyperWorld hyperWorld, final GameRule gameRule) {
+ if (gameRule == null) {
+ MessageUtil.sendMessage(sender, Messages.messageGameRuleUnknown);
+ return;
+ }
+ if (hyperWorld == null) {
+ MessageUtil.sendMessage(sender, Messages.messageNoSuchWorld);
+ return;
+ }
+ if (!hyperWorld.isLoaded()) {
+ MessageUtil.sendMessage(sender, Messages.messageWorldNotLoaded);
+ return;
+ }
+ hyperWorld.getBukkitWorld().setGameRule(gameRule,
+ hyperWorld.getBukkitWorld().getGameRuleDefault(gameRule));
+ MessageUtil.sendMessage(sender, Messages.messageGameRuleRemoved);
+ }
+
+ @Category("Management") @Subcommand("delete") @CommandPermission("hyperverse.delete")
+ @CommandCompletion("@hyperworlds true|false") @Description("{@@command.delete}")
+ public void doDelete(final CommandSender sender, final HyperWorld hyperWorld,
+ @Default("false") boolean deleteDirectory) {
+ if (hyperWorld == null) {
+ MessageUtil.sendMessage(sender, Messages.messageNoSuchWorld);
+ return;
+ }
+ hyperWorld.deleteWorld(worldUnloadResult -> {
+ if (worldUnloadResult != HyperWorld.WorldUnloadResult.SUCCESS) {
+ MessageUtil.sendMessage(sender, Messages.messageWorldNotRemoved, "%reason%",
+ worldUnloadResult.getDescription());
+ return;
+ }
+
+ if (deleteDirectory) {
+ final Path path = Bukkit.getWorldContainer().toPath()
+ .resolve(hyperWorld.getConfiguration().getName());
+ try {
+ try (Stream walk = Files.walk(path)) {
+ walk.sorted(Comparator.reverseOrder())
+ .map(Path::toFile)
+ .peek(System.out::println)
+ .forEach(File::delete);
+ }
+ } catch (final Exception e) {
+ MessageUtil.sendMessage(sender, Messages.messageWorldNotRemoved, "%reason%",
+ e.getMessage());
+ e.printStackTrace();
+ return;
+ }
+ }
+
+ MessageUtil.sendMessage(sender, Messages.messageWorldRemoved);
+ });
+ }
+
+ @Category("Misc") @Subcommand("reload") @CommandPermission("hyperverse.reload") @CommandAlias("hvreload")
+ @Description("{@@command.reload}")
+ public void doConfigReload(final CommandSender sender) {
+ if (!Hyperverse.getPlugin(Hyperverse.class).reloadConfiguration(sender)) {
+ throw new CommandException("Failed to reload configuration files");
+ }
+ }
+
+ @Category("Misc") @Subcommand("debugpaste") @CommandPermission("hyperverse.debugpaste")
+ @Description("{@@command.debugpaste}")
+ public void doDebugPaste(final CommandSender sender) {
+ this.taskChainFactory.newChain().async(() -> {
+ try {
+ final Hyperverse hyperverse = Hyperverse.getPlugin(Hyperverse.class);
+
+ StringBuilder b = new StringBuilder();
+ b.append(
+ "# Welcome to this paste\n# It is meant to provide us at IntellectualSites with better information about your "
+ + "problem\n\n");
+
+ b.append("# Server Information\n");
+ b.append("Server Version: ").append(Bukkit.getVersion()).append("\n");
+
+ b.append("Plugins:");
+ for (final Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
+ b.append("\n ").append(plugin.getName()).append(":\n ").append("version: '")
+ .append(plugin.getDescription().getVersion()).append('\'').append("\n enabled: ").append(plugin.isEnabled());
+ }
+
+ b.append("\n\n# YAY! Now, let's see what we can find in your JVM\n");
+ Runtime runtime = Runtime.getRuntime();
+ RuntimeMXBean rb = ManagementFactory.getRuntimeMXBean();
+ b.append("Uptime: ").append(
+ TimeUnit.MINUTES.convert(rb.getUptime(), TimeUnit.MILLISECONDS) + " minutes")
+ .append('\n');
+ b.append("JVM Flags: ").append(rb.getInputArguments()).append('\n');
+ b.append("Free Memory: ").append(runtime.freeMemory() / 1024 / 1024 + " MB")
+ .append('\n');
+ b.append("Max Memory: ").append(runtime.maxMemory() / 1024 / 1024 + " MB")
+ .append('\n');
+ b.append("Java Name: ").append(rb.getVmName()).append('\n');
+ b.append("Java Version: '").append(System.getProperty("java.version"))
+ .append("'\n");
+ b.append("Java Vendor: '").append(System.getProperty("java.vendor")).append("'\n");
+ b.append("Operating System: '").append(System.getProperty("os.name")).append("'\n");
+ b.append("OS Version: ").append(System.getProperty("os.version")).append('\n');
+ b.append("OS Arch: ").append(System.getProperty("os.arch")).append('\n');
+ b.append("# Okay :D Great. You are now ready to create your bug report!");
+ b.append(
+ "\n# You can do so at https://github.com/Sauilitired/Hyperverse/issues");
+ b.append("\n# or via our Discord at https://discord.gg/KxkjDVg");
+
+ // We use the PlotSquared profile
+ final IncendoPaster incendoPaster = new IncendoPaster("plotsquared");
+ incendoPaster.addFile(new IncendoPaster.PasteFile("information", b.toString()));
+
+ try {
+ final File logFile = new File(Bukkit.getWorldContainer(), "./logs/latest.log");
+ if (Files.size(logFile.toPath()) > 14_000_000) {
+ throw new IOException("Too big...");
+ }
+ incendoPaster.addFile(new IncendoPaster.PasteFile("latest.log", IncendoPaster.readFile(logFile)));
+ } catch (IOException ignored) {
+ MessageUtil.sendMessage(sender, Messages.messageLogTooBig);
+ }
+
+ try {
+ incendoPaster.addFile(new IncendoPaster.PasteFile("hyperverse.conf",
+ IncendoPaster.readFile(new File(hyperverse.getDataFolder(), "hyperverse.conf"))));
+ } catch (final IllegalArgumentException | IOException ignored) {
+ }
+
+
+ for (final HyperWorld hyperWorld : worldManager.getWorlds()) {
+ incendoPaster.addFile(new IncendoPaster.PasteFile(String.format("%s.json",
+ hyperWorld.getConfiguration().getName()), IncendoPaster.readFile(this.worldManager.getWorldDirectory().
+ resolve(String.format("%s.json", hyperWorld.getConfiguration().getName())).toFile())));
+ }
+
+ try {
+ final String rawResponse = incendoPaster.upload();
+ final JsonObject jsonObject = new JsonParser().parse(rawResponse).getAsJsonObject();
+
+ if (jsonObject.has("created")) {
+ final String pasteId = jsonObject.get("paste_id").getAsString();
+ final String link =
+ String.format("https://athion.net/ISPaster/paste/view/%s", pasteId);
+ MessageUtil.sendMessage(sender, Messages.messagePasteUpload, "%paste%", link);
+ } else {
+ final String responseMessage = jsonObject.get("response").getAsString();
+ MessageUtil.sendMessage(sender, Messages.messagePasteFailed, "%reason%", responseMessage);
+ }
+ } catch (final Throwable throwable) {
+ throwable.printStackTrace();
+ MessageUtil.sendMessage(sender, Messages.messagePasteFailed, "%reason%", throwable.getMessage());
+ }
+ } catch (final Exception ignored) {
+ }
+ }).execute();
+ }
+
+ @Category("Misc") @Subcommand("multiverse") @CommandPermission("hyperverse.plugin.import")
+ @Description("{@@command.multiverse}")
+ public void doMultiverse(final CommandSender sender) {
+ if (Bukkit.getPluginManager().isPluginEnabled("Multiverse-Core")) {
+ new MultiverseImporter(this.worldManager, this.hyperWorldFactory)
+ .performImport(sender);
+ } else {
+ MessageUtil.sendMessage(sender, Messages.messageImportPluginMissing,"%plugin%", "Multiverse");
+ }
+ }
+
+ @Category("Misc") @Subcommand("myworlds") @CommandPermission("hyperverse.plugin.import")
+ public void doMyWorlds(final CommandSender sender) {
+ if (Bukkit.getPluginManager().isPluginEnabled("My_Worlds")) {
+ new MyWorldsImporter(this.worldManager, this.hyperWorldFactory).performImport(sender);
+ } else { MessageUtil
+ .sendMessage(sender, Messages.messageImportPluginMissing, "%plugin%", "MyWorlds");
+
+ }
+ }
+
+ @Category("Misc") @Subcommand("plugin")
+ @Description("{@@command.plugin}")
+ public void doPlugin(final CommandSender sender) {
+ final Hyperverse plugin = Hyperverse.getPlugin(Hyperverse.class);
+ final PluginDescriptionFile description = plugin.getDescription();
+ Stream.of("Plugin Version: " + description.getVersion() + "",
+ "Author(s): " + StringUtils.join(description.getAuthors(), ", ") + "",
+ "Website: Click to open\">https://hyperver.se").forEach(msg ->
+ sender.spigot().sendMessage(MiniMessageParser.parseFormat(
+ "[Hyperverse] " + msg)));
+ }
+
+ @Category("Management") @Subcommand("regenerate|regen") @Description("{@@command.regenerate}")
+ @CommandPermission("hyperverse.regenerate") @CommandCompletion("@hyperworlds true|false")
+ public void doRegenerate(final CommandSender sender, final HyperWorld world, @Default("false") final boolean randomiseSeed) {
+ if (world == null) {
+ MessageUtil.sendMessage(sender, Messages.messageNoSuchWorld);
+ return;
+ }
+
+ final WorldConfiguration configuration = world.getConfiguration().copy();
+ if (randomiseSeed) {
+ configuration.setSeed(SeedUtil.randomSeed());
+ }
+
+ world.deleteWorld(worldUnloadResult -> {
+ if (worldUnloadResult != HyperWorld.WorldUnloadResult.SUCCESS) {
+ MessageUtil.sendMessage(sender, Messages.messageWorldNotRemoved, "%reason%",
+ worldUnloadResult.getDescription());
+ return;
+ }
+
+ final Path path = Bukkit.getWorldContainer().toPath()
+ .resolve(world.getConfiguration().getName());
+ try {
+ try (Stream walk = Files.walk(path)) {
+ walk.sorted(Comparator.reverseOrder())
+ .map(Path::toFile)
+ .peek(System.out::println)
+ .forEach(File::delete);
+ }
+ } catch (final Exception e) {
+ MessageUtil.sendMessage(sender, Messages.messageWorldNotRemoved, "%reason%",
+ e.getMessage());
+ e.printStackTrace();
+ return;
+ }
+ MessageUtil.sendMessage(sender, Messages.messageWorldRemoved);
+ final HyperWorld hyperWorld = hyperWorldFactory.create(UUID.randomUUID(), configuration);
+ MessageUtil.sendMessage(sender, Messages.messageWorldCreationStarted);
+ hyperWorld.sendWorldInfo(sender);
+
+ // Make sure we don't detect the world load
+ this.worldManager.ignoreWorld(configuration.getName());
+
+ try {
+ hyperWorld.createBukkitWorld();
+ // Register the world
+ this.worldManager.addWorld(hyperWorld);
+ MessageUtil.sendMessage(sender, Messages.messageWorldCreationFinished);
+ if (sender instanceof Player) {
+ // Attempt to teleport them to the world
+ hyperWorld.teleportPlayer((Player) sender);
+ }
+ } catch (final HyperWorldValidationException validationException) {
+ switch (validationException.getValidationResult()) {
+ case UNKNOWN_GENERATOR:
+ MessageUtil.sendMessage(sender, Messages.messageGeneratorInvalid,
+ "%world%", hyperWorld.getConfiguration().getName(),
+ "%generator%", hyperWorld.getConfiguration().getGenerator());
+ break;
+ case SUCCESS:
+ break;
+ default:
+ MessageUtil.sendMessage(sender, Messages.messageCreationUnknownFailure);
+ break;
+ }
+ } catch (final Exception e) {
+ MessageUtil.sendMessage(sender, Messages.messageWorldCreationFailed,
+ "%reason%", e.getMessage());
+ }
+ });
+ }
+
+}
diff --git a/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommandUtil.java b/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommandUtil.java
new file mode 100644
index 00000000..40973f99
--- /dev/null
+++ b/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommandUtil.java
@@ -0,0 +1,348 @@
+//
+// Hyperverse - A Minecraft world management plugin
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+//
+
+package se.hyperver.hyperverse.commands;
+
+import co.aikar.commands.BukkitCommandManager;
+import co.aikar.commands.BukkitMessageFormatter;
+import co.aikar.commands.InvalidCommandArgument;
+import co.aikar.commands.MessageType;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.GameRule;
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.Plugin;
+import org.jetbrains.annotations.NotNull;
+import se.hyperver.hyperverse.configuration.Messages;
+import se.hyperver.hyperverse.flags.GlobalWorldFlagContainer;
+import se.hyperver.hyperverse.flags.WorldFlag;
+import se.hyperver.hyperverse.flags.implementation.ProfileGroupFlag;
+import se.hyperver.hyperverse.world.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+final class HyperCommandUtil {
+
+ private final BukkitCommandManager bukkitCommandManager;
+ private final WorldManager worldManager;
+ private final GlobalWorldFlagContainer globalFlagContainer;
+
+
+ HyperCommandUtil(final WorldManager worldManager, final GlobalWorldFlagContainer
+ globalFlagContainer, final BukkitCommandManager bukkitCommandManager) {
+ this.bukkitCommandManager = bukkitCommandManager;
+ this.worldManager = Objects.requireNonNull(worldManager);
+ this.globalFlagContainer = Objects.requireNonNull(globalFlagContainer);
+
+ this.bukkitCommandManager.usePerIssuerLocale(true, true);
+ this.bukkitCommandManager.getLocales().addMessages(Locale.ENGLISH, Messages.getMessages());
+
+ setFormats();
+ registerCompletions();
+ registerAsyncCompletions();
+ registerContexts();
+ }
+
+
+ private void setFormats() {
+ this.bukkitCommandManager.setDefaultFormatter(new BukkitMessageFormatter(ChatColor.GRAY) {
+ @Override public String format(@NotNull final String message) {
+ return ChatColor.translateAlternateColorCodes('&', Messages.messagePrefix.toString())
+ + super.format(message);
+ }
+ });
+ this.bukkitCommandManager.setFormat(
+ MessageType.ERROR, new BukkitMessageFormatter(ChatColor.RED, ChatColor.GOLD, ChatColor.WHITE) {
+ @Override public String format(final String message) {
+ return ChatColor.translateAlternateColorCodes('&', Messages.messagePrefix.toString())
+ + ChatColor.RED + super.format(message);
+ }
+ });
+ this.bukkitCommandManager.setFormat(MessageType.SYNTAX, new BukkitMessageFormatter(ChatColor.GRAY, ChatColor.GOLD, ChatColor.WHITE) {
+ @Override public String format(final String message) {
+ return ChatColor.translateAlternateColorCodes('&', Messages.messagePrefix.toString())
+ + ChatColor.GRAY + super.format(message);
+ }
+ });
+ this.bukkitCommandManager.setFormat(MessageType.HELP, new BukkitMessageFormatter(ChatColor.GRAY, ChatColor.GOLD, ChatColor.WHITE) {
+ @Override public String format(final String message) {
+ return ChatColor.translateAlternateColorCodes('&', Messages.messagePrefix.toString())
+ + ChatColor.GRAY + super.format(message);
+ }
+ });
+ }
+
+ private void registerContexts() {
+ /*bukkitCommandManager.getCommandContexts().registerContext(Player[].class, context -> {
+ final List args = context.getArgs();
+ final Player[] arr = new Player[args.size()];
+ for (int index = 0; index < args.size(); index++) {
+ final Player player = Bukkit.getPlayer(args.get(index));
+ if (player == null) {
+ throw new InvalidCommandArgument(MessageUtil.format(Messages.messageNoPlayerFound.toString(), "%name%", args.get(index)));
+ }
+ arr[index] = player;
+ }
+ args.clear();
+ return arr;
+ });*/
+ bukkitCommandManager.getCommandContexts().registerContext(WorldType.class, context -> {
+ final String arg = context.popFirstArg();
+ return WorldType.fromString(arg).orElseThrow(() ->
+ new InvalidCommandArgument(Messages.messageInvalidWorldType.withoutColorCodes()));
+ });
+ bukkitCommandManager.getCommandContexts().registerContext(WorldFeatures.class, context -> {
+ final String arg = context.popFirstArg();
+ return WorldFeatures.fromName(arg).orElseThrow(() ->
+ new InvalidCommandArgument(Messages.messageInvalidWorldFeatures.withoutColorCodes()));
+ });
+ bukkitCommandManager.getCommandContexts().registerIssuerAwareContext(HyperWorld.class, context -> {
+ HyperWorld hyperWorld = worldManager.getWorld(context.getFirstArg());
+ if (hyperWorld == null) {
+ if (context.getPlayer() != null) {
+ hyperWorld = worldManager.getWorld(context.getPlayer().getWorld());
+ }
+ if (hyperWorld == null) {
+ throw new InvalidCommandArgument(Messages.messageNoSuchWorld.withoutColorCodes());
+ }
+ } else {
+ context.popFirstArg(); // remove the world argument as it's a valid world
+ }
+ return hyperWorld;
+ });
+ bukkitCommandManager.getCommandContexts().registerContext(GameRule.class, context ->
+ java.util.Optional.ofNullable(GameRule.getByName(context.popFirstArg()))
+ .orElseThrow(() -> new InvalidCommandArgument(Messages.messageInvalidGameRule.withoutColorCodes())));
+ bukkitCommandManager.getCommandContexts().registerContext(WorldFlag.class, context -> {
+ final WorldFlag, ?> flag = globalFlagContainer.getFlagFromString(context.popFirstArg().toLowerCase());
+ if (flag == null) {
+ throw new InvalidCommandArgument(Messages.messageFlagUnknown.withoutColorCodes());
+ }
+ return flag;
+ });
+ //noinspection deprecation
+ bukkitCommandManager.enableUnstableAPI("help");
+ }
+
+ private void registerCompletions() {
+ bukkitCommandManager.getCommandCompletions().registerCompletion("null", context ->
+ Collections.emptyList());
+ bukkitCommandManager.getCommandCompletions()
+ .registerAsyncCompletion("generators", context -> {
+ final String arg = context.getInput();
+ if (arg.contains(":")) {
+ return Collections.emptyList();
+ }
+ final List generators = new ArrayList<>();
+ generators.add("vanilla");
+ for (final Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
+ generators.add(plugin.getName().toLowerCase());
+ }
+ return generators;
+ });
+ bukkitCommandManager.getCommandCompletions().registerCompletion("profile_groups", context -> {
+ Stream groups = worldManager.getWorlds().stream().map(world -> world.getFlag(
+ ProfileGroupFlag.class)).filter(s -> !s.isEmpty());
+ String requirePerms = context.getConfig("has_perms", "false");
+ if (requirePerms.equalsIgnoreCase("true")) {
+ groups = groups.filter(profile -> context.getSender().hasPermission("hyperverse.teleportgroup." + profile));
+ }
+ return groups.collect(Collectors.toList());
+ });
+ bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("structures", context ->
+ Arrays.asList("yes", "true", "generate_structures", "structures", "no", "false", "no_structures"));
+ bukkitCommandManager.getCommandContexts().registerContext(WorldStructureSetting.class, context -> {
+ switch (context.popFirstArg().toLowerCase()) {
+ case "yes":
+ case "true":
+ case "generate_structures":
+ case "structures":
+ return WorldStructureSetting.GENERATE_STRUCTURES;
+ case "no":
+ case "false":
+ case "no_structures":
+ return WorldStructureSetting.NO_STRUCTURES;
+ default:
+ throw new InvalidCommandArgument(Messages.messageInvalidStructureSetting.withoutColorCodes());
+ }
+ });
+ bukkitCommandManager.getCommandCompletions()
+ .registerCompletion("vararg_players", context -> {
+ String[] input = context.getInput().split(" ");
+ final int toPop;
+ try {
+ toPop = Integer.parseInt(context.getConfig("pop"));
+ } catch (final NumberFormatException ex) {
+ ex.printStackTrace();
+ return Collections.emptyList();
+ }
+ if (toPop > input.length) {
+ throw new IllegalArgumentException(
+ "Config to pop is greater than input length!");
+ }
+ input = Arrays.copyOfRange(input, toPop, input.length - 1);
+ for (int index = 0; index < input.length; index++) {
+ input[index] = input[index].toLowerCase();
+ }
+ final List players = new ArrayList<>(Arrays.asList(input));
+ if (context.getPlayer() != null && !context.getConfig("self", "false")
+ .equalsIgnoreCase("true")) {
+ players.remove(context.getPlayer().getName());
+ }
+ return Bukkit.getOnlinePlayers().stream().map(Player::getName)
+ .filter(player -> !players.contains(player.toLowerCase()))
+ .sorted(Comparator.naturalOrder()).collect(Collectors.toList());
+
+ });
+ bukkitCommandManager.getCommandCompletions().registerCompletion("vararg_player_world", context -> {
+ String[] input = context.getInput().split(" ");
+ final int toPop;
+ try {
+ toPop = Integer.parseInt(context.getConfig("pop"));
+ } catch (final NumberFormatException ex) {
+ ex.printStackTrace();
+ return Collections.emptyList();
+ }
+ if (toPop > input.length) {
+ throw new IllegalArgumentException(
+ "Config to pop is greater than input length!");
+ }
+ final String inWorld = context.getConfig("in_world", "false");
+ final boolean checkInWorld = !inWorld.equalsIgnoreCase("false");
+ input = Arrays.copyOfRange(input, toPop, input.length - 1);
+ for (int index = 0; index < input.length; index++) {
+ input[index] = input[index].toLowerCase();
+ }
+ final List players = new ArrayList<>(Arrays.asList(input));
+ if (context.getPlayer() != null && !context.getConfig("self", "false")
+ .equalsIgnoreCase("true")) {
+ players.remove(context.getPlayer().getName());
+ }
+ Stream extends Player> stream = Bukkit.getOnlinePlayers().stream();
+ if (checkInWorld) {
+ final HyperWorld world = context.getContextValue(HyperWorld.class);
+ if (world == null) {
+ return Collections.emptyList();
+ }
+ stream = stream.filter(player -> player.getWorld() != world.getBukkitWorld());
+ }
+ return stream.map(Player::getName)
+ .filter(player -> !players.contains(player.toLowerCase()))
+ .sorted(Comparator.naturalOrder()).collect(Collectors.toList());
+ });
+ }
+
+ private void registerAsyncCompletions() {
+ this.bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("hyperworlds",
+ context -> worldManager.getWorlds().stream().filter(hyperWorld -> {
+ final String stateSel = context.getConfig("state", "").toLowerCase();
+ final String playerSel = context.getConfig("players", "").toLowerCase();
+ if (!hyperWorld.isLoaded()) {
+ return false;
+ }
+ assert hyperWorld.getBukkitWorld() != null;
+ boolean ret = true;
+ switch (stateSel) {
+ case "loaded":
+ ret = hyperWorld.isLoaded(); break;
+ case "not_loaded":
+ ret = !hyperWorld.isLoaded(); break;
+ default:
+ break;
+ }
+ switch (playerSel) {
+ case "no_players":
+ ret = ret && hyperWorld.getBukkitWorld().getPlayers().isEmpty(); break;
+ case "has_players":
+ ret = ret && !hyperWorld.getBukkitWorld().getPlayers().isEmpty(); break;
+ default:
+ break;
+ }
+ return ret;
+
+ }).map(HyperWorld::getConfiguration).map(WorldConfiguration::getName)
+ .filter(worldName -> {
+ final String selection = context.getConfig("player", "").toLowerCase();
+ final boolean inWorld = context.getIssuer().isPlayer() &&
+ worldName.equalsIgnoreCase(context.getPlayer().getWorld().getName());
+ switch (selection) {
+ case "not_in":
+ return !inWorld;
+ case "in":
+ return inWorld;
+ default:
+ return true;
+ }
+ }).collect(Collectors.toList()));
+ this.bukkitCommandManager.getCommandCompletions()
+ .registerAsyncCompletion("import-candidates", context -> {
+ final File baseDirectory = Bukkit.getWorldContainer();
+ try {
+ return Files.list(baseDirectory.toPath()).filter(path -> {
+ final File file = path.toFile();
+ return file.isDirectory() && new File(file, "level.dat").isFile()
+ && worldManager.getWorld(file.getName()) == null;
+ }).map(path -> path.toFile().getName()).sorted(Comparator.naturalOrder())
+ .collect(Collectors.toList());
+ } catch (IOException ex) {
+ return Collections.emptyList();
+ }
+ });
+ this.bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("worldtypes", context -> {
+ if (context.getInput().contains(" ")) {
+ return Collections.emptyList();
+ }
+ return Arrays.stream(WorldType.values()).map(WorldType::name).map(String::toLowerCase)
+ .collect(Collectors.toList());
+ });
+ this.bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("worldfeatures", context -> {
+ if (context.getInput().contains(" ")) {
+ return Collections.emptyList();
+ }
+ return Arrays.stream(WorldFeatures.values()).map(WorldFeatures::name).map(String::toLowerCase)
+ .collect(Collectors.toList());
+ });
+ this.bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("flags", context ->
+ globalFlagContainer.getFlagMap().values().stream().map(WorldFlag::getName).collect(
+ Collectors.toList()));
+ this.bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("gamerules", context ->
+ Arrays.stream(GameRule.values()).map(GameRule::getName).collect(Collectors.toList()));
+ this.bukkitCommandManager.getCommandCompletions().registerCompletion("flag", context -> {
+ final WorldFlag, ?> flag = context.getContextValue(WorldFlag.class);
+ if (flag != null) {
+ return flag.getTabCompletions();
+ }
+ return Collections.emptyList();
+ });
+ this.bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("gamerule", context -> {
+ final GameRule> gameRule = context.getContextValue(GameRule.class);
+ if (gameRule != null) {
+ if (gameRule.getType() == Boolean.class) {
+ return Arrays.asList("true", "false");
+ }
+ }
+ return Collections.emptyList();
+ });
+ }
+
+
+}
From f37acffde5ced24fbbd05042639a383b26033f6b Mon Sep 17 00:00:00 2001
From: Andrew Wong <42793301+md5sha256@users.noreply.github.com>
Date: Tue, 28 Jul 2020 17:20:50 +0200
Subject: [PATCH 2/3] Make HyperCommandUtil a static utility class
---
.../se/hyperver/hyperverse/Hyperverse.java | 4 +-
.../hyperverse/commands/HyperCommand.java | 2 +-
.../commands/HyperCommandManager.java | 1082 -----------------
.../hyperverse/commands/HyperCommandUtil.java | 75 +-
4 files changed, 44 insertions(+), 1119 deletions(-)
delete mode 100644 Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommandManager.java
diff --git a/Core/src/main/java/se/hyperver/hyperverse/Hyperverse.java b/Core/src/main/java/se/hyperver/hyperverse/Hyperverse.java
index 9382a844..cfb05ee7 100644
--- a/Core/src/main/java/se/hyperver/hyperverse/Hyperverse.java
+++ b/Core/src/main/java/se/hyperver/hyperverse/Hyperverse.java
@@ -38,7 +38,7 @@
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import se.hyperver.hyperverse.commands.HyperCommandManager;
+import se.hyperver.hyperverse.commands.HyperCommand;
import se.hyperver.hyperverse.configuration.FileHyperConfiguration;
import se.hyperver.hyperverse.configuration.HyperConfiguration;
import se.hyperver.hyperverse.configuration.Messages;
@@ -195,7 +195,7 @@ public static HyperverseAPI getApi() {
// Create the command manager instance
try {
- injector.getInstance(HyperCommandManager.class);
+ injector.getInstance(HyperCommand.class);
} catch (final Exception e) {
e.printStackTrace();
}
diff --git a/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommand.java b/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommand.java
index eccb5b90..c40e71ff 100644
--- a/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommand.java
+++ b/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommand.java
@@ -84,7 +84,7 @@ public class HyperCommand extends BaseCommand {
// Create the command manager
BukkitCommandManager bukkitCommandManager = new PaperCommandManager(hyperverse);
- new HyperCommandUtil(worldManager, globalFlagContainer, bukkitCommandManager);
+ HyperCommandUtil.setupCommandManager(bukkitCommandManager, worldManager, globalFlagContainer);
bukkitCommandManager.registerCommand(this);
}
diff --git a/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommandManager.java b/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommandManager.java
deleted file mode 100644
index 55899563..00000000
--- a/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommandManager.java
+++ /dev/null
@@ -1,1082 +0,0 @@
-//
-// Hyperverse - A Minecraft world management plugin
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
-//
-
-package se.hyperver.hyperverse.commands;
-
-import co.aikar.commands.*;
-import co.aikar.commands.annotation.Optional;
-import co.aikar.commands.annotation.*;
-import co.aikar.taskchain.TaskChainFactory;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
-import com.google.inject.Inject;
-import me.minidigger.minimessage.bungee.MiniMessageParser;
-import org.apache.commons.lang.StringUtils;
-import org.bukkit.*;
-import org.bukkit.command.CommandException;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.Player;
-import org.bukkit.plugin.Plugin;
-import org.bukkit.plugin.PluginDescriptionFile;
-import org.jetbrains.annotations.NotNull;
-import se.hyperver.hyperverse.Hyperverse;
-import se.hyperver.hyperverse.configuration.FileHyperConfiguration;
-import se.hyperver.hyperverse.configuration.Message;
-import se.hyperver.hyperverse.configuration.Messages;
-import se.hyperver.hyperverse.database.PersistentLocation;
-import se.hyperver.hyperverse.exception.HyperWorldValidationException;
-import se.hyperver.hyperverse.flags.FlagParseException;
-import se.hyperver.hyperverse.flags.GlobalWorldFlagContainer;
-import se.hyperver.hyperverse.flags.WorldFlag;
-import se.hyperver.hyperverse.flags.implementation.EndFlag;
-import se.hyperver.hyperverse.flags.implementation.NetherFlag;
-import se.hyperver.hyperverse.flags.implementation.ProfileGroupFlag;
-import se.hyperver.hyperverse.modules.HyperWorldFactory;
-import se.hyperver.hyperverse.util.*;
-import se.hyperver.hyperverse.world.WorldType;
-import se.hyperver.hyperverse.world.*;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.management.ManagementFactory;
-import java.lang.management.RuntimeMXBean;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.text.DecimalFormat;
-import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-@CommandAlias("hyperverse|hv|worlds|world")
-@CommandPermission("hyperverse.worlds")
-@SuppressWarnings("unused")
-public class HyperCommandManager extends BaseCommand {
-
- private final BukkitCommandManager bukkitCommandManager;
- private final WorldManager worldManager;
- private final FileHyperConfiguration fileHyperConfiguration;
- private final HyperWorldFactory hyperWorldFactory;
- private final GlobalWorldFlagContainer globalFlagContainer;
- private final TaskChainFactory taskChainFactory;
-
- @Inject public HyperCommandManager(final Hyperverse hyperverse, final WorldManager worldManager,
- final HyperWorldFactory hyperWorldFactory, final GlobalWorldFlagContainer globalFlagContainer,
- final TaskChainFactory taskChainFactory, final FileHyperConfiguration hyperConfiguration) {
- this.worldManager = Objects.requireNonNull(worldManager);
- this.hyperWorldFactory = Objects.requireNonNull(hyperWorldFactory);
- this.globalFlagContainer = Objects.requireNonNull(globalFlagContainer);
- this.taskChainFactory = Objects.requireNonNull(taskChainFactory);
- this.fileHyperConfiguration = Objects.requireNonNull(hyperConfiguration);
-
- // Create the command manager
- bukkitCommandManager = new PaperCommandManager(hyperverse);
- bukkitCommandManager.usePerIssuerLocale(true, true);
- bukkitCommandManager.getLocales().addMessages(Locale.ENGLISH, Messages.getMessages());
- bukkitCommandManager.setDefaultFormatter(new BukkitMessageFormatter(ChatColor.GRAY) {
- @Override public String format(@NotNull final String message) {
- return ChatColor.translateAlternateColorCodes('&', Messages.messagePrefix.toString())
- + super.format(message);
- }
- });
- bukkitCommandManager.setFormat(MessageType.ERROR, new BukkitMessageFormatter(ChatColor.RED, ChatColor.GOLD, ChatColor.WHITE) {
- @Override public String format(final String message) {
- return ChatColor.translateAlternateColorCodes('&', Messages.messagePrefix.toString())
- + ChatColor.RED + super.format(message);
- }
- });
- bukkitCommandManager.setFormat(MessageType.SYNTAX, new BukkitMessageFormatter(ChatColor.GRAY, ChatColor.GOLD, ChatColor.WHITE) {
- @Override public String format(final String message) {
- return ChatColor.translateAlternateColorCodes('&', Messages.messagePrefix.toString())
- + ChatColor.GRAY + super.format(message);
- }
- });
- bukkitCommandManager.setFormat(MessageType.HELP, new BukkitMessageFormatter(ChatColor.GRAY, ChatColor.GOLD, ChatColor.WHITE) {
- @Override public String format(final String message) {
- return ChatColor.translateAlternateColorCodes('&', Messages.messagePrefix.toString())
- + ChatColor.GRAY + super.format(message);
- }
- });
- bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("hyperworlds",
- context -> worldManager.getWorlds().stream().filter(hyperWorld -> {
- final String stateSel = context.getConfig("state", "").toLowerCase();
- final String playerSel = context.getConfig("players", "").toLowerCase();
- if (!hyperWorld.isLoaded()) {
- return false;
- }
- assert hyperWorld.getBukkitWorld() != null;
- boolean ret = true;
- switch (stateSel) {
- case "loaded":
- ret = hyperWorld.isLoaded(); break;
- case "not_loaded":
- ret = !hyperWorld.isLoaded(); break;
- default:
- break;
- }
- switch (playerSel) {
- case "no_players":
- ret = ret && hyperWorld.getBukkitWorld().getPlayers().isEmpty(); break;
- case "has_players":
- ret = ret && !hyperWorld.getBukkitWorld().getPlayers().isEmpty(); break;
- default:
- break;
- }
- return ret;
-
- }).map(HyperWorld::getConfiguration).map(WorldConfiguration::getName)
- .filter(worldName -> {
- final String selection = context.getConfig("player", "").toLowerCase();
- final boolean inWorld = context.getIssuer().isPlayer() &&
- worldName.equalsIgnoreCase(context.getPlayer().getWorld().getName());
- switch (selection) {
- case "not_in":
- return !inWorld;
- case "in":
- return inWorld;
- default:
- return true;
- }
- }).collect(Collectors.toList()));
- bukkitCommandManager.getCommandCompletions()
- .registerAsyncCompletion("import-candidates", context -> {
- final File baseDirectory = Bukkit.getWorldContainer();
- try {
- return Files.list(baseDirectory.toPath()).filter(path -> {
- final File file = path.toFile();
- return file.isDirectory() && new File(file, "level.dat").isFile()
- && this.worldManager.getWorld(file.getName()) == null;
- }).map(path -> path.toFile().getName()).sorted(Comparator.naturalOrder())
- .collect(Collectors.toList());
- } catch (IOException ex) {
- return Collections.emptyList();
- }
- });
- bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("worldtypes", context -> {
- if (context.getInput().contains(" ")) {
- return Collections.emptyList();
- }
- return Arrays.stream(WorldType.values()).map(WorldType::name).map(String::toLowerCase)
- .collect(Collectors.toList());
- });
- bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("worldfeatures", context -> {
- if (context.getInput().contains(" ")) {
- return Collections.emptyList();
- }
- return Arrays.stream(WorldFeatures.values()).map(WorldFeatures::name).map(String::toLowerCase)
- .collect(Collectors.toList());
- });
- bukkitCommandManager.getCommandCompletions().registerCompletion("null", context ->
- Collections.emptyList());
- bukkitCommandManager.getCommandCompletions()
- .registerAsyncCompletion("generators", context -> {
- final String arg = context.getInput();
- if (arg.contains(":")) {
- return Collections.emptyList();
- }
- final List generators = new ArrayList<>();
- generators.add("vanilla");
- for (final Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
- generators.add(plugin.getName().toLowerCase());
- }
- return generators;
- });
- bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("flags", context ->
- globalFlagContainer.getFlagMap().values().stream().map(WorldFlag::getName).collect(
- Collectors.toList()));
- bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("gamerules", context ->
- Arrays.stream(GameRule.values()).map(GameRule::getName).collect(Collectors.toList()));
- bukkitCommandManager.getCommandCompletions().registerCompletion("flag", context -> {
- final WorldFlag, ?> flag = context.getContextValue(WorldFlag.class);
- if (flag != null) {
- return flag.getTabCompletions();
- }
- return Collections.emptyList();
- });
- bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("gamerule", context -> {
- final GameRule> gameRule = context.getContextValue(GameRule.class);
- if (gameRule != null) {
- if (gameRule.getType() == Boolean.class) {
- return Arrays.asList("true", "false");
- }
- }
- return Collections.emptyList();
- });
- bukkitCommandManager.getCommandCompletions().registerCompletion("profile_groups", context -> {
- Stream groups = worldManager.getWorlds().stream().map(world -> world.getFlag(ProfileGroupFlag.class)).filter(s -> !s.isEmpty());
- String requirePerms = context.getConfig("has_perms", "false");
- if (requirePerms.equalsIgnoreCase("true")) {
- groups = groups.filter(profile -> context.getSender().hasPermission("hyperverse.teleportgroup." + profile));
- }
- return groups.collect(Collectors.toList());
- });
- bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("structures", context ->
- Arrays.asList("yes", "true", "generate_structures", "structures", "no", "false", "no_structures"));
- bukkitCommandManager.getCommandContexts().registerContext(WorldStructureSetting.class, context -> {
- switch (context.popFirstArg().toLowerCase()) {
- case "yes":
- case "true":
- case "generate_structures":
- case "structures":
- return WorldStructureSetting.GENERATE_STRUCTURES;
- case "no":
- case "false":
- case "no_structures":
- return WorldStructureSetting.NO_STRUCTURES;
- default:
- throw new InvalidCommandArgument(Messages.messageInvalidStructureSetting.withoutColorCodes());
- }
- });
- bukkitCommandManager.getCommandCompletions()
- .registerCompletion("vararg_players", context -> {
- String[] input = context.getInput().split(" ");
- final int toPop;
- try {
- toPop = Integer.parseInt(context.getConfig("pop"));
- } catch (final NumberFormatException ex) {
- ex.printStackTrace();
- return Collections.emptyList();
- }
- if (toPop > input.length) {
- throw new IllegalArgumentException(
- "Config to pop is greater than input length!");
- }
- input = Arrays.copyOfRange(input, toPop, input.length - 1);
- for (int index = 0; index < input.length; index++) {
- input[index] = input[index].toLowerCase();
- }
- final List players = new ArrayList<>(Arrays.asList(input));
- if (context.getPlayer() != null && !context.getConfig("self", "false")
- .equalsIgnoreCase("true")) {
- players.remove(context.getPlayer().getName());
- }
- return Bukkit.getOnlinePlayers().stream().map(Player::getName)
- .filter(player -> !players.contains(player.toLowerCase()))
- .sorted(Comparator.naturalOrder()).collect(Collectors.toList());
-
- });
- bukkitCommandManager.getCommandCompletions().registerCompletion("vararg_player_world", context -> {
- String[] input = context.getInput().split(" ");
- final int toPop;
- try {
- toPop = Integer.parseInt(context.getConfig("pop"));
- } catch (final NumberFormatException ex) {
- ex.printStackTrace();
- return Collections.emptyList();
- }
- if (toPop > input.length) {
- throw new IllegalArgumentException(
- "Config to pop is greater than input length!");
- }
- final String inWorld = context.getConfig("in_world", "false");
- final boolean checkInWorld = !inWorld.equalsIgnoreCase("false");
- input = Arrays.copyOfRange(input, toPop, input.length - 1);
- for (int index = 0; index < input.length; index++) {
- input[index] = input[index].toLowerCase();
- }
- final List players = new ArrayList<>(Arrays.asList(input));
- if (context.getPlayer() != null && !context.getConfig("self", "false")
- .equalsIgnoreCase("true")) {
- players.remove(context.getPlayer().getName());
- }
- Stream extends Player> stream = Bukkit.getOnlinePlayers().stream();
- if (checkInWorld) {
- final HyperWorld world = context.getContextValue(HyperWorld.class);
- if (world == null) {
- return Collections.emptyList();
- }
- stream = stream.filter(player -> player.getWorld() != world.getBukkitWorld());
- }
- return stream.map(Player::getName)
- .filter(player -> !players.contains(player.toLowerCase()))
- .sorted(Comparator.naturalOrder()).collect(Collectors.toList());
- });
- /*bukkitCommandManager.getCommandContexts().registerContext(Player[].class, context -> {
- final List args = context.getArgs();
- final Player[] arr = new Player[args.size()];
- for (int index = 0; index < args.size(); index++) {
- final Player player = Bukkit.getPlayer(args.get(index));
- if (player == null) {
- throw new InvalidCommandArgument(MessageUtil.format(Messages.messageNoPlayerFound.toString(), "%name%", args.get(index)));
- }
- arr[index] = player;
- }
- args.clear();
- return arr;
- });*/
- bukkitCommandManager.getCommandContexts().registerContext(WorldType.class, context -> {
- final String arg = context.popFirstArg();
- return WorldType.fromString(arg).orElseThrow(() ->
- new InvalidCommandArgument(Messages.messageInvalidWorldType.withoutColorCodes()));
- });
- bukkitCommandManager.getCommandContexts().registerContext(WorldFeatures.class, context -> {
- final String arg = context.popFirstArg();
- return WorldFeatures.fromName(arg).orElseThrow(() ->
- new InvalidCommandArgument(Messages.messageInvalidWorldFeatures.withoutColorCodes()));
- });
- bukkitCommandManager.getCommandContexts().registerIssuerAwareContext(HyperWorld.class, context -> {
- HyperWorld hyperWorld = worldManager.getWorld(context.getFirstArg());
- if (hyperWorld == null) {
- if (context.getPlayer() != null) {
- hyperWorld = worldManager.getWorld(context.getPlayer().getWorld());
- }
- if (hyperWorld == null) {
- throw new InvalidCommandArgument(Messages.messageNoSuchWorld.withoutColorCodes());
- }
- } else {
- context.popFirstArg(); // remove the world argument as it's a valid world
- }
- return hyperWorld;
- });
- bukkitCommandManager.getCommandContexts().registerContext(GameRule.class, context ->
- java.util.Optional.ofNullable(GameRule.getByName(context.popFirstArg()))
- .orElseThrow(() -> new InvalidCommandArgument(Messages.messageInvalidGameRule.withoutColorCodes())));
- bukkitCommandManager.getCommandContexts().registerContext(WorldFlag.class, context -> {
- final WorldFlag, ?> flag = this.globalFlagContainer.getFlagFromString(context.popFirstArg().toLowerCase());
- if (flag == null) {
- throw new InvalidCommandArgument(Messages.messageFlagUnknown.withoutColorCodes());
- }
- return flag;
- });
- //noinspection deprecation
- bukkitCommandManager.enableUnstableAPI("help");
- bukkitCommandManager.registerCommand(this);
- }
-
- @HelpCommand public void doHelp(final CommandSender sender, final CommandHelp commandHelp) {
- commandHelp.showHelp();
- }
-
- @Category("Management")
- @Subcommand("create") @Syntax(" [generator: plugin name, vanilla][:[args]] [type: overworld, nether, end] [seed] [generate-structures: true, false] [features: normal, flatland, amplified, bucket] [settings...]")
- @CommandPermission("hyperverse.create") @Description("{@@command.create}")
- @CommandCompletion("@null @generators @worldtypes @null @structures @worldfeatures @null")
- public void createWorld(final CommandSender sender, final String world, String generator,
- @Default("overworld") final WorldType type, @Optional final Long specifiedSeed,
- @Default("true") final WorldStructureSetting generateStructures, @Default("normal") final WorldFeatures features,
- @Default final String settings) {
- final long seed = specifiedSeed == null ? SeedUtil.randomSeed() : specifiedSeed;
- // Check if the name already exists
- for (final HyperWorld hyperWorld : this.worldManager.getWorlds()) {
- if (hyperWorld.getConfiguration().getName().equalsIgnoreCase(world)) {
- MessageUtil.sendMessage(sender, Messages.messageWorldExists);
- return;
- }
- }
- // Double check that Bukkit doesn't have the world stored
- if (Bukkit.getWorld(world) != null) {
- MessageUtil.sendMessage(sender, Messages.messageWorldExists);
- return;
- }
- // Now validate the world name
- if (!WorldUtil.validateName(world)) {
- MessageUtil.sendMessage(sender, Messages.messageWorldNameInvalid);
- return;
- }
-
- String generatorArgs = "";
- if (generator.contains(":")) {
- final String[] split = generator.split(":");
- generator = split[0];
- generatorArgs = split[1];
- }
-
- // Check if the generator is actually valid
- final WorldConfiguration worldConfiguration =
- WorldConfiguration.builder().setName(world).setGenerator(generator).setType(type).setSeed(seed)
- .setGenerateStructures(generateStructures).setSettings(settings).setWorldFeatures(features)
- .setGeneratorArg(generatorArgs).createWorldConfiguration();
- final HyperWorld hyperWorld =
- hyperWorldFactory.create(UUID.randomUUID(), worldConfiguration);
- MessageUtil.sendMessage(sender, Messages.messageWorldCreationStarted);
- hyperWorld.sendWorldInfo(sender);
-
- // Make sure we don't detect the world load
- this.worldManager.ignoreWorld(world);
-
- try {
- hyperWorld.createBukkitWorld();
- // Register the world
- this.worldManager.addWorld(hyperWorld);
- MessageUtil.sendMessage(sender, Messages.messageWorldCreationFinished);
- if (sender instanceof Player) {
- // Attempt to teleport them to the world
- hyperWorld.teleportPlayer((Player) sender);
- }
- } catch (final HyperWorldValidationException validationException) {
- switch (validationException.getValidationResult()) {
- case UNKNOWN_GENERATOR:
- MessageUtil.sendMessage(sender, Messages.messageGeneratorInvalid,
- "%world%", hyperWorld.getConfiguration().getName(),
- "%generator%", hyperWorld.getConfiguration().getGenerator());
- break;
- case SUCCESS:
- break;
- default:
- MessageUtil.sendMessage(sender, Messages.messageCreationUnknownFailure);
- break;
- }
- } catch (final Exception e) {
- MessageUtil.sendMessage(sender, Messages.messageWorldCreationFailed,
- "%reason%", e.getMessage());
- }
- }
-
- @Category("Management") @Subcommand("import") @CommandPermission("hyperverse.import")
- @CommandAlias("hvimport") @CommandCompletion("@import-candidates @generators @worldtypes") @Description("{@@command.import}")
- public void importWorld(final CommandSender sender, final String worldName, final String generator, @Default("over_world") final WorldType worldType) {
- if (worldManager.getWorld(worldName) != null) {
- MessageUtil.sendMessage(sender, Messages.messageWorldAlreadyImported);
- return;
- }
- if (!WorldUtil.isSuitableImportCandidate(worldName, worldManager)) {
- MessageUtil.sendMessage(sender, Messages.messageNoSuchWorld);
- return;
- }
- worldManager.ignoreWorld(worldName); //Make sure we don't auto register on init
- final HyperWorld hyperWorld = hyperWorldFactory.create(UUID.randomUUID(),
- new WorldConfigurationBuilder().setName(worldName).setGenerator(generator)
- .setType(worldType).createWorldConfiguration());
- final World bukkitWorld;
- try {
- hyperWorld.createBukkitWorld();
- bukkitWorld = hyperWorld.getBukkitWorld();
- assert bukkitWorld != null;
- } catch (HyperWorldValidationException e) {
- MessageUtil.sendMessage(sender, Messages.messageWorldImportFailure, "%world%", worldName,
- "%result%", e.getMessage());
- return;
- }
- worldManager.addWorld(hyperWorld);
- MessageUtil.sendMessage(sender, Messages.messageWorldImportFinished);
- if (sender instanceof Player) {
- //Schedule teleport 1-tick later so the world has a chance to load.
- Bukkit.getScheduler().runTaskLater(Hyperverse.getPlugin(Hyperverse.class),
- () -> doTeleport((Player) sender, worldManager.getWorld(bukkitWorld)), 1L);
- }
- }
-
- @Category("Informational") @Subcommand("list|l|worlds") @CommandPermission("hyperverse.list")
- @CommandAlias("hvl") @Description("{@@command.list}") public void doList(final CommandSender sender) {
- MessageUtil.sendMessage(sender, Messages.messageListHeader);
- Stream stream = this.worldManager.getWorlds().stream().sorted(Comparator.comparing(world -> world.getConfiguration().getName()));
- if (sender instanceof Entity) {
- stream = stream.sorted(Comparator
- .comparing(world -> !((Entity) sender).getWorld().equals(world.getBukkitWorld())));
- }
- stream.forEachOrdered(hyperWorld -> {
- final WorldConfiguration configuration = hyperWorld.getConfiguration();
-
- // Format the generator name a little better
- String generator = configuration.getGenerator();
- if (generator.isEmpty()) {
- generator = "vanilla";
- } else {
- generator = generator.toLowerCase();
- }
-
- final String loadStatus;
- if (hyperWorld.isLoaded()) {
- loadStatus = "Click to unload\">loaded";
- } else {
- loadStatus = "Click to load\">unloaded";
- }
-
- final Message message;
- if (sender instanceof Entity && ((Entity) sender).getWorld() == hyperWorld.getBukkitWorld()) {
- message = Messages.messageListEntryCurrentWorld;
- } else {
- message = Messages.messageListEntry;
- }
-
- MessageUtil.sendMessage(sender, message, "%name%", configuration.getName(),
- "%display-name%", hyperWorld.getDisplayName(), "%generator%", generator, "%type%",
- configuration.getType().name(), "%load_status%", loadStatus);
- });
- }
-
- @Category("Misc") @Subcommand("teleport|tp") @CommandAlias("hvtp") @CommandPermission("hyperverse.teleport")
- @CommandCompletion("@hyperworlds:player=not_in,state=loaded") @Description("{@@command.teleport}")
- public void doTeleport(final Player player, final HyperWorld world) {
- if (world == null) {
- MessageUtil.sendMessage(player, Messages.messageNoSuchWorld);
- return;
- }
- if (!world.isLoaded()) {
- MessageUtil.sendMessage(player, Messages.messageWorldNotLoaded);
- return;
- }
- if (world.getBukkitWorld() == player.getWorld()) {
- MessageUtil.sendMessage(player, Messages.messageAlreadyInWorld);
- return;
- }
- MessageUtil.sendMessage(player, Messages.messageTeleporting, "%world%", world.getDisplayName());
- world.teleportPlayer(player);
- }
-
- @Category("Misc") @Subcommand("teleport|tp") @CommandAlias("hvtp") @CommandPermission("hyperverse.teleport")
- @CommandCompletion("@hyperworlds:state=loaded @vararg_player_world:pop=0,in_world=true")
- public void doMassTeleport(final CommandSender sender, final HyperWorld world, String[] players) {
- if (players.length == 0) {
- if (sender instanceof Player) {
- doTeleport((Player) sender, world);
- } else {
- MessageUtil.sendMessage(sender, Messages.messageSpecifyPlayer);
- }
- return;
- }
- if (world == null) {
- MessageUtil.sendMessage(sender, Messages.messageNoSuchWorld);
- return;
- }
- if (!world.isLoaded()) {
- MessageUtil.sendMessage(sender, Messages.messageWorldNotLoaded);
- return;
- }
- final List playerList = new ArrayList<>(players.length);
- for (final String rawPlayer : players) {
- final Player player = Bukkit.getPlayer(rawPlayer);
- if (player == null) {
- MessageUtil.sendMessage(sender, Messages.messageNoPlayerFound, "%name%", rawPlayer);
- return;
- }
- if (!playerList.contains(player)) {
- playerList.add(player);
- }
- }
- for (final Player player : playerList) {
- if (world.getBukkitWorld() == player.getWorld()) {
- MessageUtil.sendMessage(sender, Messages.messagePlayerAlreadyInWorld, "%player%",
- player.getName());
- continue;
- }
- MessageUtil.sendMessage(player, Messages.messageTeleporting, "%world%", world.getDisplayName());
- if (player != sender) {
- MessageUtil.sendMessage(sender, Messages.messageTeleportingPlayer, "%player%",
- player.getName(), "%world%", world.getDisplayName());
- }
- world.teleportPlayer(player);
- }
- }
-
- @Category("Misc") @Subcommand("teleportgroup|tpgroup") @CommandAlias("hvtpgroup")
- @CommandPermission("hyperverse.teleportgroup")
- @CommandCompletion("@profile_groups:has_perms=true") @Description("{@command.teleportgroup}")
- public void doGroupedTeleport(final Player sender, final String profileGroup) {
- final CompletableFuture> future =
- (CompletableFuture>) Hyperverse
- .getPlugin(Hyperverse.class).getDatabase().getLocations(sender.getUniqueId());
-
- future.thenAccept(persistentLocations -> {
- final java.util.Optional optional =
- persistentLocations.stream().filter(persistentLocation -> {
- final HyperWorld hyperWorld =
- worldManager.getWorld(persistentLocation.getWorld());
- if (hyperWorld == null) {
- return false;
- }
- return hyperWorld.getFlag(ProfileGroupFlag.class)
- .equalsIgnoreCase(profileGroup);
- }).min(Comparator.comparingInt(PersistentLocation::getId)); //Lowest number is most recent?
-
- if (!optional.isPresent()) {
- MessageUtil.sendMessage(sender, Messages.messageInvalidProfileGroup);
- return;
- }
- final PersistentLocation location = optional.get();
- final HyperWorld hyperWorld = worldManager.getWorld(location.getWorld());
- assert hyperWorld != null;
- doTeleport(sender, hyperWorld);
- });
- }
-
- @Category("Informational") @Subcommand("info|i") @CommandAlias("hvi")
- @CommandPermission("hyperverse.info") @CommandCompletion("@hyperworlds") @Description("View world info")
- public void doInfo(final CommandSender sender, final HyperWorld world) {
- if (world == null) {
- return;
- }
- MessageUtil.sendMessage(sender, Messages.messageInfoHeader);
- world.sendWorldInfo(sender);
- }
-
- @Category("Management") @Subcommand("unload") @CommandPermission("hyperverse.unload")
- @CommandCompletion("@hyperworlds:state=loaded") @Description("{@@command.unload}")
- public void doUnload(final CommandSender sender, final HyperWorld world) {
- if (world == null) {
- return;
- }
- if (!world.isLoaded()) {
- MessageUtil.sendMessage(sender, Messages.messageWorldNotLoaded);
- return;
- }
- final HyperWorld.WorldUnloadResult worldUnloadResult = world.unloadWorld();
- if (worldUnloadResult == HyperWorld.WorldUnloadResult.SUCCESS) {
- MessageUtil.sendMessage(sender, Messages.messageWorldUnloaded);
- } else {
- MessageUtil.sendMessage(sender, Messages.messageWorldUnloadFailed,
- "%reason%", worldUnloadResult.getDescription());
- }
- }
-
- @Category("Management") @Subcommand("load") @CommandPermission("hyperverse.load")
- @CommandCompletion("@hyperworlds:state=unloaded") @Description("{@@command.load}")
- public void doLoad(final CommandSender sender, final HyperWorld world) {
- if (world == null) {
- MessageUtil.sendMessage(sender, Messages.messageNoSuchWorld);
- return;
- }
- if (world.isLoaded()) {
- MessageUtil.sendMessage(sender, Messages.messageWorldAlreadyLoaded);
- return;
- }
- try {
- world.createBukkitWorld();
- } catch (final HyperWorldValidationException e) {
- MessageUtil.sendMessage(sender, Messages.messageWorldImportFailure,
- "%world%", world.getConfiguration().getName(), "%result%", e.getMessage());
- return;
- }
-
- world.getConfiguration().setLoaded(true);
- world.saveConfiguration();
-
- MessageUtil.sendMessage(sender, Messages.messageWorldLoadedSuccessfully);
- }
-
- @Category("Misc") @Subcommand("find|where") @CommandPermission("hyperverse.find") @CommandAlias("hvf|hvfind")
- @CommandCompletion("@players") @Description("{@@command.find}")
- //public void findPlayer(final CommandSender sender, final String... players) {
- public void findPlayer(final CommandSender sender, final String player) {
- //for (String player : players) {
- final Player bukkitPlayer = Bukkit.getPlayer(player);
- if (bukkitPlayer == null) {
- MessageUtil.sendMessage(sender, Messages.messageNoPlayerFound, "%name%", player);
- return;
- }
- final Location location = bukkitPlayer.getLocation();
- final DecimalFormat format = Messages.miscCoordinateDecimalFormat;
- MessageUtil
- .sendMessage(sender, Messages.messagePlayerCurrentWorld, "%player%", player, "%world%",
- bukkitPlayer.getWorld().getName(), "%x%",
- format.format(location.getX()), "%y%", format.format(location.getY()),
- "%z%", format.format(location.getZ()));
- //}
- }
-
- @Category("Misc") @Subcommand("who") @CommandPermission("hyperverse.who") @CommandAlias("hvwho")
- @CommandCompletion("@hyperworlds") @Description("{@@command.who}")
- public void findPlayersPresent(final CommandSender sender, @Optional final String world) {
- if (world != null) {
- final World bukkitWorld = Bukkit.getWorld(world);
- if (bukkitWorld == null) {
- MessageUtil.sendMessage(sender, Messages.messageNoSuchWorld);
- return;
- }
- final HyperWorld hyperWorld = this.worldManager.getWorld(bukkitWorld);
- if (hyperWorld == null) {
- MessageUtil.sendMessage(sender, Messages.messageNoSuchWorld);
- return;
- }
- final DecimalFormat format = Messages.miscCoordinateDecimalFormat;
- if (bukkitWorld.getPlayers().isEmpty()) {
- MessageUtil.sendMessage(sender, Messages.messageNoPlayersInWorld, "%world%", hyperWorld.getDisplayName());
- return;
- }
- final StringJoiner players = new StringJoiner(", ");
- for (final Player player : bukkitWorld.getPlayers()) {
- final Location location = player.getLocation();
- players.add(MessageUtil
- .format(Messages.messageListEntryPlayer.toString(), "%player%",
- ChatColor.stripColor(player.getDisplayName()), "%world%", world, "%x%",
- format.format(location.getX()), "%y%", format.format(location.getY()),
- "%z%", format.format(location.getZ())));
- }
- MessageUtil.sendMessage(sender, Messages.messageListEntryWorld, "%players%",
- players.toString().trim(), "%world%", hyperWorld.getDisplayName());
- }
- else {
- for (final World bukkitWorld : Bukkit.getWorlds()) {
- findPlayersPresent(sender, bukkitWorld.getName());
- }
- }
- }
-
- @Category("Management") @Subcommand("flag set") @CommandPermission("hyperverse.flag.set")
- @CommandCompletion("@hyperworlds @flags @flag") @Description("{@@command.flag.set}")
- public void doFlagSet(final CommandSender sender, final HyperWorld hyperWorld,
- final WorldFlag, ?> flag, final String value) {
- try {
- hyperWorld.setFlag(flag, value);
- } catch (final FlagParseException e) {
- MessageUtil.sendMessage(sender, Messages.messageFlagParseError, "%flag%", e.getFlag().getName(), "%value%", e.getValue(), "%reason%", e.getErrorMessage());
- return;
- }
- MessageUtil.sendMessage(sender, Messages.messageFlagSet);
- }
-
- @Category("Management") @Subcommand("flag reset") @CommandPermission("hyperverse.flag.set") @CommandCompletion("@flags|@hyperworlds @flags") @SuppressWarnings("unchecked")
- public void doFlagReset(final CommandSender sender, final HyperWorld hyperWorld, final WorldFlag,?> flag) {
- final WorldFlag, ?> toSet;
- if (flag.getClass() == EndFlag.class) {
- final World bukkitWorld = hyperWorld.getBukkitWorld();
- if (bukkitWorld == null) {
- toSet = globalFlagContainer.getFlag(flag.getClass());
- } else {
- WorldFlag, ?> temp;
- try {
- temp = EndFlag.END_FLAG_DEFAULT.parse(bukkitWorld.getName() + "_the_end");
- } catch (FlagParseException ignored) {
- temp = globalFlagContainer.getFlag(flag.getClass());
- }
- toSet = temp;
- }
- } else if (flag.getClass() == NetherFlag.class) {
- final World bukkitWorld = hyperWorld.getBukkitWorld();
- if (bukkitWorld == null) {
- toSet = globalFlagContainer.getFlag(flag.getClass());
- } else {
- WorldFlag, ?> temp;
- try {
- temp = NetherFlag.NETHER_FLAG_DEFAULT.parse(bukkitWorld.getName() + "_nether");
- } catch (FlagParseException ignored) {
- temp = globalFlagContainer.getFlag(flag.getClass());
- }
- toSet = temp;
- }
- } else {
- toSet = globalFlagContainer.getFlag(flag.getClass());
- }
- hyperWorld.setFlagInstance(toSet);
- MessageUtil.sendMessage(sender, Messages.messageFlagSet);
- }
-
- @Category("Management") @Subcommand("flag remove") @CommandPermission("hyperverse.flag.set")
- @CommandCompletion("@hyperworlds @flags") @Description("{@@command.flag.remove}")
- public void doFlagRemove(final CommandSender sender, final HyperWorld hyperWorld, final WorldFlag, ?> flag) {
- hyperWorld.removeFlag(flag);
- MessageUtil.sendMessage(sender, Messages.messageFlagRemoved);
- }
-
- @Category("Management") @Subcommand("flag info") @CommandPermission("hyperverse.flag.info") @CommandCompletion("@flags|@hyperworlds @flags") @SuppressWarnings("unchecked")
- public void showFlagStatus(final CommandSender sender, final HyperWorld hyperWorld, final WorldFlag flag) {
- final String value = String.valueOf(hyperWorld.getFlag((Class extends WorldFlag>) flag.getClass())), defaultValue;
- defaultValue = String.valueOf((globalFlagContainer.getFlag(flag.getClass()).getValue()));
- MessageUtil.sendMessage(sender, Messages.messageFlagDisplayInfo, "%description%", flag.getFlagDescription().toString(), "%current%", value.isEmpty() ? "Unset" : value, "%default%", defaultValue.isEmpty() ? "Unset" : defaultValue);
- }
-
- @Category("Management") @Subcommand("gamerule set") @CommandPermission("hyperverse.gamerule.set")
- @CommandCompletion("@hyperworlds @gamerules @gamerule") @Description("{@@command.gamerule.set}")
- public void doGameRuleSet(final CommandSender sender, final HyperWorld hyperWorld,
- final GameRule gameRule, final String value) {
- if (!hyperWorld.isLoaded()) {
- MessageUtil.sendMessage(sender, Messages.messageWorldNotLoaded);
- return;
- }
-
- final Object object;
- if (gameRule.getType() == Boolean.class) {
- try {
- object = Boolean.parseBoolean(value);
- } catch (final Exception e) {
- MessageUtil.sendMessage(sender, Messages.messageGameRuleParseError);
- return;
- }
- } else if (gameRule.getType() == Integer.class) {
- try {
- object = Integer.parseInt(value);
- } catch (final Exception e) {
- MessageUtil.sendMessage(sender, Messages.messageGameRuleParseError);
- return;
- }
- } else {
- // ??
- return;
- }
-
- hyperWorld.getBukkitWorld().setGameRule(gameRule, object);
- MessageUtil.sendMessage(sender, Messages.messageGameRuleSet);
- }
-
- @Category("Management") @Subcommand("gamerule remove") @CommandPermission("hyperverse.gamerule.set")
- @CommandCompletion("@hyperworlds @gamerules") @Description("{@@command.gamerule.remove}")
- public void doGameRuleRemove(final CommandSender sender, final HyperWorld hyperWorld, final GameRule gameRule) {
- if (gameRule == null) {
- MessageUtil.sendMessage(sender, Messages.messageGameRuleUnknown);
- return;
- }
- if (hyperWorld == null) {
- MessageUtil.sendMessage(sender, Messages.messageNoSuchWorld);
- return;
- }
- if (!hyperWorld.isLoaded()) {
- MessageUtil.sendMessage(sender, Messages.messageWorldNotLoaded);
- return;
- }
- hyperWorld.getBukkitWorld().setGameRule(gameRule,
- hyperWorld.getBukkitWorld().getGameRuleDefault(gameRule));
- MessageUtil.sendMessage(sender, Messages.messageGameRuleRemoved);
- }
-
- @Category("Management") @Subcommand("delete") @CommandPermission("hyperverse.delete")
- @CommandCompletion("@hyperworlds true|false") @Description("{@@command.delete}")
- public void doDelete(final CommandSender sender, final HyperWorld hyperWorld,
- @Default("false") boolean deleteDirectory) {
- if (hyperWorld == null) {
- MessageUtil.sendMessage(sender, Messages.messageNoSuchWorld);
- return;
- }
- hyperWorld.deleteWorld(worldUnloadResult -> {
- if (worldUnloadResult != HyperWorld.WorldUnloadResult.SUCCESS) {
- MessageUtil.sendMessage(sender, Messages.messageWorldNotRemoved, "%reason%",
- worldUnloadResult.getDescription());
- return;
- }
-
- if (deleteDirectory) {
- final Path path = Bukkit.getWorldContainer().toPath()
- .resolve(hyperWorld.getConfiguration().getName());
- try {
- try (Stream walk = Files.walk(path)) {
- walk.sorted(Comparator.reverseOrder())
- .map(Path::toFile)
- .peek(System.out::println)
- .forEach(File::delete);
- }
- } catch (final Exception e) {
- MessageUtil.sendMessage(sender, Messages.messageWorldNotRemoved, "%reason%",
- e.getMessage());
- e.printStackTrace();
- return;
- }
- }
-
- MessageUtil.sendMessage(sender, Messages.messageWorldRemoved);
- });
- }
-
- @Category("Misc") @Subcommand("reload") @CommandPermission("hyperverse.reload") @CommandAlias("hvreload")
- @Description("{@@command.reload}")
- public void doConfigReload(final CommandSender sender) {
- if (!Hyperverse.getPlugin(Hyperverse.class).reloadConfiguration(sender)) {
- throw new CommandException("Failed to reload configuration files");
- }
- }
-
- @Category("Misc") @Subcommand("debugpaste") @CommandPermission("hyperverse.debugpaste")
- @Description("{@@command.debugpaste}")
- public void doDebugPaste(final CommandSender sender) {
- this.taskChainFactory.newChain().async(() -> {
- try {
- final Hyperverse hyperverse = Hyperverse.getPlugin(Hyperverse.class);
-
- StringBuilder b = new StringBuilder();
- b.append(
- "# Welcome to this paste\n# It is meant to provide us at IntellectualSites with better information about your "
- + "problem\n\n");
-
- b.append("# Server Information\n");
- b.append("Server Version: ").append(Bukkit.getVersion()).append("\n");
-
- b.append("Plugins:");
- for (final Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
- b.append("\n ").append(plugin.getName()).append(":\n ").append("version: '")
- .append(plugin.getDescription().getVersion()).append('\'').append("\n enabled: ").append(plugin.isEnabled());
- }
-
- b.append("\n\n# YAY! Now, let's see what we can find in your JVM\n");
- Runtime runtime = Runtime.getRuntime();
- RuntimeMXBean rb = ManagementFactory.getRuntimeMXBean();
- b.append("Uptime: ").append(
- TimeUnit.MINUTES.convert(rb.getUptime(), TimeUnit.MILLISECONDS) + " minutes")
- .append('\n');
- b.append("JVM Flags: ").append(rb.getInputArguments()).append('\n');
- b.append("Free Memory: ").append(runtime.freeMemory() / 1024 / 1024 + " MB")
- .append('\n');
- b.append("Max Memory: ").append(runtime.maxMemory() / 1024 / 1024 + " MB")
- .append('\n');
- b.append("Java Name: ").append(rb.getVmName()).append('\n');
- b.append("Java Version: '").append(System.getProperty("java.version"))
- .append("'\n");
- b.append("Java Vendor: '").append(System.getProperty("java.vendor")).append("'\n");
- b.append("Operating System: '").append(System.getProperty("os.name")).append("'\n");
- b.append("OS Version: ").append(System.getProperty("os.version")).append('\n');
- b.append("OS Arch: ").append(System.getProperty("os.arch")).append('\n');
- b.append("# Okay :D Great. You are now ready to create your bug report!");
- b.append(
- "\n# You can do so at https://github.com/Sauilitired/Hyperverse/issues");
- b.append("\n# or via our Discord at https://discord.gg/KxkjDVg");
-
- // We use the PlotSquared profile
- final IncendoPaster incendoPaster = new IncendoPaster("plotsquared");
- incendoPaster.addFile(new IncendoPaster.PasteFile("information", b.toString()));
-
- try {
- final File logFile = new File(Bukkit.getWorldContainer(), "./logs/latest.log");
- if (Files.size(logFile.toPath()) > 14_000_000) {
- throw new IOException("Too big...");
- }
- incendoPaster.addFile(new IncendoPaster.PasteFile("latest.log", IncendoPaster.readFile(logFile)));
- } catch (IOException ignored) {
- MessageUtil.sendMessage(sender, Messages.messageLogTooBig);
- }
-
- try {
- incendoPaster.addFile(new IncendoPaster.PasteFile("hyperverse.conf",
- IncendoPaster.readFile(new File(hyperverse.getDataFolder(), "hyperverse.conf"))));
- } catch (final IllegalArgumentException | IOException ignored) {
- }
-
-
- for (final HyperWorld hyperWorld : worldManager.getWorlds()) {
- incendoPaster.addFile(new IncendoPaster.PasteFile(String.format("%s.json",
- hyperWorld.getConfiguration().getName()), IncendoPaster.readFile(this.worldManager.getWorldDirectory().
- resolve(String.format("%s.json", hyperWorld.getConfiguration().getName())).toFile())));
- }
-
- try {
- final String rawResponse = incendoPaster.upload();
- final JsonObject jsonObject = new JsonParser().parse(rawResponse).getAsJsonObject();
-
- if (jsonObject.has("created")) {
- final String pasteId = jsonObject.get("paste_id").getAsString();
- final String link =
- String.format("https://athion.net/ISPaster/paste/view/%s", pasteId);
- MessageUtil.sendMessage(sender, Messages.messagePasteUpload, "%paste%", link);
- } else {
- final String responseMessage = jsonObject.get("response").getAsString();
- MessageUtil.sendMessage(sender, Messages.messagePasteFailed, "%reason%", responseMessage);
- }
- } catch (final Throwable throwable) {
- throwable.printStackTrace();
- MessageUtil.sendMessage(sender, Messages.messagePasteFailed, "%reason%", throwable.getMessage());
- }
- } catch (final Exception ignored) {
- }
- }).execute();
- }
-
- @Category("Misc") @Subcommand("multiverse") @CommandPermission("hyperverse.plugin.import")
- @Description("{@@command.multiverse}")
- public void doMultiverse(final CommandSender sender) {
- if (Bukkit.getPluginManager().isPluginEnabled("Multiverse-Core")) {
- new MultiverseImporter(this.worldManager, this.hyperWorldFactory)
- .performImport(sender);
- } else {
- MessageUtil.sendMessage(sender, Messages.messageImportPluginMissing,"%plugin%", "Multiverse");
- }
- }
-
- @Category("Misc") @Subcommand("myworlds") @CommandPermission("hyperverse.plugin.import")
- public void doMyWorlds(final CommandSender sender) {
- if (Bukkit.getPluginManager().isPluginEnabled("My_Worlds")) {
- new MyWorldsImporter(this.worldManager, this.hyperWorldFactory).performImport(sender);
- } else { MessageUtil
- .sendMessage(sender, Messages.messageImportPluginMissing, "%plugin%", "MyWorlds");
-
- }
- }
-
- @Category("Misc") @Subcommand("plugin")
- @Description("{@@command.plugin}")
- public void doPlugin(final CommandSender sender) {
- final Hyperverse plugin = Hyperverse.getPlugin(Hyperverse.class);
- final PluginDescriptionFile description = plugin.getDescription();
- Stream.of("Plugin Version: " + description.getVersion() + "",
- "Author(s): " + StringUtils.join(description.getAuthors(), ", ") + "",
- "Website: Click to open\">https://hyperver.se").forEach(msg ->
- sender.spigot().sendMessage(MiniMessageParser.parseFormat(
- "[Hyperverse] " + msg)));
- }
-
- @Category("Management") @Subcommand("regenerate|regen") @Description("{@@command.regenerate}")
- @CommandPermission("hyperverse.regenerate") @CommandCompletion("@hyperworlds true|false")
- public void doRegenerate(final CommandSender sender, final HyperWorld world, @Default("false") final boolean randomiseSeed) {
- if (world == null) {
- MessageUtil.sendMessage(sender, Messages.messageNoSuchWorld);
- return;
- }
-
- final WorldConfiguration configuration = world.getConfiguration().copy();
- if (randomiseSeed) {
- configuration.setSeed(SeedUtil.randomSeed());
- }
-
- world.deleteWorld(worldUnloadResult -> {
- if (worldUnloadResult != HyperWorld.WorldUnloadResult.SUCCESS) {
- MessageUtil.sendMessage(sender, Messages.messageWorldNotRemoved, "%reason%",
- worldUnloadResult.getDescription());
- return;
- }
-
- final Path path = Bukkit.getWorldContainer().toPath()
- .resolve(world.getConfiguration().getName());
- try {
- try (Stream walk = Files.walk(path)) {
- walk.sorted(Comparator.reverseOrder())
- .map(Path::toFile)
- .peek(System.out::println)
- .forEach(File::delete);
- }
- } catch (final Exception e) {
- MessageUtil.sendMessage(sender, Messages.messageWorldNotRemoved, "%reason%",
- e.getMessage());
- e.printStackTrace();
- return;
- }
- MessageUtil.sendMessage(sender, Messages.messageWorldRemoved);
- final HyperWorld hyperWorld = hyperWorldFactory.create(UUID.randomUUID(), configuration);
- MessageUtil.sendMessage(sender, Messages.messageWorldCreationStarted);
- hyperWorld.sendWorldInfo(sender);
-
- // Make sure we don't detect the world load
- this.worldManager.ignoreWorld(configuration.getName());
-
- try {
- hyperWorld.createBukkitWorld();
- // Register the world
- this.worldManager.addWorld(hyperWorld);
- MessageUtil.sendMessage(sender, Messages.messageWorldCreationFinished);
- if (sender instanceof Player) {
- // Attempt to teleport them to the world
- hyperWorld.teleportPlayer((Player) sender);
- }
- } catch (final HyperWorldValidationException validationException) {
- switch (validationException.getValidationResult()) {
- case UNKNOWN_GENERATOR:
- MessageUtil.sendMessage(sender, Messages.messageGeneratorInvalid,
- "%world%", hyperWorld.getConfiguration().getName(),
- "%generator%", hyperWorld.getConfiguration().getGenerator());
- break;
- case SUCCESS:
- break;
- default:
- MessageUtil.sendMessage(sender, Messages.messageCreationUnknownFailure);
- break;
- }
- } catch (final Exception e) {
- MessageUtil.sendMessage(sender, Messages.messageWorldCreationFailed,
- "%reason%", e.getMessage());
- }
- });
- }
-
-}
diff --git a/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommandUtil.java b/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommandUtil.java
index 40973f99..0a13186d 100644
--- a/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommandUtil.java
+++ b/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommandUtil.java
@@ -42,48 +42,48 @@
final class HyperCommandUtil {
- private final BukkitCommandManager bukkitCommandManager;
- private final WorldManager worldManager;
- private final GlobalWorldFlagContainer globalFlagContainer;
- HyperCommandUtil(final WorldManager worldManager, final GlobalWorldFlagContainer
- globalFlagContainer, final BukkitCommandManager bukkitCommandManager) {
- this.bukkitCommandManager = bukkitCommandManager;
- this.worldManager = Objects.requireNonNull(worldManager);
- this.globalFlagContainer = Objects.requireNonNull(globalFlagContainer);
+ public static void setupCommandManager(final BukkitCommandManager bukkitCommandManager,
+ final WorldManager worldManager, final GlobalWorldFlagContainer globalFlagContainer) {
- this.bukkitCommandManager.usePerIssuerLocale(true, true);
- this.bukkitCommandManager.getLocales().addMessages(Locale.ENGLISH, Messages.getMessages());
+ bukkitCommandManager.usePerIssuerLocale(true, true);
+ bukkitCommandManager.getLocales().addMessages(Locale.ENGLISH, Messages.getMessages());
- setFormats();
- registerCompletions();
- registerAsyncCompletions();
- registerContexts();
+ setupLocales(bukkitCommandManager);
+ setFormats(bukkitCommandManager);
+ registerCompletions(bukkitCommandManager, worldManager);
+ registerAsyncCompletions(bukkitCommandManager, worldManager, globalFlagContainer);
+ registerContexts(bukkitCommandManager, worldManager, globalFlagContainer);
+ }
+
+ private static void setupLocales(final BukkitCommandManager bukkitCommandManager) {
+ bukkitCommandManager.usePerIssuerLocale(true, true);
+ bukkitCommandManager.getLocales().addMessages(Locale.ENGLISH, Messages.getMessages());
}
- private void setFormats() {
- this.bukkitCommandManager.setDefaultFormatter(new BukkitMessageFormatter(ChatColor.GRAY) {
+ private static void setFormats(final BukkitCommandManager bukkitCommandManager) {
+ bukkitCommandManager.setDefaultFormatter(new BukkitMessageFormatter(ChatColor.GRAY) {
@Override public String format(@NotNull final String message) {
return ChatColor.translateAlternateColorCodes('&', Messages.messagePrefix.toString())
+ super.format(message);
}
});
- this.bukkitCommandManager.setFormat(
+ bukkitCommandManager.setFormat(
MessageType.ERROR, new BukkitMessageFormatter(ChatColor.RED, ChatColor.GOLD, ChatColor.WHITE) {
@Override public String format(final String message) {
return ChatColor.translateAlternateColorCodes('&', Messages.messagePrefix.toString())
+ ChatColor.RED + super.format(message);
}
});
- this.bukkitCommandManager.setFormat(MessageType.SYNTAX, new BukkitMessageFormatter(ChatColor.GRAY, ChatColor.GOLD, ChatColor.WHITE) {
+ bukkitCommandManager.setFormat(MessageType.SYNTAX, new BukkitMessageFormatter(ChatColor.GRAY, ChatColor.GOLD, ChatColor.WHITE) {
@Override public String format(final String message) {
return ChatColor.translateAlternateColorCodes('&', Messages.messagePrefix.toString())
+ ChatColor.GRAY + super.format(message);
}
});
- this.bukkitCommandManager.setFormat(MessageType.HELP, new BukkitMessageFormatter(ChatColor.GRAY, ChatColor.GOLD, ChatColor.WHITE) {
+ bukkitCommandManager.setFormat(MessageType.HELP, new BukkitMessageFormatter(ChatColor.GRAY, ChatColor.GOLD, ChatColor.WHITE) {
@Override public String format(final String message) {
return ChatColor.translateAlternateColorCodes('&', Messages.messagePrefix.toString())
+ ChatColor.GRAY + super.format(message);
@@ -91,7 +91,8 @@ MessageType.ERROR, new BukkitMessageFormatter(ChatColor.RED, ChatColor.GOLD, Cha
});
}
- private void registerContexts() {
+ private static void registerContexts(final BukkitCommandManager bukkitCommandManager,
+ final WorldManager worldManager, final GlobalWorldFlagContainer globalFlagContainer) {
/*bukkitCommandManager.getCommandContexts().registerContext(Player[].class, context -> {
final List args = context.getArgs();
final Player[] arr = new Player[args.size()];
@@ -143,7 +144,8 @@ private void registerContexts() {
bukkitCommandManager.enableUnstableAPI("help");
}
- private void registerCompletions() {
+ private static void registerCompletions(final BukkitCommandManager bukkitCommandManager,
+ final WorldManager worldManager) {
bukkitCommandManager.getCommandCompletions().registerCompletion("null", context ->
Collections.emptyList());
bukkitCommandManager.getCommandCompletions()
@@ -251,8 +253,9 @@ private void registerCompletions() {
});
}
- private void registerAsyncCompletions() {
- this.bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("hyperworlds",
+ private static void registerAsyncCompletions(final BukkitCommandManager bukkitCommandManager,
+ final WorldManager worldManager, final GlobalWorldFlagContainer globalFlagContainer) {
+ bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("hyperworlds",
context -> worldManager.getWorlds().stream().filter(hyperWorld -> {
final String stateSel = context.getConfig("state", "").toLowerCase();
final String playerSel = context.getConfig("players", "").toLowerCase();
@@ -263,17 +266,21 @@ private void registerAsyncCompletions() {
boolean ret = true;
switch (stateSel) {
case "loaded":
- ret = hyperWorld.isLoaded(); break;
+ ret = hyperWorld.isLoaded();
+ break;
case "not_loaded":
- ret = !hyperWorld.isLoaded(); break;
+ ret = !hyperWorld.isLoaded();
+ break;
default:
break;
}
switch (playerSel) {
case "no_players":
- ret = ret && hyperWorld.getBukkitWorld().getPlayers().isEmpty(); break;
+ ret = ret && hyperWorld.getBukkitWorld().getPlayers().isEmpty();
+ break;
case "has_players":
- ret = ret && !hyperWorld.getBukkitWorld().getPlayers().isEmpty(); break;
+ ret = ret && !hyperWorld.getBukkitWorld().getPlayers().isEmpty();
+ break;
default:
break;
}
@@ -293,7 +300,7 @@ private void registerAsyncCompletions() {
return true;
}
}).collect(Collectors.toList()));
- this.bukkitCommandManager.getCommandCompletions()
+ bukkitCommandManager.getCommandCompletions()
.registerAsyncCompletion("import-candidates", context -> {
final File baseDirectory = Bukkit.getWorldContainer();
try {
@@ -307,33 +314,33 @@ private void registerAsyncCompletions() {
return Collections.emptyList();
}
});
- this.bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("worldtypes", context -> {
+ bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("worldtypes", context -> {
if (context.getInput().contains(" ")) {
return Collections.emptyList();
}
return Arrays.stream(WorldType.values()).map(WorldType::name).map(String::toLowerCase)
.collect(Collectors.toList());
});
- this.bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("worldfeatures", context -> {
+ bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("worldfeatures", context -> {
if (context.getInput().contains(" ")) {
return Collections.emptyList();
}
return Arrays.stream(WorldFeatures.values()).map(WorldFeatures::name).map(String::toLowerCase)
.collect(Collectors.toList());
});
- this.bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("flags", context ->
+ bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("flags", context ->
globalFlagContainer.getFlagMap().values().stream().map(WorldFlag::getName).collect(
Collectors.toList()));
- this.bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("gamerules", context ->
+ bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("gamerules", context ->
Arrays.stream(GameRule.values()).map(GameRule::getName).collect(Collectors.toList()));
- this.bukkitCommandManager.getCommandCompletions().registerCompletion("flag", context -> {
+ bukkitCommandManager.getCommandCompletions().registerCompletion("flag", context -> {
final WorldFlag, ?> flag = context.getContextValue(WorldFlag.class);
if (flag != null) {
return flag.getTabCompletions();
}
return Collections.emptyList();
});
- this.bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("gamerule", context -> {
+ bukkitCommandManager.getCommandCompletions().registerAsyncCompletion("gamerule", context -> {
final GameRule> gameRule = context.getContextValue(GameRule.class);
if (gameRule != null) {
if (gameRule.getType() == Boolean.class) {
From 4eeb7dbf7a6df011b71462b6d895b7e4472f0757 Mon Sep 17 00:00:00 2001
From: Andrew Wong <42793301+md5sha256@users.noreply.github.com>
Date: Tue, 28 Jul 2020 17:23:54 +0200
Subject: [PATCH 3/3] Document and fix styling issues
---
.../hyperverse/commands/HyperCommand.java | 1 +
.../hyperverse/commands/HyperCommandUtil.java | 16 ++++++++++++----
2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommand.java b/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommand.java
index c40e71ff..4b549f5e 100644
--- a/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommand.java
+++ b/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommand.java
@@ -84,6 +84,7 @@ public class HyperCommand extends BaseCommand {
// Create the command manager
BukkitCommandManager bukkitCommandManager = new PaperCommandManager(hyperverse);
+ // Register our completions etc
HyperCommandUtil.setupCommandManager(bukkitCommandManager, worldManager, globalFlagContainer);
bukkitCommandManager.registerCommand(this);
}
diff --git a/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommandUtil.java b/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommandUtil.java
index 0a13186d..77ab7615 100644
--- a/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommandUtil.java
+++ b/Core/src/main/java/se/hyperver/hyperverse/commands/HyperCommandUtil.java
@@ -40,10 +40,19 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;
+/**
+ * Internal utility class used to setup Hyperverse's command manager.
+ * @see HyperCommand
+ */
final class HyperCommandUtil {
-
-
+ /**
+ * Utility method, used to register locales, formats, completions and contexts to
+ * the command manager.
+ * @param bukkitCommandManager The command manager instance to register contexts to.
+ * @param worldManager The world manager object (DI)
+ * @param globalFlagContainer The glag container object (DI)
+ */
public static void setupCommandManager(final BukkitCommandManager bukkitCommandManager,
final WorldManager worldManager, final GlobalWorldFlagContainer globalFlagContainer) {
@@ -350,6 +359,5 @@ private static void registerAsyncCompletions(final BukkitCommandManager bukkitCo
return Collections.emptyList();
});
}
-
-
+
}