diff options
Diffstat (limited to 'modules/line_handler/message.py')
| -rw-r--r-- | modules/line_handler/message.py | 200 |
1 files changed, 74 insertions, 126 deletions
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) |
