#!/usr/bin/python import re import socket import sys import tempfile import uxnrepl server = "irc.libera.chat" nick = b"uxnbot" channel = b"#uxn" sandbox = tempfile.mkdtemp(prefix='uxnrepl') irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) def send(msg): print('>>> %r' % msg) irc.send(msg + b'\r\n') def recv(): msg = irc.recv(2040) print('<<< %r' % msg) return msg print("connecting to: %s" % server) irc.connect((server, 6667)) send(b"USER %s %s %s :bot for testing uxntal code" % (nick, nick, nick)) send(b"NICK %s" % nick) #send("PRIVMSG nickserv :iNOOPE\r\n") send(b"JOIN %s" % channel) ping_re = re.compile(br'PING (.+)$') chan_msg_re = re.compile(br':([^!]+)![^ ]+ PRIVMSG ([^ ]+) :' + nick + br': (.*)$') priv_msg_re = re.compile(br':([^!]+)![^ ]+ PRIVMSG ' + nick + br' :(.*)$') ignored = {b'rst', b'wst', b''} def evaluate(msg): output = uxnrepl.execute(msg, sandbox=sandbox) lines = [s.strip() for s in output.split(b'\n')] interesting = [s for s in lines if s not in ignored] result = b' | '.join(interesting) print('*** executing %r gave %r -> %r -> %r' % (msg, output, interesting, result)) return result while True: #text = irc.recv(2040) #print(text) text = recv() m = ping_re.match(text) if m: send(b'PONG %s' % m.group(1)) continue m = chan_msg_re.match(text) if m and m.group(2) == channel: user = m.group(1) msg = m.group(3).strip() result = evaluate(msg) send(b'PRIVMSG %s :%s: %s' % (channel, user, result)) continue m = priv_msg_re.match(text) if m: user = m.group(1) msg = m.group(2).strip() result = evaluate(msg) send(b'PRIVMSG %s :%s' % (user, result)) continue # message from user in channel: # b':d_m!~d_m@user/d-m/x-5109880 PRIVMSG #uxn :uxnbot: hello\r\n' # keep alive: # b'PING :mercury.libera.chat\r\n' # private message # b':d_m!~d_m@user/d-m/x-5109880 PRIVMSG uxnbot :hello\r\n'