import socket class IRC: """A set of methods for basic IRC communication.""" def __init__(self): self.debug = False self.sock = "" def is_debug(self, boolean): self.debug = boolean def send(self, command, text, *args, **kwargs): """Send messages given the IRC command and text. Optionally specify a message recipient with `recvr=user`.""" recvr = kwargs.get("recvr", "") if recvr != "": recvr += " :" if self.debug: print("[debug][send] " + command + " " + recvr + text) bs = bytes(command + " " + recvr + text + "\r\n", "utf-8") try: if kwargs.get("sock", "") != "": public_ss = kwargs.get("sock", "") public_ss.sendall(bs) else: self.sock.sendall(bs) except BrokenPipeError: print("[debug][broken_pipe_err] " + command + " " + recvr + text) pass def connect(self, server, bot_nick): """Connect to the server and sends user/nick information.""" self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.connect(server) self.send("USER", bot_nick + " " + bot_nick + " " + \ bot_nick + " " + bot_nick) self.send("NICK", bot_nick) return self.sock def disconnect(self, resp_msg, quit_msg, admin_user): """Notify the admin user and disconnect from the server.""" self.send("PRIVMSG", resp_msg, recvr=admin_user) self.send("QUIT", ":" + quit_msg) def receive(self, *args, **kwargs): data = self.sock.recv(2040).decode("utf-8").strip("\n\r") if self.debug: print("[debug][recv] " + data) return data def keep_alive(self, line): """Stay connected to a server by responding to server pings.""" if "PING" in line: self.send("PONG", ":" + line.split(":", 2)[1].split(" ", 1)[0]) def join_channels(self, channels): """Join channels from a list in the config.""" for c in channels: if c.strip() != "" or c.strip() != "#": self.send("JOIN", c) def parse_msg(self, line, req_prefix): """Extract the request, the nick and username of the requester, the channel where the request originated and returns a dictionary of values.""" data = {"req": "", "req_chan": "", "nick": "", "user": ""} if (":" + req_prefix) in line: data["req"] = line.split("PRIVMSG", 1)[1].split(":" + \ req_prefix, 1)[1].strip() data["req_chan"] = line.split("PRIVMSG ", \ 1)[1].split(" :", 1)[0] data["nick"] = line.split("!~", 1)[0][1:] data["user"] = line.split("!~", 2)[1][0:].split("@", 1)[0] return data