Adjusted to adhere to the new generator decorator
This commit is contained in:
parent
0cddba95e7
commit
b4dae0b99c
|
@ -4,6 +4,7 @@ abots/
|
||||||
abots
|
abots
|
||||||
*.log
|
*.log
|
||||||
*.swp
|
*.swp
|
||||||
|
test_*.py
|
||||||
settings.json
|
settings.json
|
||||||
|
|
||||||
# ---> Python
|
# ---> Python
|
||||||
|
|
194
client.py
194
client.py
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue