diff options
| author | 2019-11-20 11:34:36 +0000 | |
|---|---|---|
| committer | 2019-11-20 11:34:36 +0000 | |
| commit | 17edb1c8cbe7975e9025f68baf91df80044bdb02 (patch) | |
| tree | 54be1b5cb324da81d6abfb168075bb5960b83d72 /modules | |
| parent | set private NOTICE context so print_activity shows who a notice was sent to (diff) | |
| signature | ||
move command aliases out to their own module (aliases.py)
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/aliases.py | 113 | ||||
| -rw-r--r-- | modules/commands/__init__.py | 79 |
2 files changed, 126 insertions, 66 deletions
diff --git a/modules/aliases.py b/modules/aliases.py new file mode 100644 index 00000000..90619908 --- /dev/null +++ b/modules/aliases.py @@ -0,0 +1,113 @@ +#--depends-on commands +import re +from src import EventManager, ModuleManager, utils + +REGEX_ARG_NUMBER = re.compile(r"\$(?:(\d+)(-?)|(-))") +SETTING_PREFIX = "alias-" + +class Module(ModuleManager.BaseModule): + def _arg_replace(self, s, args_split): + for match in REGEX_ARG_NUMBER.finditer(s): + if match.group(1): + index = int(match.group(1)) + continuous = match.group(2) == "-" + if index >= len(args_split): + raise IndexError("Unknown alias arg index") + else: + index = 0 + continuous = True + + if continuous: + replace = " ".join(args_split[index:]) + else: + replace = args_split[index] + s = s.replace(match.group(0), replace) + return s + + def _get_alias(self, server, target, command): + setting = "%s%s" % (SETTING_PREFIX, command) + alias = self.bot.get_setting(setting, + server.get_setting(setting, + target.get_setting(setting, None))) + if not alias == None: + alias, _, args = alias.partition(" ") + return alias, args + return None + def _get_aliases(self, targets): + alias_list = [] + for target in targets: + alias_list += target.find_settings(prefix=SETTING_PREFIX) + + aliases = {} + for alias in alias_list: + alias, _, args = alias.partition(" ") + if not alias in aliases: + aliases[alias] = args or None + return aliases + + @utils.hook("get.command") + @utils.kwarg("priority", EventManager.PRIORITY_URGENT) + def get_command(self, event): + alias = self._get_alias(event["server"], event["target"], + event["command"].command) + if not alias == None: + alias, alias_args = alias + event["command"].command = alias + event["command"].args = self._arg_replace(alias_args, + event["command"].args.split(" ")) + + @utils.hook("received.command.alias") + @utils.hook("received.command.calias") + @utils.kwarg("min_args", 1) + @utils.kwarg("usage", "list") + @utils.kwarg("usage", "add <alias> <command> [arg1 [arg2 ...]]") + @utils.kwarg("usage", "remove <alias>") + @utils.kwarg("remove_empty", False) + def alias(self, event): + target = event["server"] + if event["command"] == "calias": + if not event["is_channel"]: + raise utils.EventError("%scalias can only be used in-channel" + % event["command_prefix"]) + target = event["target"] + + subcommand = event["args_split"][0].lower() + if subcommand == "list": + aliases = self._get_aliases([target]) + event["stdout"].write("Available aliases: %s" % + ", ".join(sorted(aliases.keys()))) + + elif subcommand == "show": + if not len(event["args_split"]) > 1: + raise utils.EventError("Please provide an alias to remove") + + alias = event["args_split"][0].lower() + setting = target.get_setting("%s%s" % (SETTING_PREFIX, alias), None) + + if setting == None: + raise utils.EventError("I don't have an '%s' alias" % alias) + prefix = event["command_prefix"] + event["stdout"].write(f"{prefix}{alias}: {prefix}{setting}") + + elif subcommand == "add": + if not len(event["args_split"]) > 2: + raise utils.EventError("Please provide an alias and a command") + + alias = event["args_split"][1].lower() + command = event["args_split"][2].lower() + command = " ".join([command]+event["args_split"][3:]) + target.set_setting("%s%s" % (SETTING_PREFIX, alias), command) + + event["stdout"].write("Added '%s' alias" % alias) + + elif subcommand == "remove": + if not len(event["args_split"]) > 1: + raise utils.EventError("Please provide an alias to remove") + + alias = event["args_split"][1].lower() + setting = "%s%s" % (SETTING_PREFIX, alias) + if target.get_setting(setting, None) == None: + raise utils.EventError("I don't have an '%s' alias" % alias) + + target.del_setting(setting) + event["stdout"].write("Removed '%s' alias" % alias) diff --git a/modules/commands/__init__.py b/modules/commands/__init__.py index d48a58a8..9048fb8d 100644 --- a/modules/commands/__init__.py +++ b/modules/commands/__init__.py @@ -8,8 +8,6 @@ from . import outs COMMAND_METHOD = "command-method" COMMAND_METHODS = ["PRIVMSG", "NOTICE"] -REGEX_ARG_NUMBER = re.compile(r"\$(?:(\d+)(-?)|(-))") - MESSAGE_TAGS_CAP = utils.irc.Capability("message-tags", "draft/message-tags-0.2") MSGID_TAG = utils.irc.MessageTag("msgid", "draft/msgid") @@ -21,6 +19,11 @@ class BadContextException(Exception): self.required_context = required_context Exception.__init__(self) +class CommandEvent(object): + def __init__(self, command, args): + self.command = command + self.args = args + SETTING_COMMANDMETHOD = utils.OptionsSetting(COMMAND_METHODS, COMMAND_METHOD, "Set the method used to respond to commands") @@ -59,44 +62,19 @@ class Module(ModuleManager.BaseModule): if s and s[-1] in [":", ","]: return server.is_own_nickname(s[:-1]) - def _get_aliases(self, server): - return server.get_setting("command-aliases", {}) - def _set_aliases(self, server, aliases): - server.set_setting("command-aliases", aliases) - - def _alias_arg_replace(self, s, args_split): - for match in REGEX_ARG_NUMBER.finditer(s): - if match.group(1): - index = int(match.group(1)) - continuous = match.group(2) == "-" - if index >= len(args_split): - raise IndexError("Unknown alias arg index") - else: - index = 0 - continuous = True - - if continuous: - replace = " ".join(args_split[index:]) - else: - replace = args_split[index] - s = s.replace(match.group(0), replace) - return s - def _command_method(self, target, server): return target.get_setting(COMMAND_METHOD, server.get_setting(COMMAND_METHOD, self.bot.get_setting(COMMAND_METHOD, "PRIVMSG"))) - def _find_command_hook(self, server, command, is_channel, args): + def _find_command_hook(self, server, target, is_channel, command, args): if not self.has_command(command): - aliases = self._get_aliases(server) - if command.lower() in aliases: - command, _, new_args = aliases[command.lower()].partition(" ") + command_event = CommandEvent(command, args) + self.events.on("get.command").call(command=command_event, + server=server, target=target, is_channel=is_channel) - try: - args = self._alias_arg_replace(new_args, shlex.split(args)) - except IndexError: - return None, None, None + command = command_event.command + args = command_event.args hook = None args_split = [] @@ -300,7 +278,7 @@ class Module(ModuleManager.BaseModule): if command: try: hook, command, args_split = self._find_command_hook( - event["server"], command, True, args) + event["server"], event["channel"], True, command, args) except BadContextException: event["channel"].send_message( "%s: That command is not valid in a channel" % @@ -359,7 +337,7 @@ class Module(ModuleManager.BaseModule): try: hook, command, args_split = self._find_command_hook( - event["server"], command, False, args) + event["server"], event["user"], False, command, args) except BadContextException: event["user"].send_message( "That command is not valid in a PM") @@ -424,37 +402,6 @@ class Module(ModuleManager.BaseModule): if stderr.has_text(): event["target"].last_stderr = stderr - @utils.hook("received.command.alias", min_args=2) - def add_alias(self, event): - """ - :help: Add a command alias - :usage: <alias> <command> <args...> - :permission: command-alias - """ - alias = event["args_split"][0].lower() - command = " ".join(event["args_split"][1:]) - aliases = self._get_aliases(event["server"]) - aliases[alias] = command - self._set_aliases(event["server"], aliases) - event["stdout"].write("Added '%s' alias" % alias) - - @utils.hook("received.command.removealias", min_args=1) - def remove_alias(self, event): - """ - :help: Remove a command alias - :usage: <alias> - :permission: command-alias - """ - alias = event["args_split"][0].lower() - aliases = self._get_aliases(event["server"]) - - if not alias in aliases: - raise utils.EventError("No '%s' alias" % alias) - - del aliases[alias] - self._set_aliases(event["server"], aliases) - event["stdout"].write("Removed '%s' alias" % alias) - @utils.hook("check.command.self") def check_command_self(self, event): if event["server"].irc_lower(event["request_args"][0] |
