diff options
Diffstat (limited to 'modules/line_handler')
| -rw-r--r-- | modules/line_handler/__init__.py | 58 | ||||
| -rw-r--r-- | modules/line_handler/channel.py | 16 | ||||
| -rw-r--r-- | modules/line_handler/core.py | 9 | ||||
| -rw-r--r-- | modules/line_handler/ircv3.py | 2 | ||||
| -rw-r--r-- | modules/line_handler/message.py | 200 | ||||
| -rw-r--r-- | modules/line_handler/user.py | 18 |
6 files changed, 124 insertions, 179 deletions
diff --git a/modules/line_handler/__init__.py b/modules/line_handler/__init__.py index a11fdec5..19e1902b 100644 --- a/modules/line_handler/__init__.py +++ b/modules/line_handler/__init__.py @@ -2,11 +2,6 @@ import enum from src import EventManager, ModuleManager, utils from . import channel, core, ircv3, message, user -LABELED_BATCH = { - "labeled-response": "label", - "draft/labeled-response": "draft/label" -} - class Module(ModuleManager.BaseModule): def _handle(self, server, line): hooks = self.events.on("raw.received").on(line.command).get_hooks() @@ -15,8 +10,9 @@ class Module(ModuleManager.BaseModule): default_events.append(hook.kwargs.get("default_event", False)) default_event = any(default_events) - kwargs = {"args": line.args, "tags": line.tags, "server": server, - "prefix": line.prefix, "direction": utils.Direction.Recv} + kwargs = {"command": line.command, "args": line.args, "tags": line.tags, + "server": server, "source": line.source, + "direction": utils.Direction.Recv} self.events.on("raw.received").on(line.command).call_unsafe(**kwargs) if default_event or not hooks: @@ -26,7 +22,7 @@ class Module(ModuleManager.BaseModule): def handle_raw(self, event): if ("batch" in event["line"].tags and event["line"].tags["batch"] in event["server"].batches): - event["server"].batches[event["line"].tags["batch"]].lines.append( + event["server"].batches[event["line"].tags["batch"]].add_line( event["line"]) else: self._handle(event["server"], event["line"]) @@ -34,8 +30,9 @@ class Module(ModuleManager.BaseModule): @utils.hook("raw.send") def handle_send(self, event): self.events.on("raw.send").on(event["line"].command).call_unsafe( - args=event["line"].args, tags=event["line"].tags, - server=event["server"], direction=utils.Direction.Send) + command=event["line"].command, args=event["line"].args, + tags=event["line"].tags, server=event["server"], + direction=utils.Direction.Send) # ping from the server @utils.hook("raw.received.ping") @@ -158,22 +155,14 @@ class Module(ModuleManager.BaseModule): def invite(self, event): core.invite(self.events, event) - # we've received/sent a message + # we've received/sent a PRIVMSG, NOTICE or TAGMSG @utils.hook("raw.received.privmsg") @utils.hook("raw.send.privmsg") - def privmsg(self, event): - message.privmsg(self.events, event) - - # we've received/sent a notice @utils.hook("raw.received.notice") @utils.hook("raw.send.notice") - def notice(self, event): - message.notice(self.events, event) - - # IRCv3 TAGMSG, used to send tags without any other information @utils.hook("raw.received.tagmsg") - def tagmsg(self, event): - message.tagmsg(self.events, event) + def message(self, event): + message.message(self.events, event) # IRCv3 AWAY, used to notify us that a client we can see has changed /away @utils.hook("raw.received.away") @@ -187,20 +176,29 @@ class Module(ModuleManager.BaseModule): if modifier == "+": batch_type = event["args"][1] - event["server"].batches[identifier] = utils.irc.IRCRecvBatch( - identifier, batch_type, event["tags"]) + args = event["args"][2:] + + batch = utils.irc.IRCBatch(identifier, batch_type, args, + event["tags"]) + event["server"].batches[identifier] = batch + + self.events.on("received.batch.start").call(batch=batch, + server=event["server"]) else: batch = event["server"].batches[identifier] del event["server"].batches[identifier] - add_tags = {} - if batch.type in LABELED_BATCH.keys(): - tag_name = LABELED_BATCH[batch.type] - add_tags[tag_name] = batch.tags[tag_name] + lines = batch.get_lines() + + results = self.events.on("received.batch.end").call(batch=batch, + server=event["server"]) + + for result in results: + if not result == None: + lines = result + break - for line in batch.lines: - if add_tags: - line.tags.update(add_tags) + for line in lines: self._handle(event["server"], line) # IRCv3 CHGHOST, a user's username and/or hostname has changed diff --git a/modules/line_handler/channel.py b/modules/line_handler/channel.py index 5b877764..759fdf45 100644 --- a/modules/line_handler/channel.py +++ b/modules/line_handler/channel.py @@ -8,7 +8,7 @@ def handle_332(events, event): topic=topic) def topic(events, event): - user = event["server"].get_user(event["prefix"].nickname) + user = event["server"].get_user(event["source"].nickname) channel = event["server"].channels.get(event["args"][0]) topic = event["args"].get(1) channel.set_topic(topic) @@ -69,17 +69,17 @@ def join(events, event): account = event["args"][1] realname = event["args"][2] - user = event["server"].get_user(event["prefix"].nickname) + user = event["server"].get_user(event["source"].nickname) - user.username = event["prefix"].username - user.hostname = event["prefix"].hostname + user.username = event["source"].username + user.hostname = event["source"].hostname if account: user.identified_account = account user.identified_account_id = event["server"].get_user(account).get_id() if realname: user.realname = realname - is_self = event["server"].is_own_nickname(event["prefix"].nickname) + is_self = event["server"].is_own_nickname(event["source"].nickname) if is_self: channel = event["server"].channels.add(channel_name) else: @@ -101,7 +101,7 @@ def join(events, event): def part(events, event): channel = event["server"].channels.get(event["args"][0]) - user = event["server"].get_user(event["prefix"].nickname) + user = event["server"].get_user(event["source"].nickname) reason = event["args"].get(1) channel.remove_user(user) @@ -109,7 +109,7 @@ def part(events, event): if not len(user.channels): event["server"].remove_user(user) - if not event["server"].is_own_nickname(event["prefix"].nickname): + if not event["server"].is_own_nickname(event["source"].nickname): events.on("received.part").call(channel=channel, reason=reason, user=user, server=event["server"]) else: @@ -137,7 +137,7 @@ def handle_477(timers, event): server_id=event["server"].id) def kick(events, event): - user = event["server"].get_user(event["prefix"].nickname) + user = event["server"].get_user(event["source"].nickname) target = event["args"][1] channel = event["server"].channels.get(event["args"][0]) reason = event["args"].get(2) diff --git a/modules/line_handler/core.py b/modules/line_handler/core.py index 88544a08..3d656b2f 100644 --- a/modules/line_handler/core.py +++ b/modules/line_handler/core.py @@ -7,10 +7,11 @@ def ping(event): event["server"].send_pong(event["args"][0]) def handle_001(event): - event["server"].socket.set_write_throttling(True) - event["server"].name = event["prefix"].hostmask + event["server"].socket.enable_write_throttle() + event["server"].name = event["source"].hostmask event["server"].set_own_nickname(event["args"][0]) event["server"].send_whois(event["server"].nickname) + event["server"].connected = True def handle_005(events, event): isupport_list = event["args"][1:-1] @@ -64,7 +65,7 @@ def motd_line(event): event["server"].motd_lines.append(event["args"][1]) def mode(events, event): - user = event["server"].get_user(event["prefix"].nickname) + user = event["server"].get_user(event["source"].nickname) target = event["args"][0] is_channel = target[0] in event["server"].channel_types if is_channel: @@ -97,7 +98,7 @@ def mode(events, event): def invite(events, event): target_channel = event["args"][1] - user = event["server"].get_user(event["prefix"].nickname) + user = event["server"].get_user(event["source"].nickname) target_user = event["server"].get_user(event["args"][0]) events.on("received.invite").call(user=user, target_channel=target_channel, server=event["server"], target_user=target_user) diff --git a/modules/line_handler/ircv3.py b/modules/line_handler/ircv3.py index 42afece7..d9f83b75 100644 --- a/modules/line_handler/ircv3.py +++ b/modules/line_handler/ircv3.py @@ -10,11 +10,9 @@ CAPABILITIES = [ utils.irc.Capability("away-notify"), utils.irc.Capability("userhost-in-names"), utils.irc.Capability("message-tags", "draft/message-tags-0.2"), - utils.irc.Capability("server-time"), utils.irc.Capability("cap-notify"), utils.irc.Capability("batch"), utils.irc.Capability("echo-message"), - utils.irc.Capability(None, "draft/labeled-response"), utils.irc.Capability(None, "draft/rename"), utils.irc.Capability(None, "draft/setname") ] diff --git a/modules/line_handler/message.py b/modules/line_handler/message.py index 4fb507ca..9157af66 100644 --- a/modules/line_handler/message.py +++ b/modules/line_handler/message.py @@ -1,163 +1,111 @@ from src import utils -def _from_self(server, direction, prefix): +def _from_self(server, direction, source): if direction == utils.Direction.Send: if server.has_capability_str("echo-message"): return None else: return True else: - if prefix: - return server.is_own_nickname(prefix.nickname) + if source: + return server.is_own_nickname(source.nickname) else: return False -def privmsg(events, event): +def message(events, event): from_self = _from_self(event["server"], event["direction"], - event.get("prefix", None)) + event.get("source", None)) if from_self == None: return - user = None - if "prefix" in event and not from_self: - user = event["server"].get_user(event["prefix"].nickname) + direction = "send" if from_self else "received" - message = event["args"][1] target_str = event["args"][0] + message = None + if len(event["args"]) > 1: + message = event["args"][1] + + if not from_self and ( + not event["source"] or + not event["server"].name or + event["source"].hostmask == event["server"].name or + target_str == "*"): + if event["source"]: + event["server"].name = event["source"].hostmask + + events.on("received.server-notice").call(message=message, + message_split=message.split(" "), server=event["server"]) + return + + if from_self: + user = event["server"].get_user(event["server"].nickname) + else: + user = event["server"].get_user(event["source"].nickname) + # 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"].prefix_symbols.keys())) - channel = None + is_channel = False + if target[0] in event["server"].channel_types: + is_channel = True if not target in event["server"].channels: return - channel = event["server"].channels.get(target) - - action = False - event_type = "message" - ctcp_message = utils.irc.parse_ctcp(message) - if ctcp_message: - message = ctcp_message.message - if ctcp_message.command == "ACTION": - action = True - message = ctcp_message.message - else: - event_type = "ctcp.%s" % ctcp_message.command - - if user and "account" in event["tags"]: - user.identified_account = event["tags"]["account"] - user.identified_account_id = event["server"].get_user( - event["tags"]["account"]).get_id() - - kwargs = {"message": message, "message_split": message.split(" "), - "server": event["server"], "tags": event["tags"], - "action": action, "target_str": target_str} - - direction = "send" if from_self else "received" - context = "channel" if channel else "private" - hook = events.on(direction).on(event_type).on(context) - - user_nickname = None - if user: - user_nickname = None if from_self else user.nickname - - if channel: - hook.call(user=user, channel=channel, **kwargs) - channel.buffer.add_message(user_nickname, message, action, - event["tags"], user==None) - elif from_self: - # a message we've sent to a user - user = event["server"].get_user(target) - hook.call(user=user, **kwargs) - user.buffer.add_message(user_nickname, message, action, - event["tags"], True) - elif event["server"].is_own_nickname(target): - hook.call(user=user, **kwargs) - user.buffer.add_message(user_nickname, message, action, - event["tags"], False) - -def notice(events, event): - from_self = _from_self(event["server"], event["direction"], - event.get("prefix", None)) - if from_self == None: - return - - message = event["args"][1] - target = event["args"][0] - - if "prefix" in event and ( - not event["prefix"] or - not event["server"].name or - event["prefix"].hostmask == event["server"].name or - target == "*"): - if event["prefix"]: - event["server"].name = event["prefix"].hostmask - - events.on("received.server-notice").call(message=message, - message_split=message.split(" "), server=event["server"]) + target_obj = event["server"].channels.get(target) else: - user = None - if "prefix" in event and not from_self: - user = event["server"].get_user(event["prefix"].nickname) - - channel = None - if target[0] in event["server"].channel_types: - channel = event["server"].channels.get(target) + target_obj = event["server"].get_user(target) - direction = "send" if from_self else "received" - context = "channel" if channel else "private" - hook = events.on(direction).on("notice").on(context) + kwargs = {"server": event["server"], "target": target_obj, + "target_str": target_str, "user": user, "tags": event["tags"], + "is_channel": is_channel} - user_nickname = None - if user: - user_nickname = None if from_self else user.nickname + action = False - kwargs = {"message": message, "message_split": message.split(" "), - "server": event["server"], "tags": event["tags"]} + if message: + ctcp_message = utils.irc.parse_ctcp(message) - if channel: - hook.call(user=user, channel=channel, **kwargs) - channel.buffer.add_notice(user_nickname, message, event["tags"], - user==None) - elif from_self: - # a notice we've sent to a user - user = event["server"].get_user(target) - hook.call(user=user, **kwargs) - user.buffer.add_notice(user_nickname, message, event["tags"], - True) - elif event["server"].is_own_nickname(target): - hook.call(user=user, **kwargs) - user.buffer.add_notice(user_nickname, message, event["tags"], - False) + if ctcp_message: + if not ctcp_message.command == "ACTION" or not event["command" + ] == "PRIVMSG": + if event["command"] == "PRIVMSG": + ctcp_action = "request" + else: + ctcp_action = "response" + events.on(direction).on("ctcp").on(ctcp_action).call( + message=ctcp_message.message, **kwargs) + events.on(direction).on("ctcp").on(ctcp_action).on( + ctcp_message.command).call(message=ctcp_message.message, + **kwargs) + return + else: + message = ctcp_message.message + action = True -def tagmsg(events, event): - from_self = _from_self(event["server"], event["direction"], - event.get("prefix", None)) - if from_self == None: - return + if not message == None: + kwargs["message"] = message + kwargs["message_split"] = message.split(" ") + kwargs["action"] = action - user = None - if "prefix" in event and not from_self: - user = event["server"].get_user(event["prefix"].nickname) + event_type = event["command"].lower() + if event["command"] == "PRIVMSG": + event_type = "message" - target = event["args"][0] - channel = None - if target[0] in event["server"].channel_types: - channel = event["server"].channels.get(target) + context = "channel" if is_channel else "private" + hook = events.on(direction).on(event_type).on(context) - direction = "send" if from_self else "received" - context = "channel" if channel else "private" - hook = events.on(direction).on("tagmsg").on(context) + if is_channel: + hook.call(channel=target_obj, **kwargs) + target_obj.buffer.add_message(user.nickname, message, action, + event["tags"], from_self) + else: + hook.call(**kwargs) - kwargs = {"server": event["server"], "tags": event["tags"]} + buffer_obj = target_obj + if not from_self: + buffer_obj = user - if channel: - hook.call(user=user, channel=channel, **kwargs) - elif event["server"].is_own_nickname(target): - hook.call(user=user, **kwargs) - elif from_self: - user = event["server"].get_user(target) - hook.call(user=user, **kwargs) + buffer_obj.buffer.add_message(user.nickname, message, action, + event["tags"], from_self) diff --git a/modules/line_handler/user.py b/modules/line_handler/user.py index f95ce4f4..c31a3b52 100644 --- a/modules/line_handler/user.py +++ b/modules/line_handler/user.py @@ -19,13 +19,13 @@ def handle_311(event): def quit(events, event): nickname = None if event["direction"] == utils.Direction.Recv: - nickname = event["prefix"].nickname + nickname = event["source"].nickname reason = event["args"].get(0) if event["direction"] == utils.Direction.Recv: - nickname = event["prefix"].nickname + nickname = event["source"].nickname if (not event["server"].is_own_nickname(nickname) and - not event["prefix"].hostmask == "*"): + not event["source"].hostmask == "*"): user = event["server"].get_user(nickname) event["server"].remove_user(user) events.on("received.quit").call(reason=reason, user=user, @@ -37,10 +37,10 @@ def quit(events, event): def nick(events, event): new_nickname = event["args"].get(0) - user = event["server"].get_user(event["prefix"].nickname) + user = event["server"].get_user(event["source"].nickname) old_nickname = user.nickname - if not event["server"].is_own_nickname(event["prefix"].nickname): + if not event["server"].is_own_nickname(event["source"].nickname): events.on("received.nick").call(new_nickname=new_nickname, old_nickname=old_nickname, user=user, server=event["server"]) else: @@ -52,7 +52,7 @@ def nick(events, event): event["server"].change_user_nickname(old_nickname, new_nickname) def away(events, event): - user = event["server"].get_user(event["prefix"].nickname) + user = event["server"].get_user(event["source"].nickname) message = event["args"].get(0) if message: user.away = True @@ -65,7 +65,7 @@ def away(events, event): events.on("received.away.off").call(user=user, server=event["server"]) def chghost(event): - nickname = event["prefix"].nickname + nickname = event["source"].nickname username = event["args"][0] hostname = event["args"][1] @@ -78,7 +78,7 @@ def chghost(event): target.hostname = hostname def setname(event): - nickname = event["prefix"].nickname + nickname = event["source"].nickname realname = event["args"][0] user = event["server"].get_user(nickname) @@ -88,7 +88,7 @@ def setname(event): event["server"].realname = realname def account(events, event): - user = event["server"].get_user(event["prefix"].nickname) + user = event["server"].get_user(event["source"].nickname) if not event["args"][0] == "*": user.identified_account = event["args"][0] |
