from simplesocket import ClientSocket from typing import Callable class Client: def __init__(self, server: str, port: int, nick: str, username: str, realname: str = "Python Bot"): self.nickname = nick self.__server = ClientSocket(server, port) self.__server.sendline("USER %s ignore ignore :%s" % (username, realname)) self.__server.sendline("NICK %s" % self.nickname) self.__function_register = { 'NICK': self.on_nick } self.receive() def receive(self): while line := self.__server.recvline(): print(line) if line.startswith("PING"): self.__server.sendline("PONG " + line.split()[1]) continue (msg_from, msg_type, msg_to, *msg) = line[1:].split() if msg_type == "433": self.nickname = msg[0] + "_" self.__server.sendline("NICK %s" % self.nickname) else: if msg_type in self.__function_register: self.__function_register[msg_type](msg_from, msg_to, " ".join(msg)[1:]) def register(self, msg_type: str, func: Callable[..., None]): self.__function_register[msg_type] = func def on_nick(self, old_nick: str, new_nick: str, _): old_nick = old_nick.split("!")[0] if old_nick == self.nickname: self.nickname = new_nick[1:] def nick(self, new_nick: str): self.__server.sendline("NICK %s" % new_nick) def join(self, channel: str): self.__server.sendline("JOIN %s" % channel) self.receive() def leave(self, channel: str): self.__server.sendline("LEAVE %s" % channel) self.receive() def privmsg(self, target: str, message: str): self.__server.sendline("PRIVMSG %s :%s" % (target, message)) def quit(self, message: str = "Elvis has left the building!"): self.__server.sendline("QUIT :%s" % message) self.receive() self.__server.close()