diff options
-rw-r--r-- | IRC.py | 53 | ||||
-rw-r--r-- | client.py | 65 |
2 files changed, 67 insertions, 51 deletions
diff --git a/IRC.py b/IRC.py index 90ef1fa..9361982 100644 --- a/IRC.py +++ b/IRC.py @@ -4,26 +4,31 @@ import socket import sys import irctokens import time + + class IRCBadMessage(Exception): pass + + class IRCError(Exception): pass + def printred(s): t = f"\033[1;31m {s} \033[0m\n" print(t) + def parsemsg(s): - """Breaks a message from an IRC server into its prefix, command, and arguments. - """ - prefix = '' + """Breaks a message from an IRC server into its prefix, command, and arguments.""" + prefix = "" trailing = [] if not s: - raise IRCBadMessage("Empty line.") - if s[0] == ':': - prefix, s = s[1:].split(' ', 1) - if s.find(' :') != -1: - s, trailing = s.split(' :', 1) + raise IRCBadMessage("Empty line.") + if s[0] == ":": + prefix, s = s[1:].split(" ", 1) + if s.find(" :") != -1: + s, trailing = s.split(" :", 1) args = s.split() args.append(trailing) else: @@ -32,10 +37,10 @@ def parsemsg(s): return prefix, command, args -LINEEND = '\r\n' +LINEEND = "\r\n" -class IRCBot: +class IRCBot: irc = None def __init__(self, sock, config=None): @@ -45,10 +50,10 @@ class IRCBot: def send_cmd(self, line): """Send an IRC Command, takes an IRC command string without the CRLF - Returns encoded msg on success raises IRCError on failure """ + Returns encoded msg on success raises IRCError on failure""" if not self.connected: raise IRCError("Not Connected") - encmsg = bytes(line.format() + LINEEND, 'UTF-8' ) + encmsg = bytes(line.format() + LINEEND, "UTF-8") expected = len(encmsg) if self.irc.send(encmsg) == expected: return str(encmsg) @@ -56,16 +61,15 @@ class IRCBot: raise IRCError("Unexpected Send Length") def on_welcome(self, *args, **kwargs): - authmsg = irctokens.build("NICKSERV", ['IDENTIFY', self.config['nickpass']]) + authmsg = irctokens.build("NICKSERV", ["IDENTIFY", self.config["nickpass"]]) self.send_cmd(authmsg) - joinmsg = irctokens.build("JOIN", [self.config['channel']]) + joinmsg = irctokens.build("JOIN", [self.config["channel"]]) self.send_cmd(joinmsg) - def send_privmsg(self, dst, msg): - msg = irctokens.build("PRIVMSG",[dst, msg]) + msg = irctokens.build("PRIVMSG", [dst, msg]) self.send_cmd(msg) - + def send_quit(self, quitmsg): msg = irctokens.build("QUIT", [quitmsg]) print(msg) @@ -87,12 +91,16 @@ class IRCBot: self.connected = True # Perform user registration - usermsg = irctokens.build("USER", [botnick, "0","*", "RabbitEars Bot"]).format() + password_msg = irctokens.build("PASS", [self.config["nickpass"]]) + self.send_cmd(password_msg) + usermsg = irctokens.build( + "USER", [botnick, "0", "*", "Nyx Kermitsdotter"] + ).format() print(usermsg) self.send_cmd(usermsg) nickmsg = irctokens.build("NICK", [botnick]) self.send_cmd(nickmsg) - + def get_response(self): # Get the response resp = self.irc.recv(4096).decode("UTF-8") @@ -103,9 +111,8 @@ class IRCBot: self.on_welcome(nwmsg.params) if nwmsg.command == "ERROR": raise IRCError(str(nwmsg.params[0])) - if nwmsg.command == 'PING': - print('Sending pong') - self.irc.send( - bytes('PONG ' + LINEEND, "UTF-8")) + if nwmsg.command == "PING": + print("Sending pong") + self.irc.send(bytes("PONG " + LINEEND, "UTF-8")) return msg diff --git a/client.py b/client.py index a3ce217..d1e7474 100644 --- a/client.py +++ b/client.py @@ -1,6 +1,6 @@ # Part of rabbitears See LICENSE for permissions # Copyright (C) 2022 Matt Arnold -from IRC import * +from IRC import IRCBot, IRCError, printred import os import random import ssl @@ -8,53 +8,64 @@ import socket import sys import irctokens import json +import re -LINEEND = '\r\n' +horse_counter = 0 +trigger_regex = re.compile(".*frog.*") +LINEEND = "\r\n" # IRC Config config = None -with open('config.json') as f: +with open("config.json") as f: jld = f.read() config = json.loads(jld) - -# Need to pass the IRCBot class a socket the reason it doesn't do this itself is +# Need to pass the IRCBot class a socket the reason it doesn't do this itself is # so you can set up TLS or not as you need it # These provide good defaults. But your milage may vary oursock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) context = ssl.SSLContext() context.check_hostname = False context.verify_mode = ssl.CERT_NONE -oursock = context.wrap_socket(oursock, server_hostname=config['hostname']) +oursock = context.wrap_socket(oursock, server_hostname=config["hostname"]) irc = IRCBot(oursock) -irc.connect(config['hostname'], - config['port'], - config['channel'], - config['nick'], - config['nickpass']) +irc.connect( + config["hostname"], + config["port"], + config["channel"], + config["nick"], + config["nickpass"], +) + def generate_response(person, message): msg = message.strip(LINEEND) - if 'cool.person' in person and msg.lower() == "hello botley": - return "Greetings Master" - elif msg.lower() == "hello": - return "Greetings Human!" - elif "Ground Control to Major Tom" in msg: - return "Put your helmet on!" - elif "Ziggy Stardust" in msg: - return "Looks good in leather pants" - else: - return None + if "horse" in person: + global horse_counter + horse_counter += 1 + if horse_counter % 50 == 0: + return "Ribbit, Frog on a horse, nobody knows where they'll go" + return "Ribbit, Frog on the floor where did she come from " + if trigger_regex.match(msg.lower()): + return "ribbit ribbit " + if "dozens" in person: + dice = random.randint(1, 20) + if dice <= 7: + return "watch it horse you almost clobbered me" + if "acdw" in person: + dice = random.randint(1, 12) + if dice == 1 or dice == 12: + return "I've been chilling in the basement for a minute" + while True: try: - text = irc.get_response() - print(text[0],text[1],text[2]) - if text[1] == 'PRIVMSG' and text[2][0] == config['channel']: - r = generate_response(text[0],text[2][1]) + print(text[0], text[1], text[2]) + if text[1] == "PRIVMSG" and text[2][0] == config["channel"]: + r = generate_response(text[0], text[2][1]) if r is not None: - irc.send_privmsg(config['channel'],r) + irc.send_privmsg(config["channel"], r) except KeyboardInterrupt: irc.send_quit("Ctrl-C Pressed") msg = oursock.recv(4096) @@ -63,5 +74,3 @@ while True: except IRCError as e: printred(e) sys.exit(1) - - |