From 68b67bfc927c83e0bd56dc5e8658b142ad20c593 Mon Sep 17 00:00:00 2001 From: DarkGuardsman Date: Sat, 19 Oct 2013 12:54:58 -0400 Subject: [PATCH] Toying with terminal and access stuff --- src/dark/api/ITerminal.java | 7 +- src/dark/api/{ => access}/AccessLevel.java | 2 +- src/dark/api/{ => access}/ISpecialAccess.java | 2 +- src/dark/api/access/ITerminalCommand.java | 31 ++++++ src/dark/api/{ => access}/TerminalGroup.java | 2 +- src/dark/api/access/TerminalPermission.java | 33 +++++++ .../access/TerminalPermissionRegistry.java | 23 +++++ src/dark/api/{ => access}/TerminalUser.java | 2 +- src/dark/api/{ => access}/UserAccess.java | 2 +- .../prefab/access/GlobalAccessManager.java | 4 +- .../core/prefab/invgui/GuiGlobalList.java | 2 +- .../core/prefab/machine/TileEntityInv.java | 6 +- .../core/prefab/terminal/CommandHelp.java | 94 ------------------- .../core/prefab/terminal/CommandUser.java | 64 ++++++++----- .../core/prefab/terminal/TerminalCommand.java | 45 --------- ...stry.java => TerminalCommandRegistry.java} | 36 +++---- .../prefab/terminal/TileEntityTerminal.java | 2 +- 17 files changed, 160 insertions(+), 197 deletions(-) rename src/dark/api/{ => access}/AccessLevel.java (97%) rename src/dark/api/{ => access}/ISpecialAccess.java (97%) create mode 100644 src/dark/api/access/ITerminalCommand.java rename src/dark/api/{ => access}/TerminalGroup.java (98%) create mode 100644 src/dark/api/access/TerminalPermission.java create mode 100644 src/dark/api/access/TerminalPermissionRegistry.java rename src/dark/api/{ => access}/TerminalUser.java (98%) rename src/dark/api/{ => access}/UserAccess.java (99%) delete mode 100644 src/dark/core/prefab/terminal/CommandHelp.java delete mode 100644 src/dark/core/prefab/terminal/TerminalCommand.java rename src/dark/core/prefab/terminal/{CommandRegistry.java => TerminalCommandRegistry.java} (52%) diff --git a/src/dark/api/ITerminal.java b/src/dark/api/ITerminal.java index d9e667fe..75e18468 100644 --- a/src/dark/api/ITerminal.java +++ b/src/dark/api/ITerminal.java @@ -2,12 +2,15 @@ package dark.api; import java.util.List; +import net.minecraft.entity.player.EntityPlayer; + +import dark.api.access.ISpecialAccess; import dark.core.interfaces.IScroll; /** Basic methods to make it easier to construct or interact with a terminal based tile. Recommend to * be used by tiles that want to mimic computer command line like interfaces. As well to restrict * access to the tile in the same way a computer would - * + * * @author DarkGuardsmsan */ public interface ITerminal extends ISpecialAccess, IScroll { @@ -16,4 +19,6 @@ public interface ITerminal extends ISpecialAccess, IScroll /** Adds a string to the console. Server side only. */ public boolean addToConsole(String msg); + + public boolean canUse(String node, EntityPlayer player); } diff --git a/src/dark/api/AccessLevel.java b/src/dark/api/access/AccessLevel.java similarity index 97% rename from src/dark/api/AccessLevel.java rename to src/dark/api/access/AccessLevel.java index 50c9cbcc..41462389 100644 --- a/src/dark/api/AccessLevel.java +++ b/src/dark/api/access/AccessLevel.java @@ -1,4 +1,4 @@ -package dark.api; +package dark.api.access; public enum AccessLevel { diff --git a/src/dark/api/ISpecialAccess.java b/src/dark/api/access/ISpecialAccess.java similarity index 97% rename from src/dark/api/ISpecialAccess.java rename to src/dark/api/access/ISpecialAccess.java index 921873b7..442409b8 100644 --- a/src/dark/api/ISpecialAccess.java +++ b/src/dark/api/access/ISpecialAccess.java @@ -1,4 +1,4 @@ -package dark.api; +package dark.api.access; import java.util.List; diff --git a/src/dark/api/access/ITerminalCommand.java b/src/dark/api/access/ITerminalCommand.java new file mode 100644 index 00000000..edbdfc91 --- /dev/null +++ b/src/dark/api/access/ITerminalCommand.java @@ -0,0 +1,31 @@ +package dark.api.access; + +import java.util.Set; + +import net.minecraft.entity.player.EntityPlayer; +import dark.api.ITerminal; + +/** Prefab for creating commands that most terminal entities can use + * + * @author DarkGuardsman */ +public interface ITerminalCommand +{ + /** The command has been called by a player in a terminal. + * + * @return false if the call was not supported rather than failed. Used too allow several + * commands with the same name to exist but each has its own sub calls */ + public boolean called(EntityPlayer player, ITerminal terminal, String[] args); + + /** Can the machine use the command. Used to prevent commands from being called on machines that + * can't support it */ + public boolean canSupport(ITerminal terminal); + + /** What the command starts with like /time */ + public String getCommandName(); + + /** Used to restrict sub commands like /time day, or /time night. Will be added to the name of + * the command so a command called time will have a sub comamnd day its node will equal time.day */ + public Set getPermissionNodes(); + + public String getNode(String[] args); +} diff --git a/src/dark/api/TerminalGroup.java b/src/dark/api/access/TerminalGroup.java similarity index 98% rename from src/dark/api/TerminalGroup.java rename to src/dark/api/access/TerminalGroup.java index f8e43bdf..f9f12835 100644 --- a/src/dark/api/TerminalGroup.java +++ b/src/dark/api/access/TerminalGroup.java @@ -1,4 +1,4 @@ -package dark.api; +package dark.api.access; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; diff --git a/src/dark/api/access/TerminalPermission.java b/src/dark/api/access/TerminalPermission.java new file mode 100644 index 00000000..9edaa4a1 --- /dev/null +++ b/src/dark/api/access/TerminalPermission.java @@ -0,0 +1,33 @@ +package dark.api.access; + +/** Used too store information about a permission node with in a terminal like device. Such as ICBM + * sentry guns, or GS locked chests. + * + * @author DarkGuardsman */ +public class TerminalPermission +{ + protected String permissionName = "p"; + protected String saveName = "access.general.p"; + + public TerminalPermission(String name) + { + this.permissionName = name; + this.saveName = "access.general." + name; + } + + public TerminalPermission(String name, String saveName) + { + this.permissionName = name; + this.saveName = saveName; + } + + public String getName() + { + return this.permissionName; + } + + public String getSaveName() + { + return this.saveName; + } +} diff --git a/src/dark/api/access/TerminalPermissionRegistry.java b/src/dark/api/access/TerminalPermissionRegistry.java new file mode 100644 index 00000000..d11d5212 --- /dev/null +++ b/src/dark/api/access/TerminalPermissionRegistry.java @@ -0,0 +1,23 @@ +package dark.api.access; + +import java.util.HashMap; + +public class TerminalPermissionRegistry +{ + public static HashMap permission = new HashMap(); + + static + { + registerPermission(new TerminalPermission("help", "general.help")); + registerPermission(new TerminalPermission("access", "security.core.access")); + registerPermission(new TerminalPermission("access.set", "security.core.access.set")); + } + + public static void registerPermission(TerminalPermission p) + { + if (!permission.containsKey(p.getName())) + { + permission.put(p.getSaveName(), p); + } + } +} diff --git a/src/dark/api/TerminalUser.java b/src/dark/api/access/TerminalUser.java similarity index 98% rename from src/dark/api/TerminalUser.java rename to src/dark/api/access/TerminalUser.java index a5528aca..b9f3b8a3 100644 --- a/src/dark/api/TerminalUser.java +++ b/src/dark/api/access/TerminalUser.java @@ -1,4 +1,4 @@ -package dark.api; +package dark.api.access; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/dark/api/UserAccess.java b/src/dark/api/access/UserAccess.java similarity index 99% rename from src/dark/api/UserAccess.java rename to src/dark/api/access/UserAccess.java index c13825e6..3288bc9f 100644 --- a/src/dark/api/UserAccess.java +++ b/src/dark/api/access/UserAccess.java @@ -1,4 +1,4 @@ -package dark.api; +package dark.api.access; import java.util.ArrayList; import java.util.List; diff --git a/src/dark/core/prefab/access/GlobalAccessManager.java b/src/dark/core/prefab/access/GlobalAccessManager.java index 3190e2e3..44870979 100644 --- a/src/dark/core/prefab/access/GlobalAccessManager.java +++ b/src/dark/core/prefab/access/GlobalAccessManager.java @@ -8,8 +8,8 @@ import java.util.Map; import java.util.Map.Entry; import net.minecraft.nbt.NBTTagCompound; -import dark.api.AccessLevel; -import dark.api.UserAccess; +import dark.api.access.AccessLevel; +import dark.api.access.UserAccess; import dark.core.prefab.helpers.NBTFileHelper; public class GlobalAccessManager diff --git a/src/dark/core/prefab/invgui/GuiGlobalList.java b/src/dark/core/prefab/invgui/GuiGlobalList.java index 248d244e..cef302a3 100644 --- a/src/dark/core/prefab/invgui/GuiGlobalList.java +++ b/src/dark/core/prefab/invgui/GuiGlobalList.java @@ -19,7 +19,7 @@ import universalelectricity.core.vector.Vector2; import universalelectricity.prefab.vector.Region2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import dark.api.UserAccess; +import dark.api.access.UserAccess; import dark.core.interfaces.IScroll; import dark.core.prefab.ModPrefab; diff --git a/src/dark/core/prefab/machine/TileEntityInv.java b/src/dark/core/prefab/machine/TileEntityInv.java index 243aebf3..b91158b4 100644 --- a/src/dark/core/prefab/machine/TileEntityInv.java +++ b/src/dark/core/prefab/machine/TileEntityInv.java @@ -11,9 +11,9 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraftforge.common.ForgeDirection; import universalelectricity.prefab.tile.TileEntityAdvanced; -import dark.api.AccessLevel; -import dark.api.ISpecialAccess; -import dark.api.UserAccess; +import dark.api.access.AccessLevel; +import dark.api.access.ISpecialAccess; +import dark.api.access.UserAccess; import dark.core.interfaces.IExternalInv; import dark.core.interfaces.IInvBox; import dark.core.prefab.invgui.InvChest; diff --git a/src/dark/core/prefab/terminal/CommandHelp.java b/src/dark/core/prefab/terminal/CommandHelp.java deleted file mode 100644 index 9cd71b2d..00000000 --- a/src/dark/core/prefab/terminal/CommandHelp.java +++ /dev/null @@ -1,94 +0,0 @@ -package dark.core.prefab.terminal; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.entity.player.EntityPlayer; -import dark.api.ISpecialAccess; -import dark.api.ITerminal; - -public class CommandHelp extends TerminalCommand -{ - @Override - public String getCommandPrefix() - { - return "help"; - } - - @Override - public boolean processCommand(EntityPlayer player, ITerminal TE, String[] args) - { - if (args.length > 1) - { - List displayed = new ArrayList(); - - for (TerminalCommand cc : CommandRegistry.COMMANDS) - { - if (cc.getCommandPrefix().equalsIgnoreCase(args[1]) && cc.showOnHelp(player, TE) && cc.canMachineUse(TE)) - { - TE.addToConsole("----------------------"); - TE.addToConsole(args[1] + " commands"); - TE.addToConsole("----------------------"); - List ccList = cc.getCmdUses(player, TE); - - for (String cm : ccList) - { - if (!displayed.contains(cm.toLowerCase())) - { - TE.addToConsole(cm); - displayed.add(cm.toLowerCase()); - } - } - TE.addToConsole("----------------------"); - } - } - return true; - } - else - { - TE.addToConsole("----------------------"); - TE.addToConsole("Listing commands"); - TE.addToConsole("----------------------"); - TE.addToConsole("Help command"); - - for (TerminalCommand cc : CommandRegistry.COMMANDS) - { - if (cc.showOnHelp(player, TE) && cc.canMachineUse(TE)) - { - List ccList = cc.getCmdUses(player, TE); - for (String cm : ccList) - { - TE.addToConsole(cm); - } - } - } - TE.addToConsole("-----------------------"); - return true; - } - } - - @Override - public boolean canPlayerUse(EntityPlayer var1, ISpecialAccess mm) - { - return true; - } - - @Override - public boolean showOnHelp(EntityPlayer player, ISpecialAccess mm) - { - return false; - } - - @Override - public List getCmdUses(EntityPlayer player, ISpecialAccess mm) - { - return null; - } - - @Override - public boolean canMachineUse(ISpecialAccess mm) - { - return true; - } - -} diff --git a/src/dark/core/prefab/terminal/CommandUser.java b/src/dark/core/prefab/terminal/CommandUser.java index 027e8fb9..f207a9b1 100644 --- a/src/dark/core/prefab/terminal/CommandUser.java +++ b/src/dark/core/prefab/terminal/CommandUser.java @@ -1,23 +1,24 @@ package dark.core.prefab.terminal; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; import net.minecraft.entity.player.EntityPlayer; -import dark.api.AccessLevel; -import dark.api.ISpecialAccess; import dark.api.ITerminal; +import dark.api.access.AccessLevel; +import dark.api.access.ISpecialAccess; +import dark.api.access.ITerminalCommand; -public class CommandUser extends TerminalCommand +public class CommandUser implements ITerminalCommand { @Override - public String getCommandPrefix() + public String getCommandName() { return "users"; } @Override - public boolean processCommand(EntityPlayer player, ITerminal terminal, String[] args) + public boolean called(EntityPlayer player, ITerminal terminal, String[] args) { if (args[0].equalsIgnoreCase("users") && args.length > 1 && args[1] != null && terminal instanceof ISpecialAccess) { @@ -82,31 +83,46 @@ public class CommandUser extends TerminalCommand } @Override - public boolean canPlayerUse(EntityPlayer var1, ISpecialAccess mm) + public boolean canSupport(ITerminal mm) { - return mm.getUsers().size() <= 0 || mm.getUserAccess(var1.username).ordinal() >= AccessLevel.ADMIN.ordinal(); + return mm != null; } @Override - public boolean showOnHelp(EntityPlayer player, ISpecialAccess mm) + public Set getPermissionNodes() { - return this.canPlayerUse(player, mm); + Set nodes = new HashSet(); + nodes.add("add"); + nodes.add("remove"); + nodes.add("list"); + return nodes; } @Override - public List getCmdUses(EntityPlayer player, ISpecialAccess mm) + public String getNode(String[] args) { - List cmds = new ArrayList(); - cmds.add("users list"); - cmds.add("users add [player]"); - cmds.add("users remove [player]"); - return cmds; + if (args != null && args.length >= 1) + { + if (args[0] != null && args[0].equalsIgnoreCase(this.getCommandName())) + { + if (args.length >= 2) + { + if (args[1] != null && args[1].equalsIgnoreCase("add")) + { + return "users.add"; + } + if (args[1] != null && args[1].equalsIgnoreCase("remove")) + { + return "users.remove"; + } + if (args[1] != null && args[1].equalsIgnoreCase("list")) + { + return "users.list"; + } + } + return "users"; + } + } + return null; } - - @Override - public boolean canMachineUse(ISpecialAccess mm) - { - return mm instanceof ISpecialAccess; - } - } diff --git a/src/dark/core/prefab/terminal/TerminalCommand.java b/src/dark/core/prefab/terminal/TerminalCommand.java deleted file mode 100644 index 8680c67e..00000000 --- a/src/dark/core/prefab/terminal/TerminalCommand.java +++ /dev/null @@ -1,45 +0,0 @@ -package dark.core.prefab.terminal; - -import java.util.List; - -import net.minecraft.entity.player.EntityPlayer; -import dark.api.ISpecialAccess; -import dark.api.ITerminal; - -/** @author Calclavia, DarkGuardsman */ -public abstract class TerminalCommand -{ - /** what the commands starts with /help /time /day - * - * @return */ - public abstract String getCommandPrefix(); - - /** Executes the command - * - * @param var1 - * @param args */ - public abstract boolean processCommand(EntityPlayer player, ITerminal terminal, String[] args); - - /** Returns true if the given command sender is allowed to use this command. */ - public abstract boolean canPlayerUse(EntityPlayer player, ISpecialAccess specialAccess); - - /** should this command show on /help - * - * @param player - used to find if it should show - * @return true/false */ - public abstract boolean showOnHelp(EntityPlayer player, ISpecialAccess specialAccess); - - /** returns the list of commands that the player can view on /help keep it shorter than 22 chars - * to fit on Cmd Gui - * - * @param player - * @return */ - public abstract List getCmdUses(EntityPlayer player, ISpecialAccess specialAccess); - - /** some cmds can only be use on some machines but will be access by all machines. to prevent the - * cmd from activating on the machine return false - * - * @param mm - * @return */ - public abstract boolean canMachineUse(ISpecialAccess specialAccess); -} diff --git a/src/dark/core/prefab/terminal/CommandRegistry.java b/src/dark/core/prefab/terminal/TerminalCommandRegistry.java similarity index 52% rename from src/dark/core/prefab/terminal/CommandRegistry.java rename to src/dark/core/prefab/terminal/TerminalCommandRegistry.java index 6970c715..4b4a2e9e 100644 --- a/src/dark/core/prefab/terminal/CommandRegistry.java +++ b/src/dark/core/prefab/terminal/TerminalCommandRegistry.java @@ -5,15 +5,16 @@ import java.util.List; import net.minecraft.entity.player.EntityPlayer; import dark.api.ITerminal; +import dark.api.access.ITerminalCommand; -/** @author Calclavia, DarkGuardsman */ -public class CommandRegistry +/** @author DarkGuardsman */ +public class TerminalCommandRegistry { - public static final List COMMANDS = new ArrayList(); + public static final List COMMANDS = new ArrayList(); /** @param prefix - what the command starts with for example /time * @param cmd - Cmd instance that will execute the command */ - public static void register(TerminalCommand cmd) + public static void register(ITerminalCommand cmd) { if (!COMMANDS.contains(cmd)) { @@ -22,40 +23,32 @@ public class CommandRegistry } /** When a player uses a command in any CMD machine it pass threw here first - * + * * @param terminal - The terminal, can be cast to TileEntity. */ - public static void onCommand(EntityPlayer player, ITerminal terminal, String cmd) + public static boolean onCommand(EntityPlayer player, ITerminal terminal, String cmd) { if (cmd != null && cmd != "") { - TerminalCommand currentCommand = null; String[] args = cmd.split(" "); - terminal.addToConsole("\u00a7A" + player.username + ": " + cmd); if (args[0] != null) { - for (TerminalCommand command : COMMANDS) + for (ITerminalCommand command : COMMANDS) { - if (command.getCommandPrefix().equalsIgnoreCase(args[0])) + if (command.getCommandName().equalsIgnoreCase(args[0])) { - if (!command.canMachineUse(terminal)) + if (command.canSupport(terminal) && command.getNode(args) != null) { - terminal.addToConsole("N/A"); - return; - } - else - { - if (!command.canPlayerUse(player, terminal)) + if (!terminal.canUse(command.getNode(args), player)) { terminal.addToConsole("Access Denied."); - return; + return false; } else { - if (command.processCommand(player, terminal, args)) + if (command.called(player, terminal, args)) { - currentCommand = command; - return; + return true; } } } @@ -65,6 +58,7 @@ public class CommandRegistry terminal.addToConsole("Unknown Command."); } + return false; } } diff --git a/src/dark/core/prefab/terminal/TileEntityTerminal.java b/src/dark/core/prefab/terminal/TileEntityTerminal.java index 2ddecaed..875438bd 100644 --- a/src/dark/core/prefab/terminal/TileEntityTerminal.java +++ b/src/dark/core/prefab/terminal/TileEntityTerminal.java @@ -122,7 +122,7 @@ public abstract class TileEntityTerminal extends TileEntityEnergyMachine impleme { if (id.equalsIgnoreCase(SimplePacketTypes.GUI_COMMAND.name)) { - CommandRegistry.onCommand(this.worldObj.getPlayerEntityByName(dis.readUTF()), this, dis.readUTF()); + TerminalCommandRegistry.onCommand(this.worldObj.getPlayerEntityByName(dis.readUTF()), this, dis.readUTF()); this.sendTerminalOutputToClients(); return true; }