diff --git a/.gitignore b/.gitignore index 77775c5..f00636f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ venv/ __pycache__/ *.log +users.conf reviews/ .coverage diff --git a/README.md b/README.md index 367b6f9..6e84600 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ # Hebdobot v3 -Ce projet est une refonte d'Hebdobot pour l'april en python. +Ce projet est une refonte d'Hebdobot pour l'April en Python. diff --git a/bot/hebdobot.py b/bot/hebdobot.py deleted file mode 100644 index 3382475..0000000 --- a/bot/hebdobot.py +++ /dev/null @@ -1,53 +0,0 @@ -from dataclasses import dataclass -import time - -from bot.hooks import hooks -from bot.review.review import Review - - -@dataclass -class Answer: - target: str - message: str - - -class Hebdobot: - def __init__(self, settings, channel, nickname="hebdobot"): - self.settings = settings - self.channel = channel - self.nickname = nickname - self.answers = [] - - # Gestion de la revue hebdomadaire - self.review = Review() - - def on_private_message(self, channel, sender, message): - """ - Tous les messages privés sont ignorés. Si l'utilisateur tente une commande, on - lui signale de le faire plutôt sur le canal public. - """ - self.answers = [] - if message[0] == "!": - self.send(sender, "vos commandes dans le salon public") - - return self.answers - - def on_public_message(self, channel, sender, message): - """ - Tous les messages publics sont pris en compte. On utilise les hooks chargés au - démarrage pour cela. - """ - self.answers = [] - if self.review.is_started: - self.review.add_message(sender, message) - - for hook in hooks: - if hook.process(self, channel, sender, message): - break - - return self.answers - - def send(self, target, message): - self.answers.append(Answer(target, message)) - if self.review.is_started and target == self.channel: - self.review.add_message(self.nickname, message) diff --git a/bot/hooks/help.py b/bot/hooks/help.py deleted file mode 100644 index 0452390..0000000 --- a/bot/hooks/help.py +++ /dev/null @@ -1,44 +0,0 @@ -import logger - - -class Help: - def process(self, bot, channel, sender, message): - """ - Le message est pris en compte si l'utilisateur demande de l'aide. - """ - if message.lower() in ("!aide", "!help", "!aide hebdobot", "!help hebdobot"): - logger.info("!help caught.") - - bot.send( - sender, - f"Bienvenue {sender}. Je suis {bot.nickname}, le robot de gestion " - "des revues hebdomadaires de l'April.", - ) - bot.send(sender, "Voici les commandes que je comprends :") - bot.send(sender, " ") - bot.send(sender, " !aide,!help : afficher cette aide") - bot.send( - sender, - " !aide commande : afficher l'aide de la commande !commande" - ) - bot.send(sender, " !début : commencer une nouvelle revue") - bot.send(sender, " % message  : traiter comme un commentaire") - bot.send(sender, " # titre  : démarrer un sujet individuel") - bot.send(sender, " ## titre  : démarrer un sujet collectif") - bot.send( - sender, - " !oups   : annuler la dernière entrée dans un point de " - "revue", - ) - bot.send(sender, " !courant : afficher le sujet en cours") - bot.send(sender, " !fin : terminer la revue en cours") - bot.send(sender, " !stop  : abandonner la revue en cours") - bot.send(sender, " ") - bot.send( - sender, - "Autres commandes : !anniv, !bonjour, !chrono, !date, !hello, " - "!licence, !manquants, !merci, !record, !salut, !stats, !status, " - "!version", - ) - - return True diff --git a/bot/review/__init__.py b/bot/review/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/events/__init__.py b/events/__init__.py new file mode 100644 index 0000000..005f15d --- /dev/null +++ b/events/__init__.py @@ -0,0 +1,5 @@ +from .event import Event + +events = ( + Event(), +) diff --git a/events/event.py b/events/event.py new file mode 100644 index 0000000..bdea709 --- /dev/null +++ b/events/event.py @@ -0,0 +1,31 @@ +""" +Script used to... +""" +import time + +import settings + +SCHEDULER_DELAY = 60 + + +class Event: + def __init__(self): + self.scheduler = None + self.callback = None + self.event_id = 1 + self.last_update = time.gmtime() + + def init_scheduler(self, scheduler, callback): + self.scheduler = scheduler + self.callback = callback + self.scheduler.execute_every(SCHEDULER_DELAY, self.do_something) + + def do_something(self): + now = time.localtime() + # Gestion du rappel avant la revue hebdomadaire + for reminder in settings.CRON_REVIEW_REMINDERS: + if now.tm_hour == reminder[0] and now.tm_min == reminder[1]: + # On calcule le nombre de minutes avant la revue hebdomadaire + minutes = (settings.REVIEW_HOUR[0] - now.tm_hour) * 60 + minutes += settings.REVIEW_HOUR[1] - now.tm_min + self.callback(minutes) diff --git a/hebdobot.py b/hebdobot.py index 19daeb1..aab19a3 100644 --- a/hebdobot.py +++ b/hebdobot.py @@ -1,24 +1,84 @@ -import click +""" +Bot IRC permettant de gérer la revue hebdomadaire de l'April. +""" +import time from ircbot import IrcBot -import settings + +from events import events +from hooks import hooks import logger +from review.review import Review +import settings -@click.command() -@click.option("--version", is_flag=True, help="Display bot version and exit.") -def main(version): - if version: - click.echo(f"Hebdobot {settings.VERSION}") - exit(0) +class HebdoBot(IrcBot): + def __init__(self, settings): + super().__init__(settings) + self.VERSION = "3.0.0" + self.review = Review() + + for event in events: + event.init_scheduler(self.reactor.scheduler, self.callback) + + logger.info( + "--==============================INIT====" + "======================================--" + ) + logger.info(f"Hebdobot {self.VERSION}") + + + def callback(self, minutes): + """ + Envoi des notification sur IRC et les réseaux sociaux. + """ + if minutes == 15: + # Envoi sur IRC + self.send( + self.channel, + f"Plus que {minutes} minutes avant le début de la revue hebdomdaire.", + ) + # Envoi sur Mastodon + # TODO : Gérer mastodon + # ~ mastodon.send( + # ~ "Revue hebdomadaire April à 12h sur notre salon : " + # ~ "http://april.org/salon-irc-de-lapril\nCette revue ne dure qu'une " + # ~ "quinzaine de minutes et permet d'avoir une idée des actions en cours " + # ~ "et à venir.\nVous pouvez aussi juste nous faire un coucou. Et ça met " + # ~ "en appétit :)", + # ~ ) + + def on_privmsg(self, connection, event): + """ + Tous les messages privés sont ignorés. Si l'utilisateur tente une commande, on + lui signale de le faire plutôt sur le canal public. + """ + target = event.source.nick + message = event.arguments[0] + if message[0] == "!": + self.send(target, "Vos commandes dans le salon public") + + def on_pubmsg(self, connection, event): + """ + Tous les messages publics sont pris en compte. On utilise les hooks chargés au + démarrage pour cela. + """ + channel = event.target + sender = event.source.nick + message = event.arguments[0] + if self.review.is_started: + self.review.add_message(sender, message) + + for hook in hooks: + if hook.process(self, channel, sender, message): + break + + def send(self, target, message): + if self.review.is_started and target == self.channel: + self.review.add_message(self.nickname, message) + super().send(target, message) - logger.info( - "--==============================INIT====" - "======================================--" - ) - logger.info(f"Hebdobot {settings.VERSION}") - IrcBot(settings).start() if __name__ == "__main__": - main() + HebdoBot(settings).start() diff --git a/bot/hooks/__init__.py b/hooks/__init__.py similarity index 100% rename from bot/hooks/__init__.py rename to hooks/__init__.py diff --git a/bot/hooks/anniv.py b/hooks/anniv.py similarity index 100% rename from bot/hooks/anniv.py rename to hooks/anniv.py diff --git a/bot/hooks/bad_command.py b/hooks/bad_command.py similarity index 100% rename from bot/hooks/bad_command.py rename to hooks/bad_command.py diff --git a/bot/hooks/cancel_previous_input.py b/hooks/cancel_previous_input.py similarity index 100% rename from bot/hooks/cancel_previous_input.py rename to hooks/cancel_previous_input.py diff --git a/bot/hooks/chrono.py b/hooks/chrono.py similarity index 100% rename from bot/hooks/chrono.py rename to hooks/chrono.py diff --git a/bot/hooks/collective_subject.py b/hooks/collective_subject.py similarity index 100% rename from bot/hooks/collective_subject.py rename to hooks/collective_subject.py diff --git a/bot/hooks/comment.py b/hooks/comment.py similarity index 100% rename from bot/hooks/comment.py rename to hooks/comment.py diff --git a/bot/hooks/current.py b/hooks/current.py similarity index 100% rename from bot/hooks/current.py rename to hooks/current.py diff --git a/bot/hooks/date.py b/hooks/date.py similarity index 100% rename from bot/hooks/date.py rename to hooks/date.py diff --git a/bot/hooks/default.py b/hooks/default.py similarity index 100% rename from bot/hooks/default.py rename to hooks/default.py diff --git a/bot/hooks/finish_review.py b/hooks/finish_review.py similarity index 87% rename from bot/hooks/finish_review.py rename to hooks/finish_review.py index e22aa5c..158ef43 100644 --- a/bot/hooks/finish_review.py +++ b/hooks/finish_review.py @@ -1,8 +1,10 @@ from datetime import datetime import os +import privatebinapi + import logger -from bot.review.stats import ReviewData, ReviewStats +from review.stats import ReviewData, ReviewStats class FinishReview: @@ -58,7 +60,14 @@ class FinishReview: stats.save() # On copie ce texte sur un pad - url = "" + pastebin_url = "" + if bot.settings.PASTEBIN_URL != "": + result = privatebinapi.send( + bot.settings.PASTEBIN_URL, + text=report, + expiration=bot.settings.PASTEBIN_EXPIRATION, + ) + pastebin_url = result.full_url # On sauve le texte dans un fichier review_path = os.path.join( @@ -74,7 +83,7 @@ class FinishReview: f"% C'était la {stats.size}e revue hebdomadaire de l'April, la " f"{stats.year_review(bot.review.year)}e de l'année {bot.review.year}.", ) - bot.send(channel, f"% Compte-rendu de la revue : {url}") + bot.send(channel, f"% Compte-rendu de la revue : {pastebin_url}") bot.send(channel, "% Durée de la revue : {temps_ecoule} minutes") bot.send(channel, "% Nombre de personnes participantes : {combien}") bot.send( diff --git a/bot/hooks/hello.py b/hooks/hello.py similarity index 99% rename from bot/hooks/hello.py rename to hooks/hello.py index 67b8467..a8af6f1 100644 --- a/bot/hooks/hello.py +++ b/hooks/hello.py @@ -18,4 +18,5 @@ class Hello: logger.info("!hello caught.") bot.send(channel, f"{sender}, bonjour \\o/") + return True diff --git a/hooks/help.py b/hooks/help.py new file mode 100644 index 0000000..ca7b5bc --- /dev/null +++ b/hooks/help.py @@ -0,0 +1,39 @@ +import time + +import logger + + +class Help: + def process(self, bot, channel, sender, message): + """ + Le message est pris en compte si l'utilisateur demande de l'aide. + """ + if message.lower() in ("!aide", "!help", "!aide hebdobot", "!help hebdobot"): + logger.info("!help caught.") + + bot.send_multiple( + sender, + ( + f"Bienvenue {sender}. Je suis {bot.nickname}, le robot de gestion " + "des revues hebdomadaires de l'April.", + "Voici les commandes que je comprends :", + " ", + " !aide,!help : afficher cette aide", + " !aide commande : afficher l'aide de la commande !commande", + " !début : commencer une nouvelle revue", + " % message  : traiter comme un commentaire", + " # titre  : démarrer un sujet individuel", + " ## titre  : démarrer un sujet collectif", + " !oups   : annuler la dernière entrée dans un point de " + "revue", + " !courant : afficher le sujet en cours", + " !fin : terminer la revue en cours", + " !stop  : abandonner la revue en cours", + " ", + "Autres commandes : !anniv, !bonjour, !chrono, !date, !hello, " + "!licence, !manquants, !merci, !record, !salut, !stats, !status, " + "!version", + ), + ) + + return True diff --git a/bot/hooks/individual_subject.py b/hooks/individual_subject.py similarity index 100% rename from bot/hooks/individual_subject.py rename to hooks/individual_subject.py diff --git a/bot/hooks/input_review.py b/hooks/input_review.py similarity index 93% rename from bot/hooks/input_review.py rename to hooks/input_review.py index 4abaf0d..b2f01c7 100644 --- a/bot/hooks/input_review.py +++ b/hooks/input_review.py @@ -10,4 +10,3 @@ class InputReview: logger.info("message during review caught.") bot.review.add_input(sender, message) - return True diff --git a/bot/hooks/license.py b/hooks/license.py similarity index 100% rename from bot/hooks/license.py rename to hooks/license.py diff --git a/bot/hooks/listen_alexandrie.py b/hooks/listen_alexandrie.py similarity index 100% rename from bot/hooks/listen_alexandrie.py rename to hooks/listen_alexandrie.py diff --git a/bot/hooks/missing.py b/hooks/missing.py similarity index 98% rename from bot/hooks/missing.py rename to hooks/missing.py index 3e855d7..a3be0d7 100644 --- a/bot/hooks/missing.py +++ b/hooks/missing.py @@ -34,4 +34,4 @@ class Missing: f"sujet courant : {', '.join(missing_participants)}", ) - return True + return True \ No newline at end of file diff --git a/bot/hooks/record.py b/hooks/record.py similarity index 94% rename from bot/hooks/record.py rename to hooks/record.py index 160d40c..e949b88 100644 --- a/bot/hooks/record.py +++ b/hooks/record.py @@ -1,7 +1,7 @@ import locale import logger -from bot.review.stats import ReviewStats +from review.stats import ReviewStats class Record: diff --git a/bot/hooks/start_review.py b/hooks/start_review.py similarity index 95% rename from bot/hooks/start_review.py rename to hooks/start_review.py index ca0c3dc..d070a47 100644 --- a/bot/hooks/start_review.py +++ b/hooks/start_review.py @@ -14,11 +14,10 @@ class StartReview: return True # TODO: tester l'heure de démarrage de la revue - bot.review.start(sender) bot.send(sender, f"% Bonjour {sender}, vous êtes responsable de réunion.") bot.send(sender, "% Pour terminer la réunion, tapez !fin") - # ~ bot.checkReviewAnniversary(); + # TODO: bot.checkReviewAnniversary(); bot.send(channel, "% Début de la réunion hebdomadaire") bot.send( channel, diff --git a/bot/hooks/stats.py b/hooks/stats.py similarity index 97% rename from bot/hooks/stats.py rename to hooks/stats.py index f1bc650..adf3851 100644 --- a/bot/hooks/stats.py +++ b/hooks/stats.py @@ -1,7 +1,7 @@ import locale import logger -from bot.review.stats import ReviewStats +from review.stats import ReviewStats class Stats: diff --git a/bot/hooks/status.py b/hooks/status.py similarity index 98% rename from bot/hooks/status.py rename to hooks/status.py index ad75380..b412852 100644 --- a/bot/hooks/status.py +++ b/hooks/status.py @@ -10,7 +10,7 @@ class Status: logger.info("!status caught.") bot.send(sender, f"{sender}, voici l'état d'Hebdobot :") - bot.send(sender, f" revue en cours : {bot.review is not None}") + bot.send(sender, f" revue en cours : {bot.review.started}") if bot.review.is_started: bot.send(sender, f" animateur revue : {bot.review.owner}") else: diff --git a/bot/hooks/stop_review.py b/hooks/stop_review.py similarity index 99% rename from bot/hooks/stop_review.py rename to hooks/stop_review.py index ef448f6..afe56e2 100644 --- a/bot/hooks/stop_review.py +++ b/hooks/stop_review.py @@ -23,6 +23,7 @@ class StopReview: ) return True - bot.send(channel, "Abandon de la revue en cours.") bot.review.cancel() + bot.send(channel, "Abandon de la revue en cours.") + return True diff --git a/bot/hooks/thanks.py b/hooks/thanks.py similarity index 100% rename from bot/hooks/thanks.py rename to hooks/thanks.py diff --git a/bot/hooks/version.py b/hooks/version.py similarity index 77% rename from bot/hooks/version.py rename to hooks/version.py index 5a4e194..0183037 100644 --- a/bot/hooks/version.py +++ b/hooks/version.py @@ -8,6 +8,6 @@ class Version: """ if message.lower() == "!version": logger.info("!version caught.") - bot.send(channel, bot.settings.VERSION) + bot.send(channel, bot.VERSION) - return True + return True \ No newline at end of file diff --git a/ircbot.py b/ircbot.py index eeaef58..dca646e 100644 --- a/ircbot.py +++ b/ircbot.py @@ -1,14 +1,10 @@ import time import irc.bot -import irc.strings - -from bot.hebdobot import Hebdobot class IrcBot(irc.bot.SingleServerIRCBot): def __init__(self, settings): - # Récupération des paramètres self.settings = settings self.server = self.settings.IRC_SERVER self.port = self.settings.IRC_PORT @@ -16,39 +12,23 @@ class IrcBot(irc.bot.SingleServerIRCBot): self.nickname = self.settings.IRC_NICK self.password = self.settings.IRC_PASSWORD - self.bot = Hebdobot(self.settings, self.channel, self.nickname) - - # Démarrage et connexion à IRC + # Starting Bot irc.bot.SingleServerIRCBot.__init__( self, [(self.server, self.port)], self.nickname, self.nickname ) def on_nicknameinuse(self, connection, event): - # TODO: Re-tester si son propre nom est disponible plus tard. + # TODO: Check again if name is available later self.nickname = self.nickname + "_" - self.bot.nickname = self.nickname connection.nick(self.nickname) def on_welcome(self, connection, event): connection.join(self.channel) - def on_privmsg(self, connection, event): - channel = event.target - sender = event.source.nick - message = event.arguments[0] - answers = self.bot.on_private_message(channel, sender, message) - for answer in answers: - self.connection.privmsg(answer.target, answer.message) - - def on_pubmsg(self, connection, event): - channel = event.target - sender = event.source.nick - message = event.arguments[0] - answers = self.bot.on_public_message(channel, sender, message) - for answer in answers: - self.connection.privmsg(answer.target, answer.message) + def send(self, target, message): + self.connection.privmsg(target, message) def send_multiple(self, target, messages): for message in messages: - self.connection.privmsg(target, message) + self.send(target, message) time.sleep(self.settings.IRC_DELAY) diff --git a/bot/__init__.py b/review/__init__.py similarity index 100% rename from bot/__init__.py rename to review/__init__.py diff --git a/bot/review/aliases.py b/review/aliases.py similarity index 100% rename from bot/review/aliases.py rename to review/aliases.py diff --git a/bot/review/review.py b/review/review.py similarity index 99% rename from bot/review/review.py rename to review/review.py index ad28873..a51e5ef 100644 --- a/bot/review/review.py +++ b/review/review.py @@ -2,8 +2,8 @@ from datetime import datetime import locale from textwrap import fill -from bot.review.topic import Message, Topic -from bot.review.aliases import Aliases +from review.topic import Message, Topic +from review.aliases import Aliases LENGTH_LINE = 80 diff --git a/bot/review/stats.py b/review/stats.py similarity index 100% rename from bot/review/stats.py rename to review/stats.py diff --git a/bot/review/topic.py b/review/topic.py similarity index 100% rename from bot/review/topic.py rename to review/topic.py diff --git a/settings.py b/settings.py index 6129f76..8f13a81 100644 --- a/settings.py +++ b/settings.py @@ -4,8 +4,6 @@ import os BASE_DIR = os.path.abspath(os.path.dirname(__file__)) -VERSION = "3.0.0" - # Log File LOGFILE = os.environ.get("LOGFILE", os.path.join(BASE_DIR, "hebdobot.log")) LOGLEVEL = os.environ.get("LOGLEVEL", logging.DEBUG) @@ -15,19 +13,28 @@ LOGDATE = os.environ.get("LOGDATE", "%Y-%m-%d %H:%M:%S") # IRC configuration IRC_SERVER = os.environ.get("IRC_SERVER", "irc.libera.chat") IRC_PORT = int(os.environ.get("IRC_PORT", 6667)) -IRC_CHANNEL = os.environ.get("IRC_CHANNEL", " #bidibot") -IRC_NICK = os.environ.get("IRC_NICK", " Testbot") +IRC_CHANNEL = os.environ.get("IRC_CHANNEL", " #april") +IRC_NICK = os.environ.get("IRC_NICK", "Testbot") IRC_PASSWORD = os.environ.get("IRC_PASSWORD", " ") IRC_DELAY = float(os.environ.get("IRC_DELAY", 0.5)) # Délai entre plusieurs messages -# User Alias -USER_ALIASES = "" +# User aliases +USER_ALIASES = os.environ.get("USER_ALIASES", os.path.join(BASE_DIR, "users.conf")) # Review +REVIEW_HOUR = (16, 30) REVIEW_DIRECTORY = os.environ.get("REVIEW_DIRECTORY", os.path.join(BASE_DIR, "reviews")) -REVIEW_PASTEBIN = "" REVIEW_STATS = os.environ.get("REVIEW_STATS", os.path.join(REVIEW_DIRECTORY, "reviewstats.csv")) +# Pastebin +PASTEBIN_URL = "https://paste.chapril.org/" +# Values : 5min, 10min, 1hour, 1day, 1week, 1month, 1year, never +PASTEBIN_EXPIRATION = "5min" + +# Cron +CRON_REVIEW_REMINDERS = [(11, 45)] +CRON_STOP_BOT = [(16, 15)] + # Mastodon MASTODON_SERVER = "" MASTODON_NAME = "" diff --git a/tests/settings.py b/tests/settings.py index 9338803..1561c16 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -4,8 +4,6 @@ import os BASE_DIR = os.path.abspath(os.path.dirname(__file__)) -VERSION = "3.0.0" - # Log File LOGFILE = os.environ.get("LOGFILE", os.path.join(BASE_DIR, "hebdobot.log")) LOGLEVEL = os.environ.get("LOGLEVEL", logging.DEBUG) @@ -16,18 +14,27 @@ LOGDATE = os.environ.get("LOGDATE", "%Y-%m-%d %H:%M:%S") IRC_SERVER = os.environ.get("IRC_SERVER", "irc.libera.chat") IRC_PORT = int(os.environ.get("IRC_PORT", 6667)) IRC_CHANNEL = os.environ.get("IRC_CHANNEL", " #testbot") -IRC_NICK = os.environ.get("IRC_NICK", " Testbot") +IRC_NICK = os.environ.get("IRC_NICK", "Hebdobot") IRC_PASSWORD = os.environ.get("IRC_PASSWORD", " ") -IRC_DELAY = float(os.environ.get("IRC_DELAY", 0.5)) # Délai entre plusieurs messages +IRC_DELAY = float(os.environ.get("IRC_DELAY", 0)) # Délai entre plusieurs messages # User aliases USER_ALIASES = os.environ.get("USER_ALIASES", os.path.join(BASE_DIR, "users.conf")) # Review +REVIEW_HOUR = (16, 30) REVIEW_DIRECTORY = os.environ.get("REVIEW_DIRECTORY", os.path.join(BASE_DIR, "reviews")) -REVIEW_PASTEBIN = "" REVIEW_STATS = os.environ.get("REVIEW_STATS", os.path.join(REVIEW_DIRECTORY, "reviewstats.csv")) +# Pastebin +PASTEBIN_URL = "" +# Values : 5min, 10min, 1hour, 1day, 1week, 1month, 1year, never +PASTEBIN_EXPIRATION = "5min" + +# Cron +CRON_REVIEW_REMINDERS = [(11, 45)] +CRON_STOP_BOT = [(16, 15)] + # Mastodon MASTODON_SERVER = "" MASTODON_NAME = "" diff --git a/tests/test_aliases.py b/tests/test_aliases.py index 40a2397..0f6aebe 100644 --- a/tests/test_aliases.py +++ b/tests/test_aliases.py @@ -1,5 +1,5 @@ -from bot.review.aliases import Aliases -from tests.utils import bot, CHANNEL, OWNER, SENDER +from review.aliases import Aliases +from tests.utils import bot def test_aliases(bot): diff --git a/tests/test_basic_hooks.py b/tests/test_basic_hooks.py index aba08d5..553f4b8 100644 --- a/tests/test_basic_hooks.py +++ b/tests/test_basic_hooks.py @@ -1,7 +1,7 @@ import os import shutil -from tests.utils import bot, CHANNEL, OWNER, SENDER +from tests.utils import bot, OWNER, SENDER def setup_function(): @@ -9,7 +9,7 @@ def setup_function(): def test_hook_listen_anniv(bot): - bot.on_public_message(CHANNEL, SENDER, "!anniv") + bot.test_public_message(bot.channel, SENDER, "!anniv") assert len(bot.answers) == 3 assert bot.answers[0].message.startswith("La revue") assert bot.answers[1].message.startswith("Hebdobot") @@ -17,96 +17,96 @@ def test_hook_listen_anniv(bot): def test_hook_bad_command(bot): - bot.on_public_message(CHANNEL, SENDER, "!aniv") + bot.test_public_message(bot.channel, SENDER, "!aniv") assert len(bot.answers) == 1 assert bot.answers[0].message == f"{SENDER}, Yo !" def test_hook_date(bot): - bot.on_public_message(CHANNEL, SENDER, "!date") + bot.test_public_message(bot.channel, SENDER, "!date") assert len(bot.answers) == 1 - bot.on_public_message(CHANNEL, SENDER, "!time") + bot.test_public_message(bot.channel, SENDER, "!time") assert len(bot.answers) == 1 - bot.on_public_message(CHANNEL, SENDER, "!now") + bot.test_public_message(bot.channel, SENDER, "!now") assert len(bot.answers) == 1 def test_hook_default(bot): - bot.on_public_message(CHANNEL, SENDER, "some message") + bot.test_public_message(bot.channel, SENDER, "some message") assert bot.answers == [] def test_hook_hello(bot): - bot.on_public_message(CHANNEL, SENDER, "!salut") + bot.test_public_message(bot.channel, SENDER, "!salut") assert len(bot.answers) == 1 assert bot.answers[0].message == f"{SENDER}, bonjour \\o/" - bot.on_public_message(CHANNEL, SENDER, "!bonjour") + bot.test_public_message(bot.channel, SENDER, "!bonjour") assert len(bot.answers) == 1 assert bot.answers[0].message == f"{SENDER}, bonjour \\o/" - bot.on_public_message(CHANNEL, SENDER, "!hello") + bot.test_public_message(bot.channel, SENDER, "!hello") assert len(bot.answers) == 1 assert bot.answers[0].message == f"{SENDER}, bonjour \\o/" - bot.on_public_message(CHANNEL, SENDER, "bonjour hebdobot") + bot.test_public_message(bot.channel, SENDER, "bonjour hebdobot") assert len(bot.answers) == 1 assert bot.answers[0].message == f"{SENDER}, bonjour \\o/" def test_hook_help(bot): - bot.on_public_message(CHANNEL, SENDER, "!help") + bot.test_public_message(bot.channel, SENDER, "!help") assert len(bot.answers) == 15 - bot.on_public_message(CHANNEL, SENDER, "!aide") + bot.test_public_message(bot.channel, SENDER, "!aide") assert len(bot.answers) == 15 def test_hook_license(bot): - bot.on_public_message(CHANNEL, SENDER, "!license") + bot.test_public_message(bot.channel, SENDER, "!license") assert len(bot.answers) == 1 assert bot.answers[0].message.startswith("Hebdobot est un logiciel libre") - bot.on_public_message(CHANNEL, SENDER, "!licence") + bot.test_public_message(bot.channel, SENDER, "!licence") assert len(bot.answers) == 1 assert bot.answers[0].message.startswith("Hebdobot est un logiciel libre") def test_hook_listen_alexandrie(bot): - bot.on_public_message(CHANNEL, "alexandrie", "!version") + bot.test_public_message(bot.channel, "alexandrie", "!version") assert bot.answers == [] - bot.on_public_message(CHANNEL, SENDER, "!version") + bot.test_public_message(bot.channel, SENDER, "!version") assert bot.answers != [] def test_hook_record(bot): - bot.on_public_message(CHANNEL, SENDER, "!record") + bot.test_public_message(bot.channel, SENDER, "!record") assert len(bot.answers) == 1 assert bot.answers[0].message.startswith("Le record de participation") def test_hook_stats(bot): - bot.on_public_message(CHANNEL, SENDER, "!stats") + bot.test_public_message(bot.channel, SENDER, "!stats") assert len(bot.answers) == 5 assert bot.answers[0].message.startswith("% Il y a eu ") def test_hook_stats_with_no_review(bot): os.remove("tests/reviews/reviewstats.csv") - bot.on_public_message(CHANNEL, SENDER, "!stats") + bot.test_public_message(bot.channel, SENDER, "!stats") assert len(bot.answers) == 5 assert bot.answers[0].message == "% Il n'y a pas encore eu de revue." def test_hook_status(bot): - bot.on_public_message(CHANNEL, SENDER, "!status") + bot.test_public_message(bot.channel, SENDER, "!status") assert len(bot.answers) == 3 assert bot.answers[0].message.startswith(f"{SENDER}, voici l'état") - bot.on_public_message(CHANNEL, SENDER, "!statut") + bot.test_public_message(bot.channel, SENDER, "!statut") assert len(bot.answers) == 3 assert bot.answers[0].message.startswith(f"{SENDER}, voici l'état") - assert bot.answers[1].message == f" revue en cours : {bot.review is not None}" + assert bot.answers[1].message == f" revue en cours : {bot.review.started}" assert bot.answers[2].message == " animateur revue : none" def test_hook_status_started_review(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, SENDER, "!statut") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, SENDER, "!statut") assert len(bot.answers) == 3 assert bot.answers[0].message.startswith(f"{SENDER}, voici l'état") assert bot.answers[1].message == f" revue en cours : {bot.review is not None}" @@ -114,11 +114,11 @@ def test_hook_status_started_review(bot): def test_hook_thanks(bot): - bot.on_public_message(CHANNEL, SENDER, "!merci") + bot.test_public_message(bot.channel, SENDER, "!merci") assert len(bot.answers) == 1 assert bot.answers[0].message == f"{SENDER}, de rien \\o/" def test_hook_version(bot): - bot.on_public_message(CHANNEL, SENDER, "!version") + bot.test_public_message(bot.channel, SENDER, "!version") assert len(bot.answers) == 1 diff --git a/tests/test_bot.py b/tests/test_bot.py index 14813ae..4cb718c 100644 --- a/tests/test_bot.py +++ b/tests/test_bot.py @@ -1,12 +1,12 @@ -from tests.utils import bot, CHANNEL, OWNER, SENDER +from tests.utils import bot, OWNER, SENDER def test_private_message(bot): - bot.on_private_message(CHANNEL, SENDER, "hello") + bot.test_private_message(bot.channel, SENDER, "hello") assert len(bot.answers) == 0 def test_private_command(bot): - bot.on_private_message(CHANNEL, SENDER, "!hello") + bot.test_private_message(bot.channel, SENDER, "!hello") assert len(bot.answers) == 1 - assert bot.answers[0].message == "vos commandes dans le salon public" + assert bot.answers[0].message == "Vos commandes dans le salon public" diff --git a/tests/test_complete_review.py b/tests/test_complete_review.py index 65081ae..00cede3 100644 --- a/tests/test_complete_review.py +++ b/tests/test_complete_review.py @@ -1,7 +1,7 @@ from datetime import datetime import shutil -from tests.utils import bot, CHANNEL, OWNER, SENDER +from tests.utils import bot, OWNER, SENDER def setup_function(): @@ -18,10 +18,10 @@ def test_complete_review(bot): text = ":".join(data[1:]).strip() messages.append((author, text)) - bot.on_public_message(CHANNEL, "lllll", "!start") + bot.test_public_message(bot.channel, "lllll", "!start") bot.review.start_time = datetime(2023, 12, 1, 12, 0, 0) for message in messages: - bot.on_public_message(CHANNEL, message[0], message[1]) + bot.test_public_message(bot.channel, message[0], message[1]) # compare contents with open("tests/datas/20231201-log-irc-revue-hebdomadaire.txt") as file_handle: diff --git a/tests/test_review_hooks.py b/tests/test_review_hooks.py index 067489f..dc9e896 100644 --- a/tests/test_review_hooks.py +++ b/tests/test_review_hooks.py @@ -1,7 +1,7 @@ from datetime import datetime, timedelta import shutil -from tests.utils import bot, CHANNEL, OWNER, SENDER +from tests.utils import bot, OWNER, SENDER def setup_function(): @@ -17,17 +17,17 @@ def test_review_starting_new(bot): assert bot.review.ended == False assert bot.review.start_time is None assert bot.review.end_time is None - bot.on_public_message(CHANNEL, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "!start") assert len(bot.answers) == 5 assert bot.answers[0].target == OWNER assert bot.answers[0].message.startswith(f"% Bonjour {OWNER}") assert bot.answers[1].target == OWNER assert bot.answers[1].message.startswith("% Pour terminer") - assert bot.answers[2].target == CHANNEL + assert bot.answers[2].target == bot.channel assert bot.answers[2].message.startswith("% Début de") - assert bot.answers[3].target == CHANNEL + assert bot.answers[3].target == bot.channel assert bot.answers[3].message.startswith("% rappel") - assert bot.answers[4].target == CHANNEL + assert bot.answers[4].target == bot.channel assert bot.answers[4].message.startswith("% pour connaître") assert bot.review.participants == [] assert bot.review.topics == [] @@ -40,8 +40,8 @@ def test_review_starting_new(bot): def test_review_starting_started_review(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "!start") assert len(bot.answers) == 1 assert bot.answers[0].message == f"% {OWNER}, une revue est déjà en cours." assert bot.review.participants == [] @@ -55,7 +55,7 @@ def test_review_starting_started_review(bot): def test_review_ending_not_started_review(bot): - bot.on_public_message(CHANNEL, OWNER, "!fin") + bot.test_public_message(bot.channel, OWNER, "!fin") assert len(bot.answers) == 1 assert bot.answers[0].message == f"{OWNER}, pas de revue en cours." assert bot.review.participants == [] @@ -69,8 +69,8 @@ def test_review_ending_not_started_review(bot): def test_review_ending_as_not_owner(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, SENDER, "!fin") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, SENDER, "!fin") assert len(bot.answers) == 1 assert bot.answers[0].message == f"{SENDER}, vous n'êtes pas responsable de la revue." assert bot.review.participants == [] @@ -84,171 +84,171 @@ def test_review_ending_as_not_owner(bot): def test_review_cancel_last_message_on_collective_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "## Collective topic") - bot.on_public_message(CHANNEL, SENDER, "This is my message") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "## Collective topic") + bot.test_public_message(bot.channel, SENDER, "This is my message") assert len(bot.review.current_topic.messages) == 1 assert bot.review.current_topic.messages[0].text == "This is my message" - bot.on_public_message(CHANNEL, SENDER, "!oups") + bot.test_public_message(bot.channel, SENDER, "!oups") assert len(bot.review.current_topic.messages) == 0 - bot.on_public_message(CHANNEL, SENDER, "This is my message") + bot.test_public_message(bot.channel, SENDER, "This is my message") assert len(bot.review.current_topic.messages) == 1 assert bot.review.current_topic.messages[0].text == "This is my message" - bot.on_public_message(CHANNEL, SENDER, "!oops") + bot.test_public_message(bot.channel, SENDER, "!oops") assert len(bot.review.current_topic.messages) == 0 - bot.on_public_message(CHANNEL, SENDER, "This is my message") + bot.test_public_message(bot.channel, SENDER, "This is my message") assert len(bot.review.current_topic.messages) == 1 assert bot.review.current_topic.messages[0].text == "This is my message" - bot.on_public_message(CHANNEL, SENDER, "!cancelprevious") + bot.test_public_message(bot.channel, SENDER, "!cancelprevious") assert len(bot.review.current_topic.messages) == 0 def test_review_cancel_only_message_on_collective_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "## Collective topic") - bot.on_public_message(CHANNEL, OWNER, "This is a message from owner") - bot.on_public_message(CHANNEL, SENDER, "This is a message from sender") - bot.on_public_message(CHANNEL, OWNER, "This is another message from owner") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "## Collective topic") + bot.test_public_message(bot.channel, OWNER, "This is a message from owner") + bot.test_public_message(bot.channel, SENDER, "This is a message from sender") + bot.test_public_message(bot.channel, OWNER, "This is another message from owner") assert len(bot.review.current_topic.messages) == 3 assert bot.review.current_topic.messages[1].text == "This is a message from sender" - bot.on_public_message(CHANNEL, SENDER, "!oups") + bot.test_public_message(bot.channel, SENDER, "!oups") assert len(bot.answers) == 1 assert len(bot.review.current_topic.messages) == 2 assert bot.review.current_topic.messages[1].text == "This is another message from owner" def test_review_cancel_last_message_from_two_on_collective_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "## Collective topic") - bot.on_public_message(CHANNEL, OWNER, "This is a message from owner") - bot.on_public_message(CHANNEL, SENDER, "This is a message from sender") - bot.on_public_message(CHANNEL, SENDER, "This is another message from sender") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "## Collective topic") + bot.test_public_message(bot.channel, OWNER, "This is a message from owner") + bot.test_public_message(bot.channel, SENDER, "This is a message from sender") + bot.test_public_message(bot.channel, SENDER, "This is another message from sender") assert len(bot.review.current_topic.messages) == 3 assert bot.review.current_topic.messages[1].text == "This is a message from sender" - bot.on_public_message(CHANNEL, SENDER, "!oups") + bot.test_public_message(bot.channel, SENDER, "!oups") assert len(bot.answers) == 1 assert len(bot.review.current_topic.messages) == 2 assert bot.review.current_topic.messages[1].text == "This is a message from sender" def test_review_cancel_first_message_from_three_on_collective_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "## Collective topic") - bot.on_public_message(CHANNEL, SENDER, "This is a message from sender") - bot.on_public_message(CHANNEL, OWNER, "This is a message from owner") - bot.on_public_message(CHANNEL, OWNER, "This is another message from owner") - bot.on_public_message(CHANNEL, OWNER, "This is a third message from owner") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "## Collective topic") + bot.test_public_message(bot.channel, SENDER, "This is a message from sender") + bot.test_public_message(bot.channel, OWNER, "This is a message from owner") + bot.test_public_message(bot.channel, OWNER, "This is another message from owner") + bot.test_public_message(bot.channel, OWNER, "This is a third message from owner") assert len(bot.review.current_topic.messages) == 4 assert bot.review.current_topic.messages[1].text == "This is a message from owner" - bot.on_public_message(CHANNEL, SENDER, "!oups") + bot.test_public_message(bot.channel, SENDER, "!oups") assert len(bot.answers) == 1 assert len(bot.review.current_topic.messages) == 3 assert bot.review.current_topic.messages[1].text == "This is another message from owner" def test_review_cancel_last_message_no_message_on_collective_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "## Collective topic") - bot.on_public_message(CHANNEL, OWNER, "This is my message") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "# Individual topic") + bot.test_public_message(bot.channel, OWNER, "This is my message") assert len(bot.review.current_topic.messages) == 1 assert bot.review.current_topic.messages[0].text == "This is my message" - bot.on_public_message(CHANNEL, SENDER, "!oups") + bot.test_public_message(bot.channel, SENDER, "!oups") assert len(bot.review.current_topic.messages) == 1 assert bot.review.current_topic.messages[0].text == "This is my message" def test_review_cancel_last_message_on_individual_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "# Individual topic") - bot.on_public_message(CHANNEL, SENDER, "This is my message") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "# Individual topic") + bot.test_public_message(bot.channel, SENDER, "This is my message") assert len(bot.review.current_topic.messages) == 1 assert bot.review.current_topic.messages[0].text == "This is my message" - bot.on_public_message(CHANNEL, SENDER, "!oups") + bot.test_public_message(bot.channel, SENDER, "!oups") assert len(bot.review.current_topic.messages) == 0 - bot.on_public_message(CHANNEL, SENDER, "This is my message") + bot.test_public_message(bot.channel, SENDER, "This is my message") assert len(bot.review.current_topic.messages) == 1 assert bot.review.current_topic.messages[0].text == "This is my message" - bot.on_public_message(CHANNEL, SENDER, "!oops") + bot.test_public_message(bot.channel, SENDER, "!oops") assert len(bot.review.current_topic.messages) == 0 - bot.on_public_message(CHANNEL, SENDER, "This is my message") + bot.test_public_message(bot.channel, SENDER, "This is my message") assert len(bot.review.current_topic.messages) == 1 assert bot.review.current_topic.messages[0].text == "This is my message" - bot.on_public_message(CHANNEL, SENDER, "!cancelprevious") + bot.test_public_message(bot.channel, SENDER, "!cancelprevious") assert len(bot.review.current_topic.messages) == 0 def test_review_cancel_only_message_on_individual_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "# Individual topic") - bot.on_public_message(CHANNEL, OWNER, "This is a message from owner") - bot.on_public_message(CHANNEL, SENDER, "This is a message from sender") - bot.on_public_message(CHANNEL, OWNER, "This is another message from owner") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "# Individual topic") + bot.test_public_message(bot.channel, OWNER, "This is a message from owner") + bot.test_public_message(bot.channel, SENDER, "This is a message from sender") + bot.test_public_message(bot.channel, OWNER, "This is another message from owner") assert len(bot.review.current_topic.messages) == 3 assert bot.review.current_topic.messages[1].text == "This is a message from sender" - bot.on_public_message(CHANNEL, SENDER, "!oups") + bot.test_public_message(bot.channel, SENDER, "!oups") assert len(bot.answers) == 1 assert len(bot.review.current_topic.messages) == 2 assert bot.review.current_topic.messages[1].text == "This is another message from owner" def test_review_cancel_last_message_from_two_on_individual_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "# Individual topic") - bot.on_public_message(CHANNEL, OWNER, "This is a message from owner") - bot.on_public_message(CHANNEL, SENDER, "This is a message from sender") - bot.on_public_message(CHANNEL, SENDER, "This is another message from sender") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "# Individual topic") + bot.test_public_message(bot.channel, OWNER, "This is a message from owner") + bot.test_public_message(bot.channel, SENDER, "This is a message from sender") + bot.test_public_message(bot.channel, SENDER, "This is another message from sender") assert len(bot.review.current_topic.messages) == 3 assert bot.review.current_topic.messages[1].text == "This is a message from sender" - bot.on_public_message(CHANNEL, SENDER, "!oups") + bot.test_public_message(bot.channel, SENDER, "!oups") assert len(bot.answers) == 1 assert len(bot.review.current_topic.messages) == 2 assert bot.review.current_topic.messages[1].text == "This is a message from sender" def test_review_cancel_first_message_from_three_on_individual_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "# Individual topic") - bot.on_public_message(CHANNEL, SENDER, "This is a message from sender") - bot.on_public_message(CHANNEL, OWNER, "This is a message from owner") - bot.on_public_message(CHANNEL, OWNER, "This is another message from owner") - bot.on_public_message(CHANNEL, OWNER, "This is a third message from owner") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "# Individual topic") + bot.test_public_message(bot.channel, SENDER, "This is a message from sender") + bot.test_public_message(bot.channel, OWNER, "This is a message from owner") + bot.test_public_message(bot.channel, OWNER, "This is another message from owner") + bot.test_public_message(bot.channel, OWNER, "This is a third message from owner") assert len(bot.review.current_topic.messages) == 4 assert bot.review.current_topic.messages[1].text == "This is a message from owner" - bot.on_public_message(CHANNEL, SENDER, "!oups") + bot.test_public_message(bot.channel, SENDER, "!oups") assert len(bot.answers) == 1 assert len(bot.review.current_topic.messages) == 3 assert bot.review.current_topic.messages[1].text == "This is another message from owner" def test_review_cancel_last_message_no_message_on_individual_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "# Individual topic") - bot.on_public_message(CHANNEL, OWNER, "This is my message") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "# Individual topic") + bot.test_public_message(bot.channel, OWNER, "This is my message") assert len(bot.review.current_topic.messages) == 1 assert bot.review.current_topic.messages[0].text == "This is my message" - bot.on_public_message(CHANNEL, SENDER, "!oups") + bot.test_public_message(bot.channel, SENDER, "!oups") assert len(bot.review.current_topic.messages) == 1 assert bot.review.current_topic.messages[0].text == "This is my message" def test_review_cancel_last_message_no_review(bot): - bot.on_public_message(CHANNEL, SENDER, "!oups") + bot.test_public_message(bot.channel, SENDER, "!oups") assert len(bot.answers) == 1 assert bot.answers[0].message == f"{SENDER}, pas de revue en cours." def test_review_cancel_last_message_no_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, SENDER, "!oups") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, SENDER, "!oups") assert len(bot.answers) == 1 assert bot.answers[0].message == f"{SENDER}, pas de sujet en cours." def test_review_collective_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "!start") assert len(bot.review.topics) == 0 assert bot.review.current_topic is None - bot.on_public_message(CHANNEL, OWNER, "## collective topic") + bot.test_public_message(bot.channel, OWNER, "## collective topic") assert len(bot.answers) == 4 assert len(bot.review.topics) == 1 assert bot.review.current_topic is not None @@ -256,13 +256,13 @@ def test_review_collective_topic(bot): def test_review_second_collective_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "!start") assert len(bot.review.topics) == 0 assert bot.review.current_topic is None - bot.on_public_message(CHANNEL, OWNER, "## collective topic") - bot.on_public_message(CHANNEL, OWNER, "This is my message") - bot.on_public_message(CHANNEL, SENDER, "This is a message from sender") - bot.on_public_message(CHANNEL, OWNER, "## second collective topic") + bot.test_public_message(bot.channel, OWNER, "## collective topic") + bot.test_public_message(bot.channel, OWNER, "This is my message") + bot.test_public_message(bot.channel, SENDER, "This is a message from sender") + bot.test_public_message(bot.channel, OWNER, "## second collective topic") assert len(bot.answers) == 6 assert len(bot.review.topics) == 2 assert bot.review.current_topic is not None @@ -270,7 +270,7 @@ def test_review_second_collective_topic(bot): def test_review_collective_no_review(bot): - bot.on_public_message(CHANNEL, OWNER, "## collective topic") + bot.test_public_message(bot.channel, OWNER, "## collective topic") assert len(bot.answers) == 0 assert not bot.review.is_started assert len(bot.review.topics) == 0 @@ -278,58 +278,58 @@ def test_review_collective_no_review(bot): def test_review_collective_topic_not_owner(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, SENDER, "## collective topic") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, SENDER, "## collective topic") assert len(bot.answers) == 1 assert bot.answers[0].message == f"{SENDER}, vous n'êtes pas responsable de la réunion" def test_review_comment(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, SENDER, "% This is a comment") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, SENDER, "% This is a comment") assert len(bot.answers) == 0 assert bot.review.messages[-1].text == "% This is a comment" assert bot.review.current_topic is None def test_review_current_without_review(bot): - bot.on_public_message(CHANNEL, OWNER, "!courant") + bot.test_public_message(bot.channel, OWNER, "!courant") assert len(bot.answers) == 1 assert bot.answers[0].message == f"{OWNER}, pas de revue en cours." assert not bot.review.is_started def test_review_current_without_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "!courant") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "!courant") assert len(bot.answers) == 1 assert bot.answers[0].message == "% Pas de sujet en cours." assert bot.review.is_started def test_review_current_with_collective_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "## collective topic") - bot.on_public_message(CHANNEL, OWNER, "!courant") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "## collective topic") + bot.test_public_message(bot.channel, OWNER, "!courant") assert len(bot.answers) == 1 assert bot.review.current_topic.title == "collective topic" assert bot.answers[0].message == f"% Sujet collectif en cours : {bot.review.current_topic.title}" def test_review_current_with_individual_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "# individual topic") - bot.on_public_message(CHANNEL, OWNER, "!courant") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "# individual topic") + bot.test_public_message(bot.channel, OWNER, "!courant") assert len(bot.answers) == 1 assert bot.review.current_topic.title == "individual topic" assert bot.answers[0].message == f"% Sujet individuel en cours : {bot.review.current_topic.title}" def test_review_individual_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "!start") assert len(bot.review.topics) == 0 assert bot.review.current_topic is None - bot.on_public_message(CHANNEL, OWNER, "# individual topic") + bot.test_public_message(bot.channel, OWNER, "# individual topic") assert len(bot.answers) == 3 assert len(bot.review.topics) == 1 assert bot.review.current_topic is not None @@ -337,13 +337,13 @@ def test_review_individual_topic(bot): def test_review_second_individual_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "!start") assert len(bot.review.topics) == 0 assert bot.review.current_topic is None - bot.on_public_message(CHANNEL, OWNER, "# individual topic") - bot.on_public_message(CHANNEL, OWNER, "This is my message") - bot.on_public_message(CHANNEL, SENDER, "This is a message from sender") - bot.on_public_message(CHANNEL, OWNER, "# second individual topic") + bot.test_public_message(bot.channel, OWNER, "# individual topic") + bot.test_public_message(bot.channel, OWNER, "This is my message") + bot.test_public_message(bot.channel, SENDER, "This is a message from sender") + bot.test_public_message(bot.channel, OWNER, "# second individual topic") assert len(bot.answers) == 5 assert len(bot.review.topics) == 2 assert bot.review.current_topic is not None @@ -351,7 +351,7 @@ def test_review_second_individual_topic(bot): def test_review_individual_no_review(bot): - bot.on_public_message(CHANNEL, OWNER, "# individual topic") + bot.test_public_message(bot.channel, OWNER, "# individual topic") assert len(bot.answers) == 0 assert not bot.review.is_started assert len(bot.review.topics) == 0 @@ -359,20 +359,20 @@ def test_review_individual_no_review(bot): def test_review_individual_topic_not_owner(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, SENDER, "# individual topic") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, SENDER, "# individual topic") assert len(bot.answers) == 1 assert bot.answers[0].message == f"{SENDER}, vous n'êtes pas responsable de la réunion" def test_stop_review(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "!start") assert bot.review.is_started assert not bot.review.is_ended - bot.on_public_message(CHANNEL, OWNER, "A messsage") - bot.on_public_message(CHANNEL, OWNER, "## collective topic") - bot.on_public_message(CHANNEL, OWNER, "Another messsage") - bot.on_public_message(CHANNEL, OWNER, "!stop") + bot.test_public_message(bot.channel, OWNER, "A messsage") + bot.test_public_message(bot.channel, OWNER, "## collective topic") + bot.test_public_message(bot.channel, OWNER, "Another messsage") + bot.test_public_message(bot.channel, OWNER, "!stop") assert not bot.review.is_started assert not bot.review.is_ended assert len(bot.review.topics) == 0 @@ -382,15 +382,15 @@ def test_stop_review(bot): def test_stop_review_not_owner(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, SENDER, "!stop") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, SENDER, "!stop") assert bot.review.is_started assert len(bot.answers) == 1 assert bot.answers[0].message == f"{SENDER}, vous n'êtes pas responsable de la réunion." def test_stop_review_no_review(bot): - bot.on_public_message(CHANNEL, OWNER, "!stop") + bot.test_public_message(bot.channel, OWNER, "!stop") assert not bot.review.is_started assert not bot.review.is_ended assert len(bot.review.topics) == 0 @@ -400,38 +400,38 @@ def test_stop_review_no_review(bot): def test_missing_no_review(bot): - bot.on_public_message(CHANNEL, OWNER, "!manquants") + bot.test_public_message(bot.channel, OWNER, "!manquants") assert not bot.review.is_started assert len(bot.answers) == 1 assert bot.answers[0].message == f"{OWNER}, pas de revue en cours." def test_missing_no_topic(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "!start") assert bot.review.is_started - bot.on_public_message(CHANNEL, OWNER, "!manquants") + bot.test_public_message(bot.channel, OWNER, "!manquants") assert len(bot.answers) == 1 assert bot.answers[0].message == "% Pas de sujet en cours." def test_missing_no_one_is_missing(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "## collective topic") - bot.on_public_message(CHANNEL, SENDER, "This is my message") - bot.on_public_message(CHANNEL, OWNER, "This is owner message") - bot.on_public_message(CHANNEL, OWNER, "!manquants") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "## collective topic") + bot.test_public_message(bot.channel, SENDER, "This is my message") + bot.test_public_message(bot.channel, OWNER, "This is owner message") + bot.test_public_message(bot.channel, OWNER, "!manquants") assert len(bot.answers) == 1 assert bot.answers[0].message == "% Tout le monde s'est exprimé sur le sujet courant \\o/" def test_missing_one_is_missing(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "## collective topic") - bot.on_public_message(CHANNEL, SENDER, "This is my message") - bot.on_public_message(CHANNEL, OWNER, "This is owner message") - bot.on_public_message(CHANNEL, OWNER, "## a second collective topic") - bot.on_public_message(CHANNEL, OWNER, "This is the second owner message") - bot.on_public_message(CHANNEL, OWNER, "!manquants") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "## collective topic") + bot.test_public_message(bot.channel, SENDER, "This is my message") + bot.test_public_message(bot.channel, OWNER, "This is owner message") + bot.test_public_message(bot.channel, OWNER, "## a second collective topic") + bot.test_public_message(bot.channel, OWNER, "This is the second owner message") + bot.test_public_message(bot.channel, OWNER, "!manquants") assert len(bot.answers) == 1 assert bot.answers[0].message == ( "% Personnes participantes ne s'étant pas exprimées sur le " @@ -440,68 +440,68 @@ def test_missing_one_is_missing(bot): def test_chrono_no_review(bot): - bot.on_public_message(CHANNEL, OWNER, "!chrono") + bot.test_public_message(bot.channel, OWNER, "!chrono") assert len(bot.answers) == 1 assert bot.answers[0].message == "n/a" def test_chrono(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "!start") bot.review.start_time = datetime.today() - timedelta(seconds=87) - bot.on_public_message(CHANNEL, OWNER, "!chrono") + bot.test_public_message(bot.channel, OWNER, "!chrono") assert len(bot.answers) == 1 assert bot.answers[0].message == "01:27" def test_finish_review(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "## collective topic") - bot.on_public_message(CHANNEL, OWNER, "Owner message on collective topic") - bot.on_public_message(CHANNEL, SENDER, "Sender message on collective topic") - bot.on_public_message(CHANNEL, OWNER, "# individual topic") - bot.on_public_message(CHANNEL, OWNER, "Owner message on individual topic") - bot.on_public_message(CHANNEL, SENDER, "Sender message on individual topic") - bot.on_public_message(CHANNEL, OWNER, "!fin") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "## collective topic") + bot.test_public_message(bot.channel, OWNER, "Owner message on collective topic") + bot.test_public_message(bot.channel, SENDER, "Sender message on collective topic") + bot.test_public_message(bot.channel, OWNER, "# individual topic") + bot.test_public_message(bot.channel, OWNER, "Owner message on individual topic") + bot.test_public_message(bot.channel, SENDER, "Sender message on individual topic") + bot.test_public_message(bot.channel, OWNER, "!fin") assert len(bot.answers) == 10 assert bot.answers[-2].message == "% Fin de la revue hebdomadaire" assert bot.answers[-1].message == "Revue finie." def test_finish_review_no_review(bot): - bot.on_public_message(CHANNEL, OWNER, "!fin") + bot.test_public_message(bot.channel, OWNER, "!fin") assert len(bot.answers) == 1 assert bot.answers[0].message == f"{OWNER}, pas de revue en cours." def test_finish_review_already_finished(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "## collective topic") - bot.on_public_message(CHANNEL, OWNER, "Owner message on collective topic") - bot.on_public_message(CHANNEL, SENDER, "Sender message on collective topic") - bot.on_public_message(CHANNEL, OWNER, "# individual topic") - bot.on_public_message(CHANNEL, OWNER, "Owner message on individual topic") - bot.on_public_message(CHANNEL, SENDER, "Sender message on individual topic") - bot.on_public_message(CHANNEL, OWNER, "!fin") - bot.on_public_message(CHANNEL, OWNER, "!fin") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "## collective topic") + bot.test_public_message(bot.channel, OWNER, "Owner message on collective topic") + bot.test_public_message(bot.channel, SENDER, "Sender message on collective topic") + bot.test_public_message(bot.channel, OWNER, "# individual topic") + bot.test_public_message(bot.channel, OWNER, "Owner message on individual topic") + bot.test_public_message(bot.channel, SENDER, "Sender message on individual topic") + bot.test_public_message(bot.channel, OWNER, "!fin") + bot.test_public_message(bot.channel, OWNER, "!fin") assert len(bot.answers) == 1 assert bot.answers[0].message == "La revue est déjà finie." def test_finish_review_not_owner(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "## collective topic") - bot.on_public_message(CHANNEL, OWNER, "Owner message on collective topic") - bot.on_public_message(CHANNEL, SENDER, "Sender message on collective topic") - bot.on_public_message(CHANNEL, OWNER, "# individual topic") - bot.on_public_message(CHANNEL, OWNER, "Owner message on individual topic") - bot.on_public_message(CHANNEL, SENDER, "Sender message on individual topic") - bot.on_public_message(CHANNEL, SENDER, "!fin") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "## collective topic") + bot.test_public_message(bot.channel, OWNER, "Owner message on collective topic") + bot.test_public_message(bot.channel, SENDER, "Sender message on collective topic") + bot.test_public_message(bot.channel, OWNER, "# individual topic") + bot.test_public_message(bot.channel, OWNER, "Owner message on individual topic") + bot.test_public_message(bot.channel, SENDER, "Sender message on individual topic") + bot.test_public_message(bot.channel, SENDER, "!fin") assert len(bot.answers) == 1 assert bot.answers[0].message == f"{SENDER}, vous n'êtes pas responsable de la revue." def test_finish_review_no_participation(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "!fin") + bot.test_public_message(bot.channel, OWNER, "!start") + bot.test_public_message(bot.channel, OWNER, "!fin") assert len(bot.answers) == 1 assert bot.answers[0].message == "Participation nulle détectée. La revue est ignorée." diff --git a/tests/test_topic.py b/tests/test_topic.py index 7637317..175eda7 100644 --- a/tests/test_topic.py +++ b/tests/test_topic.py @@ -1,8 +1,8 @@ -from tests.utils import bot, CHANNEL, OWNER, SENDER +from tests.utils import bot, OWNER, SENDER def test_topic_duration_not_ended(bot): - bot.on_public_message(CHANNEL, OWNER, "!start") - bot.on_public_message(CHANNEL, OWNER, "## collective topic") - assert bot.review.current_topic.duration != "" + bot.test_public_message(bot.channel, SENDER, "!start") + bot.test_public_message(bot.channel, SENDER, "## collective topic") + assert bot.review.current_topic.duration != "" diff --git a/tests/utils.py b/tests/utils.py index 2b4561a..6d6fb71 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,13 +1,53 @@ +from dataclasses import dataclass + import pytest -from bot.hebdobot import Hebdobot +from hebdobot import HebdoBot from tests import settings -CHANNEL = "#test_channel" OWNER = "me" SENDER = "foobar" +@dataclass +class Answer(): + target: str + message: str + + +@dataclass +class Source(): + nick: str + + +class Event(): + def __init__(self, target, nick, message): + self.target = target + self.source = Source(nick) + self.arguments = [message] + + +def test_privmsg(self, target, message): + self.answers.append(Answer(target, message)) + + +def test_public_message(self, target, sender, message): + self.answers = [] + self.on_pubmsg(None, Event(target, sender, message)) + + +def test_private_message(self, target, sender, message): + self.answers = [] + self.on_privmsg(None, Event(target, sender, message)) + + @pytest.fixture def bot(): - return Hebdobot(settings, CHANNEL, nickname="Hebdobot") \ No newline at end of file + HebdoBot.test_public_message = test_public_message + HebdoBot.test_private_message = test_private_message + HebdoBot.test_privmsg = test_privmsg + hebdobot = HebdoBot(settings) + hebdobot.connection.privmsg = hebdobot.test_privmsg + hebdobot.answers = [] + + return hebdobot diff --git a/users-sample.conf b/users-sample.conf new file mode 100644 index 0000000..0e13256 --- /dev/null +++ b/users-sample.conf @@ -0,0 +1,14 @@ +# +# Sample Hebdobot user file +# + +Christian P. MOMON=cpm__,cpm_screen +Lionel Allorge=liot,liot_ +Frédéric Couchet=madix +Isabella Vanni=cioccolisa +Étienne Gonnu=lonugem +Elsa Pottier=eipoca1 +François Poulain=Polux__,Polux_,Polux,Polux[2] +Thérèse Godefroy=therese +Magali Garnero=Bookynette +Marie-Odile Morandi=Marie-Odile1,Marie-Odile