From b1eaa4ecd7130a6b993719207223f0d1c03597d7 Mon Sep 17 00:00:00 2001 From: Darks Date: Wed, 11 Nov 2020 13:46:05 +0100 Subject: [PATCH] Improved the API --- bot.py | 15 +++------------ main.py | 5 ++++- v5.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 13 deletions(-) create mode 100644 v5.py diff --git a/bot.py b/bot.py index 8fc48d4..f1cfbd0 100644 --- a/bot.py +++ b/bot.py @@ -2,6 +2,7 @@ import socket from threading import Thread from irc import IRC +from v5 import V5 from secrets import USER, PASSWORD @@ -9,9 +10,7 @@ class Bot(object): def __init__(self, irc, v5, channels): self.irc = IRC(*irc) self.channels = channels - self._sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) - self._v5_handler = Thread(target=self._handle_v5) - self._sock.bind(v5) + self.v5 = V5(v5, self.irc) def start(self): # Start IRC @@ -22,15 +21,7 @@ class Bot(object): self.irc.join(c) # Start v5 handler - self._v5_handler.start() + self.v5.start() # Run IRC self.irc.run() - - - def _handle_v5(self): - while True: - data, addr = self._sock.recvfrom(4096) - data = data.decode() - print(f"v5: Received <{data}>") - self.irc.send("#glados", data) diff --git a/main.py b/main.py index 20ca579..55a54f6 100755 --- a/main.py +++ b/main.py @@ -5,7 +5,6 @@ import time from threading import Thread from bot import Bot -from secrets import USER, PASSWORD glados = Bot( ('irc.planet-casio.com', 6697), @@ -17,5 +16,9 @@ glados = Bot( def say_hello(msg): glados.irc.send(msg.to, f"Nice to see you, {msg.author}") +@glados.v5.on(lambda c, m: True) +def announce(channels, message): + for c in channels: + glados.irc.send(c, message) glados.start() diff --git a/v5.py b/v5.py new file mode 100644 index 0000000..467c87d --- /dev/null +++ b/v5.py @@ -0,0 +1,43 @@ +import socket +from threading import Thread +from functools import wraps + +class V5(object): + def __init__(self, v5, irc): + """ Initialize v5 handle + :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() + + 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() + channels, message = data.split(":", 1) + channels = channels.split(" ") + + for event, callback in self._callbacks: + if event(channels, message): + callback(channels, message)