From 47c2cbb0fa93e143c6add4cf1eb4012bbc37f7b2 Mon Sep 17 00:00:00 2001 From: jesopo Date: Fri, 22 Feb 2019 11:23:36 +0000 Subject: Split line_handler.py out in to different files for different categories --- modules/line_handler/message.py | 168 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 modules/line_handler/message.py (limited to 'modules/line_handler/message.py') diff --git a/modules/line_handler/message.py b/modules/line_handler/message.py new file mode 100644 index 00000000..cdea31c0 --- /dev/null +++ b/modules/line_handler/message.py @@ -0,0 +1,168 @@ +from src import utils + +def _from_self(server, direction, prefix): + if direction == utils.Direction.SEND: + if "echo-message" in server.agreed_capabilities: + return None + else: + return True + else: + if prefix: + return server.is_own_nickname(prefix.nickname) + else: + return False + +def privmsg(events, event): + from_self = _from_self(event["server"], event["direction"], + event.get("prefix", None)) + if from_self == None: + return + + user = None + if "prefix" in event and not from_self: + user = event["server"].get_user(event["prefix"].nickname) + + message = event["args"][1] + target = event["args"][0] + + # 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 + statusmsg = [] + while target[0] in event["server"].prefix_symbols.keys(): + statusmsg.append(target[0]) + target = target[1:] + + channel = None + if target[0] in event["server"].channel_types: + 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 + event_type = "ctcp.%s" % ctcp_message.command + if ctcp_message.command == "ACTION": + action = True + message = ctcp_message.message + + 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} + + 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, statusmsg=statusmsg, **kwargs) + channel.buffer.add_message(user_nickname, message, action, + event["tags"], user==None) + elif event["server"].is_own_nickname(target): + hook.call(user=user, **kwargs) + user.buffer.add_message(user_nickname, message, action, + event["tags"], False) + 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) + +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] + message_split = message.split(" ") + 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"]) + 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) + + direction = "send" if from_self else "received" + context = "channel" if channel else "private" + hook = events.on(direction).on("notice").on(context) + + user_nickname = None + if user: + user_nickname = None if from_self else user.nickname + + kwargs = {"message": message, "message_split": message_split, + "server": event["server"], "tags": event["tags"]} + + if channel: + hook.call(user=user, channel=channel, **kwargs) + channel.buffer.add_notice(user_nickname, message, event["tags"], + user==None) + elif event["server"].is_own_nickname(target): + hook.call(user=user, **kwargs) + user.buffer.add_notice(user_nickname, message, event["tags"], + False) + 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) + +# IRCv3 TAGMSG, used to send tags without any other information +@utils.hook("raw.received.tagmsg") +def tagmsg(events, event): + from_self = _from_self(event["server"], event["direction"], + event.get("prefix", None)) + if from_self == None: + return + + user = None + if "prefix" in event and not from_self: + user = event["server"].get_user(event["prefix"].nickname) + + target = event["args"][0] + channel = None + if target[0] in event["server"].channel_types: + channel = event["server"].channels.get(target) + + direction = "send" if from_self else "received" + context = "channel" if channel else "private" + hook = events.on(direction).on("tagmsg").on(context) + + kwargs = {"server": event["server"], "tags": event["tags"]} + + if channel: + hook.call(user=user, channel=channel, **kwargs) + elif event["server"].is_own_nickname(taget): + hook.call(user=user, **kwargs) + elif from_self: + user = event["server"].get_user(target) + hook.call(user=user, **kwargs) -- cgit v1.3.1-10-gc9f91