From 4a1d0e902c3f08fc841c1da9a943413133b295a2 Mon Sep 17 00:00:00 2001 From: Vincent Le Gallic Date: Sat, 1 Feb 2014 23:13:16 +0100 Subject: [PATCH] Gestion d'une liste de quotes --- config.py | 9 +++++ quotes.py | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 quotes.py diff --git a/config.py b/config.py index c650d46..c42357e 100644 --- a/config.py +++ b/config.py @@ -108,3 +108,12 @@ helpmsg_overops = u" SAY DO STAY NOSTAY OPS OVEROPS KICK DIE CRASH" #: Liste de paires de masques ``[black, exceptlist]`` : on blacklistera ce qui match ``black`` #: et aucun élément de ``exceptlist`` blacklisted_masks = [("Flo!*@*", [])] + +#: Regexp utilisée pour parser des quotes +quote_regexp = ur"""\s*("|«|')\s*(?P.*?)\s*("|»|') ?~ ?(?P.*)""" + +#: Template pour afficher une quote +quote_template = u"« %(content)s » ~ %(author)s" + +#: Fichier pour stocker les quotes +quote_file = u"quotes.json" diff --git a/quotes.py b/quotes.py new file mode 100644 index 0000000..73f711c --- /dev/null +++ b/quotes.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" Gestion des quotes """ + +import datetime +import time +import re +import json +import random + +import config + +def get_now(): + """ Renvoie la date actuelle """ + return datetime.datetime(*time.localtime()[:6]) + +class Quote(object): + """ Une citation """ + def __init__(self, author, content, timestamp=None): + if timestamp is None: + timestamp = get_now() + elif isinstance(timestamp, basestring): + timestamp = datetime.datetime(*time.strptime(timestamp, u"%Y-%m-%d_%H:%M:%S")[:6]) + self.author = author + self.content = content + self.timestamp = timestamp + + def jsonize(self): + d = {"author" : self.author, "content" : self.content, + "timestamp" : self.timestamp.strftime(u"%F_%T")} + return d + + def __unicode__(self): + """ Retourne la quote affichable """ + return config.quote_template % self.__dict__ + def __str__(self): + return unicode(self).encode("utf-8") + + def __eq__(self, otherquote): + """ Vérifie si cette phrase n'a pas déjà été dite par la même personne. + Indépendamment de la date. """ + return [self.author, self.content] == [otherquote.author, otherquote.content] + +quote_matcher = re.compile(config.quote_regexp) + +def parse(text, date=None): + """ Parse le ``text`` et renvoie une quote ou None. """ + if date == None: + date = get_now() + get = quote_matcher.match(text) + if not get is None: + d = get.groupdict() + return Quote(d["author"], d["content"], date) + +def load_file(filename): + """ Récupère les quotes depuis le fichier """ + with open(filename) as f: + jsonquotes = json.load(f) + quotes = [Quote(**q) for q in jsonquotes] + return quotes + +def save_file(quotes, filename): + """ Enregistre les quotes dans le fichier """ + with open(filename, "w") as f: + raws = [q.jsonize() for q in quotes] + json.dump(raws, f) + +class QuoteDB(object): + """ Stocke et distribue des quotes. """ + def __init__(self): + self.quotelist = [] + + def load(self): + """ Charge le fichier de quotes dans la DB """ + self.quotelist = load_file(config.quote_file) + + def save(self): + """ Sauvegarde la DB dans le fichier de quotes """ + save_file(self.quotelist, config.quote_file) + + def store(self, author, content, timestamp=None): + """ Enregistre une nouvelle quote, sauf si elle existe déjà. + Renvoie ``True`` si elle a été ajoutée, ``False`` si elle existait. """ + newquote = Quote(author, content, timestamp) + if not newquote in self.quotelist: + self.quotelist.append(newquote) + return True + return False + + def __repr__(self): + return repr(self.quotelist) + + def random(self): + """ Sort une quote aléatoire """ + return random.choice(self.quotelist) + def randomfrom(self, author): + """ Sort une quote aléatoire de ``author`` """ + return random.choice([q for q in self.quotelist if q.author == author]) -- 2.39.2