From a5f20b3113de24f0cea30825f904ae8ddf95ac6f Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Sun, 11 Jun 2023 18:25:08 +0200 Subject: [PATCH] Delete classes and add decorators --- glados_cmnds.py | 56 +++++++++++++++++++------- irc_api/api.py | 102 ++++++++++++++++++++++++++---------------------- irc_api/irc.py | 2 +- main.py | 11 +++--- 4 files changed, 103 insertions(+), 68 deletions(-) diff --git a/glados_cmnds.py b/glados_cmnds.py index 8810cc1..42643fc 100644 --- a/glados_cmnds.py +++ b/glados_cmnds.py @@ -1,20 +1,46 @@ from irc_api import api +from random import choice -class GladosV4(api.CommandsPack): - @api.command(name="bye", event=lambda m: "au revoir glados" in m.text.lower()) - def greetings_bye(self, msg): - """Répond "au revoir".""" - self.bot.irc.send(msg.to, f"Au revoir {msg.author}") - - @api.command(name="hello", event=lambda m: "bonjour glados" in m.text.lower()) - def greetings_hello(self, msg): - """Dit bonjour lorsque l'on salue le GLaDOS.""" - self.bot.irc.send(msg.to, f"Bonjour {msg.author}") +@api.on(lambda m: "au revoir glados" in m.text.lower()) +def greetings_bye(bot, msg): + bot.irc.send(msg.to, f"Au revoir {msg.author}") -class GladosV5(api.CommandsPack): - @api.command(name="test") - def test(self, msg): - """Test de module de fonction.""" - self.bot.irc.send(msg.to, "Ceci est un test") \ No newline at end of file +@api.channel("#glados") +@api.on( + event=lambda m: "bonjour glados" in m.text.lower(), + desc="Réagis au 'bonjour glados' uniquement si le message est envoyé depuis le channel"\ + "#glados." + ) +def greetings_hello(bot, msg): + bot.irc.send(msg.to, f"Oh un utilisateur sur #glados :o") + + +@api.command("test") +def test(bot, msg): + """Test de module de fonction.""" + bot.irc.send(msg.to, "Ceci est un test") + + +@api.channel("#glados") +def react_on_glados(bot, msg): + """Répond de manière random à tout les messages posté sur #glados.""" + answers = ( + f"Yo {msg.author} o/", + "Alors, de quoi on parle ?", + "Ça va ?", + "Bon, tu as fini de spammer ou bien ?", + "Ça roule ?", + "Hey you! Ah, you finally awake…", + ) + bot.irc.send(msg.to, choice(answers)) + + +commands = [ + api.auto_help, + greetings_bye, + greetings_hello, + test, + react_on_glados + ] \ No newline at end of file diff --git a/irc_api/api.py b/irc_api/api.py index f22da09..4f9abf4 100644 --- a/irc_api/api.py +++ b/irc_api/api.py @@ -1,45 +1,65 @@ -from functools import wraps import logging -from secrets import USER, PASSWORD from irc_api.irc import IRC PREFIX = "" -def command(name, event=None): - """Decorate a function and return a Command instance.""" + +def command(name, desc=""): def decorator(func): - desc = name - if func.__doc__: - desc = func.__doc__ return Command( name=name, - desc=desc, func=func, - event=event + events=[lambda m: m.text.startswith(PREFIX + name)], + desc=desc ) return decorator -class Command: - def __init__(self, name, desc, func, event=None): - self.name = name - self.desc = desc - self.func = func - if not event: - self.event = lambda m: m.text.startswith(PREFIX + name) - else: - self.event = event +def on(event, desc=""): + def decorator(func): + return Command( + name=func.__name__, + func=func, + events=[event], + desc=desc + ) + return decorator - self.cmnd_pack = None + +def channel(channel_name, desc=""): + def decorator(func_or_cmnd): + if isinstance(func_or_cmnd, Command): + func_or_cmnd.events.append(lambda m: m.to == channel_name) + return func_or_cmnd + else: + return Command( + name=func_or_cmnd.__name__, + func=func_or_cmnd, + events=[lambda m: m.to == channel_name], + desc=desc + ) + + return decorator + + +class Command: + def __init__(self, name, func, events, desc): + self.name = name + self.func = func + self.events = events + + if desc: + self.desc = desc + else: + self.desc = "..." + if func.__doc__: + self.desc = func.__doc__ + + self.bot = None def __call__(self, msg): - return self.func(self.cmnd_pack, msg) - - -class CommandsPack: - def __init__(self, bot): - self.bot = bot + return self.func(self.bot, msg) class Bot: @@ -59,7 +79,7 @@ class Bot: start : NoneType, public Runs the bot and connects it to IRC and V5 servers. """ - def __init__(self, irc_params: tuple, channels: list, prefix: str=""): + def __init__(self, auth: tuple, irc_params: tuple, channels: list, prefix: str=""): """Initialize the Bot instance. Parameters @@ -74,13 +94,14 @@ class Bot: global PREFIX PREFIX = prefix + self.auth = auth self.irc = IRC(*irc_params) self.channels = channels def start(self): """Starts the bot and connect it to the given IRC and V5 servers.""" # Start IRC - self.irc.start(USER, PASSWORD) + self.irc.start(self.auth[0], self.auth[1]) # Join channels for channel in self.channels: @@ -89,16 +110,7 @@ class Bot: # Run IRC self.irc.run() - def add_help(self): - help_callback = Command( - "aide", - "Affiche la liste des commandes disponibles.", - help_cmnd - ) - help_callback.cmnd_pack = self - self.irc.callbacks.append(help_callback) - - def add_commands_pack(self, commands_pack): + def add_commands(self, commands): """Add a package of commands to the bot. Parameters @@ -106,18 +118,14 @@ class Bot: commands_pack : CommandsPack A commands pack which contains command's instances. """ - cmnd_pack = commands_pack(self) - - for cmnd_name in dir(commands_pack): - if not cmnd_name.startswith("__") and not cmnd_name.endswith("__"): - cmnd = getattr(commands_pack, cmnd_name) - cmnd.cmnd_pack = cmnd_pack - - self.irc.callbacks.append(cmnd) + for cmnd in commands: + cmnd.bot = self + self.irc.callbacks.append(cmnd) -def help_cmnd(bot, msg): - """Documentation des fonctions disponibles.""" +@command("aide") +def auto_help(bot, msg): + """Aide des commandes disponibles.""" bot.irc.send(msg.to, f"Aide des commandes") for cmnd in bot.irc.callbacks: bot.irc.send(msg.to, f" – {cmnd.name} : {cmnd.desc}") diff --git a/irc_api/irc.py b/irc_api/irc.py index 79c2087..9ed4b21 100644 --- a/irc_api/irc.py +++ b/irc_api/irc.py @@ -109,7 +109,7 @@ class IRC: logging.info("received %s", message) if message is not None: for callback in self.callbacks: - if callback.event(message): + if not False in [event(message) for event in callback.events]: logging.info("matched %s", callback.name) callback(message) diff --git a/main.py b/main.py index c9f4acb..b2b3e3d 100755 --- a/main.py +++ b/main.py @@ -11,7 +11,10 @@ Create a bot's instance and manages it. import logging import re from irc_api import api -from glados_cmnds import GladosV4, GladosV5 + + +from glados_cmnds import commands +from secrets import USER, PASSWORD LOG_FORMAT = "%(asctime)s [%(levelname)s] <%(filename)s> %(funcName)s: %(message)s" @@ -19,15 +22,13 @@ logging.basicConfig(format=LOG_FORMAT, level=logging.DEBUG) glados = api.Bot( + (USER, PASSWORD), ('irc.planet-casio.com', 6697), ["#general", "#glados"], "!" ) - -glados.add_commands_pack(GladosV4) -glados.add_commands_pack(GladosV5) -glados.add_help() +glados.add_commands(commands) glados.start()