diff options
| -rw-r--r-- | IRC.py | 53 | ||||
| -rw-r--r-- | client.py | 65 | 
2 files changed, 67 insertions, 51 deletions
| @@ -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 @@ -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) - -     | 
