summaryrefslogtreecommitdiff
path: root/miniirc_idc.py
diff options
context:
space:
mode:
authorluk3yx <luk3yx@users.noreply.github.com>2022-04-21 08:18:00 +1200
committerluk3yx <luk3yx@users.noreply.github.com>2022-04-21 08:18:00 +1200
commit5efb17b2abdc8b7477e6ece15b891fee88f7dd8e (patch)
treedccfe412dd34f6ffc0f2146e4bc88fdd1a0ab41c /miniirc_idc.py
downloadminiirc_idc-5efb17b2abdc8b7477e6ece15b891fee88f7dd8e.tar.gz
miniirc_idc-5efb17b2abdc8b7477e6ece15b891fee88f7dd8e.zip
Initial commit
Diffstat (limited to 'miniirc_idc.py')
-rw-r--r--miniirc_idc.py84
1 files changed, 84 insertions, 0 deletions
diff --git a/miniirc_idc.py b/miniirc_idc.py
new file mode 100644
index 0000000..45d7757
--- /dev/null
+++ b/miniirc_idc.py
@@ -0,0 +1,84 @@
+#!/usr/bin/env python3
+#
+# This is very horrible and quickly written
+# But it works
+#
+
+import datetime, miniirc, re
+assert miniirc.ver >= (1,8,1)
+
+
+_LEADING_COLON = '' if miniirc.ver[0] > 2 else ':'
+_esc_re = re.compile(r'\\(.)|\t')
+
+
+idc_to_irc = {
+ #'MESSAGE': 'PRIVMSG',
+ 'RPL_LOGIN_GOOD': '001',
+}
+
+
+class IDC(miniirc.IRC):
+ def idc_message_parser(self, msg):
+ args = _esc_re.sub(lambda m: m.group(1) or '\udeff', msg).split('\udeff')
+
+ command = args.pop(0).upper()
+ tags = {}
+ if command == 'PRIVMSG':
+ dt = datetime.datetime.utcfromtimestamp(float(args[0]))
+ tags['time'] = dt.isoformat() + 'Z'
+ hostmask = (args[1], args[1], f'idc/{args[1]}')
+ args = [self.current_nick, args[2]]
+ else:
+ hostmask = ('', '', '')
+
+ if args and _LEADING_COLON:
+ args[-1] = _LEADING_COLON + args[-1]
+ return idc_to_irc.get(command, command), hostmask, tags, args
+
+ # Send raw messages
+ def idc_send(self, *args):
+ line = '\t'.join(arg.replace('\\', '\\\\').replace('\t', '\\\t')
+ for arg in args)
+ super().quote(line, force=True)
+
+ if miniirc.ver < (2, 0, 0):
+ @property
+ def _sock(self):
+ return self.sock
+
+ def quote(self, *msg, force=None, tags=None) -> None:
+ cmd, _, tags2, args = miniirc.ircv3_message_parser(' '.join(msg))
+ if miniirc.ver[0] < 2 and args and args[-1].startswith(':'):
+ args[-1] = args[-1][1:]
+ self.send(cmd, *args, force=force, tags=tags or tags2)
+
+ def _get_idc_account(self):
+ if isinstance(self.ns_identity, tuple):
+ return self.ns_identity
+ else:
+ return self.ns_identity.split(' ', 1)
+
+ @property
+ def current_nick(self):
+ return self._get_idc_account()[0]
+
+ def send(self, cmd, *args, force=None, tags=None) -> None:
+ cmd = cmd.upper()
+ if cmd in ('PRIVMSG', 'NOTICE'):
+ target = args[0]
+ # TODO: Make miniirc think that SASL worked PMs to NickServ don't
+ # have to be blocked.
+ if target == 'NickServ':
+ return
+ self.idc_send('CHANMSG' if target.startswith('#') else 'PRIVMSG',
+ *args)
+ elif cmd in ('PING', 'QUIT'):
+ self.idc_send(cmd, *args)
+ elif cmd == 'USER':
+ user, password = self._get_idc_account()
+ self.idc_send('USER', user, password)
+
+ # Override the message parser to change the default parser.
+ def change_parser(self, parser=None):
+ super().change_parser(parser or self.idc_message_parser)