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 21:34:10 +00:00
|
|
|
|
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"))
|
2019-05-10 21:34:10 +00:00
|
|
|
continue
|
2019-05-14 22:13:18 +00:00
|
|
|
logger.debug(meta.get("raw"))
|
|
|
|
except GeneratorExit:
|
|
|
|
pass
|
2019-05-10 21:34:10 +00:00
|
|
|
|
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-10 21:34:10 +00:00
|
|
|
|
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-10 21:34:10 +00:00
|
|
|
|
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-10 21:34:10 +00:00
|
|
|
|
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()
|