More ACF testing, add queue manager.

This commit is contained in:
benwoo1110 2020-12-15 13:32:08 +08:00
parent d8ff083418
commit 15810c9404
12 changed files with 226 additions and 101 deletions

View File

@ -709,6 +709,8 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core {
* Register Multiverse-Core commands to Command Manager.
*/
private void registerCommands() {
commandHandler.enableUnstableAPI("help");
CommandTools tools = new CommandTools(this);
tools.registerCommandContext();
tools.registerCommandCompletions();

View File

@ -5,10 +5,12 @@ import co.aikar.commands.PaperCommandManager;
import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.api.MVWorldManager;
import com.onarandombox.MultiverseCore.api.MultiverseWorld;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.UUID;
import java.util.stream.Collectors;
public class CommandTools {
@ -16,6 +18,9 @@ public class CommandTools {
private final PaperCommandManager commandHandler;
private final MVWorldManager worldManager;
private static final String UUID_REGEX = "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[34][0-9a-fA-F]{3}-[89ab][0-9a-fA-F]{3}-[0-9a-fA-F]{12}"
;
public CommandTools(MultiverseCore plugin) {
this.plugin = plugin;
this.commandHandler = this.plugin.getCommandHandler();
@ -73,25 +78,35 @@ public class CommandTools {
}
);
commandHandler.getCommandContexts().registerIssuerAwareContext(
PageOrWorld.class,
commandHandler.getCommandContexts().registerContext(
Player.class,
context -> {
String arg = context.popFirstArg();
MultiverseWorld targetWorld = this.worldManager.getMVWorld(arg);
if (targetWorld != null) {
return new PageOrWorld(targetWorld);
String playerIdentifier = context.popFirstArg();
Player targetPlayer = Bukkit.getPlayerExact(playerIdentifier);
if (targetPlayer == null) {
return tryGetPlayerByUUID(playerIdentifier);
}
targetWorld = GetPlayerMVWorld(context.getPlayer());
int page = ParsePageNumber(arg);
return new PageOrWorld(targetWorld, page);
return targetPlayer;
}
);
//TODO: Destination
}
private Player tryGetPlayerByUUID(String playerIdentifier) {
if (!playerIdentifier.matches(UUID_REGEX)) {
return null;
}
UUID playerUUID;
try {
playerUUID = UUID.fromString(playerIdentifier);
}
catch (Exception e) {
return null;
}
return Bukkit.getPlayer(playerUUID);
}
@NotNull
private MultiverseWorld GetPlayerMVWorld(Player player) {
if (player == null) {
@ -105,17 +120,4 @@ public class CommandTools {
return targetWorld;
}
private int ParsePageNumber(String arg) {
if (arg == null) {
return 1;
}
try {
return Integer.parseInt(arg);
}
catch (NumberFormatException ignored) {
throw new InvalidCommandArgument("Invalid page number: " + arg);
}
}
}

View File

@ -22,7 +22,7 @@ public class ConfigCommand extends MultiverseCommand {
super(plugin);
}
@Subcommand("show")
@Subcommand("list")
@Description("Show Global MV Variables.")
public void onShowCommand(CommandSender sender) {
StringBuilder builder = new StringBuilder();
@ -53,17 +53,16 @@ public class ConfigCommand extends MultiverseCommand {
return;
}
// special rule
// special rule, don't forget to set the world!
if (property.equalsIgnoreCase("firstspawnworld")) {
// Don't forget to set the world!
this.plugin.getMVWorldManager().setFirstSpawnWorld(value);
}
if (this.plugin.saveMVConfigs()) {
sender.sendMessage(ChatColor.GREEN + "SUCCESS!" + ChatColor.WHITE + " Values were updated successfully!");
this.plugin.loadConfigs();
} else {
if (!this.plugin.saveMVConfigs()) {
sender.sendMessage(ChatColor.RED + "FAIL!" + ChatColor.WHITE + " Check your console for details!");
}
sender.sendMessage(ChatColor.GREEN + "SUCCESS!" + ChatColor.WHITE + " Values were updated successfully!");
this.plugin.loadConfigs();
}
}
}

View File

@ -0,0 +1,10 @@
package com.onarandombox.MultiverseCore.commands_acf;
import com.onarandombox.MultiverseCore.MultiverseCore;
public class ConfirmCommand extends MultiverseCommand {
public ConfirmCommand(MultiverseCore plugin) {
super(plugin);
}
}

View File

@ -11,51 +11,56 @@ import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
@CommandAlias("mv")
@Subcommand("debug")
@CommandPermission("multiverse.core.debug")
public class DebugCommand extends MultiverseCommand {
public DebugCommand(MultiverseCore plugin) {
super(plugin);
}
@Subcommand("debug")
@CommandPermission("multiverse.core.debug")
@Description("Show the current debug level.")
public void showDebugCommand(CommandSender sender) {
displayDebugMode(sender);
}
@Subcommand("debug")
@CommandPermission("multiverse.core.debug")
@Syntax("<level>")
@Description("Change debug level.")
public void changeDebugCommand(CommandSender sender, String debugLevel) {
int parsedLevel;
if (debugLevel.equalsIgnoreCase("off")) {
parsedLevel = 0;
}
else {
try {
parsedLevel = Integer.parseInt(debugLevel);
if (parsedLevel > 3 || parsedLevel < 0) {
throw new NumberFormatException();
}
} catch (NumberFormatException e) {
sender.sendMessage(ChatColor.RED + "Error" + ChatColor.WHITE
+ " setting debug level. Please use a number 0-3 " + ChatColor.AQUA + "(3 being many many messages!)");
return;
}
public void changeDebugCommand(CommandSender sender, String debugLevel) {
int parsedLevel = parseDebugLevel(debugLevel);
if (parsedLevel == -1) {
sender.sendMessage(ChatColor.RED + "Error" + ChatColor.WHITE
+ " setting debug level. Please use a number 0-3 " + ChatColor.AQUA + "(3 being many many messages!)");
return;
}
plugin.getMVConfig().setGlobalDebug(parsedLevel);
if (!plugin.saveMVConfigs()) {
this.plugin.getMVConfig().setGlobalDebug(parsedLevel);
if (!this.plugin.saveMVConfigs()) {
sender.sendMessage(ChatColor.RED + "Error saving changes to config! See console for more info.");
}
this.displayDebugMode(sender);
displayDebugMode(sender);
}
private int parseDebugLevel(String debugLevel) {
if (debugLevel.equalsIgnoreCase("off")) {
return 0;
}
if (debugLevel.equalsIgnoreCase("on")) {
return 1;
}
try {
int parsedLevel = Integer.parseInt(debugLevel);
return (parsedLevel > 3 || parsedLevel < 0) ? parsedLevel : -1;
}
catch (NumberFormatException ignored) {
return -1;
}
}
private void displayDebugMode(CommandSender sender) {
final int debugLevel = plugin.getMVConfig().getGlobalDebug();
final int debugLevel = this.plugin.getMVConfig().getGlobalDebug();
if (debugLevel == 0) {
sender.sendMessage("Multiverse Debug mode is " + ChatColor.RED + "OFF");
}

View File

@ -0,0 +1,10 @@
package com.onarandombox.MultiverseCore.commands_acf;
import com.onarandombox.MultiverseCore.MultiverseCore;
public class DeleteCommand extends MultiverseCommand {
protected DeleteCommand(MultiverseCore plugin) {
super(plugin);
}
}

View File

@ -22,26 +22,17 @@ public class InfoCommand extends MultiverseCommand {
super(plugin);
}
@Subcommand("info")
@CommandPermission("multiverse.core.info")
@Syntax("[page]")
@Description("")
public void onPlayerInfoCommand(CommandSender sender, PageOrWorld pageOrWorld) {
ShowWorldInfo(sender, pageOrWorld.getWorld(), pageOrWorld.getPage());
}
@Subcommand("info")
@CommandPermission("multiverse.core.info")
@Syntax("[world] [page]")
@CommandCompletion("@mvworlds")
@Description("")
public void onInfoCommand(CommandSender sender, PageOrWorld pageOrWorld, @Default("1") int page) {
ShowWorldInfo(sender, pageOrWorld.getWorld(), page);
public void onInfoCommand(CommandSender sender, MultiverseWorld world, @Default("1") int page) {
ShowWorldInfo(sender, world, page);
}
private void ShowWorldInfo(CommandSender sender, MultiverseWorld world, int page) {
sender.sendMessage(world.toString());
sender.sendMessage("Page of " + page);
}
}

View File

@ -4,6 +4,7 @@ import co.aikar.commands.BaseCommand;
import com.onarandombox.MultiverseCore.MultiverseCore;
public class MultiverseCommand extends BaseCommand {
protected final MultiverseCore plugin;
protected MultiverseCommand(MultiverseCore plugin) {

View File

@ -1,34 +0,0 @@
package com.onarandombox.MultiverseCore.commands_acf;
import com.onarandombox.MultiverseCore.api.MultiverseWorld;
public class PageOrWorld {
private MultiverseWorld world;
private int page;
public PageOrWorld(MultiverseWorld world) {
this.world = world;
this.page = 1;
}
public PageOrWorld(MultiverseWorld world, int page) {
this.world = world;
this.page = page;
}
public MultiverseWorld getWorld() {
return world;
}
public void setWorld(MultiverseWorld world) {
this.world = world;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
}

View File

@ -0,0 +1,79 @@
package com.onarandombox.MultiverseCore.commands_acf;
import com.dumptruckman.minecraft.util.Logging;
import com.onarandombox.MultiverseCore.MultiverseCore;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.scheduler.BukkitTask;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.Map;
public class QueueManager {
private final MultiverseCore plugin;
private final Map<CommandSender, QueuedCommand> queuedCommands;
private static final int DEFAULT_EXPIRE_TIME = 200; // In ticks for now
public QueueManager(MultiverseCore plugin) {
this.plugin = plugin;
this.queuedCommands = new HashMap<CommandSender, QueuedCommand>();
}
public void addToQueue(@NotNull CommandSender sender, @NotNull Runnable runnable) {
addToQueue(sender, runnable, DEFAULT_EXPIRE_TIME);
}
public void addToQueue(@NotNull CommandSender sender, @NotNull Runnable runnable, int validPeriod) {
cancelPreviousQueue(sender);
QueuedCommand queuedCommand = new QueuedCommand(sender, runnable, validPeriod);
queuedCommands.put(sender, queuedCommand);
queuedCommand.setExpireTask(runExpireLater(queuedCommand));
sender.sendMessage("The command you are trying to run is deemed dangerous.");
sender.sendMessage("Run /mv confirm to continue.");
}
private void cancelPreviousQueue(@NotNull CommandSender sender) {
QueuedCommand previousCommand = queuedCommands.get(sender);
if (previousCommand == null) {
return;
}
previousCommand.cancelExpiryTask();
queuedCommands.remove(sender);
}
private BukkitTask runExpireLater(@NotNull QueuedCommand queuedCommand) {
return Bukkit.getScheduler().runTaskLater(
this.plugin,
expireRunnable(queuedCommand),
queuedCommand.getValidInterval()
);
}
private Runnable expireRunnable(@NotNull QueuedCommand queuedCommand) {
return () -> {
QueuedCommand matchingQueuedCommand = this.queuedCommands.get(queuedCommand.getSender());
if (!queuedCommand.equals(matchingQueuedCommand)) {
Logging.finer("This is an old command already.");
return;
}
this.queuedCommands.remove(queuedCommand.getSender());
Logging.finer("Command expired and is removed.");
};
}
public boolean runQueuedCommand(@NotNull CommandSender sender) {
QueuedCommand queuedCommand = this.queuedCommands.get(sender);
if (queuedCommand == null) {
Logging.fine("No queued command.");
return false;
}
queuedCommand.runCommand();
queuedCommands.remove(sender);
return true;
}
}

View File

@ -0,0 +1,38 @@
package com.onarandombox.MultiverseCore.commands_acf;
import org.bukkit.command.CommandSender;
import org.bukkit.scheduler.BukkitTask;
public class QueuedCommand {
private final CommandSender sender;
private final Runnable runnable;
private final int validInterval;
private BukkitTask expireTask;
public QueuedCommand(CommandSender sender, Runnable runnable, int validPeriod) {
this.sender = sender;
this.runnable = runnable;
this.validInterval = validPeriod;
}
public void runCommand() {
runnable.run();
cancelExpiryTask();
}
public void cancelExpiryTask() {
expireTask.cancel();
}
public void setExpireTask(BukkitTask expireTask) {
this.expireTask = expireTask;
}
public CommandSender getSender() {
return sender;
}
public int getValidInterval() {
return validInterval;
}
}

View File

@ -0,0 +1,22 @@
package com.onarandombox.MultiverseCore.commands_acf;
import co.aikar.commands.CommandHelp;
import co.aikar.commands.annotation.*;
import com.onarandombox.MultiverseCore.MultiverseCore;
import org.bukkit.command.CommandSender;
@CommandAlias("mv")
public class UsageCommand extends MultiverseCommand {
public UsageCommand(MultiverseCore plugin) {
super(plugin);
}
@HelpCommand
@Subcommand("help")
@CommandPermission("multiverse.core.help")
@Description("Show Multiverse Command usage.")
public void onUsageCommand(CommandSender sender, CommandHelp help) {
help.showHelp();
}
}