irc-client/client.py

144 lines
4.2 KiB
Python
Raw Normal View History

2019-05-10 05:04:30 +00:00
#!/opt/abots/env/bin/python3
2019-05-14 22:13:18 +00:00
from components import IRCSocketClient, Composer
from abots.net import PrefixSocketClient
from abots.helpers import Logger, infinitedict, isnumeric, coroutine
2019-05-10 05:04:30 +00:00
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()
2019-05-14 22:13:18 +00:00
composer = Composer(logger)
2019-05-10 05:04:30 +00:00
2019-05-14 22:13:18 +00:00
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)
2019-05-10 05:04:30 +00:00
irc_client.ready.wait()
2019-05-14 22:13:18 +00:00
name = "babili"
2019-05-10 05:04:30 +00:00
2019-05-14 22:13:18 +00:00
@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
2019-05-14 22:13:18 +00:00
logger.debug(meta.get("raw"))
except GeneratorExit:
pass
2019-05-14 22:13:18 +00:00
@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
2019-05-14 22:13:18 +00:00
@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
2019-05-14 22:13:18 +00:00
@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
2019-05-14 22:13:18 +00:00
composer.register_many([init, caps])
composer.get_messages(irc_client)
2019-05-10 05:04:30 +00:00
2019-05-14 22:13:18 +00:00
#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()