diff options
| author | 2019-12-10 11:23:34 +0000 | |
|---|---|---|
| committer | 2019-12-10 11:23:34 +0000 | |
| commit | 734aec179f53712505a3f43f4c4ee5c41da4bd83 (patch) | |
| tree | bea68dfdbb6bf2fdbdc138bfba79a8fa0ecfc152 /src | |
| parent | don't overwrite `on_resume()` in ircv3_resume (diff) | |
| signature | ||
move aliases.py to core_modules
Diffstat (limited to 'src')
| -rw-r--r-- | src/core_modules/aliases.py | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/src/core_modules/aliases.py b/src/core_modules/aliases.py new file mode 100644 index 00000000..3b120370 --- /dev/null +++ b/src/core_modules/aliases.py @@ -0,0 +1,120 @@ +#--depends-on commands +import re +from src import EventManager, ModuleManager, utils + +REGEX_ARG_NUMBER = re.compile(r"\$(?:(\d+)(-?)|(-))") +SETTING_PREFIX = "command-alias-" + +class Module(ModuleManager.BaseModule): + def _arg_replace(self, s, args_split): + parts = s.split("$$") + for i, part in enumerate(parts): + 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] + parts[i] = part.replace(match.group(0), replace) + return "$".join(parts) + + def _get_alias(self, server, target, command): + setting = "%s%s" % (SETTING_PREFIX, command) + command = self.bot.get_setting(setting, + server.get_setting(setting, + target.get_setting(setting, None))) + if not command == None: + command, _, args = command.partition(" ") + return command, 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, command in alias_list: + alias = alias.replace(SETTING_PREFIX, "", 1) + if not alias in aliases: + aliases[alias] = command + 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", + require_mode="o", require_access="alias") + @utils.kwarg("min_args", 1) + @utils.kwarg("permission", "alias") + @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"][1].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) + + else: + raise utils.EventError("Unknown subcommand '%s'" % subcommand) |
