Split up CommandHandler class
This commit is contained in:
parent
5bb0080ca3
commit
779b1acbff
13 changed files with 1784 additions and 1204 deletions
File diff suppressed because it is too large
Load diff
329
src/main/java/net/coreprotect/command/CommandParser.java
Normal file
329
src/main/java/net/coreprotect/command/CommandParser.java
Normal file
|
|
@ -0,0 +1,329 @@
|
|||
package net.coreprotect.command;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import net.coreprotect.command.parser.ActionParser;
|
||||
import net.coreprotect.command.parser.LocationParser;
|
||||
import net.coreprotect.command.parser.MaterialParser;
|
||||
import net.coreprotect.command.parser.TimeParser;
|
||||
import net.coreprotect.command.parser.UserParser;
|
||||
import net.coreprotect.command.parser.WorldParser;
|
||||
|
||||
/**
|
||||
* Main parser class for CoreProtect commands.
|
||||
* Delegates to specialized parser classes for specific functionality.
|
||||
*/
|
||||
public class CommandParser {
|
||||
|
||||
/**
|
||||
* Parse page number from command arguments
|
||||
*
|
||||
* @param argumentArray
|
||||
* The command arguments
|
||||
* @return The modified argument array
|
||||
*/
|
||||
protected static String[] parsePage(String[] argumentArray) {
|
||||
return ActionParser.parsePage(argumentArray);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse action type from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return A list of action type integers
|
||||
*/
|
||||
protected static List<Integer> parseAction(String[] inputArguments) {
|
||||
return ActionParser.parseAction(inputArguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse coordinates from command arguments
|
||||
*
|
||||
* @param location
|
||||
* The base location
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @param worldId
|
||||
* The world ID
|
||||
* @return The parsed location
|
||||
*/
|
||||
protected static Location parseCoordinates(Location location, String[] inputArguments, int worldId) {
|
||||
return LocationParser.parseCoordinates(location, inputArguments, worldId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse count flag from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return true if the count flag is present
|
||||
*/
|
||||
protected static boolean parseCount(String[] inputArguments) {
|
||||
return ActionParser.parseCount(inputArguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse excluded materials and entities from command arguments
|
||||
*
|
||||
* @param player
|
||||
* The command sender
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @param argAction
|
||||
* The list of actions to include
|
||||
* @return A map of excluded materials and entities
|
||||
*/
|
||||
protected static Map<Object, Boolean> parseExcluded(CommandSender player, String[] inputArguments, List<Integer> argAction) {
|
||||
return MaterialParser.parseExcluded(player, inputArguments, argAction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse excluded users from command arguments
|
||||
*
|
||||
* @param player
|
||||
* The command sender
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return A list of excluded users
|
||||
*/
|
||||
protected static List<String> parseExcludedUsers(CommandSender player, String[] inputArguments) {
|
||||
return UserParser.parseExcludedUsers(player, inputArguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse force global flag from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return true if global search should be forced
|
||||
*/
|
||||
protected static boolean parseForceGlobal(String[] inputArguments) {
|
||||
return WorldParser.parseForceGlobal(inputArguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse location from command sender and command arguments
|
||||
*
|
||||
* @param user
|
||||
* The command sender
|
||||
* @param argumentArray
|
||||
* The command arguments
|
||||
* @return The parsed location
|
||||
*/
|
||||
protected static Location parseLocation(CommandSender user, String[] argumentArray) {
|
||||
return LocationParser.parseLocation(user, argumentArray);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse noisy/verbose flag from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return 1 if noisy/verbose mode is enabled, 0 otherwise
|
||||
*/
|
||||
protected static int parseNoisy(String[] inputArguments) {
|
||||
return ActionParser.parseNoisy(inputArguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse preview flag from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return 1 for preview, 2 for preview cancel, 0 otherwise
|
||||
*/
|
||||
protected static int parsePreview(String[] inputArguments) {
|
||||
return ActionParser.parsePreview(inputArguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse radius from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @param user
|
||||
* The command sender
|
||||
* @param location
|
||||
* The base location
|
||||
* @return The parsed radius
|
||||
*/
|
||||
protected static Integer[] parseRadius(String[] inputArguments, CommandSender user, Location location) {
|
||||
Integer[] result = LocationParser.parseRadius(inputArguments, user, location);
|
||||
|
||||
// Handle WorldEdit case which LocationParser returned as null
|
||||
if (result == null && WorldParser.parseWorldEdit(inputArguments)) {
|
||||
if (user.getServer().getPluginManager().getPlugin("WorldEdit") != null) {
|
||||
Integer[] worldEditResult = WorldEditHandler.runWorldEditCommand(user);
|
||||
if (worldEditResult != null) {
|
||||
result = worldEditResult;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse restricted materials and entities from command arguments
|
||||
*
|
||||
* @param player
|
||||
* The command sender
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @param argAction
|
||||
* The list of actions to include
|
||||
* @return A list of restricted materials and entities
|
||||
*/
|
||||
protected static List<Object> parseRestricted(CommandSender player, String[] inputArguments, List<Integer> argAction) {
|
||||
return MaterialParser.parseRestricted(player, inputArguments, argAction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse time from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return An array of two longs - [time1, time2]
|
||||
*/
|
||||
protected static long[] parseTime(String[] inputArguments) {
|
||||
return TimeParser.parseTime(inputArguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse time string from command arguments for display
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return A formatted time string
|
||||
*/
|
||||
protected static String parseTimeString(String[] inputArguments) {
|
||||
return TimeParser.parseTimeString(inputArguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse rows from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return The number of rows
|
||||
*/
|
||||
protected static int parseRows(String[] inputArguments) {
|
||||
return TimeParser.parseRows(inputArguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse world from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @param processWorldEdit
|
||||
* Whether to process WorldEdit arguments
|
||||
* @param requireLoaded
|
||||
* Whether the world must be loaded
|
||||
* @return The world ID
|
||||
*/
|
||||
protected static int parseWorld(String[] inputArguments, boolean processWorldEdit, boolean requireLoaded) {
|
||||
return WorldParser.parseWorld(inputArguments, processWorldEdit, requireLoaded);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse whether to use WorldEdit for radius
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return true if WorldEdit should be used
|
||||
*/
|
||||
protected static boolean parseWorldEdit(String[] inputArguments) {
|
||||
return WorldParser.parseWorldEdit(inputArguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse world name from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @param processWorldEdit
|
||||
* Whether to process WorldEdit arguments
|
||||
* @return The world name
|
||||
*/
|
||||
protected static String parseWorldName(String[] inputArguments, boolean processWorldEdit) {
|
||||
return WorldParser.parseWorldName(inputArguments, processWorldEdit);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a map of block tags and their associated materials
|
||||
*
|
||||
* @return A map of block tags and their associated materials
|
||||
*/
|
||||
protected static Map<String, Set<Material>> getTags() {
|
||||
return MaterialParser.getTags();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an argument matches a block tag
|
||||
*
|
||||
* @param argument
|
||||
* The argument to check
|
||||
* @return true if the argument matches a block tag
|
||||
*/
|
||||
protected static boolean checkTags(String argument) {
|
||||
return MaterialParser.checkTags(argument);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an argument matches a block tag and add the associated materials to the list
|
||||
*
|
||||
* @param argument
|
||||
* The argument to check
|
||||
* @param list
|
||||
* The list to add the associated materials to
|
||||
* @return true if the argument matches a block tag
|
||||
*/
|
||||
protected static boolean checkTags(String argument, Map<Object, Boolean> list) {
|
||||
return MaterialParser.checkTags(argument, list);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an argument matches a block tag and add the associated materials to the list
|
||||
*
|
||||
* @param argument
|
||||
* The argument to check
|
||||
* @param list
|
||||
* The list to add the associated materials to
|
||||
* @return true if the argument matches a block tag
|
||||
*/
|
||||
protected static boolean checkTags(String argument, List<Object> list) {
|
||||
return MaterialParser.checkTags(argument, list);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse users from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return A list of parsed users
|
||||
*/
|
||||
protected static List<String> parseUsers(String[] inputArguments) {
|
||||
return UserParser.parseUsers(inputArguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method for formatting BigDecimal values
|
||||
*
|
||||
* @param input
|
||||
* The BigDecimal value to format
|
||||
* @return The formatted string
|
||||
*/
|
||||
private static String timeString(BigDecimal input) {
|
||||
return input.stripTrailingZeros().toPlainString();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -45,31 +45,30 @@ import net.coreprotect.utility.EntityUtils;
|
|||
import net.coreprotect.utility.ItemUtils;
|
||||
import net.coreprotect.utility.MaterialUtils;
|
||||
import net.coreprotect.utility.StringUtils;
|
||||
import net.coreprotect.utility.Util;
|
||||
import net.coreprotect.utility.WorldUtils;
|
||||
|
||||
public class LookupCommand {
|
||||
protected static void runCommand(CommandSender player, Command command, boolean permission, String[] args) {
|
||||
int resultc = args.length;
|
||||
args = CommandHandler.parsePage(args);
|
||||
Location lo = CommandHandler.parseLocation(player, args);
|
||||
args = CommandParser.parsePage(args);
|
||||
Location lo = CommandParser.parseLocation(player, args);
|
||||
// List<String> arg_uuids = new ArrayList<String>();
|
||||
List<String> argUsers = CommandHandler.parseUsers(args);
|
||||
Integer[] argRadius = CommandHandler.parseRadius(args, player, lo);
|
||||
int argNoisy = CommandHandler.parseNoisy(args);
|
||||
List<Integer> argAction = CommandHandler.parseAction(args);
|
||||
List<Object> argBlocks = CommandHandler.parseRestricted(player, args, argAction);
|
||||
Map<Object, Boolean> argExclude = CommandHandler.parseExcluded(player, args, argAction);
|
||||
List<String> argExcludeUsers = CommandHandler.parseExcludedUsers(player, args);
|
||||
String ts = CommandHandler.parseTimeString(args);
|
||||
long[] argTime = CommandHandler.parseTime(args);
|
||||
List<String> argUsers = CommandParser.parseUsers(args);
|
||||
Integer[] argRadius = CommandParser.parseRadius(args, player, lo);
|
||||
int argNoisy = CommandParser.parseNoisy(args);
|
||||
List<Integer> argAction = CommandParser.parseAction(args);
|
||||
List<Object> argBlocks = CommandParser.parseRestricted(player, args, argAction);
|
||||
Map<Object, Boolean> argExclude = CommandParser.parseExcluded(player, args, argAction);
|
||||
List<String> argExcludeUsers = CommandParser.parseExcludedUsers(player, args);
|
||||
String ts = CommandParser.parseTimeString(args);
|
||||
long[] argTime = CommandParser.parseTime(args);
|
||||
long startTime = argTime[0];
|
||||
long endTime = argTime[1];
|
||||
int argWid = CommandHandler.parseWorld(args, true, true);
|
||||
int parseRows = CommandHandler.parseRows(args);
|
||||
boolean count = CommandHandler.parseCount(args);
|
||||
boolean worldedit = CommandHandler.parseWorldEdit(args);
|
||||
boolean forceglobal = CommandHandler.parseForceGlobal(args);
|
||||
int argWid = CommandParser.parseWorld(args, true, true);
|
||||
int parseRows = CommandParser.parseRows(args);
|
||||
boolean count = CommandParser.parseCount(args);
|
||||
boolean worldedit = CommandParser.parseWorldEdit(args);
|
||||
boolean forceglobal = CommandParser.parseForceGlobal(args);
|
||||
boolean pageLookup = false;
|
||||
|
||||
if (argBlocks == null || argExclude == null || argExcludeUsers == null) {
|
||||
|
|
@ -126,7 +125,7 @@ public class LookupCommand {
|
|||
}
|
||||
|
||||
if (argWid == -1) {
|
||||
String worldName = CommandHandler.parseWorldName(args, true);
|
||||
String worldName = CommandParser.parseWorldName(args, true);
|
||||
Chat.sendMessage(player, new ChatMessage(Phrase.build(Phrase.WORLD_NOT_FOUND, worldName)).build());
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,14 +36,14 @@ public class PurgeCommand extends Consumer {
|
|||
|
||||
protected static void runCommand(final CommandSender player, boolean permission, String[] args) {
|
||||
int resultc = args.length;
|
||||
Location location = CommandHandler.parseLocation(player, args);
|
||||
final Integer[] argRadius = CommandHandler.parseRadius(args, player, location);
|
||||
final List<Integer> argAction = CommandHandler.parseAction(args);
|
||||
final List<Object> argBlocks = CommandHandler.parseRestricted(player, args, argAction);
|
||||
final Map<Object, Boolean> argExclude = CommandHandler.parseExcluded(player, args, argAction);
|
||||
final List<String> argExcludeUsers = CommandHandler.parseExcludedUsers(player, args);
|
||||
final long[] argTime = CommandHandler.parseTime(args);
|
||||
final int argWid = CommandHandler.parseWorld(args, false, false);
|
||||
Location location = CommandParser.parseLocation(player, args);
|
||||
final Integer[] argRadius = CommandParser.parseRadius(args, player, location);
|
||||
final List<Integer> argAction = CommandParser.parseAction(args);
|
||||
final List<Object> argBlocks = CommandParser.parseRestricted(player, args, argAction);
|
||||
final Map<Object, Boolean> argExclude = CommandParser.parseExcluded(player, args, argAction);
|
||||
final List<String> argExcludeUsers = CommandParser.parseExcludedUsers(player, args);
|
||||
final long[] argTime = CommandParser.parseTime(args);
|
||||
final int argWid = CommandParser.parseWorld(args, false, false);
|
||||
final List<Integer> supportedActions = Arrays.asList();
|
||||
long startTime = argTime[1] > 0 ? argTime[0] : 0;
|
||||
long endTime = argTime[1] > 0 ? argTime[1] : argTime[0];
|
||||
|
|
@ -77,7 +77,7 @@ public class PurgeCommand extends Consumer {
|
|||
return;
|
||||
}
|
||||
if (argWid == -1) {
|
||||
String worldName = CommandHandler.parseWorldName(args, false);
|
||||
String worldName = CommandParser.parseWorldName(args, false);
|
||||
Chat.sendMessage(player, new ChatMessage(Phrase.build(Phrase.WORLD_NOT_FOUND, worldName)).build());
|
||||
return;
|
||||
}
|
||||
|
|
@ -202,7 +202,7 @@ public class PurgeCommand extends Consumer {
|
|||
}
|
||||
|
||||
if (argWid > 0) {
|
||||
String worldName = CommandHandler.parseWorldName(args, false);
|
||||
String worldName = CommandParser.parseWorldName(args, false);
|
||||
Chat.sendGlobalMessage(player, Phrase.build(Phrase.PURGE_STARTED, worldName));
|
||||
}
|
||||
else {
|
||||
|
|
|
|||
|
|
@ -29,29 +29,28 @@ import net.coreprotect.language.Phrase;
|
|||
import net.coreprotect.language.Selector;
|
||||
import net.coreprotect.utility.Chat;
|
||||
import net.coreprotect.utility.Color;
|
||||
import net.coreprotect.utility.Util;
|
||||
import net.coreprotect.utility.WorldUtils;
|
||||
|
||||
public class RollbackRestoreCommand {
|
||||
protected static void runCommand(CommandSender player, Command command, boolean permission, String[] args, Location argLocation, long forceStart, long forceEnd) {
|
||||
Location lo = (argLocation != null ? argLocation : CommandHandler.parseLocation(player, args));
|
||||
Location lo = (argLocation != null ? argLocation : CommandParser.parseLocation(player, args));
|
||||
List<String> argUuids = new ArrayList<>();
|
||||
List<String> argUsers = CommandHandler.parseUsers(args);
|
||||
Integer[] argRadius = CommandHandler.parseRadius(args, player, lo);
|
||||
int argNoisy = CommandHandler.parseNoisy(args);
|
||||
List<Integer> argAction = CommandHandler.parseAction(args);
|
||||
List<Object> argBlocks = CommandHandler.parseRestricted(player, args, argAction);
|
||||
Map<Object, Boolean> argExclude = CommandHandler.parseExcluded(player, args, argAction);
|
||||
List<String> argExcludeUsers = CommandHandler.parseExcludedUsers(player, args);
|
||||
String ts = CommandHandler.parseTimeString(args);
|
||||
long[] argTime = CommandHandler.parseTime(args);
|
||||
List<String> argUsers = CommandParser.parseUsers(args);
|
||||
Integer[] argRadius = CommandParser.parseRadius(args, player, lo);
|
||||
int argNoisy = CommandParser.parseNoisy(args);
|
||||
List<Integer> argAction = CommandParser.parseAction(args);
|
||||
List<Object> argBlocks = CommandParser.parseRestricted(player, args, argAction);
|
||||
Map<Object, Boolean> argExclude = CommandParser.parseExcluded(player, args, argAction);
|
||||
List<String> argExcludeUsers = CommandParser.parseExcludedUsers(player, args);
|
||||
String ts = CommandParser.parseTimeString(args);
|
||||
long[] argTime = CommandParser.parseTime(args);
|
||||
long startTime = argTime[0];
|
||||
long endTime = argTime[1];
|
||||
int argWid = CommandHandler.parseWorld(args, true, true);
|
||||
boolean count = CommandHandler.parseCount(args);
|
||||
boolean worldedit = CommandHandler.parseWorldEdit(args);
|
||||
boolean forceglobal = CommandHandler.parseForceGlobal(args);
|
||||
int preview = CommandHandler.parsePreview(args);
|
||||
int argWid = CommandParser.parseWorld(args, true, true);
|
||||
boolean count = CommandParser.parseCount(args);
|
||||
boolean worldedit = CommandParser.parseWorldEdit(args);
|
||||
boolean forceglobal = CommandParser.parseForceGlobal(args);
|
||||
int preview = CommandParser.parsePreview(args);
|
||||
String corecommand = args[0].toLowerCase(Locale.ROOT);
|
||||
|
||||
if (argBlocks == null || argExclude == null || argExcludeUsers == null) {
|
||||
|
|
@ -112,7 +111,7 @@ public class RollbackRestoreCommand {
|
|||
return;
|
||||
}
|
||||
if (argWid == -1) {
|
||||
String worldName = CommandHandler.parseWorldName(args, true);
|
||||
String worldName = CommandParser.parseWorldName(args, true);
|
||||
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.WORLD_NOT_FOUND, worldName));
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -318,7 +318,7 @@ public class TabHandler implements TabCompleter {
|
|||
}
|
||||
|
||||
// add custom tags
|
||||
for (String tag : CommandHandler.getTags().keySet()) {
|
||||
for (String tag : CommandParser.getTags().keySet()) {
|
||||
materialList.add(tag);
|
||||
}
|
||||
|
||||
|
|
|
|||
228
src/main/java/net/coreprotect/command/parser/ActionParser.java
Normal file
228
src/main/java/net/coreprotect/command/parser/ActionParser.java
Normal file
|
|
@ -0,0 +1,228 @@
|
|||
package net.coreprotect.command.parser;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Parser for action-related command arguments
|
||||
*/
|
||||
public class ActionParser {
|
||||
|
||||
/**
|
||||
* Parse page from command arguments
|
||||
*
|
||||
* @param argumentArray
|
||||
* The command arguments
|
||||
* @return The processed argument array
|
||||
*/
|
||||
public static String[] parsePage(String[] argumentArray) {
|
||||
if (argumentArray.length == 2) {
|
||||
argumentArray[1] = argumentArray[1].replaceFirst("page:", "");
|
||||
}
|
||||
|
||||
return argumentArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse action from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return A list of action integers
|
||||
*/
|
||||
public static List<Integer> parseAction(String[] inputArguments) {
|
||||
String[] argumentArray = inputArguments.clone();
|
||||
List<Integer> result = new ArrayList<>();
|
||||
int count = 0;
|
||||
int next = 0;
|
||||
for (String argument : argumentArray) {
|
||||
if (count > 0) {
|
||||
argument = argument.trim().toLowerCase(Locale.ROOT);
|
||||
argument = argument.replaceAll("\\\\", "");
|
||||
argument = argument.replaceAll("'", "");
|
||||
|
||||
if (argument.equals("a:") || argument.equals("action:")) {
|
||||
next = 1;
|
||||
}
|
||||
else if (next == 1 || argument.startsWith("a:") || argument.startsWith("action:")) {
|
||||
result.clear();
|
||||
argument = argument.replaceAll("action:", "");
|
||||
argument = argument.replaceAll("a:", "");
|
||||
if (argument.startsWith("#")) {
|
||||
argument = argument.replaceFirst("#", "");
|
||||
}
|
||||
if (argument.equals("broke") || argument.equals("break") || argument.equals("remove") || argument.equals("destroy") || argument.equals("block-break") || argument.equals("block-remove") || argument.equals("-block") || argument.equals("-blocks") || argument.equals("block-")) {
|
||||
result.add(0);
|
||||
}
|
||||
else if (argument.equals("placed") || argument.equals("place") || argument.equals("block-place") || argument.equals("+block") || argument.equals("+blocks") || argument.equals("block+")) {
|
||||
result.add(1);
|
||||
}
|
||||
else if (argument.equals("block") || argument.equals("blocks") || argument.equals("block-change") || argument.equals("change") || argument.equals("changes")) {
|
||||
result.add(0);
|
||||
result.add(1);
|
||||
}
|
||||
else if (argument.equals("click") || argument.equals("clicks") || argument.equals("interact") || argument.equals("interaction") || argument.equals("player-interact") || argument.equals("player-interaction") || argument.equals("player-click")) {
|
||||
result.add(2);
|
||||
}
|
||||
else if (argument.equals("death") || argument.equals("deaths") || argument.equals("entity-death") || argument.equals("entity-deaths") || argument.equals("kill") || argument.equals("kills") || argument.equals("entity-kill") || argument.equals("entity-kills")) {
|
||||
result.add(3);
|
||||
}
|
||||
else if (argument.equals("container") || argument.equals("container-change") || argument.equals("containers") || argument.equals("chest") || argument.equals("transaction") || argument.equals("transactions")) {
|
||||
result.add(4);
|
||||
}
|
||||
else if (argument.equals("-container") || argument.equals("container-") || argument.equals("remove-container")) {
|
||||
result.add(4);
|
||||
result.add(0);
|
||||
}
|
||||
else if (argument.equals("+container") || argument.equals("container+") || argument.equals("container-add") || argument.equals("add-container")) {
|
||||
result.add(4);
|
||||
result.add(1);
|
||||
}
|
||||
else if (argument.equals("chat") || argument.equals("chats")) {
|
||||
result.add(6);
|
||||
}
|
||||
else if (argument.equals("command") || argument.equals("commands")) {
|
||||
result.add(7);
|
||||
}
|
||||
else if (argument.equals("logins") || argument.equals("login") || argument.equals("+session") || argument.equals("+sessions") || argument.equals("session+") || argument.equals("+connection") || argument.equals("connection+")) {
|
||||
result.add(8);
|
||||
result.add(1);
|
||||
}
|
||||
else if (argument.equals("logout") || argument.equals("logouts") || argument.equals("-session") || argument.equals("-sessions") || argument.equals("session-") || argument.equals("-connection") || argument.equals("connection-")) {
|
||||
result.add(8);
|
||||
result.add(0);
|
||||
}
|
||||
else if (argument.equals("session") || argument.equals("sessions") || argument.equals("connection") || argument.equals("connections")) {
|
||||
result.add(8);
|
||||
}
|
||||
else if (argument.equals("username") || argument.equals("usernames") || argument.equals("user") || argument.equals("users") || argument.equals("name") || argument.equals("names") || argument.equals("uuid") || argument.equals("uuids") || argument.equals("username-change") || argument.equals("username-changes") || argument.equals("name-change") || argument.equals("name-changes")) {
|
||||
result.add(9);
|
||||
}
|
||||
else if (argument.equals("sign") || argument.equals("signs")) {
|
||||
result.add(10);
|
||||
}
|
||||
else if (argument.equals("inv") || argument.equals("inventory") || argument.equals("inventories")) {
|
||||
result.add(4); // container
|
||||
result.add(11); // item
|
||||
}
|
||||
else if (argument.equals("-inv") || argument.equals("inv-") || argument.equals("-inventory") || argument.equals("inventory-") || argument.equals("-inventories")) {
|
||||
result.add(4);
|
||||
result.add(11);
|
||||
result.add(1);
|
||||
}
|
||||
else if (argument.equals("+inv") || argument.equals("inv+") || argument.equals("+inventory") || argument.equals("inventory+") || argument.equals("+inventories")) {
|
||||
result.add(4);
|
||||
result.add(11);
|
||||
result.add(0);
|
||||
}
|
||||
else if (argument.equals("item") || argument.equals("items")) {
|
||||
result.add(11);
|
||||
}
|
||||
else if (argument.equals("-item") || argument.equals("item-") || argument.equals("-items") || argument.equals("items-") || argument.equals("drop") || argument.equals("drops") || argument.equals("deposit") || argument.equals("deposits") || argument.equals("deposited")) {
|
||||
result.add(11);
|
||||
result.add(0);
|
||||
}
|
||||
else if (argument.equals("+item") || argument.equals("item+") || argument.equals("+items") || argument.equals("items+") || argument.equals("pickup") || argument.equals("pickups") || argument.equals("withdraw") || argument.equals("withdraws") || argument.equals("withdrew")) {
|
||||
result.add(11);
|
||||
result.add(1);
|
||||
}
|
||||
else {
|
||||
result.add(-1);
|
||||
}
|
||||
next = 0;
|
||||
}
|
||||
else {
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse count flag from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return true if the count flag is present
|
||||
*/
|
||||
public static boolean parseCount(String[] inputArguments) {
|
||||
String[] argumentArray = inputArguments.clone();
|
||||
boolean result = false;
|
||||
int count = 0;
|
||||
for (String argument : argumentArray) {
|
||||
if (count > 0) {
|
||||
argument = argument.trim().toLowerCase(Locale.ROOT);
|
||||
argument = argument.replaceAll("\\\\", "");
|
||||
argument = argument.replaceAll("'", "");
|
||||
if (argument.equals("#count") || argument.equals("#sum")) {
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse noisy flag from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return 1 if noisy/verbose mode is enabled, 0 otherwise
|
||||
*/
|
||||
public static int parseNoisy(String[] inputArguments) {
|
||||
String[] argumentArray = inputArguments.clone();
|
||||
int noisy = 0;
|
||||
int count = 0;
|
||||
if (net.coreprotect.config.Config.getGlobal().VERBOSE) {
|
||||
noisy = 1;
|
||||
}
|
||||
for (String argument : argumentArray) {
|
||||
if (count > 0) {
|
||||
argument = argument.trim().toLowerCase(Locale.ROOT);
|
||||
argument = argument.replaceAll("\\\\", "");
|
||||
argument = argument.replaceAll("'", "");
|
||||
|
||||
if (argument.equals("n") || argument.equals("noisy") || argument.equals("v") || argument.equals("verbose") || argument.equals("#v") || argument.equals("#verbose")) {
|
||||
noisy = 1;
|
||||
}
|
||||
else if (argument.equals("#silent")) {
|
||||
noisy = 0;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
return noisy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse preview flag from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return 1 for preview, 2 for preview cancel, 0 otherwise
|
||||
*/
|
||||
public static int parsePreview(String[] inputArguments) {
|
||||
String[] argumentArray = inputArguments.clone();
|
||||
int result = 0;
|
||||
int count = 0;
|
||||
for (String argument : argumentArray) {
|
||||
if (count > 0) {
|
||||
argument = argument.trim().toLowerCase(Locale.ROOT);
|
||||
argument = argument.replaceAll("\\\\", "");
|
||||
argument = argument.replaceAll("'", "");
|
||||
if (argument.equals("#preview")) {
|
||||
result = 1;
|
||||
}
|
||||
else if (argument.equals("#preview_cancel")) {
|
||||
result = 2;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
229
src/main/java/net/coreprotect/command/parser/LocationParser.java
Normal file
229
src/main/java/net/coreprotect/command/parser/LocationParser.java
Normal file
|
|
@ -0,0 +1,229 @@
|
|||
package net.coreprotect.command.parser;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.command.BlockCommandSender;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import net.coreprotect.bukkit.BukkitAdapter;
|
||||
import net.coreprotect.utility.WorldUtils;
|
||||
|
||||
/**
|
||||
* Parser for location-related command arguments
|
||||
*/
|
||||
public class LocationParser {
|
||||
|
||||
/**
|
||||
* Parse location from command sender and command arguments
|
||||
*
|
||||
* @param user
|
||||
* The command sender
|
||||
* @param argumentArray
|
||||
* The command arguments
|
||||
* @return The parsed location
|
||||
*/
|
||||
public static Location parseLocation(CommandSender user, String[] argumentArray) {
|
||||
Location location = null;
|
||||
if (user instanceof Player) {
|
||||
location = ((Player) user).getLocation();
|
||||
}
|
||||
else if (user instanceof BlockCommandSender) {
|
||||
location = ((BlockCommandSender) user).getBlock().getLocation();
|
||||
}
|
||||
|
||||
return parseCoordinates(location, argumentArray, WorldParser.parseWorld(argumentArray, true, true));
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse coordinates from command arguments and apply them to a location
|
||||
*
|
||||
* @param location
|
||||
* The base location
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @param worldId
|
||||
* The world ID
|
||||
* @return The modified location
|
||||
*/
|
||||
public static Location parseCoordinates(Location location, String[] inputArguments, int worldId) {
|
||||
String[] argumentArray = inputArguments.clone();
|
||||
int count = 0;
|
||||
int next = 0;
|
||||
for (String argument : argumentArray) {
|
||||
if (count > 0) {
|
||||
argument = argument.trim().toLowerCase(Locale.ROOT);
|
||||
argument = argument.replaceAll("\\\\", "");
|
||||
argument = argument.replaceAll("'", "");
|
||||
|
||||
if (argument.equals("position:") || argument.equals("location:") || argument.equals("c:") || argument.equals("coord:") || argument.equals("coords:") || argument.equals("cord:") || argument.equals("cords:") || argument.equals("coordinate:") || argument.equals("coordinates:") || argument.equals("cordinate:") || argument.equals("cordinates:")) {
|
||||
next = 2;
|
||||
}
|
||||
else if (next == 2 || argument.startsWith("c:") || argument.startsWith("coord:") || argument.startsWith("coords:") || argument.startsWith("cord:") || argument.startsWith("cords:") || argument.startsWith("coordinate:") || argument.startsWith("coordinates:") || argument.startsWith("cordinate:") || argument.startsWith("cordinates:")) {
|
||||
argument = argument.replaceAll("coordinates:", "");
|
||||
argument = argument.replaceAll("coordinate:", "");
|
||||
argument = argument.replaceAll("cordinates:", "");
|
||||
argument = argument.replaceAll("cordinate:", "");
|
||||
argument = argument.replaceAll("coords:", "");
|
||||
argument = argument.replaceAll("coord:", "");
|
||||
argument = argument.replaceAll("cords:", "");
|
||||
argument = argument.replaceAll("cord:", "");
|
||||
argument = argument.replaceAll("c:", "");
|
||||
if (argument.contains(",")) {
|
||||
String[] i2 = argument.split(",");
|
||||
double x = 0.00;
|
||||
double y = 0.00;
|
||||
double z = 0.00;
|
||||
int cCount = 0;
|
||||
for (String coord : i2) {
|
||||
coord = coord.replaceAll("[^0-9.\\-]", "");
|
||||
if (coord.length() > 0 && !coord.equals(".") && !coord.equals("-") && coord.indexOf('.') == coord.lastIndexOf('.')) {
|
||||
double parsedCoord = Double.parseDouble(coord);
|
||||
if (cCount == 0) {
|
||||
x = parsedCoord;
|
||||
}
|
||||
else if (cCount == 1) {
|
||||
z = parsedCoord;
|
||||
}
|
||||
else if (cCount == 2) {
|
||||
y = z;
|
||||
z = parsedCoord;
|
||||
}
|
||||
cCount++;
|
||||
}
|
||||
}
|
||||
if (cCount > 1) {
|
||||
if (location == null && worldId > 0) {
|
||||
location = new Location(Bukkit.getWorld(WorldUtils.getWorldName(worldId)), 0, 0, 0);
|
||||
}
|
||||
if (location != null) {
|
||||
int worldMaxHeight = location.getWorld().getMaxHeight() - 1;
|
||||
int worldMinHeight = BukkitAdapter.ADAPTER.getMinHeight(location.getWorld());
|
||||
|
||||
if (y < worldMinHeight) {
|
||||
y = Double.valueOf(worldMinHeight);
|
||||
}
|
||||
if (y > worldMaxHeight) {
|
||||
y = Double.valueOf(worldMaxHeight);
|
||||
}
|
||||
|
||||
location.setX(x);
|
||||
location.setY(y);
|
||||
location.setZ(z);
|
||||
}
|
||||
}
|
||||
}
|
||||
next = 0;
|
||||
}
|
||||
else {
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
return location;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse radius from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @param user
|
||||
* The command sender
|
||||
* @param location
|
||||
* The base location
|
||||
* @return The parsed radius
|
||||
*/
|
||||
public static Integer[] parseRadius(String[] inputArguments, CommandSender user, Location location) {
|
||||
String[] argumentArray = inputArguments.clone();
|
||||
Integer[] radius = null;
|
||||
int count = 0;
|
||||
int next = 0;
|
||||
for (String argument : argumentArray) {
|
||||
if (count > 0) {
|
||||
argument = argument.trim().toLowerCase(Locale.ROOT);
|
||||
argument = argument.replaceAll("\\\\", "");
|
||||
argument = argument.replaceAll("'", "");
|
||||
|
||||
if (argument.equals("r:") || argument.equals("radius:")) {
|
||||
next = 2;
|
||||
}
|
||||
else if (next == 2 || argument.startsWith("r:") || argument.startsWith("radius:")) {
|
||||
argument = argument.replaceAll("radius:", "");
|
||||
argument = argument.replaceAll("r:", "");
|
||||
if (argument.equals("#worldedit") || argument.equals("#we")) {
|
||||
// For WorldEdit, we'll need to use the original CommandParser since
|
||||
// the WorldEditHandler.runWorldEditCommand method is protected
|
||||
return null; // Let CommandParser handle this case
|
||||
}
|
||||
else if ((argument.startsWith("#") && argument.length() > 1) || argument.equals("global") || argument.equals("off") || argument.equals("-1") || argument.equals("none") || argument.equals("false")) {
|
||||
// radius = -2;
|
||||
}
|
||||
else {
|
||||
int rcount = 0;
|
||||
int r_x = 0;
|
||||
int r_y = -1;
|
||||
int r_z = 0;
|
||||
String[] r_dat = new String[] { argument };
|
||||
boolean validRadius = false;
|
||||
if (argument.contains("x")) {
|
||||
r_dat = argument.split("x");
|
||||
}
|
||||
for (String value : r_dat) {
|
||||
String i4 = value.replaceAll("[^0-9.]", "");
|
||||
if (i4.length() > 0 && i4.length() == value.length() && i4.replaceAll("[^0-9]", "").length() > 0 && i4.indexOf('.') == i4.lastIndexOf('.')) {
|
||||
double a1 = Double.parseDouble(i4);
|
||||
if (rcount == 0) { // x
|
||||
r_x = (int) a1;
|
||||
r_z = (int) a1;
|
||||
}
|
||||
else if (rcount == 1) { // y
|
||||
r_y = (int) a1;
|
||||
}
|
||||
else if (rcount == 2) { // z
|
||||
r_z = (int) a1;
|
||||
}
|
||||
validRadius = true;
|
||||
}
|
||||
rcount++;
|
||||
}
|
||||
if (location != null) {
|
||||
Integer xmin = location.getBlockX() - r_x;
|
||||
Integer xmax = location.getBlockX() + r_x;
|
||||
Integer ymin = null;
|
||||
Integer ymax = null;
|
||||
Integer zmin = location.getBlockZ() - r_z;
|
||||
Integer zmax = location.getBlockZ() + r_z;
|
||||
if (r_y > -1) {
|
||||
ymin = location.getBlockY() - r_y;
|
||||
ymax = location.getBlockY() + r_y;
|
||||
}
|
||||
int max = r_x;
|
||||
if (r_y > max) {
|
||||
max = r_y;
|
||||
}
|
||||
if (r_z > max) {
|
||||
max = r_z;
|
||||
}
|
||||
if (validRadius) {
|
||||
radius = new Integer[] { max, xmin, xmax, ymin, ymax, zmin, zmax, 0 };
|
||||
}
|
||||
else {
|
||||
radius = new Integer[] { -1 };
|
||||
}
|
||||
}
|
||||
}
|
||||
next = 0;
|
||||
}
|
||||
else {
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
return radius;
|
||||
}
|
||||
}
|
||||
308
src/main/java/net/coreprotect/command/parser/MaterialParser.java
Normal file
308
src/main/java/net/coreprotect/command/parser/MaterialParser.java
Normal file
|
|
@ -0,0 +1,308 @@
|
|||
package net.coreprotect.command.parser;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.EntityType;
|
||||
|
||||
import net.coreprotect.language.Phrase;
|
||||
import net.coreprotect.model.BlockGroup;
|
||||
import net.coreprotect.utility.Chat;
|
||||
import net.coreprotect.utility.Color;
|
||||
import net.coreprotect.utility.EntityUtils;
|
||||
import net.coreprotect.utility.MaterialUtils;
|
||||
|
||||
/**
|
||||
* Parser for material and entity related command arguments
|
||||
*/
|
||||
public class MaterialParser {
|
||||
|
||||
/**
|
||||
* Parse restricted materials and entities from command arguments
|
||||
*
|
||||
* @param player
|
||||
* The command sender
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @param argAction
|
||||
* The list of actions to include
|
||||
* @return A list of restricted materials and entities
|
||||
*/
|
||||
public static List<Object> parseRestricted(CommandSender player, String[] inputArguments, List<Integer> argAction) {
|
||||
String[] argumentArray = inputArguments.clone();
|
||||
List<Object> restricted = new ArrayList<>();
|
||||
int count = 0;
|
||||
int next = 0;
|
||||
for (String argument : argumentArray) {
|
||||
if (count > 0) {
|
||||
argument = argument.trim().toLowerCase(Locale.ROOT);
|
||||
argument = argument.replaceAll("\\\\", "");
|
||||
argument = argument.replaceAll("'", "");
|
||||
|
||||
if (argument.equals("i:") || argument.equals("include:") || argument.equals("item:") || argument.equals("items:") || argument.equals("b:") || argument.equals("block:") || argument.equals("blocks:")) {
|
||||
next = 4;
|
||||
}
|
||||
else if (next == 4 || argument.startsWith("i:") || argument.startsWith("include:") || argument.startsWith("item:") || argument.startsWith("items:") || argument.startsWith("b:") || argument.startsWith("block:") || argument.startsWith("blocks:")) {
|
||||
argument = argument.replaceAll("include:", "");
|
||||
argument = argument.replaceAll("i:", "");
|
||||
argument = argument.replaceAll("items:", "");
|
||||
argument = argument.replaceAll("item:", "");
|
||||
argument = argument.replaceAll("blocks:", "");
|
||||
argument = argument.replaceAll("block:", "");
|
||||
argument = argument.replaceAll("b:", "");
|
||||
if (argument.contains(",")) {
|
||||
String[] i2 = argument.split(",");
|
||||
for (String i3 : i2) {
|
||||
if (!checkTags(i3, restricted)) {
|
||||
Material i3_material = MaterialUtils.getType(i3);
|
||||
if (i3_material != null && (i3_material.isBlock() || argAction.contains(4))) {
|
||||
restricted.add(i3_material);
|
||||
}
|
||||
else {
|
||||
EntityType i3_entity = EntityUtils.getEntityType(i3);
|
||||
if (i3_entity != null) {
|
||||
restricted.add(i3_entity);
|
||||
}
|
||||
else if (i3_material != null) {
|
||||
restricted.add(i3_material);
|
||||
}
|
||||
else {
|
||||
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.INVALID_INCLUDE, i3));
|
||||
// Functions.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.MISSING_PARAMETERS, "/co help include"));
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (argument.endsWith(",")) {
|
||||
next = 4;
|
||||
}
|
||||
else {
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (!checkTags(argument, restricted)) {
|
||||
Material material = MaterialUtils.getType(argument);
|
||||
if (material != null && (material.isBlock() || argAction.contains(4))) {
|
||||
restricted.add(material);
|
||||
}
|
||||
else {
|
||||
EntityType entityType = EntityUtils.getEntityType(argument);
|
||||
if (entityType != null) {
|
||||
restricted.add(entityType);
|
||||
}
|
||||
else if (material != null) {
|
||||
restricted.add(material);
|
||||
}
|
||||
else {
|
||||
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.INVALID_INCLUDE, argument));
|
||||
// Functions.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.MISSING_PARAMETERS, "/co help include"));
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
return restricted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse excluded materials and entities from command arguments
|
||||
*
|
||||
* @param player
|
||||
* The command sender
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @param argAction
|
||||
* The list of actions to include
|
||||
* @return A map of excluded materials and entities
|
||||
*/
|
||||
public static Map<Object, Boolean> parseExcluded(CommandSender player, String[] inputArguments, List<Integer> argAction) {
|
||||
String[] argumentArray = inputArguments.clone();
|
||||
Map<Object, Boolean> excluded = new HashMap<>();
|
||||
int count = 0;
|
||||
int next = 0;
|
||||
for (String argument : argumentArray) {
|
||||
if (count > 0) {
|
||||
argument = argument.trim().toLowerCase(Locale.ROOT);
|
||||
argument = argument.replaceAll("\\\\", "");
|
||||
argument = argument.replaceAll("'", "");
|
||||
|
||||
if (argument.equals("e:") || argument.equals("exclude:")) {
|
||||
next = 5;
|
||||
}
|
||||
else if (next == 5 || argument.startsWith("e:") || argument.startsWith("exclude:")) {
|
||||
argument = argument.replaceAll("exclude:", "");
|
||||
argument = argument.replaceAll("e:", "");
|
||||
if (argument.contains(",")) {
|
||||
String[] i2 = argument.split(",");
|
||||
for (String i3 : i2) {
|
||||
if (!checkTags(i3, excluded)) {
|
||||
Material i3_material = MaterialUtils.getType(i3);
|
||||
if (i3_material != null && (i3_material.isBlock() || argAction.contains(4))) {
|
||||
excluded.put(i3_material, false);
|
||||
}
|
||||
else {
|
||||
EntityType i3_entity = EntityUtils.getEntityType(i3);
|
||||
if (i3_entity != null) {
|
||||
excluded.put(i3_entity, false);
|
||||
}
|
||||
else if (i3_material != null) {
|
||||
excluded.put(i3_material, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (argument.endsWith(",")) {
|
||||
next = 5;
|
||||
}
|
||||
else {
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (!checkTags(argument, excluded)) {
|
||||
Material iMaterial = MaterialUtils.getType(argument);
|
||||
if (iMaterial != null && (iMaterial.isBlock() || argAction.contains(4))) {
|
||||
excluded.put(iMaterial, false);
|
||||
}
|
||||
else {
|
||||
EntityType iEntity = EntityUtils.getEntityType(argument);
|
||||
if (iEntity != null) {
|
||||
excluded.put(iEntity, false);
|
||||
}
|
||||
else if (iMaterial != null) {
|
||||
excluded.put(iMaterial, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
return excluded;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a map of block tags and their associated materials
|
||||
*
|
||||
* @return A map of block tags and their associated materials
|
||||
*/
|
||||
public static Map<String, Set<Material>> getTags() {
|
||||
Map<String, Set<Material>> tagMap = new HashMap<>();
|
||||
tagMap.put("#button", BlockGroup.BUTTONS);
|
||||
tagMap.put("#container", BlockGroup.CONTAINERS);
|
||||
tagMap.put("#door", BlockGroup.DOORS);
|
||||
tagMap.put("#natural", BlockGroup.NATURAL_BLOCKS);
|
||||
tagMap.put("#pressure_plate", BlockGroup.PRESSURE_PLATES);
|
||||
tagMap.put("#shulker_box", BlockGroup.SHULKER_BOXES);
|
||||
return tagMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an argument matches a block tag
|
||||
*
|
||||
* @param argument
|
||||
* The argument to check
|
||||
* @return true if the argument matches a block tag
|
||||
*/
|
||||
public static boolean checkTags(String argument) {
|
||||
return getTags().containsKey(argument);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an argument matches a block tag and add the associated materials to the list
|
||||
*
|
||||
* @param argument
|
||||
* The argument to check
|
||||
* @param list
|
||||
* The list to add the associated materials to
|
||||
* @return true if the argument matches a block tag
|
||||
*/
|
||||
public static boolean checkTags(String argument, Map<Object, Boolean> list) {
|
||||
for (Entry<String, Set<Material>> entry : getTags().entrySet()) {
|
||||
String tag = entry.getKey();
|
||||
Set<Material> materials = entry.getValue();
|
||||
|
||||
if (argument.equals(tag)) {
|
||||
for (Material block : materials) {
|
||||
list.put(block, false);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an argument matches a block tag and add the associated materials to the list
|
||||
*
|
||||
* @param argument
|
||||
* The argument to check
|
||||
* @param list
|
||||
* The list to add the associated materials to
|
||||
* @return true if the argument matches a block tag
|
||||
*/
|
||||
public static boolean checkTags(String argument, List<Object> list) {
|
||||
for (Entry<String, Set<Material>> entry : getTags().entrySet()) {
|
||||
String tag = entry.getKey();
|
||||
Set<Material> materials = entry.getValue();
|
||||
|
||||
if (argument.equals(tag)) {
|
||||
list.addAll(materials);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a string represents a block or entity
|
||||
*
|
||||
* @param argument
|
||||
* The string to check
|
||||
* @return true if the string represents a block or entity
|
||||
*/
|
||||
public static boolean isBlockOrEntity(String argument) {
|
||||
boolean isBlock = false;
|
||||
if (checkTags(argument)) {
|
||||
isBlock = true;
|
||||
}
|
||||
else {
|
||||
Material material = MaterialUtils.getType(argument);
|
||||
if (material != null) {
|
||||
isBlock = true;
|
||||
}
|
||||
else {
|
||||
EntityType entityType = EntityUtils.getEntityType(argument);
|
||||
if (entityType != null) {
|
||||
isBlock = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return isBlock;
|
||||
}
|
||||
}
|
||||
298
src/main/java/net/coreprotect/command/parser/TimeParser.java
Normal file
298
src/main/java/net/coreprotect/command/parser/TimeParser.java
Normal file
|
|
@ -0,0 +1,298 @@
|
|||
package net.coreprotect.command.parser;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Locale;
|
||||
|
||||
import net.coreprotect.language.Phrase;
|
||||
import net.coreprotect.language.Selector;
|
||||
|
||||
/**
|
||||
* Parser for time-related command arguments
|
||||
*/
|
||||
public class TimeParser {
|
||||
|
||||
/**
|
||||
* Parse time from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return An array of two longs - [time1, time2]
|
||||
*/
|
||||
public static long[] parseTime(String[] inputArguments) {
|
||||
String[] argumentArray = inputArguments.clone();
|
||||
long timeStart = 0;
|
||||
long timeEnd = 0;
|
||||
int count = 0;
|
||||
int next = 0;
|
||||
boolean range = false;
|
||||
double w = 0;
|
||||
double d = 0;
|
||||
double h = 0;
|
||||
double m = 0;
|
||||
double s = 0;
|
||||
for (String argument : argumentArray) {
|
||||
if (count > 0) {
|
||||
argument = argument.trim().toLowerCase(Locale.ROOT);
|
||||
argument = argument.replaceAll("\\\\", "");
|
||||
argument = argument.replaceAll("'", "");
|
||||
|
||||
if (argument.equals("t:") || argument.equals("time:")) {
|
||||
next = 1;
|
||||
}
|
||||
else if (next == 1 || argument.startsWith("t:") || argument.startsWith("time:")) {
|
||||
// time arguments
|
||||
argument = argument.replaceAll("time:", "");
|
||||
argument = argument.replaceAll("t:", "");
|
||||
argument = argument.replaceAll("y", "y:");
|
||||
argument = argument.replaceAll("m", "m:");
|
||||
argument = argument.replaceAll("w", "w:");
|
||||
argument = argument.replaceAll("d", "d:");
|
||||
argument = argument.replaceAll("h", "h:");
|
||||
argument = argument.replaceAll("s", "s:");
|
||||
range = argument.contains("-");
|
||||
|
||||
int argCount = 0;
|
||||
String[] i2 = argument.split(":");
|
||||
for (String i3 : i2) {
|
||||
if (range && argCount > 0 && timeStart == 0 && i3.startsWith("-")) {
|
||||
timeStart = (long) (((w * 7 * 24 * 60 * 60) + (d * 24 * 60 * 60) + (h * 60 * 60) + (m * 60) + s));
|
||||
w = 0;
|
||||
d = 0;
|
||||
h = 0;
|
||||
m = 0;
|
||||
s = 0;
|
||||
}
|
||||
|
||||
if (i3.endsWith("w") && w == 0) {
|
||||
String i4 = i3.replaceAll("[^0-9.]", "");
|
||||
if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 && i4.indexOf('.') == i4.lastIndexOf('.')) {
|
||||
w = Double.parseDouble(i4);
|
||||
}
|
||||
}
|
||||
else if (i3.endsWith("d") && d == 0) {
|
||||
String i4 = i3.replaceAll("[^0-9.]", "");
|
||||
if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 && i4.indexOf('.') == i4.lastIndexOf('.')) {
|
||||
d = Double.parseDouble(i4);
|
||||
}
|
||||
}
|
||||
else if (i3.endsWith("h") && h == 0) {
|
||||
String i4 = i3.replaceAll("[^0-9.]", "");
|
||||
if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 && i4.indexOf('.') == i4.lastIndexOf('.')) {
|
||||
h = Double.parseDouble(i4);
|
||||
}
|
||||
}
|
||||
else if (i3.endsWith("m") && m == 0) {
|
||||
String i4 = i3.replaceAll("[^0-9.]", "");
|
||||
if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 && i4.indexOf('.') == i4.lastIndexOf('.')) {
|
||||
m = Double.parseDouble(i4);
|
||||
}
|
||||
}
|
||||
else if (i3.endsWith("s") && s == 0) {
|
||||
String i4 = i3.replaceAll("[^0-9.]", "");
|
||||
if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 && i4.indexOf('.') == i4.lastIndexOf('.')) {
|
||||
s = Double.parseDouble(i4);
|
||||
}
|
||||
}
|
||||
|
||||
argCount++;
|
||||
}
|
||||
if (timeStart > 0) {
|
||||
timeEnd = (long) (((w * 7 * 24 * 60 * 60) + (d * 24 * 60 * 60) + (h * 60 * 60) + (m * 60) + s));
|
||||
}
|
||||
else {
|
||||
timeStart = (long) (((w * 7 * 24 * 60 * 60) + (d * 24 * 60 * 60) + (h * 60 * 60) + (m * 60) + s));
|
||||
}
|
||||
next = 0;
|
||||
}
|
||||
else {
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
|
||||
if (timeEnd >= timeStart) {
|
||||
return new long[] { timeEnd, timeStart };
|
||||
}
|
||||
else {
|
||||
return new long[] { timeStart, timeEnd };
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse time string from command arguments for display
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return A formatted time string
|
||||
*/
|
||||
public static String parseTimeString(String[] inputArguments) {
|
||||
String[] argumentArray = inputArguments.clone();
|
||||
String time = "";
|
||||
int count = 0;
|
||||
int next = 0;
|
||||
boolean range = false;
|
||||
BigDecimal w = new BigDecimal(0);
|
||||
BigDecimal d = new BigDecimal(0);
|
||||
BigDecimal h = new BigDecimal(0);
|
||||
BigDecimal m = new BigDecimal(0);
|
||||
BigDecimal s = new BigDecimal(0);
|
||||
for (String argument : argumentArray) {
|
||||
if (count > 0) {
|
||||
argument = argument.trim().toLowerCase(Locale.ROOT);
|
||||
argument = argument.replaceAll("\\\\", "");
|
||||
argument = argument.replaceAll("'", "");
|
||||
|
||||
if (argument.equals("t:") || argument.equals("time:")) {
|
||||
next = 1;
|
||||
}
|
||||
else if (next == 1 || argument.startsWith("t:") || argument.startsWith("time:")) {
|
||||
// time arguments
|
||||
argument = argument.replaceAll("time:", "");
|
||||
argument = argument.replaceAll("t:", "");
|
||||
argument = argument.replaceAll("y", "y:");
|
||||
argument = argument.replaceAll("m", "m:");
|
||||
argument = argument.replaceAll("w", "w:");
|
||||
argument = argument.replaceAll("d", "d:");
|
||||
argument = argument.replaceAll("h", "h:");
|
||||
argument = argument.replaceAll("s", "s:");
|
||||
range = argument.contains("-");
|
||||
|
||||
int argCount = 0;
|
||||
String[] i2 = argument.split(":");
|
||||
for (String i3 : i2) {
|
||||
if (range && argCount > 0 && !time.contains("-") && i3.startsWith("-")) {
|
||||
w = new BigDecimal(0);
|
||||
d = new BigDecimal(0);
|
||||
h = new BigDecimal(0);
|
||||
m = new BigDecimal(0);
|
||||
s = new BigDecimal(0);
|
||||
time = time + " -";
|
||||
}
|
||||
|
||||
if (i3.endsWith("w") && w.intValue() == 0) {
|
||||
String i4 = i3.replaceAll("[^0-9.]", "");
|
||||
if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 && i4.indexOf('.') == i4.lastIndexOf('.')) {
|
||||
w = new BigDecimal(i4);
|
||||
if (range) {
|
||||
time = time + " " + timeString(w) + "w";
|
||||
}
|
||||
else {
|
||||
time = time + " " + Phrase.build(Phrase.TIME_WEEKS, timeString(w), (w.doubleValue() == 1 ? Selector.FIRST : Selector.SECOND));
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (i3.endsWith("d") && d.intValue() == 0) {
|
||||
String i4 = i3.replaceAll("[^0-9.]", "");
|
||||
if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 && i4.indexOf('.') == i4.lastIndexOf('.')) {
|
||||
d = new BigDecimal(i4);
|
||||
if (range) {
|
||||
time = time + " " + timeString(d) + "d";
|
||||
}
|
||||
else {
|
||||
time = time + " " + Phrase.build(Phrase.TIME_DAYS, timeString(d), (d.doubleValue() == 1 ? Selector.FIRST : Selector.SECOND));
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (i3.endsWith("h") && h.intValue() == 0) {
|
||||
String i4 = i3.replaceAll("[^0-9.]", "");
|
||||
if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 && i4.indexOf('.') == i4.lastIndexOf('.')) {
|
||||
h = new BigDecimal(i4);
|
||||
if (range) {
|
||||
time = time + " " + timeString(h) + "h";
|
||||
}
|
||||
else {
|
||||
time = time + " " + Phrase.build(Phrase.TIME_HOURS, timeString(h), (h.doubleValue() == 1 ? Selector.FIRST : Selector.SECOND));
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (i3.endsWith("m") && m.intValue() == 0) {
|
||||
String i4 = i3.replaceAll("[^0-9.]", "");
|
||||
if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 && i4.indexOf('.') == i4.lastIndexOf('.')) {
|
||||
m = new BigDecimal(i4);
|
||||
if (range) {
|
||||
time = time + " " + timeString(m) + "m";
|
||||
}
|
||||
else {
|
||||
time = time + " " + Phrase.build(Phrase.TIME_MINUTES, timeString(m), (m.doubleValue() == 1 ? Selector.FIRST : Selector.SECOND));
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (i3.endsWith("s") && s.intValue() == 0) {
|
||||
String i4 = i3.replaceAll("[^0-9.]", "");
|
||||
if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 && i4.indexOf('.') == i4.lastIndexOf('.')) {
|
||||
s = new BigDecimal(i4);
|
||||
if (range) {
|
||||
time = time + " " + timeString(s) + "s";
|
||||
}
|
||||
else {
|
||||
time = time + " " + Phrase.build(Phrase.TIME_SECONDS, timeString(s), (s.doubleValue() == 1 ? Selector.FIRST : Selector.SECOND));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
argCount++;
|
||||
}
|
||||
next = 0;
|
||||
}
|
||||
else {
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
|
||||
if (time.startsWith(" ")) {
|
||||
time = time.substring(1);
|
||||
}
|
||||
|
||||
return time;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse rows from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return The number of rows
|
||||
*/
|
||||
public static int parseRows(String[] inputArguments) {
|
||||
String[] argumentArray = inputArguments.clone();
|
||||
int rows = 0;
|
||||
int count = 0;
|
||||
int next = 0;
|
||||
|
||||
for (String argument : argumentArray) {
|
||||
if (count > 0) {
|
||||
argument = argument.trim().toLowerCase(Locale.ROOT);
|
||||
argument = argument.replaceAll("\\\\", "");
|
||||
argument = argument.replaceAll("'", "");
|
||||
|
||||
if (argument.equals("rows:")) {
|
||||
next = 1;
|
||||
}
|
||||
else if (next == 1 || argument.startsWith("rows:")) {
|
||||
argument = argument.replaceAll("rows:", "").trim();
|
||||
if (!argument.startsWith("-")) {
|
||||
String i2 = argument.replaceAll("[^0-9]", "");
|
||||
if (i2.length() > 0 && i2.length() < 10) {
|
||||
rows = Integer.parseInt(i2);
|
||||
}
|
||||
}
|
||||
|
||||
next = 0;
|
||||
}
|
||||
else {
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
|
||||
return rows;
|
||||
}
|
||||
|
||||
private static String timeString(BigDecimal input) {
|
||||
return input.stripTrailingZeros().toPlainString();
|
||||
}
|
||||
}
|
||||
160
src/main/java/net/coreprotect/command/parser/UserParser.java
Normal file
160
src/main/java/net/coreprotect/command/parser/UserParser.java
Normal file
|
|
@ -0,0 +1,160 @@
|
|||
package net.coreprotect.command.parser;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
/**
|
||||
* Parser for user-related command arguments
|
||||
*/
|
||||
public class UserParser {
|
||||
|
||||
/**
|
||||
* Parse users from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return A list of parsed users
|
||||
*/
|
||||
public static List<String> parseUsers(String[] inputArguments) {
|
||||
String[] argumentArray = inputArguments.clone();
|
||||
List<String> users = new ArrayList<>();
|
||||
int count = 0;
|
||||
int next = 0;
|
||||
for (String argument : argumentArray) {
|
||||
if (count > 0) {
|
||||
argument = argument.trim().toLowerCase(Locale.ROOT);
|
||||
argument = argument.replaceAll("\\\\", "");
|
||||
argument = argument.replaceAll("'", "");
|
||||
|
||||
if (next == 2) {
|
||||
if (argument.endsWith(",")) {
|
||||
next = 2;
|
||||
}
|
||||
else {
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
else if (argument.equals("p:") || argument.equals("user:") || argument.equals("users:") || argument.equals("u:")) {
|
||||
next = 1;
|
||||
}
|
||||
else if (next == 1 || argument.startsWith("p:") || argument.startsWith("user:") || argument.startsWith("users:") || argument.startsWith("u:")) {
|
||||
argument = argument.replaceAll("user:", "");
|
||||
argument = argument.replaceAll("users:", "");
|
||||
argument = argument.replaceAll("p:", "");
|
||||
argument = argument.replaceAll("u:", "");
|
||||
if (argument.contains(",")) {
|
||||
String[] i2 = argument.split(",");
|
||||
for (String i3 : i2) {
|
||||
parseUser(users, i3);
|
||||
}
|
||||
if (argument.endsWith(",")) {
|
||||
next = 1;
|
||||
}
|
||||
else {
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
parseUser(users, argument);
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
else if (argument.endsWith(",") || argument.endsWith(":")) {
|
||||
next = 2;
|
||||
}
|
||||
else if (argument.contains(":")) {
|
||||
next = 0;
|
||||
}
|
||||
else {
|
||||
parseUser(users, argument);
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
return users;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse excluded users from command arguments
|
||||
*
|
||||
* @param player
|
||||
* The command sender
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return A list of excluded users
|
||||
*/
|
||||
public static List<String> parseExcludedUsers(CommandSender player, String[] inputArguments) {
|
||||
String[] argumentArray = inputArguments.clone();
|
||||
List<String> excluded = new ArrayList<>();
|
||||
int count = 0;
|
||||
int next = 0;
|
||||
for (String argument : argumentArray) {
|
||||
if (count > 0) {
|
||||
argument = argument.trim().toLowerCase(Locale.ROOT);
|
||||
argument = argument.replaceAll("\\\\", "");
|
||||
argument = argument.replaceAll("'", "");
|
||||
|
||||
if (argument.equals("e:") || argument.equals("exclude:")) {
|
||||
next = 5;
|
||||
}
|
||||
else if (next == 5 || argument.startsWith("e:") || argument.startsWith("exclude:")) {
|
||||
argument = argument.replaceAll("exclude:", "");
|
||||
argument = argument.replaceAll("e:", "");
|
||||
if (argument.contains(",")) {
|
||||
String[] i2 = argument.split(",");
|
||||
for (String i3 : i2) {
|
||||
boolean isBlock = MaterialParser.isBlockOrEntity(i3);
|
||||
if (!isBlock) {
|
||||
excluded.add(i3);
|
||||
}
|
||||
}
|
||||
if (argument.endsWith(",")) {
|
||||
next = 5;
|
||||
}
|
||||
else {
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
boolean isBlock = MaterialParser.isBlockOrEntity(argument);
|
||||
if (!isBlock) {
|
||||
excluded.add(argument);
|
||||
}
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
return excluded;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process a user string and add it to the users list if valid
|
||||
*
|
||||
* @param users
|
||||
* The list to add the user to
|
||||
* @param user
|
||||
* The user string to process
|
||||
*/
|
||||
private static void parseUser(List<String> users, String user) {
|
||||
List<String> badUsers = Arrays.asList("n", "noisy", "v", "verbose", "#v", "#verbose", "#silent", "#preview", "#preview_cancel", "#count", "#sum");
|
||||
String check = user.replaceAll("[\\s'\"]", "");
|
||||
if (check.equals(user) && check.length() > 0) {
|
||||
if (user.equalsIgnoreCase("#global")) {
|
||||
user = "#global";
|
||||
}
|
||||
if (!badUsers.contains(user.toLowerCase(Locale.ROOT))) {
|
||||
users.add(user);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
186
src/main/java/net/coreprotect/command/parser/WorldParser.java
Normal file
186
src/main/java/net/coreprotect/command/parser/WorldParser.java
Normal file
|
|
@ -0,0 +1,186 @@
|
|||
package net.coreprotect.command.parser;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import net.coreprotect.config.ConfigHandler;
|
||||
import net.coreprotect.utility.WorldUtils;
|
||||
|
||||
/**
|
||||
* Parser for world-related command arguments
|
||||
*/
|
||||
public class WorldParser {
|
||||
|
||||
/**
|
||||
* Parse world from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @param processWorldEdit
|
||||
* Whether to process WorldEdit arguments
|
||||
* @param requireLoaded
|
||||
* Whether the world must be loaded
|
||||
* @return The world ID
|
||||
*/
|
||||
public static int parseWorld(String[] inputArguments, boolean processWorldEdit, boolean requireLoaded) {
|
||||
String[] argumentArray = inputArguments.clone();
|
||||
int world_id = 0;
|
||||
int count = 0;
|
||||
int next = 0;
|
||||
for (String argument : argumentArray) {
|
||||
if (count > 0) {
|
||||
argument = argument.trim();
|
||||
argument = argument.replaceAll("\\\\", "");
|
||||
argument = argument.replaceAll("'", "");
|
||||
|
||||
String inputProcessed = argument.toLowerCase(Locale.ROOT);
|
||||
if (inputProcessed.equals("r:") || inputProcessed.equals("radius:")) {
|
||||
next = 2;
|
||||
}
|
||||
else if (next == 2 || inputProcessed.startsWith("r:") || inputProcessed.startsWith("radius:")) {
|
||||
argument = argument.replaceAll("radius:", "").replaceAll("r:", "");
|
||||
inputProcessed = argument.toLowerCase(Locale.ROOT);
|
||||
if ((processWorldEdit && (inputProcessed.equals("#worldedit") || inputProcessed.equals("#we"))) || inputProcessed.equals("#global") || inputProcessed.equals("global") || inputProcessed.equals("off") || inputProcessed.equals("-1") || inputProcessed.equals("none") || inputProcessed.equals("false")) {
|
||||
world_id = 0;
|
||||
}
|
||||
else if (inputProcessed.startsWith("#")) {
|
||||
world_id = WorldUtils.matchWorld(inputProcessed);
|
||||
if (world_id == -1 && !requireLoaded) {
|
||||
world_id = ConfigHandler.worlds.getOrDefault(argument.replaceFirst("#", ""), -1);
|
||||
}
|
||||
}
|
||||
next = 0;
|
||||
}
|
||||
else {
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
return world_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse world name from command arguments
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @param processWorldEdit
|
||||
* Whether to process WorldEdit arguments
|
||||
* @return The world name
|
||||
*/
|
||||
public static String parseWorldName(String[] inputArguments, boolean processWorldEdit) {
|
||||
String[] argumentArray = inputArguments.clone();
|
||||
String worldName = "";
|
||||
int count = 0;
|
||||
int next = 0;
|
||||
for (String argument : argumentArray) {
|
||||
if (count > 0) {
|
||||
argument = argument.trim().toLowerCase(Locale.ROOT);
|
||||
argument = argument.replaceAll("\\\\", "");
|
||||
argument = argument.replaceAll("'", "");
|
||||
|
||||
if (argument.equals("r:") || argument.equals("radius:")) {
|
||||
next = 2;
|
||||
}
|
||||
else if (next == 2 || argument.startsWith("r:") || argument.startsWith("radius:")) {
|
||||
argument = argument.replaceAll("radius:", "");
|
||||
argument = argument.replaceAll("r:", "");
|
||||
if ((processWorldEdit && (argument.equals("#worldedit") || argument.equals("#we"))) || argument.equals("#global") || argument.equals("global") || argument.equals("off") || argument.equals("-1") || argument.equals("none") || argument.equals("false")) {
|
||||
worldName = "";
|
||||
}
|
||||
else if (argument.startsWith("#")) {
|
||||
worldName = argument.replaceFirst("#", "");
|
||||
}
|
||||
next = 0;
|
||||
}
|
||||
else {
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
return worldName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse whether to use WorldEdit for radius
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return true if WorldEdit should be used
|
||||
*/
|
||||
public static boolean parseWorldEdit(String[] inputArguments) {
|
||||
String[] argumentArray = inputArguments.clone();
|
||||
boolean result = false;
|
||||
int count = 0;
|
||||
int next = 0;
|
||||
for (String argument : argumentArray) {
|
||||
if (count > 0) {
|
||||
argument = argument.trim().toLowerCase(Locale.ROOT);
|
||||
argument = argument.replaceAll("\\\\", "");
|
||||
argument = argument.replaceAll("'", "");
|
||||
|
||||
if (argument.equals("r:") || argument.equals("radius:")) {
|
||||
next = 2;
|
||||
}
|
||||
else if (next == 2 || argument.startsWith("r:") || argument.startsWith("radius:")) {
|
||||
argument = argument.replaceAll("radius:", "");
|
||||
argument = argument.replaceAll("r:", "");
|
||||
if (argument.equals("#worldedit") || argument.equals("#we")) {
|
||||
result = true;
|
||||
}
|
||||
next = 0;
|
||||
}
|
||||
else {
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse whether to force global search
|
||||
*
|
||||
* @param inputArguments
|
||||
* The command arguments
|
||||
* @return true if global search should be forced
|
||||
*/
|
||||
public static boolean parseForceGlobal(String[] inputArguments) {
|
||||
String[] argumentArray = inputArguments.clone();
|
||||
boolean result = false;
|
||||
int count = 0;
|
||||
int next = 0;
|
||||
for (String argument : argumentArray) {
|
||||
if (count > 0) {
|
||||
argument = argument.trim().toLowerCase(Locale.ROOT);
|
||||
argument = argument.replaceAll("\\\\", "");
|
||||
argument = argument.replaceAll("'", "");
|
||||
|
||||
if (argument.equals("r:") || argument.equals("radius:")) {
|
||||
next = 2;
|
||||
}
|
||||
else if (next == 2 || argument.startsWith("r:") || argument.startsWith("radius:")) {
|
||||
argument = argument.replaceAll("radius:", "");
|
||||
argument = argument.replaceAll("r:", "");
|
||||
if (argument.equals("#global") || argument.equals("global") || argument.equals("off") || argument.equals("-1") || argument.equals("none") || argument.equals("false")) {
|
||||
result = true;
|
||||
}
|
||||
else if (argument.startsWith("#")) {
|
||||
int worldId = WorldUtils.matchWorld(argument);
|
||||
if (worldId > 0) {
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
next = 0;
|
||||
}
|
||||
else {
|
||||
next = 0;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue