aboutsummaryrefslogtreecommitdiff
path: root/src/core_modules/aliases.py
diff options
context:
space:
mode:
authorGravatar jesopo2019-12-10 11:23:34 +0000
committerGravatar jesopo2019-12-10 11:23:34 +0000
commit734aec179f53712505a3f43f4c4ee5c41da4bd83 (patch)
treebea68dfdbb6bf2fdbdc138bfba79a8fa0ecfc152 /src/core_modules/aliases.py
parentdon't overwrite `on_resume()` in ircv3_resume (diff)
signature
move aliases.py to core_modules
Diffstat (limited to 'src/core_modules/aliases.py')
-rw-r--r--src/core_modules/aliases.py120
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)