bitbot-3.11-fork/modules/line_handler/message.py

109 lines
3.6 KiB
Python

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)