diff --git a/src/main/java/org/ultramine/commands/CommandContext.java b/src/main/java/org/ultramine/commands/CommandContext.java index bc834bc..22f7fd0 100644 --- a/src/main/java/org/ultramine/commands/CommandContext.java +++ b/src/main/java/org/ultramine/commands/CommandContext.java @@ -4,22 +4,27 @@ import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; +import net.minecraft.command.WrongUsageException; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.util.IChatComponent; import org.ultramine.server.PermissionHandler; +import java.util.Arrays; + public class CommandContext { private ICommandSender sender; private String[] args; + private IExtendedCommand command; - public CommandContext(ICommandSender sender, String[] args) + public CommandContext(IExtendedCommand command, ICommandSender sender, String[] args) { this.sender = sender; this.args = args; + this.command = command; } - + public ICommandSender getSender() { return sender; @@ -32,42 +37,50 @@ public int getInt(int argNum) { - return CommandBase.parseInt(sender, args[argNum]); + return CommandBase.parseInt(sender, getString(argNum)); } public int getInt(int argNum, int minBound) { - return CommandBase.parseIntWithMin(sender, args[argNum], minBound); + return CommandBase.parseIntWithMin(sender, getString(argNum), minBound); } public int getInt(int argNum, int minBound, int maxBound) { - return CommandBase.parseIntBounded(sender, args[argNum], minBound, maxBound); + return CommandBase.parseIntBounded(sender, getString(argNum), minBound, maxBound); } public double getDouble(int argNum) { - return CommandBase.parseDouble(sender, args[argNum]); + return CommandBase.parseDouble(sender, getString(argNum)); } public double getDouble(int argNum, double minBound) { - return CommandBase.parseDoubleWithMin(sender, args[argNum], minBound); + return CommandBase.parseDoubleWithMin(sender, getString(argNum), minBound); } public double getDouble(int argNum, double minBound, double maxBound) { - return CommandBase.parseDoubleBounded(sender, args[argNum], minBound, maxBound); + return CommandBase.parseDoubleBounded(sender, getString(argNum), minBound, maxBound); } public boolean getBoolean(int argNum) { - return CommandBase.parseBoolean(sender, args[argNum]); + return CommandBase.parseBoolean(sender, getString(argNum)); } public String getString(int argNum) { - return args[argNum]; + try + { + return args[argNum]; + } + catch (IndexOutOfBoundsException ignored) + { + throwBadUsage(); + } + return null; } public EntityPlayerMP getSenderAsPlayer() @@ -77,7 +90,7 @@ public EntityPlayerMP getPlayer(int argNum) { - return CommandBase.getPlayer(sender, args[argNum]); + return CommandBase.getPlayer(sender, getString(argNum)); } public IChatComponent getChatComponent(int startArgNum, boolean emphasizePlayers) @@ -90,24 +103,37 @@ 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, args[argNum]); + 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, args[argNum], minBound, maxBound); + return CommandBase.func_110665_a(sender, original, getString(argNum), minBound, maxBound); } public Item getItem(int argNum) { - return CommandBase.getItemByText(sender, args[argNum]); + return CommandBase.getItemByText(sender, getString(argNum)); } public Block getBlock(int argNum) { - return CommandBase.getBlockByText(sender, args[argNum]); + return CommandBase.getBlockByText(sender, getString(argNum)); } public void notifyAdmins(String messageKey, Object... messageArgs) @@ -117,7 +143,28 @@ public void checkSenderPermission(String permission) { - if (!PermissionHandler.getInstance().has(sender, permission)) + if (!senderIsServer() && !PermissionHandler.getInstance().has(sender, permission)) throw new CommandException("commands.generic.permission"); } + + public void checkSenderPermissionInWorld(String world, String permission) + { + if (!senderIsServer() && !PermissionHandler.getInstance().has(world, sender.getCommandSenderName(), permission)) + 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() + { + return args.length; + } } diff --git a/src/main/java/org/ultramine/commands/CommandRegistry.java b/src/main/java/org/ultramine/commands/CommandRegistry.java index bd0a818..6292bc8 100644 --- a/src/main/java/org/ultramine/commands/CommandRegistry.java +++ b/src/main/java/org/ultramine/commands/CommandRegistry.java @@ -38,7 +38,7 @@ { IExtendedCommand cmd = commandMap.get(alias); if (cmd == null || !cmd.getCommandName().equals(alias)) - commandMap.put(alias, cmd); + commandMap.put(alias, command); } } diff --git a/src/main/java/org/ultramine/commands/HandlerBasedCommand.java b/src/main/java/org/ultramine/commands/HandlerBasedCommand.java index 35d4145..b0d4aca 100644 --- a/src/main/java/org/ultramine/commands/HandlerBasedCommand.java +++ b/src/main/java/org/ultramine/commands/HandlerBasedCommand.java @@ -32,6 +32,8 @@ this.handler = handler; this.usage = "command." + name + ".usage"; this.description = "command." + name + ".description"; + + handler.setCommand(this); } public HandlerBasedCommand withAliases(String... aliases) diff --git a/src/main/java/org/ultramine/commands/ICommandHandler.java b/src/main/java/org/ultramine/commands/ICommandHandler.java index 76618fd..aa70763 100644 --- a/src/main/java/org/ultramine/commands/ICommandHandler.java +++ b/src/main/java/org/ultramine/commands/ICommandHandler.java @@ -5,4 +5,5 @@ public interface ICommandHandler { public void processCommand(ICommandSender var1, String[] var2); + public void setCommand(IExtendedCommand command); } diff --git a/src/main/java/org/ultramine/commands/MethodBasedCommandHandler.java b/src/main/java/org/ultramine/commands/MethodBasedCommandHandler.java index ff76804..ef5182d 100644 --- a/src/main/java/org/ultramine/commands/MethodBasedCommandHandler.java +++ b/src/main/java/org/ultramine/commands/MethodBasedCommandHandler.java @@ -12,6 +12,7 @@ public class MethodBasedCommandHandler implements ICommandHandler { private static final Logger logger = LogManager.getLogger(); + private IExtendedCommand command; private Method method; public MethodBasedCommandHandler(Method method) @@ -19,29 +20,34 @@ this.method = method; } + public void setCommand(IExtendedCommand command) + { + this.command = command; + } + @Override public void processCommand(ICommandSender var1, String[] var2) { try { - method.invoke(null, new CommandContext(var1, var2)); + method.invoke(null, new CommandContext(command, var1, var2)); } catch (IllegalAccessException e) { - logger.error("Error while executing command from method", e); + logger.error("Error while executing method for command " + command.getCommandName(), e); throw new CommandNotFoundException(); } catch (InvocationTargetException e) { if (e.getCause() == null) { - logger.error("Error while executing command from method", e); + logger.error("Error while executing method for command " + command.getCommandName(), e); throw new CommandNotFoundException(); } else if (e.getCause() instanceof CommandException) throw (CommandException) e.getCause(); else - throw new RuntimeException("Error while executing command from method", e.getCause()); + throw new RuntimeException("Error while executing method for command " + command.getCommandName(), e.getCause()); } } } diff --git a/src/main/java/org/ultramine/permission/ClientPermissionManager.java b/src/main/java/org/ultramine/permission/ClientPermissionManager.java index 843b9db..57daaee 100644 --- a/src/main/java/org/ultramine/permission/ClientPermissionManager.java +++ b/src/main/java/org/ultramine/permission/ClientPermissionManager.java @@ -1,16 +1,20 @@ package org.ultramine.permission; +import java.util.HashMap; +import java.util.Map; import java.util.Set; public class ClientPermissionManager implements IPermissionHandler { private World global; private PermissionRepository permissionRepository; + private Map groups; public ClientPermissionManager(PermissionRepository permissionRepository) { this.permissionRepository = permissionRepository; this.global = new World(permissionRepository); + this.groups = new HashMap(); } @Override @@ -29,12 +33,24 @@ } @Override - public void add(String world, String permission) + public void addToWorld(String world, String permission) { global.getDefaultPermissions().addPermission(permissionRepository.getPermission(permission)); } @Override + public void addToGroup(String group, String permission) + { + if (!group.startsWith("group.")) + group = "group." + group; + + if (!groups.containsKey(group)) + groups.put(group, new GroupPermission(group)); + + groups.get(group).addPermission(permissionRepository.getPermission(permission)); + } + + @Override public void remove(String world, String player, String permission) { if (!global.contains(player)) @@ -44,12 +60,24 @@ } @Override - public void remove(String world, String permission) + public void removeFromWorld(String world, String permission) { global.getDefaultPermissions().removePermission(permission); } @Override + public void removeFromGroup(String group, String permission) + { + if (!group.startsWith("group.")) + group = "group." + group; + + if (!groups.containsKey(group)) + return; + + groups.get(group).removePermission(permission); + } + + @Override public MetaResolver getMeta(String world, String player) { if (!global.contains(player)) diff --git a/src/main/java/org/ultramine/permission/IPermissionHandler.java b/src/main/java/org/ultramine/permission/IPermissionHandler.java index 129e779..51a99b2 100644 --- a/src/main/java/org/ultramine/permission/IPermissionHandler.java +++ b/src/main/java/org/ultramine/permission/IPermissionHandler.java @@ -8,11 +8,15 @@ public void add(String world, String player, String permission); - public void add(String world, String permission); + public void addToWorld(String world, String permission); + + public void addToGroup(String group, String permission); public void remove(String world, String player, String permission); - public void remove(String world, String permission); + public void removeFromWorld(String world, String permission); + + public void removeFromGroup(String group, String permission); public MetaResolver getMeta(String world, String player); diff --git a/src/main/java/org/ultramine/permission/ServerPermissionManager.java b/src/main/java/org/ultramine/permission/ServerPermissionManager.java index a4d7f1a..364119a 100644 --- a/src/main/java/org/ultramine/permission/ServerPermissionManager.java +++ b/src/main/java/org/ultramine/permission/ServerPermissionManager.java @@ -54,7 +54,7 @@ } @Override - public void add(String world, String permission) + public void addToWorld(String world, String permission) { if (!worlds.containsKey(world)) reloadWorld(world); @@ -63,6 +63,18 @@ } @Override + public void addToGroup(String group, String permission) + { + if (!group.startsWith("group.")) + group = "group." + group; + + if (!groups.containsKey(group)) + groups.put(group, new GroupPermission(group)); + + groups.get(group).addPermission(permissionRepository.getPermission(permission)); + } + + @Override public void remove(String world, String player, String permission) { if (!worlds.containsKey(world)) @@ -76,7 +88,7 @@ } @Override - public void remove(String world, String permission) + public void removeFromWorld(String world, String permission) { if (!worlds.containsKey(world)) return; @@ -85,6 +97,18 @@ } @Override + public void removeFromGroup(String group, String permission) + { + if (!group.startsWith("group.")) + group = "group." + group; + + if (!groups.containsKey(group)) + return; + + groups.get(group).removePermission(permission); + } + + @Override public MetaResolver getMeta(String world, String player) { if (!worlds.containsKey(world)) @@ -177,15 +201,19 @@ for (Map.Entry groupData : data.groups.entrySet()) { GroupPermission group; - if (!groups.containsKey(groupData.getKey())) + String groupKey = groupData.getKey(); + if (!groupKey.startsWith("group.")) + groupKey = "group." + groupKey; + + if (!groups.containsKey(groupKey)) { - group = new GroupPermission(groupData.getKey(), groupData.getValue().meta); + group = new GroupPermission(groupKey, groupData.getValue().meta); permissionRepository.registerPermission(group); - groups.put(groupData.getKey(), group); + groups.put(groupKey, group); } else { - group = groups.get(groupData.getKey()); + group = groups.get(groupKey); group.setInnerMeta(groupData.getValue().meta); } diff --git a/src/main/java/org/ultramine/permission/commands/BasicPermissionCommands.java b/src/main/java/org/ultramine/permission/commands/BasicPermissionCommands.java new file mode 100644 index 0000000..1b6585a --- /dev/null +++ b/src/main/java/org/ultramine/permission/commands/BasicPermissionCommands.java @@ -0,0 +1,182 @@ +package org.ultramine.permission.commands; + +import org.ultramine.commands.Command; +import org.ultramine.commands.CommandContext; +import org.ultramine.server.PermissionHandler; + +public class BasicPermissionCommands +{ + @Command( + name = "pconfig", + group = "permissions", + aliases = {"permissions", "pcfg"}, + permissions = {"permissions.admin"}, + completion = "" + ) + public static void pcofnig(CommandContext context) + { + String action = context.getString(0); + + if (action.equals("save")) + { + PermissionHandler.getInstance().save(); + context.notifyAdmins("command.pconfig.success.save"); + } + else if (action.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 + ) + 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")) + { + for (String permission : permissions) + { + PermissionHandler.getInstance().addToWorld(world, permission); + context.notifyAdmins("command.pworld.success.add", permission, world); + } + } + 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(); + } + + @Command( + name = "puser", + group = "permissions", + permissions = {"permissions.admin"}, + completion = " ...", + isUsableFromServer = false + ) + 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")) + { + for (String permission : permissions) + { + PermissionHandler.getInstance().add(world, player, permission); + context.notifyAdmins("command.puser.success.add", permission, player, world); + } + } + 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(); + } + + @Command( + name = "pgroup", + group = "permissions", + permissions = {"permissions.superadmin"}, + completion = " ..." + ) + public static void pgroup(CommandContext context) + { + String group = context.getString(0); + String action = context.getString(1); + String[] permissions = context.getLast(2); + + if (permissions.length == 0) + context.throwBadUsage(); + + if (action.equals("add")) + { + for (String permission : permissions) + { + PermissionHandler.getInstance().addToGroup(group, permission); + context.notifyAdmins("command.pgroup.success.add", permission, group); + } + } + else if (action.equals("remove")) + { + for (String permission : permissions) + { + PermissionHandler.getInstance().removeFromGroup(group, permission); + context.notifyAdmins("command.pgroup.success.remove", permission, group); + } + } + else + context.throwBadUsage(); + } +} diff --git a/src/main/java/org/ultramine/server/PermissionHandler.java b/src/main/java/org/ultramine/server/PermissionHandler.java index fbd05bb..5fb331d 100644 --- a/src/main/java/org/ultramine/server/PermissionHandler.java +++ b/src/main/java/org/ultramine/server/PermissionHandler.java @@ -9,7 +9,6 @@ import org.ultramine.permission.PermissionRepository; import org.ultramine.permission.ServerPermissionManager; -import java.util.List; import java.util.Set; public class PermissionHandler implements IPermissionHandler @@ -119,9 +118,15 @@ } @Override - public void add(String world, String permission) + public void addToWorld(String world, String permission) { - handler.add(world, permission); + handler.addToWorld(world, permission); + } + + @Override + public void addToGroup(String group, String permission) + { + handler.addToGroup(group, permission); } @Override @@ -136,9 +141,15 @@ } @Override - public void remove(String world, String permission) + public void removeFromWorld(String world, String permission) { - handler.remove(world, permission); + handler.removeFromWorld(world, permission); + } + + @Override + public void removeFromGroup(String group, String permission) + { + handler.removeFromGroup(group, permission); } @Override diff --git a/src/main/java/org/ultramine/server/UltramineServerModContainer.java b/src/main/java/org/ultramine/server/UltramineServerModContainer.java index fccf776..454010c 100644 --- a/src/main/java/org/ultramine/server/UltramineServerModContainer.java +++ b/src/main/java/org/ultramine/server/UltramineServerModContainer.java @@ -21,6 +21,7 @@ import cpw.mods.fml.relauncher.Side; import org.ultramine.commands.completion.DefaultCompleters; import org.ultramine.commands.completion.RegisterCompletersEvent; +import org.ultramine.permission.commands.BasicPermissionCommands; public class UltramineServerModContainer extends DummyModContainer { @@ -97,6 +98,7 @@ PermissionHandler.initServer(); break; } + e.getCommandRegistry().registerCommands(BasicPermissionCommands.class); } @Subscribe diff --git a/src/main/resources/assets/ultramine/lang/en_US.lang b/src/main/resources/assets/ultramine/lang/en_US.lang new file mode 100644 index 0000000..3b043f1 --- /dev/null +++ b/src/main/resources/assets/ultramine/lang/en_US.lang @@ -0,0 +1,26 @@ +# Permissions +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.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.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.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.success.add=Add permission <%s> to group <%s> +command.pgroup.success.remove=Remove permission <%s> from group <%s> \ No newline at end of file