diff options
Diffstat (limited to 'src/core_modules')
| -rw-r--r-- | src/core_modules/admin.py | 14 | ||||
| -rw-r--r-- | src/core_modules/aliases.py | 38 | ||||
| -rw-r--r-- | src/core_modules/commands/__init__.py | 20 | ||||
| -rw-r--r-- | src/core_modules/cron.py | 3 | ||||
| -rw-r--r-- | src/core_modules/line_handler/channel.py | 5 | ||||
| -rw-r--r-- | src/core_modules/line_handler/core.py | 2 | ||||
| -rw-r--r-- | src/core_modules/line_handler/message.py | 11 | ||||
| -rw-r--r-- | src/core_modules/nick_regain.py | 40 | ||||
| -rw-r--r-- | src/core_modules/permissions/__init__.py | 16 |
9 files changed, 93 insertions, 56 deletions
diff --git a/src/core_modules/admin.py b/src/core_modules/admin.py index 364380d4..3a92dd39 100644 --- a/src/core_modules/admin.py +++ b/src/core_modules/admin.py @@ -33,18 +33,22 @@ class Module(ModuleManager.BaseModule): event["stderr"].write("Line was filtered") @utils.hook("received.command.part") + @utils.kwarg("help", "Part from the current or given channel") + @utils.kwarg("usage", "[channel]") def part(self, event): - """ - :help: Part from the current or given channel - :usage: [channel] - :permission: part - """ + check = utils.Check("permission", "part") + if event["args"]: target = event["args_split"][0] elif event["is_channel"]: target = event["target"].name + check |= utils.Check("channel-mode", "high") + check |= utils.Check("channel-access", "part") else: event["stderr"].write("No channel provided") + + event["check_assert"](check) + event["server"].send_part(target) def _id_from_alias(self, alias): diff --git a/src/core_modules/aliases.py b/src/core_modules/aliases.py index f1648fea..277a4922 100644 --- a/src/core_modules/aliases.py +++ b/src/core_modules/aliases.py @@ -1,30 +1,17 @@ #--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 _arg_replace(self, s, args_split, kwargs): + vars = {} + for i in range(len(args_split)): + vars[str(i)] = args_split[i] + vars["%d-" % i] = " ".join(args_split[i:]) + vars["-"] = " ".join(args_split) + vars.update(kwargs) + return utils.parse.format_token_replace(s, vars) def _get_alias(self, server, target, command): setting = "%s%s" % (SETTING_PREFIX, command) @@ -54,9 +41,14 @@ class Module(ModuleManager.BaseModule): event["command"].command) if not alias == None: alias, alias_args = alias + + given_args = [] + if event["command"].args: + given_args = event["command"].args.split(" ") + event["command"].command = alias - event["command"].args = self._arg_replace(alias_args, - event["command"].args.split(" ")) + event["command"].args = self._arg_replace(alias_args, given_args, + {"NICK": event["user"].nickname}) @utils.hook("received.command.alias") @utils.hook("received.command.balias") diff --git a/src/core_modules/commands/__init__.py b/src/core_modules/commands/__init__.py index a7b55f2b..b22541d5 100644 --- a/src/core_modules/commands/__init__.py +++ b/src/core_modules/commands/__init__.py @@ -73,11 +73,12 @@ class Module(ModuleManager.BaseModule): server.get_setting(COMMAND_METHOD, self.bot.get_setting(COMMAND_METHOD, default))).upper() - def _find_command_hook(self, server, target, is_channel, command, args): + def _find_command_hook(self, server, target, is_channel, command, user, + args): if not self.has_command(command): command_event = CommandEvent(command, args) self.events.on("get.command").call(command=command_event, - server=server, target=target, is_channel=is_channel) + server=server, target=target, is_channel=is_channel, user=user) command = command_event.command args = command_event.args @@ -303,7 +304,8 @@ class Module(ModuleManager.BaseModule): if command: try: hook, command, args_split = self._find_command_hook( - event["server"], event["channel"], True, command, args) + event["server"], event["channel"], True, command, + event["user"], args) except BadContextException: event["channel"].send_message( "%s: That command is not valid in a channel" % @@ -318,7 +320,7 @@ class Module(ModuleManager.BaseModule): self.command(event["server"], event["channel"], event["target_str"], True, event["user"], command, args_split, event["line"], hook, - command_prefix=command_prefix, + command_prefix=command_prefix, expect_output=True, buffer_line=event["buffer_line"]) else: self.events.on("unknown.command").call(server=event["server"], @@ -330,6 +332,9 @@ class Module(ModuleManager.BaseModule): for hook in regex_hooks: if event["action"] and hook.get_kwarg("ignore_action", True): continue + if event["statusmsg"] and not hook.get_kwarg("statusmsg", False + ): + continue pattern = hook.get_kwarg("pattern", None) if pattern: @@ -340,7 +345,7 @@ class Module(ModuleManager.BaseModule): event["target_str"], True, event["user"], command, "", event["line"], hook, match=match, message=event["message"], command_prefix="", - action=event["action"], + action=event["action"], expect_output=False, buffer_line=event["buffer_line"]) if res: @@ -361,7 +366,8 @@ class Module(ModuleManager.BaseModule): try: hook, command, args_split = self._find_command_hook( - event["server"], event["user"], False, command, args) + event["server"], event["user"], False, command, + event["user"], args) except BadContextException: event["user"].send_message( "That command is not valid in a PM") @@ -371,7 +377,7 @@ class Module(ModuleManager.BaseModule): self.command(event["server"], event["user"], event["user"].nickname, False, event["user"], command, args_split, event["line"], hook, command_prefix="", - buffer_line=event["buffer_line"]) + buffer_line=event["buffer_line"], expect_output=True) else: self.events.on("unknown.command").call(server=event["server"], target=event["user"], user=event["user"], command=command, diff --git a/src/core_modules/cron.py b/src/core_modules/cron.py index fa6b15a3..69e0105b 100644 --- a/src/core_modules/cron.py +++ b/src/core_modules/cron.py @@ -4,7 +4,8 @@ from src import ModuleManager, utils class Module(ModuleManager.BaseModule): def on_load(self): now = datetime.datetime.utcnow() - next_minute = now.replace(minute=now.minute+1, second=0, microsecond=0) + next_minute = now.replace(second=0, microsecond=0) + next_minute += datetime.timedelta(minutes=1) until = time.time()+((next_minute-now).total_seconds()) self.timers.add("cron", self._minute, 60, until) diff --git a/src/core_modules/line_handler/channel.py b/src/core_modules/line_handler/channel.py index 91150839..0def7828 100644 --- a/src/core_modules/line_handler/channel.py +++ b/src/core_modules/line_handler/channel.py @@ -123,8 +123,9 @@ def handle_324(events, event): args_str=args) def handle_329(event): - channel = event["server"].channels.get(event["line"].args[1]) - channel.creation_timestamp = int(event["line"].args[2]) + if event["line"].args[1] in event["server"].channels: + channel = event["server"].channels.get(event["line"].args[1]) + channel.creation_timestamp = int(event["line"].args[2]) def handle_477(timers, event): pass diff --git a/src/core_modules/line_handler/core.py b/src/core_modules/line_handler/core.py index d72bf223..60bde125 100644 --- a/src/core_modules/line_handler/core.py +++ b/src/core_modules/line_handler/core.py @@ -51,7 +51,7 @@ def handle_005(events, event): event["server"].channel_modes = list(modes[3]) if "CHANTYPES" in isupport: event["server"].channel_types = list(isupport["CHANTYPES"]) - if "CASEMAPPING" in isupport: + if "CASEMAPPING" in isupport and isupport["CASEMAPPING"]: event["server"].case_mapping = isupport["CASEMAPPING"] if "STATUSMSG" in isupport: event["server"].statusmsg = list(isupport["STATUSMSG"]) diff --git a/src/core_modules/line_handler/message.py b/src/core_modules/line_handler/message.py index fa36dbc2..035116b6 100644 --- a/src/core_modules/line_handler/message.py +++ b/src/core_modules/line_handler/message.py @@ -41,7 +41,13 @@ def message(events, event): # strip prefix_symbols from the start of target, for when people use # e.g. 'PRIVMSG +#channel :hi' which would send a message to only # voiced-or-above users - target = target_str.lstrip("".join(event["server"].statusmsg)) + statusmsg = "" + for char in target_str: + if char in event["server"].statusmsg: + statusmsg += char + else: + break + target = target_str.replace(statusmsg, "", 1) is_channel = event["server"].is_channel(target) @@ -54,7 +60,8 @@ def message(events, event): kwargs = {"server": event["server"], "target": target_obj, "target_str": target_str, "user": user, "tags": event["line"].tags, - "is_channel": is_channel, "from_self": from_self, "line": event["line"]} + "is_channel": is_channel, "from_self": from_self, "line": event["line"], + "statusmsg": statusmsg} action = False diff --git a/src/core_modules/nick_regain.py b/src/core_modules/nick_regain.py index cf1dfa48..7a05988c 100644 --- a/src/core_modules/nick_regain.py +++ b/src/core_modules/nick_regain.py @@ -2,8 +2,8 @@ from src import ModuleManager, utils class Module(ModuleManager.BaseModule): def _done_connecting(self, server): - target_nick = server.connection_params.nickname - if not server.irc_equals(server.nickname, target_nick): + target_nick = self._target(server) + if not self._regained(server, target_nick): if "MONITOR" in server.isupport: server.send_raw("MONITOR + %s" % target_nick) else: @@ -17,16 +17,34 @@ class Module(ModuleManager.BaseModule): def no_motd(self, event): self._done_connecting(event["server"]) + def _regained(self, server, target_nickname): + return server.irc_equals(target_nickname, server.nickname) + def _target(self, server): + return server.connection_params.nickname + @utils.hook("self.nick") def self_nick(self, event): - target_nick = event["server"].connection_params.nickname - if event["server"].irc_equals(event["new_nickname"], target_nick): + target_nick = self._target(event["server"]) + if self._regained(event["server"], target_nick): if "MONITOR" in event["server"].isupport: - event["server"].send_raw("MONITOR - %s " % target_nick) + event["server"].send_raw("MONITOR - %s" % target_nick) + + @utils.hook("received.nick") + def nick(self, event): + self._check(event["server"], event["old_nickname"]) + @utils.hook("received.quit") + def quit(self, event): + self._check(event["server"], event["user"].nickname) + + def _check(self, server, nickname): + target_nick = self._target(server) + if (not self._regained(server, target_nick) + and server.irc_equals(nickname, target_nick)): + server.send_nick(target_nick) @utils.hook("received.731") def mon_offline(self, event): - target_nick = event["server"].connection_params.nickname + target_nick = self._target(event["server"]) nicks = event["line"].args[1].split(",") nicks = [event["server"].irc_lower(n) for n in nicks] if event["server"].irc_lower(target_nick) in nicks: @@ -34,15 +52,15 @@ class Module(ModuleManager.BaseModule): def _ison_check(self, timer): server = timer.kwargs["server"] - target_nick = server.connection_params.nickname - if not server.irc_equals(server.nickname, target_nick): + target_nick = self._target(server) + if not self._regained(server, target_nick): server.send_raw("ISON %s" % target_nick) timer.redo() @utils.hook("received.303") def ison_response(self, event): - target_nick = event["server"].connection_params.nickname - if not event["line"].args[1] and not event["server"].irc_equals( - event["server"].nickname, target_nick): + target_nick = self._target(event["server"]) + if (not event["line"].args[1] and + not self._regained(event["server"], target_nick)): event["server"].send_nick(target_nick) diff --git a/src/core_modules/permissions/__init__.py b/src/core_modules/permissions/__init__.py index 0559774c..0c591ebe 100644 --- a/src/core_modules/permissions/__init__.py +++ b/src/core_modules/permissions/__init__.py @@ -2,10 +2,11 @@ import base64, binascii, os import scrypt -from src import ModuleManager, utils +from src import EventManager, ModuleManager, utils HOSTMASKS_SETTING = "hostmask-account" NO_PERMISSION = "You do not have permission to do that" +ACCOUNT_TAG = utils.irc.MessageTag("account") class Module(ModuleManager.BaseModule): def on_load(self): @@ -56,6 +57,8 @@ class Module(ModuleManager.BaseModule): def _has_identified(self, server, user, account): user._id_override = server.get_user_id(account) + self.events.on("internal.identified").call(server=server, user=user, + accunt=account) def _is_identified(self, user): return not user._id_override == None def _signout(self, user): @@ -117,6 +120,13 @@ class Module(ModuleManager.BaseModule): event["user"].account) else: self._set_hostmask(event["server"], event["user"]) + @utils.hook("received.message.private") + @utils.hook("received.message.channel") + @utils.kwarg("priority", EventManager.PRIORITY_HIGH) + def account_tag(self, event): + account = ACCOUNT_TAG.get_value(event["line"].tags) + if not account == None: + self._has_identified(event["server"], event["user"], account) def _get_permissions(self, user): if self._is_identified(user): @@ -219,8 +229,6 @@ class Module(ModuleManager.BaseModule): event["stdout"].write("Correct password, you have " "been identified as %s." % account) - self.events.on("internal.identified").call( - user=event["user"]) else: event["stderr"].write("Incorrect password for '%s'" % account) @@ -307,7 +315,7 @@ class Module(ModuleManager.BaseModule): hostmasks.append(hostmask) event["user"].set_setting(HOSTMASKS_SETTING, hostmasks) - hostmask_obj = utils.irc.hostmask_parse(hostmaks) + hostmask_obj = utils.irc.hostmask_parse(hostmask) self._specific_hostmask(event["server"], hostmask_obj, account) self._add_hostmask(event["server"], hostmask_obj, account) |
