#!/opt/abots/env/bin/python3 from components import IRCSocketClient, Composer from abots.net import PrefixSocketClient from abots.helpers import Logger, infinitedict, isnumeric, coroutine from time import sleep from os import remove as delete_file from os.path import isfile logname = "babili_irc_client" logfile = f"{logname}.log" if isfile(logfile): delete_file(logfile) settings = infinitedict() settings["file"]["formatter"] = "%(message)s" settings["stream"]["formatter"] = "%(message)s" logger = Logger(logname, settings=settings) logger.start() composer = Composer(logger) irc_host = "irc.tilde.chat"#"localhost" irc_port = 6697 irc_timeout = 3 irc_args = irc_host, irc_port, irc_timeout, True irc_client, inbox, outbox, events = composer.start_socket(*irc_args) irc_client.ready.wait() name = "babili" @coroutine def log(cancel): try: while True: sock, line = (yield) meta = composer.parse_message(line) if meta.get("command", None) == "ERROR": logger.error(meta.get("raw")) continue logger.debug(meta.get("raw")) except GeneratorExit: pass @coroutine def stopper(cancel): try: while True: sock, line = (yield) meta = composer.parse_message(line) if meta.get("nick", None) != "NickServ": continue if meta.get("command", None) != "NOTICE": continue params = composer.cleanup(meta.get("params", "")) nickserv_complain = "please choose a different nick" if nickserv_complain not in params: continue cancel() sleep(0.01) sock.send("QUIT bye-bye!") sleep(1) sock.stop() composer.kill_switch.set() break except GeneratorExit: pass @coroutine def init(cancel): try: while True: sock, line = (yield) meta = composer.parse_message(line) if meta.get("source", None) != "server": continue if meta.get("command", None) != "NOTICE": continue if "hostname" not in meta.get("params", ""): continue cancel() logger.debug(meta["raw"]) sleep(0.01) sock.send("CAP LS") break except GeneratorExit: pass @coroutine def caps(cancel): try: while True: sock, line = (yield) meta = composer.parse_message(line) if meta.get("source", None) != "server": continue if meta.get("command", None) != "CAP": continue params = composer.cleanup(meta.get("params", "")) if "* LS" in params: capabilities = params.split("* LS", 1)[1].strip() logger.debug(f"Capabilities: {capabilities}") sock.send(f"CAP REQ :{capabilities}") elif "* ACK" in params: cancel() composer.register_many([log, stopper]) logger.debug(f"ACK!") sleep(0.01) sock.send("CAP END") sock.send(f"USER {name} - - -") sock.send(f"NICK {name}") break except GeneratorExit: pass composer.register_many([init, caps]) composer.get_messages(irc_client) #irc_client.send("CAP LS") #caps, collect = extract_params(collect, "* LS", # {"source": "server", "command": "CAP"}) #if caps is not None: # logger.debug(caps) # irc_client.send(f"CAP REQ :{caps}") #status, collect = need_param(collect, {"source": "server", "command": "CAP"}) #ack = "ACK" in status #logger.debug("ACK!") #irc_client.send("CAP END") #irc_client.send(f"USER {name} - - -") #irc_client.send(f"NICK {name}") #sleep(2) #irc_client.send("VERSION") #responses, collect = need(collect, "params", # {"source": "nick", "nick": "NickServ"}) #nickserv_complain = "please choose a different nick" #register = False #for response in responses: # if nickserv_complain in response.get("params", ""): # register = True # break #if register: # logger.debug("Needs to register bot now") #irc_client.stop()