GLaDOS/v5.py

47 lines
1.4 KiB
Python
Raw Permalink Normal View History

2021-05-06 14:09:49 +02:00
import logging, socket
2020-11-11 13:46:05 +01:00
from threading import Thread
from functools import wraps
class V5(object):
def __init__(self, v5, irc):
""" Initialize v5 handle
:irc <IRC>: an initialized IRC object """
self.irc = irc
self._sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
self._sock.bind(v5)
self._handler = Thread(target=self._handle)
self._callbacks = []
def start(self):
# Start v5 handler
self._handler.start()
2021-05-06 14:09:49 +02:00
logging.info("started")
2020-11-11 13:46:05 +01:00
def on(self, event):
""" Adds a callback to the v5 handler
Event is a function taking in parameter a list of channels and a
string, and return True if the callback should be executed """
def callback(func):
@wraps(func)
def wrapper(channels, message):
func(channels, message)
self._callbacks.append((event, wrapper))
return wrapper
return callback
def _handle(self):
while True:
data, addr = self._sock.recvfrom(4096)
data = data.decode()
2021-05-06 14:09:49 +02:00
logging.debug(f"received {data}")
2020-11-11 13:46:05 +01:00
channels, message = data.split(":", 1)
channels = channels.split(" ")
for event, callback in self._callbacks:
if event(channels, message):
2021-05-06 14:09:49 +02:00
logging.info(f"passed {event.__name__}")
2020-11-11 13:46:05 +01:00
callback(channels, message)