diff options
| author | 2019-12-10 05:27:35 +0000 | |
|---|---|---|
| committer | 2019-12-10 05:27:35 +0000 | |
| commit | 638eee0d685c06d258cb55287204ca97bca7c344 (patch) | |
| tree | 33442439317ae2846f1efb7674b7a3758c8990a1 /src/core_modules/line_handler/message.py | |
| parent | move sys.exit() codes to an enum in utils.consts (diff) | |
| signature | ||
move core modules to src/core_modules, make them uneffected by white/black list
Diffstat (limited to 'src/core_modules/line_handler/message.py')
| -rw-r--r-- | src/core_modules/line_handler/message.py | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/core_modules/line_handler/message.py b/src/core_modules/line_handler/message.py new file mode 100644 index 00000000..fa36dbc2 --- /dev/null +++ b/src/core_modules/line_handler/message.py @@ -0,0 +1,109 @@ +from src import IRCBuffer, utils + +def _from_self(server, source): + if source: + return server.is_own_nickname(source.nickname) + else: + return False + +def message(events, event): + from_self = _from_self(event["server"], event["line"].source) + if from_self == None: + return + + direction = "send" if from_self else "received" + + target_str = event["line"].args[0] + + message = None + if len(event["line"].args) > 1: + message = event["line"].args[1] + + if not from_self and ( + not event["line"].source or + not event["server"].name or + event["line"].source.hostmask == event["server"].name or + target_str == "*"): + if event["line"].source: + event["server"].name = event["line"].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["line"].source.nickname, + username=event["line"].source.username, + hostname=event["line"].source.hostname) + + # 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)) + + is_channel = event["server"].is_channel(target) + + if is_channel: + if not target in event["server"].channels: + return + target_obj = event["server"].channels.get(target) + else: + target_obj = event["server"].get_user(target) + + 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"]} + + action = False + + if message: + ctcp_message = utils.irc.parse_ctcp(message) + + if ctcp_message: + if (not ctcp_message.command == "ACTION" or not + event["line"].command == "PRIVMSG"): + if event["line"].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 + + if not message == None: + kwargs["message"] = message + kwargs["message_split"] = message.split(" ") + kwargs["action"] = action + + event_type = event["line"].command.lower() + if event_type == "privmsg": + event_type = "message" + + context = "channel" if is_channel else "private" + hook = events.on(direction).on(event_type).on(context) + + buffer_line = None + if message: + buffer_line = IRCBuffer.BufferLine(user.nickname, message, action, + event["line"].tags, from_self, event["line"].command) + + buffer_obj = target_obj + if is_channel: + hook.call(channel=target_obj, buffer_line=buffer_line, **kwargs) + else: + buffer_obj = target_obj + if not from_self: + buffer_obj = user + + hook.call(buffer_line=buffer_line, **kwargs) + + if buffer_line: + buffer_obj.buffer.add(buffer_line) |
