diff --git a/src/main/java/org/ultramine/commands/Action.java b/src/main/java/org/ultramine/commands/Action.java new file mode 100644 index 0000000..7aac3f6 --- /dev/null +++ b/src/main/java/org/ultramine/commands/Action.java @@ -0,0 +1,14 @@ +package org.ultramine.commands; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface Action +{ + String command(); + String name(); +} diff --git a/src/main/java/org/ultramine/commands/Command.java b/src/main/java/org/ultramine/commands/Command.java index bd805e8..6ab6f3f 100644 --- a/src/main/java/org/ultramine/commands/Command.java +++ b/src/main/java/org/ultramine/commands/Command.java @@ -11,7 +11,7 @@ { public String name(); public String group(); - public String completion() default ""; + public String[] completions() default {}; public String[] aliases() default {}; public String[] permissions() default {}; public boolean isUsableFromServer() default true; diff --git a/src/main/java/org/ultramine/commands/CommandContext.java b/src/main/java/org/ultramine/commands/CommandContext.java index 22f7fd0..bf04cde 100644 --- a/src/main/java/org/ultramine/commands/CommandContext.java +++ b/src/main/java/org/ultramine/commands/CommandContext.java @@ -10,77 +10,77 @@ import net.minecraft.util.IChatComponent; import org.ultramine.server.PermissionHandler; -import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class CommandContext { private ICommandSender sender; private String[] args; private IExtendedCommand command; + private Map argumentMap; + private int lastArgumentNum; + private String actionName; + private ICommandHandler actionHandler; - public CommandContext(IExtendedCommand command, ICommandSender sender, String[] args) + private CommandContext(IExtendedCommand command, ICommandSender sender, String[] args) { this.sender = sender; this.args = args; this.command = command; + this.argumentMap = new HashMap(args.length); + this.actionName = ""; + this.lastArgumentNum = args.length - 1; } - + + public Argument get(String key) + { + if (!argumentMap.containsKey(key)) + throwBadUsage(); + + return argumentMap.get(key); + } + + public Argument get(int num) + { + if (num < 0 || num >= args.length) + throwBadUsage(); + + return new Argument(num); + } + + public boolean contains(String key) + { + return argumentMap.containsKey(key); + } + + public Argument set(String key, String value) + { + Argument arg = new Argument(value); + argumentMap.put(key, arg); + return arg; + } + + public String getAction() + { + return actionName; + } + + public void doAction() + { + if (actionHandler != null) + actionHandler.processCommand(this); + } + public ICommandSender getSender() { return sender; } - public String[] getArgs() + public boolean senderIsServer() { - return args; - } - - public int getInt(int argNum) - { - return CommandBase.parseInt(sender, getString(argNum)); - } - - public int getInt(int argNum, int minBound) - { - return CommandBase.parseIntWithMin(sender, getString(argNum), minBound); - } - - public int getInt(int argNum, int minBound, int maxBound) - { - return CommandBase.parseIntBounded(sender, getString(argNum), minBound, maxBound); - } - - public double getDouble(int argNum) - { - return CommandBase.parseDouble(sender, getString(argNum)); - } - - public double getDouble(int argNum, double minBound) - { - return CommandBase.parseDoubleWithMin(sender, getString(argNum), minBound); - } - - public double getDouble(int argNum, double minBound, double maxBound) - { - return CommandBase.parseDoubleBounded(sender, getString(argNum), minBound, maxBound); - } - - public boolean getBoolean(int argNum) - { - return CommandBase.parseBoolean(sender, getString(argNum)); - } - - public String getString(int argNum) - { - try - { - return args[argNum]; - } - catch (IndexOutOfBoundsException ignored) - { - throwBadUsage(); - } - return null; + return sender.getCommandSenderName().equals("Server"); } public EntityPlayerMP getSenderAsPlayer() @@ -88,54 +88,6 @@ return CommandBase.getCommandSenderAsPlayer(sender); } - public EntityPlayerMP getPlayer(int argNum) - { - return CommandBase.getPlayer(sender, getString(argNum)); - } - - public IChatComponent getChatComponent(int startArgNum, boolean emphasizePlayers) - { - return CommandBase.func_147176_a(sender, args, startArgNum, emphasizePlayers); - } - - public String getJoined(int startArgNum) - { - return CommandBase.func_82360_a(sender, args, startArgNum); - } - - public String[] getLast(int startArgNum) - { - try - { - return Arrays.copyOfRange(args, startArgNum, args.length); - } - catch (IllegalArgumentException ignored) - { - throwBadUsage(); - } - return new String[0]; - } - - public double getCoordinate(int argNum, double original) - { - return CommandBase.func_110666_a(sender, original, getString(argNum)); - } - - public double getCoordinate(int argNum, double original, int minBound, int maxBound) - { - return CommandBase.func_110665_a(sender, original, getString(argNum), minBound, maxBound); - } - - public Item getItem(int argNum) - { - return CommandBase.getItemByText(sender, getString(argNum)); - } - - public Block getBlock(int argNum) - { - return CommandBase.getBlockByText(sender, getString(argNum)); - } - public void notifyAdmins(String messageKey, Object... messageArgs) { CommandBase.notifyAdmins(sender, messageKey, messageArgs); @@ -153,18 +105,200 @@ throw new CommandException("commands.generic.permission"); } - public boolean senderIsServer() - { - return sender.getCommandSenderName().equals("Server"); - } - public void throwBadUsage() { throw new WrongUsageException(command.getCommandUsage(sender)); } - public int argsCount() + public String[] getArgs() { - return args.length; + return args; + } + + public IExtendedCommand getCommand() + { + return command; + } + + public class Argument + { + private int num; + private boolean last; + private String value; + + private Argument(int num) + { + this.value = args[num]; + this.num = num; + this.last = num == lastArgumentNum; + } + + private Argument(int num, boolean last) + { + this.value = args[num]; + this.num = num; + this.last = last; + } + + private Argument(String value) + { + this.value = value; + this.num = -1; + this.last = false; + } + + private String value() + { + return value; + } + + private String[] args() + { + if (num >= 0) + return args; + else + return new String[] {value}; + } + + private int num() + { + return Math.max(num, 0); + } + + public String asString() + { + if (last) + return CommandBase.func_82360_a(sender, args(), num()); + else + return value(); + } + + public Argument[] asArray() + { + if (num < 0) + return new Argument[] {this}; + + Argument[] result = new Argument[args.length - num]; + for (int i = num; i < args.length; i++) + result[i-num] = new Argument(i, false); + return result; + } + + public int asInt() + { + return CommandBase.parseInt(sender, value()); + } + + public int asInt(int minBound) + { + return CommandBase.parseIntWithMin(sender, value(), minBound); + } + + public int asInt(int minBound, int maxBound) + { + return CommandBase.parseIntBounded(sender, value(), minBound, maxBound); + } + + public double asDouble() + { + return CommandBase.parseDouble(sender, value()); + } + + public double asDouble(double minBound) + { + return CommandBase.parseDoubleWithMin(sender, value(), minBound); + } + + public double asDouble(double minBound, double maxBound) + { + return CommandBase.parseDoubleBounded(sender, value(), minBound, maxBound); + } + + public boolean asBoolean() + { + return CommandBase.parseBoolean(sender, value()); + } + + public EntityPlayerMP asPlayer() + { + return CommandBase.getPlayer(sender, value()); + } + + public IChatComponent asChatComponent(boolean emphasizePlayers) + { + return CommandBase.func_147176_a(sender, args(), num(), emphasizePlayers); + } + + public double asCoordinate(double original) + { + return CommandBase.func_110666_a(sender, original, value()); + } + + public double asCoordinate(double original, int minBound, int maxBound) + { + return CommandBase.func_110665_a(sender, original, value(), minBound, maxBound); + } + + public Item asItem() + { + return CommandBase.getItemByText(sender, value()); + } + + public Block asBlock() + { + return CommandBase.getBlockByText(sender, value()); + } + } + + public static class Builder + { + private CommandContext context; + + public Builder(IExtendedCommand command, ICommandSender sender, String[] args) + { + context = new CommandContext(command, sender, args); + } + + public Builder setArgumentsNames(List names) + { + context.lastArgumentNum = names.size(); + Map nameCount = new HashMap(); + for (int i = 0; i < names.size(); i++) + { + String name = names.get(i); + + if (name.equals("action")) + { + context.actionName = context.actionName.isEmpty() ? context.args[i] : context.actionName + "." + context.args[i]; + continue; + } + + if (context.argumentMap.containsKey(name)) + { + Integer count = nameCount.containsKey(name) ? nameCount.get(name) + 1 : 2; + nameCount.put(name, count); + name = name + count.toString(); + } + + context.argumentMap.put(name, context.new Argument(i)); + } + return this; + } + + public String getActionName() + { + return context.getAction(); + } + + public Builder setActionHandler(ICommandHandler actionHandler) + { + context.actionHandler = actionHandler; + return this; + } + + public CommandContext build() + { + return context; + } } } diff --git a/src/main/java/org/ultramine/commands/CommandRegistry.java b/src/main/java/org/ultramine/commands/CommandRegistry.java index 6292bc8..e475bce 100644 --- a/src/main/java/org/ultramine/commands/CommandRegistry.java +++ b/src/main/java/org/ultramine/commands/CommandRegistry.java @@ -52,21 +52,45 @@ public void registerCommands(Class cls) { + List builders = new ArrayList(); + Map> actions = new HashMap>(); + for (Method method : cls.getMethods()) { if (method.isAnnotationPresent(Command.class) && Modifier.isStatic(method.getModifiers())) { Command data = method.getAnnotation(Command.class); - ICommandHandler handler = new MethodBasedCommandHandler(method); + HandlerBasedCommand.Builder builder = new HandlerBasedCommand.Builder(data.name(), data.group(), new MethodBasedCommandHandler(method)) + .setAliases(data.aliases()) + .setPermissions(data.permissions()) + .setUsableFromServer(data.isUsableFromServer()); - IExtendedCommand cmd = new HandlerBasedCommand(data.name(), data.group(), handler) - .withAliases(data.aliases()) - .withPermissions(data.permissions()) - .withUsableFromServer(data.isUsableFromServer()) - .withCompletionHandler(completionStringParser.parse(data.completion())); + for (String completion : data.completions()) + builder.addCompletionHandlers(completionStringParser.parse(completion)); - registerCommand(cmd); + builders.add(builder); } + + if (method.isAnnotationPresent(Action.class) && Modifier.isStatic(method.getModifiers())) + { + Action data = method.getAnnotation(Action.class); + + if (!actions.containsKey(data.command())) + actions.put(data.command(), new HashMap()); + + actions.get(data.command()).put(data.name(), new MethodBasedCommandHandler(method)); + } + } + + for (HandlerBasedCommand.Builder builder : builders) + { + if (actions.containsKey(builder.getName())) + { + for (Map.Entry action : actions.get(builder.getName()).entrySet()) + builder.addAction(action.getKey(), action.getValue()); + } + + registerCommand(builder.build()); } } diff --git a/src/main/java/org/ultramine/commands/HandlerBasedCommand.java b/src/main/java/org/ultramine/commands/HandlerBasedCommand.java index b0d4aca..c54f51d 100644 --- a/src/main/java/org/ultramine/commands/HandlerBasedCommand.java +++ b/src/main/java/org/ultramine/commands/HandlerBasedCommand.java @@ -1,13 +1,18 @@ package org.ultramine.commands; import net.minecraft.command.ICommandSender; +import net.minecraft.command.WrongUsageException; +import org.apache.commons.lang3.ArrayUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.ultramine.commands.completion.CommandCompletionHandler; import org.ultramine.server.PermissionHandler; +import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class HandlerBasedCommand implements IExtendedCommand { @@ -19,7 +24,8 @@ private String description; private ICommandHandler handler; - private CommandCompletionHandler completionHandler; + private List completionHandlers; + private Map actionHandlers; private List aliases; private String[] permissions; @@ -32,32 +38,8 @@ this.handler = handler; this.usage = "command." + name + ".usage"; this.description = "command." + name + ".description"; - - handler.setCommand(this); - } - - public HandlerBasedCommand withAliases(String... aliases) - { - this.aliases = Arrays.asList(aliases); - return this; - } - - public HandlerBasedCommand withCompletionHandler(CommandCompletionHandler completionHandler) - { - this.completionHandler = completionHandler; - return this; - } - - public HandlerBasedCommand withPermissions(String[] permissions) - { - this.permissions = permissions; - return this; - } - - public HandlerBasedCommand withUsableFromServer(boolean isUsableFromServer) - { - this.isUsableFromServer = isUsableFromServer; - return this; + this.completionHandlers = new ArrayList(); + this.actionHandlers = new HashMap(); } @Override @@ -93,7 +75,20 @@ @Override public void processCommand(ICommandSender var1, String[] var2) { - handler.processCommand(var1, var2); + CommandContext.Builder builder = new CommandContext.Builder(this, var1, var2); + + if (completionHandlers.size() > 0) + { + CommandCompletionHandler completionHandler = findCompletionHandler(var2); + if (completionHandler == null) + throw new WrongUsageException(usage); + + builder.setArgumentsNames(completionHandler.getNames()); + if (!builder.getActionName().isEmpty()) + builder.setActionHandler(actionHandlers.get(builder.getActionName())); + } + + handler.processCommand(builder.build()); } @Override @@ -105,18 +100,43 @@ @Override public List addTabCompletionOptions(ICommandSender var1, String[] var2) { - if (completionHandler == null) + if (completionHandlers.size() == 0) return null; - return completionHandler.getCompletionOptions(var2); + List result = null; + String[] tail = ArrayUtils.remove(var2, var2.length - 1); + + for (CommandCompletionHandler completionHandler : completionHandlers) + { + if (completionHandler.match(false, tail)) + if (result == null) + result = completionHandler.getCompletionOptions(var2); + else + result.addAll(completionHandler.getCompletionOptions(var2)); + } + return result; } @Override public boolean isUsernameIndex(String[] var1, int var2) { + CommandCompletionHandler completionHandler = findCompletionHandler(var1); return completionHandler != null && completionHandler.isUsernameIndex(var2); } + private CommandCompletionHandler findCompletionHandler(String[] args) + { + if (completionHandlers.size() == 0) + return null; + + for (CommandCompletionHandler completionHandler : completionHandlers) + { + if (completionHandler.match(true, args)) + return completionHandler; + } + return null; + } + @Override public int compareTo(Object o) { @@ -130,4 +150,54 @@ } return -1; } + + public static class Builder + { + private HandlerBasedCommand command; + + public Builder(String name, String group, ICommandHandler handler) + { + command = new HandlerBasedCommand(name, group, handler); + } + + public String getName() + { + return command.name; + } + + public Builder setAliases(String... aliases) + { + command.aliases = Arrays.asList(aliases); + return this; + } + + public Builder addCompletionHandlers(CommandCompletionHandler completionHandler) + { + command.completionHandlers.add(completionHandler); + return this; + } + + public Builder setPermissions(String... permissions) + { + command.permissions = permissions; + return this; + } + + public Builder setUsableFromServer(boolean isUsableFromServer) + { + command.isUsableFromServer = isUsableFromServer; + return this; + } + + public Builder addAction(String name, ICommandHandler action) + { + command.actionHandlers.put(name, action); + return this; + } + + public HandlerBasedCommand build() + { + return command; + } + } } diff --git a/src/main/java/org/ultramine/commands/ICommandHandler.java b/src/main/java/org/ultramine/commands/ICommandHandler.java index aa70763..8f92fc1 100644 --- a/src/main/java/org/ultramine/commands/ICommandHandler.java +++ b/src/main/java/org/ultramine/commands/ICommandHandler.java @@ -1,9 +1,6 @@ package org.ultramine.commands; -import net.minecraft.command.ICommandSender; - public interface ICommandHandler { - public void processCommand(ICommandSender var1, String[] var2); - public void setCommand(IExtendedCommand command); + public void processCommand(CommandContext context); } diff --git a/src/main/java/org/ultramine/commands/MethodBasedCommandHandler.java b/src/main/java/org/ultramine/commands/MethodBasedCommandHandler.java index ef5182d..e0718af 100644 --- a/src/main/java/org/ultramine/commands/MethodBasedCommandHandler.java +++ b/src/main/java/org/ultramine/commands/MethodBasedCommandHandler.java @@ -2,7 +2,6 @@ import net.minecraft.command.CommandException; import net.minecraft.command.CommandNotFoundException; -import net.minecraft.command.ICommandSender; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -12,7 +11,6 @@ public class MethodBasedCommandHandler implements ICommandHandler { private static final Logger logger = LogManager.getLogger(); - private IExtendedCommand command; private Method method; public MethodBasedCommandHandler(Method method) @@ -20,34 +18,29 @@ this.method = method; } - public void setCommand(IExtendedCommand command) - { - this.command = command; - } - @Override - public void processCommand(ICommandSender var1, String[] var2) + public void processCommand(CommandContext context) { try { - method.invoke(null, new CommandContext(command, var1, var2)); + method.invoke(null, context); } catch (IllegalAccessException e) { - logger.error("Error while executing method for command " + command.getCommandName(), e); + logger.error("Error while executing method for command " + context.getCommand().getCommandName(), e); throw new CommandNotFoundException(); } catch (InvocationTargetException e) { if (e.getCause() == null) { - logger.error("Error while executing method for command " + command.getCommandName(), e); + logger.error("Error while executing method for command " + context.getCommand().getCommandName(), e); throw new CommandNotFoundException(); } else if (e.getCause() instanceof CommandException) throw (CommandException) e.getCause(); else - throw new RuntimeException("Error while executing method for command " + command.getCommandName(), e.getCause()); + throw new RuntimeException("Error while executing method for command " + context.getCommand().getCommandName(), e.getCause()); } } } diff --git a/src/main/java/org/ultramine/permission/commands/BasicPermissionCommands.java b/src/main/java/org/ultramine/permission/commands/BasicPermissionCommands.java index 1b6585a..5bc0540 100644 --- a/src/main/java/org/ultramine/permission/commands/BasicPermissionCommands.java +++ b/src/main/java/org/ultramine/permission/commands/BasicPermissionCommands.java @@ -1,5 +1,7 @@ package org.ultramine.permission.commands; +import net.minecraft.command.WrongUsageException; +import org.ultramine.commands.Action; import org.ultramine.commands.Command; import org.ultramine.commands.CommandContext; import org.ultramine.server.PermissionHandler; @@ -11,172 +13,173 @@ group = "permissions", aliases = {"permissions", "pcfg"}, permissions = {"permissions.admin"}, - completion = "" + completions = {"[save reload]"} ) public static void pcofnig(CommandContext context) { - String action = context.getString(0); - - if (action.equals("save")) + if (context.getAction().equals("save")) { PermissionHandler.getInstance().save(); context.notifyAdmins("command.pconfig.success.save"); } - else if (action.equals("reload")) + else if (context.getAction().equals("reload")) { PermissionHandler.getInstance().reload(); context.notifyAdmins("command.pconfig.success.reload"); } - else - context.throwBadUsage(); } + + @Command( name = "pworld", group = "permissions", - permissions = {"permissions.admin"}, - completion = " ...", - isUsableFromServer = false + permissions = {"permissions.admin.world"}, + completions = { + "[add remove] ...", + " [add remove] ..." + } ) public static void pworld(CommandContext context) { - String action = context.getString(0); - String[] permissions = context.getLast(1); - String world = context.getSenderAsPlayer().getEntityWorld().getWorldInfo().getWorldName(); - - doPworld(context, world, action, permissions); - } - - @Command( - name = "pworld.super", - group = "permissions", - permissions = {"permissions.superadmin"}, - completion = " ..." - ) - public static void pworldSuper(CommandContext context) - { - String world = context.getString(0); - String action = context.getString(1); - String[] permissions = context.getLast(2); - - doPworld(context, world, action, permissions); - } - - private static void doPworld(CommandContext context, String world, String action, String[] permissions) - { - if (permissions.length == 0) - context.throwBadUsage(); - - if (action.equals("add")) + if (!context.contains("world")) { - for (String permission : permissions) - { - PermissionHandler.getInstance().addToWorld(world, permission); - context.notifyAdmins("command.pworld.success.add", permission, world); - } + if (context.senderIsServer()) + throw new WrongUsageException("command.permissions.serverworld"); + + context.set("world", context.getSenderAsPlayer().getEntityWorld().getWorldInfo().getWorldName()); } - else if (action.equals("remove")) - { - for (String permission : permissions) - { - PermissionHandler.getInstance().removeFromWorld(world, permission); - context.notifyAdmins("command.pworld.success.remove", permission, world); - } - } - else - context.throwBadUsage(); + + context.checkSenderPermissionInWorld(context.get("world").asString(), "permissions.admin.world"); + context.doAction(); } + @Action(command = "pworld", name = "add") + public static void pworld_add(CommandContext context) + { + String world = context.get("world").asString(); + + for (CommandContext.Argument arg : context.get("permission").asArray()) + { + PermissionHandler.getInstance().addToWorld(world, arg.asString()); + context.notifyAdmins("command.pworld.success.add", arg.asString(), world); + } + } + + @Action(command = "pworld", name = "remove") + public static void pworld_remove(CommandContext context) + { + String world = context.get("world").asString(); + + for (CommandContext.Argument arg : context.get("permission").asArray()) + { + PermissionHandler.getInstance().removeFromWorld(world, arg.asString()); + context.notifyAdmins("command.pworld.success.remove", arg.asString(), world); + } + } + + + @Command( name = "puser", group = "permissions", - permissions = {"permissions.admin"}, - completion = " ...", - isUsableFromServer = false + permissions = {"permissions.admin.user"}, + completions = { + " [add remove] ...", + " [meta] <%value>", + " [add remove] ...", + " [meta] <%value>" + } ) public static void puser(CommandContext context) { - String player = context.getString(0); - String action = context.getString(1); - String[] permissions = context.getLast(2); - String world = context.getSenderAsPlayer().getEntityWorld().getWorldInfo().getWorldName(); - - doPuser(context, world, player, action, permissions); - } - - @Command( - name = "puser.super", - group = "permissions", - permissions = {"permissions.superadmin"}, - completion = " ..." - ) - public static void puserSuper(CommandContext context) - { - String world = context.getString(0); - String player = context.getString(1); - String action = context.getString(2); - String[] permissions = context.getLast(3); - - doPuser(context, world, player, action, permissions); - } - - private static void doPuser(CommandContext context, String world, String player, String action, String[] permissions) - { - if (permissions.length == 0) - context.throwBadUsage(); - - if (action.equals("add")) + if (!context.contains("world")) { - for (String permission : permissions) - { - PermissionHandler.getInstance().add(world, player, permission); - context.notifyAdmins("command.puser.success.add", permission, player, world); - } + if (context.senderIsServer()) + throw new WrongUsageException("command.permissions.serverworld"); + + context.set("world", context.getSenderAsPlayer().getEntityWorld().getWorldInfo().getWorldName()); } - else if (action.equals("remove")) - { - for (String permission : permissions) - { - PermissionHandler.getInstance().remove(world, player, permission); - context.notifyAdmins("command.puser.success.remove", permission, player, world); - } - } - else - context.throwBadUsage(); + + context.checkSenderPermissionInWorld(context.get("world").asString(), "permissions.admin.user"); + context.doAction(); } + @Action(command = "puser", name = "add") + public static void puser_add(CommandContext context) + { + String world = context.get("world").asString(); + String player = context.get("player").asString(); + + for (CommandContext.Argument arg : context.get("permission").asArray()) + { + PermissionHandler.getInstance().add(world, player, arg.asString()); + context.notifyAdmins("command.puser.success.add", arg.asString(), player, world); + } + } + + @Action(command = "puser", name = "remove") + public static void puser_remove(CommandContext context) + { + String world = context.get("world").asString(); + String player = context.get("player").asString(); + + for (CommandContext.Argument arg : context.get("permission").asArray()) + { + PermissionHandler.getInstance().remove(world, player, arg.asString()); + context.notifyAdmins("command.puser.success.remove", arg.asString(), player, world); + } + } + + @Action(command = "puser", name = "meta") + public static void puser_meta(CommandContext context) + { + String world = context.get("world").asString(); + String player = context.get("player").asString(); + String key = context.get("pmeta").asString(); + String value = context.get("value").asString(); + + PermissionHandler.getInstance().setMeta(world, player, key, value); + context.notifyAdmins("command.puser.success.meta", key, value, player, world); + } + + + @Command( name = "pgroup", group = "permissions", - permissions = {"permissions.superadmin"}, - completion = " ..." + permissions = {"permissions.admin.group"}, + completions = { + " [add remove] ...", + " [meta] <%value>" + } ) public static void pgroup(CommandContext context) { - String group = context.getString(0); - String action = context.getString(1); - String[] permissions = context.getLast(2); + String group = context.get("group").asString(); - if (permissions.length == 0) - context.throwBadUsage(); - - if (action.equals("add")) + if (context.getAction().equals("add")) { - for (String permission : permissions) + for (CommandContext.Argument arg : context.get("permission").asArray()) { - PermissionHandler.getInstance().addToGroup(group, permission); - context.notifyAdmins("command.pgroup.success.add", permission, group); + PermissionHandler.getInstance().addToGroup(group, arg.asString()); + context.notifyAdmins("command.pgroup.success.add", arg.asString(), group); } } - else if (action.equals("remove")) + + else if (context.getAction().equals("remove")) { - for (String permission : permissions) + for (CommandContext.Argument arg : context.get("permission").asArray()) { - PermissionHandler.getInstance().removeFromGroup(group, permission); - context.notifyAdmins("command.pgroup.success.remove", permission, group); + PermissionHandler.getInstance().removeFromGroup(group, arg.asString()); + context.notifyAdmins("command.pgroup.success.remove", arg.asString(), group); } } - else - context.throwBadUsage(); + + else if (context.getAction().equals("meta")) + { + + } } + } diff --git a/src/main/resources/assets/ultramine/lang/en_US.lang b/src/main/resources/assets/ultramine/lang/en_US.lang index 3b043f1..38b2c22 100644 --- a/src/main/resources/assets/ultramine/lang/en_US.lang +++ b/src/main/resources/assets/ultramine/lang/en_US.lang @@ -1,26 +1,24 @@ # Permissions +command.permissions.serverworld=You must specify world when using this command from console + command.pconfig.usage=/pconfig command.pconfig.description=Save or reload all permissions configs command.pconfig.success.save=Permissions are saved command.pconfig.success.reload=Permissions are reloaded -command.pworld.usage=/pworld -command.pworld.description=Add or remove permissions to all user in current world +command.pworld.usage=/pworld [world] +command.pworld.description=Add or remove permissions to all user in world (current is default) command.pworld.success.add=Add permission <%s> to world <%s> command.pworld.success.remove=Remove permission <%s> from world <%s> -command.pworld.super.usage=/pworld.super -command.pworld.super.description=Add or remove permissions to all user in world - -command.puser.usage=/puser -command.puser.description=Add or remove permissions to user in current world +command.puser.usage=/puser [world] OR /puser [world] meta +command.puser.description=Add/remove permissions OR set meta for user in world (current is default) command.puser.success.add=Add permission <%s> to user <%s> in world <%s> command.puser.success.remove=Remove permission <%s> from user <%s> in world <%s> +command.puser.success.meta=Set meta <%s> to <%s> for user <%s> in world <%s> -command.puser.super.usage=/puser.super -command.puser.super.description=Add or remove permissions to user in world - -command.pgroup.usage=/pgroup -command.pgroup.description=Add or remove permissions to group +command.pgroup.usage=/pgroup OR /pgroup meta +command.pgroup.description=Add/remove permissions OR set meta for group command.pgroup.success.add=Add permission <%s> to group <%s> -command.pgroup.success.remove=Remove permission <%s> from group <%s> \ No newline at end of file +command.pgroup.success.remove=Remove permission <%s> from group <%s> +command.puser.success.meta=Set meta <%s> to <%s> for group <%s> \ No newline at end of file