Adjusted to adhere to the new generator decorator

This commit is contained in:
aewens 2019-05-18 19:48:31 -05:00
parent 0cddba95e7
commit b4dae0b99c
3 changed files with 115 additions and 84 deletions

1
.gitignore vendored
View File

@ -4,6 +4,7 @@ abots/
abots abots
*.log *.log
*.swp *.swp
test_*.py
settings.json settings.json
# ---> Python # ---> Python

194
client.py
View File

@ -1,8 +1,10 @@
#!/opt/abots/env/bin/python3 #!/usr/bin/env python3
from components import IRCSocketClient, Composer from components import IRCSocketClient, Composer
from abots.net import PrefixSocketClient from abots.net import PrefixSocketClient
from abots.helpers import Logger, infinitedict, isnumeric, coroutine from abots.events import CoroEvent
from abots.helpers import Logger, infinitedict, isnumeric, coroutine, generator
from abots.helpers import jsto, jots
from time import sleep from time import sleep
from os import remove as delete_file from os import remove as delete_file
@ -27,91 +29,119 @@ irc_args = irc_host, irc_port, irc_timeout, True
irc_client, inbox, outbox, events = composer.start_socket(*irc_args) irc_client, inbox, outbox, events = composer.start_socket(*irc_args)
irc_client.ready.wait() irc_client.ready.wait()
name = "babili" with open("settings.json", "r") as config:
settings = jsto(config.read())
assert isinstance(settings, dict), "Expected dict"
irc_settings = settings.get("irc", dict())
name = irc_settings.get("name", "")
password = irc_settings.get("password", "")
author = irc_settings.get("author", "")
auto_join = irc_settings.get("auto-join", list())
requirements = irc_settings.get("requirements", list())
require_met = CoroEvent()
@coroutine def off(composer, sock):
def log(cancel): sock.send("QUIT bye-bye!")
try: sleep(1)
while True: sock.stop()
sock, line = (yield) composer.kill_switch.set()
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 @generator
def stopper(cancel): def log(event, cancel):
try: sock, line = (yield)
while True: meta = composer.parse_message(line)
sock, line = (yield) if meta.get("command", None) == "ERROR":
meta = composer.parse_message(line) logger.error(meta.get("raw"))
if meta.get("nick", None) != "NickServ": event.set()
continue logger.debug(meta.get("raw"))
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 @generator
def init(cancel): def pivot(event, cancel):
try: sock, line = (yield)
while True: meta = composer.parse_message(line)
sock, line = (yield) tags = meta.get("tags", dict())
meta = composer.parse_message(line) if tags.get("account", None) != author:
if meta.get("source", None) != "server": return
continue if meta.get("command", None) != "PRIVMSG":
if meta.get("command", None) != "NOTICE": return
continue params = composer.cleanup(meta.get("params", ""))
if "hostname" not in meta.get("params", ""): source, message = params.split(" ", 1)
continue if message == "!quit":
cancel() cancel()
logger.debug(meta["raw"]) event.set()
sleep(0.01) off(composer, sock)
sock.send("CAP LS") elif message == "!debug":
break logger.debug(meta)
except GeneratorExit:
pass
@coroutine
def caps(cancel): @generator
try: def identify(event, cancel):
while True: sock, line = (yield)
sock, line = (yield) meta = composer.parse_message(line)
meta = composer.parse_message(line) if meta.get("nick", None) != "NickServ":
if meta.get("source", None) != "server": return
continue if meta.get("command", None) != "NOTICE":
if meta.get("command", None) != "CAP": return
continue params = composer.cleanup(meta.get("params", ""))
params = composer.cleanup(meta.get("params", "")) nickserv_complain = "please choose a different nick"
if "* LS" in params: if nickserv_complain not in params:
capabilities = params.split("* LS", 1)[1].strip() return
logger.debug(f"Capabilities: {capabilities}") cancel()
sock.send(f"CAP REQ :{capabilities}") sleep(0.01)
elif "* ACK" in params: sock.send(f"PRIVMSG NickServ IDENTIFY {password}")
cancel() sleep(1)
composer.register_many([log, stopper]) composer.register(log)
logger.debug(f"ACK!") for channel in auto_join:
sleep(0.01) sock.send(f"JOIN {channel}")
sock.send("CAP END") composer.register(pivot)
sock.send(f"USER {name} - - -") #off(composer, sock)
sock.send(f"NICK {name}") event.set()
@generator
def init(event, cancel):
sock, line = (yield)
meta = composer.parse_message(line)
if meta.get("source", None) != "server":
return
if meta.get("command", None) != "NOTICE":
return
if "hostname" not in meta.get("params", ""):
return
cancel()
logger.debug(meta["raw"])
sleep(0.01)
sock.send("CAP LS")
event.set()
@generator
def caps(event, cancel):
sock, line = (yield)
meta = composer.parse_message(line)
if meta.get("source", None) != "server":
return
if meta.get("command", None) != "CAP":
return
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}")
for cap in capabilities.split(" "):
if cap in requirements:
requirements.remove(cap)
if len(requirements) == 0:
require_met.set()
break break
except GeneratorExit: elif "* ACK" in params:
pass cancel()
logger.debug(f"ACK!")
event.set()
if require_met.is_set():
composer.register(identify)
sleep(0.01)
sock.send("CAP END")
sock.send(f"USER {name} - - -")
sock.send(f"NICK {name}")
composer.register_many([init, caps]) composer.register_many([init, caps])
composer.get_messages(irc_client) composer.get_messages(irc_client)

View File

@ -1,5 +1,5 @@
from components import IRCSocketClient from components import IRCSocketClient
from abots.events import AsyncEvent from abots.events import CoroEvent
from abots.helpers import Logger, infinitedict, isnumeric, coroutine, sha256 from abots.helpers import Logger, infinitedict, isnumeric, coroutine, sha256
from time import sleep from time import sleep
@ -10,7 +10,7 @@ class Composer:
def __init__(self, logger): def __init__(self, logger):
self.logger = logger self.logger = logger
self._targets = dict() self._targets = dict()
self.kill_switch = AsyncEvent() self.kill_switch = CoroEvent()
def start_socket(self, host, port, timeout=None, secure=False): def start_socket(self, host, port, timeout=None, secure=False):
sock = IRCSocketClient(host, port, timeout=timeout, secure=secure) sock = IRCSocketClient(host, port, timeout=timeout, secure=secure)