diff --git a/bridge.py b/bridge.py index 372deac..fca680c 100755 --- a/bridge.py +++ b/bridge.py @@ -30,8 +30,7 @@ def handle_irc(m): @shoutbox.on(lambda m: m.channel in channels) def handle_shoutbox(m): author = Shoutbox.normalize(m.author) - logging.debug(f"BBCODE: {m.bbcode}") - shoutbox.irc_clients[author][0].send(f"#{m.channel}", f"{m.text}") + shoutbox.irc_clients[author][0].send(f"#{m.channel}", f"{m.text}", bbcode=m.bbcode) irc.start(f"Shoutbox[{nick}]", password, nick) diff --git a/irc.py b/irc.py index 55006f1..38e9056 100644 --- a/irc.py +++ b/irc.py @@ -37,6 +37,7 @@ class IRC(object): self._send(f"USER {nick} * * :{nick}") self._send(f"NICK {nick}") + self._send(f"CAP REQ :message-tags") self._waitfor(lambda m: "NOTICE" in m and "/AUTH" in m) for i in range(3): @@ -76,9 +77,13 @@ class IRC(object): logging.info(f"matched {event.__name__}") callback(message) - def send(self, target, message): + def send(self, target, message, bbcode=None): """ Send a message to the specified target (channel or user) """ - self._send(f"PRIVMSG {target} :{message}") + if bbcode is not None: + bbcode = self._escapetag(bbcode) + self._send(f"@planet-casio.com/v4-bbcode={bbcode} PRIVMSG {target} :{message}") + else: + self._send(f"PRIVMSG {target} :{message}") def receive(self): """ Receive a private message """ @@ -156,6 +161,15 @@ class IRC(object): msg = self._recv() return msg + def _escapetag(self, text): + """ Escape text as an IRC tag """ + text = text.replace("\\", "\\\\") + text = text.replace(";", "\\:") + text = text.replace(" ", "\\s") + text = text.replace("\r", "\\r") + text = text.replace("\n", "\\n") + return text + class IRCMessage(object): r = re.compile("^:(?P[\w.~|\[\]]+)(?:!(?P\S+))? PRIVMSG (?P\S+) :(?P.+)")