From 1c474771c513beaaecea90ec30e732d8c8cdc9c0 Mon Sep 17 00:00:00 2001 From: jesopo Date: Mon, 3 Sep 2018 22:17:34 +0100 Subject: [PATCH] Support IRCv3's echo-message --- IRCLineHandler.py | 32 +++++++++++++++++++++++--------- IRCServer.py | 37 +++++++++++++++++++------------------ 2 files changed, 42 insertions(+), 27 deletions(-) diff --git a/IRCLineHandler.py b/IRCLineHandler.py index 082aa884..045bc33d 100644 --- a/IRCLineHandler.py +++ b/IRCLineHandler.py @@ -8,7 +8,8 @@ RE_CHANTYPES = re.compile(r"\bCHANTYPES=(\W+)(?:\b|$)") RE_MODES = re.compile(r"[-+]\w+") CAPABILITIES = {"message-tags", "multi-prefix", "chghost", "invite-notify", - "account-tag", "account-notify", "extended-join", "away-notify"} + "account-tag", "account-notify", "extended-join", "away-notify", + "echo-message"} class LineHandler(object): def __init__(self, bot, events): @@ -372,17 +373,30 @@ class LineHandler(object): action = message.startswith("\01ACTION ") and message.endswith("\01") if action: message = message.replace("\01ACTION ", "", 1)[:-1] + + kwargs = {"message": message, "message_split": message_split, + "server": event["server"], "tags": event["tags"], + "action": action} + if target[0] in event["server"].channel_types: channel = event["server"].get_channel(event["args"][0]) - self.events.on("received").on("message").on("channel").call( - user=user, message=message, message_split=message_split, - channel=channel, action=action, server=event["server"], - tags=event["tags"]) - channel.buffer.add_line(user.nickname, message, action) + + if not event["server"].is_own_nickname(nickname): + self.events.on("received.message.channel").call( + user=user, channel=channel, **kwargs) + channel.buffer.add_line(user.nickname, message, action) + else: + # supporting echo-message + self.events.on("self.message.channel").call( + channel=channel, **kwargs) + channel.buffer.add_line(user.nickname, message, action, True) + elif event["server"].is_own_nickname(nickname): + # supporting echo-message + self.events.on("self.message.private").call( + user=event["server"].get_user(target), **kwargs) elif event["server"].is_own_nickname(target): - self.events.on("received").on("message").on("private").call( - user=user, message=message, message_split=message_split, - action=action, server=event["server"], tags=event["tags"]) + self.events.on("received.message.private").call( + user=user, **kwargs) user.buffer.add_line(user.nickname, message, action) # we've received a notice diff --git a/IRCServer.py b/IRCServer.py index dbfbdf8e..a1d42476 100644 --- a/IRCServer.py +++ b/IRCServer.py @@ -329,27 +329,28 @@ class Server(object): def send_message(self, target, message, prefix=None): full_message = message if not prefix else prefix+message - self.send("PRIVMSG %s :%s" % (target, full_message)) - action = full_message.startswith("\01ACTION " - ) and full_message.endswith("\01") - if action: - message = full_message.split("\01ACTION ", 1)[1][:-1] + if not "echo-message" in self.capabilities: + action = full_message.startswith("\01ACTION " + ) and full_message.endswith("\01") - full_message_split = full_message.split() - if self.has_channel(target): - channel = self.get_channel(target) - channel.buffer.add_line(None, message, action, True) - self.events.on("self").on("message").on("channel").call( - message=full_message, message_split=full_message_split, - channel=channel, action=action, server=self) - else: - user = self.get_user(target) - user.buffer.add_line(None, message, action, True) - self.events.on("self").on("message").on("private").call( - message=full_message, message_split=full_message_split, - user=user, action=action, server=self) + if action: + message = full_message.split("\01ACTION ", 1)[1][:-1] + + full_message_split = full_message.split() + if self.has_channel(target): + channel = self.get_channel(target) + channel.buffer.add_line(None, message, action, True) + self.events.on("self").on("message").on("channel").call( + message=full_message, message_split=full_message_split, + channel=channel, action=action, server=self) + else: + user = self.get_user(target) + user.buffer.add_line(None, message, action, True) + self.events.on("self").on("message").on("private").call( + message=full_message, message_split=full_message_split, + user=user, action=action, server=self) def send_notice(self, target, message): self.send("NOTICE %s :%s" % (target, message))