diff options
-rw-r--r-- | commandmanager.py | 79 | ||||
-rw-r--r-- | helpers.py | 106 |
2 files changed, 105 insertions, 80 deletions
diff --git a/commandmanager.py b/commandmanager.py deleted file mode 100644 index 594be5d..0000000 --- a/commandmanager.py +++ /dev/null @@ -1,79 +0,0 @@ -from helpers import * - -class commandmanager(object): - - """ - Use this instead of @hook.command for your command methods. (@commandmanager(things...)) - - It will take care of the following things: - - Basic permission check. The default permission is utils.<cmd_name> - - Sender type check. You can pass whether the sender must be a player, a consolesender, or both. (see sender_limit below) - - Minimum and maximum args. Works with checkargs from helpers.py. - - A '/<cmd> help' message containing the description, usage and aliases of the command. - - Information about some arguments: - - f: The method. Don't bother with that. - - cmd_name: The command you type in chat. - - usage: For example "<player> <other_player" and is part of the help message. - - description: A brief description of what the command does. (also part of the help message) - - aliases: A list of aliases for the command - - permission: The basic permission for the command. Defaults to utils.<cmd> - - sender_limit: Defines what sendertype can use the command. Leave blank for console & player, 0 for player only, 1 for console only. - - min_args: The least arguments for the command. - - max_args: You guessed it right. Defaults to infinity (-1). - - *** DISCLAIMER *** - - Your command function must take three arguments: sender, handler, args. - Where handler is the instance of this class. You can for example return help_message(sender), get the given arguments etc. - - Your function must also not return a boolean like before, but a String instead. The string returned will be sent to the player (&-codes supported). - Use None or "" for no message. - - Feel free to edit or give suggestions (but don't break existing commands) - """ - - def __init__(self, f, cmd_name, usage = "[args...]", description = "Handles" + cmd_name, aliases = [], permission = "utils." + cmd_name.lower(), sender_limit = -1, min_args = 0, max_args = -1): - self.f = f - self.cmd_name = cmd_name.lower() - self.usage = usage - self.description = description - self.aliases = aliases - self.permission = permission - self.sender_limit = sender_limit - self.min_args = min_args - self.max_args = max_args - - @hook.command(cmd_name, aliases = aliases) - def __call__(sender, command, label, args): - msg = __run__(sender, command, label, args) - if msg: - msg(sender, msg) - - def __run__(sender, args): - isplayer = is_player(sender) - if not is_sender_valid(isplayer): - return "&cThis command can only be run from the console" if isplayer else "&cThis command can only be run by players" - if not sender.hasPermission(permission): - return "&cYou do not have permission to use this command" - if not checkargs(sender, args, min_args, max_args): - return None - return help_message(sender) if args and args[0].lower() == "help" else f(sender, self, args) - - def is_sender_valid(isplayer): - return True if sender_limit == -1 else sender_limit == 0 == isplayer - - def help_message(sender): - """ - Information about command /<cmd>: #Light green - description... #Blue - description... #Blue - - Syntax: /<cmd> <usage> #Light green - Aliases: alias1, alias2, alias3 #Gold - """ - msg = "&aInformation about command /%s:\n &9%s" % (cmd_name, description.replace("\n", "\n ")) - msg += "\n\n&aSyntax: &o/%s %s" % (cmd_name, usage) - if aliases: - msg += ("\n&6Aliases: " + [msg + ", " for msg in aliases])[:-2] - return msg
\ No newline at end of file @@ -11,6 +11,8 @@ import org.bukkit.event.entity as entity import org.bukkit.command.ConsoleCommandSender from org.bukkit.entity import * +from traceback import format_exc as trace + shared = {} # this dict can be used to share stuff across modules @@ -212,4 +214,106 @@ def toggle(player, ls, name = "Toggle", add = None): msg(player, "&a%s turned off!" % name) elif add != False: ls.append(pid) - msg(player, "&a%s turned on!" % name)
\ No newline at end of file + msg(player, "&a%s turned on!" % name) + + + + + + +""" +Use this instead of @hook.command for your command methods. (@simplecommand(things...)) + +It will take care of the following things: +- Basic permission check. The default permission is utils.<cmd_name> +- Sender type check. You can pass whether the sender must be a player, a consolesender, or both. (see sender_limit below) +- Minimum and maximum args. Works with checkargs from helpers.py. +- A '/<cmd> help' message containing the description, usage and aliases of the command. + +Information about some arguments: +- cmd_name: The command you type in chat. +- usage: For example "<player> <other_player" and is part of the help message. +- description: A brief description of what the command does. (also part of the help message) +- aliases: A list of aliases for the command +- permission: The basic permission for the command. Defaults to utils.<cmd> +- sender_limit: Defines what sendertype can use the command. Leave blank for console & player, 0 for player only, 1 for console only. +- min_args: The least arguments for the command. +- max_args: You guessed it right. Defaults to infinity (-1). + +*** DISCLAIMER *** + +Your command function must take four arguments: sender, command, label, args. + +Your function must also not return a boolean like before, but a String instead. The string returned will be sent to the player (&-codes supported). +Use None or "" for no message. + +Feel free to edit or give suggestions (but don't break existing commands) + +See below for an example command. +""" + +def simplecommand(cmd_name, aliases = [], permission = None, usage = None, description = None, sender_limit = -1, min_args = 0, max_args = -1): + cmd_name = cmd_name.lower() + if not permission: + permission = "utils." + cmd_name + if not usage: + usage = "[args...]" + if not description: + description = "Handles " + cmd_name + + def actualDecorator(function): + + @hook.command(cmd_name, aliases = aliases) + def __call_func__(sender, command, label, args): + try: + message = __run__(sender, command, label, args) + if message: + msg(sender, message) + except: + error(trace()) + + def __run__(sender, command, label, args): + isplayer = is_player(sender) + if not is_sender_valid(isplayer): + return "&cThis command can only be run from the console" if isplayer else "&cThis command can only be run by players" + if not sender.hasPermission(permission): + return "&cYou do not have permission to use this command" + if not checkargs(sender, args, min_args, max_args): + return None + return help_message(sender) if args and args[0].lower() == "help" else function(sender, command, label, args) + + return __call_func__ + + def is_sender_valid(isplayer): + return True if sender_limit == -1 else sender_limit != isplayer + + def help_message(sender): + """ + Information about command /<cmd>: #Light green + description... #Blue + description... #Blue + + Syntax: /<cmd> <usage> #Light green + Aliases: alias1, alias2, alias3 #Gold + """ + try: + help_msg = "&aInformation about command /%s:\n &9%s" % (cmd_name, description.replace("\n", "\n ")) + help_msg += "\n\n&aSyntax: &o/%s %s" % (cmd_name, usage) + if aliases: + help_msg += ("\n&6Aliases: " + "".join([(alias + ", ") for alias in aliases]))[:-2] + return help_msg + except: + error(trace()) + + return actualDecorator + + +""" +@simplecommand("test", usage = "<player>", description = "Kicks a player", aliases = ["kickp", "tek"], permission = "utils.kickuser", sender_limit = 0, min_args = 1, max_args = 2) +def on_test(sender, command, label, args): + target = server.getPlayer(args[0]); + if target: + target.kickPlayer("Kicked from the server") + return None + return "&cThat player could not be found" +""" |