CommandManager works! (Renamed to simplecommand)

See at the bottom of helpers.py!
I'm quite excited for this addition <3
This commit is contained in:
Dico200
2015-03-23 23:03:11 +01:00
parent f1b2c61411
commit 7b8242697a
2 changed files with 105 additions and 80 deletions

View File

@@ -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

View File

@@ -11,6 +11,8 @@ import org.bukkit.event.entity as entity
import org.bukkit.command.ConsoleCommandSender import org.bukkit.command.ConsoleCommandSender
from org.bukkit.entity import * from org.bukkit.entity import *
from traceback import format_exc as trace
shared = {} # this dict can be used to share stuff across modules 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) msg(player, "&a%s turned off!" % name)
elif add != False: elif add != False:
ls.append(pid) ls.append(pid)
msg(player, "&a%s turned on!" % name) 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"
"""