aboutsummaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/aliases.py113
-rw-r--r--modules/commands/__init__.py79
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]