57 lines
2.0 KiB
Python
57 lines
2.0 KiB
Python
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()
|