]> gitweb.pimeys.fr Git - bots/parrot.git/commitdiff
Gestion d'une liste de quotes
authorVincent Le Gallic <legallic@crans.org>
Sat, 1 Feb 2014 22:13:16 +0000 (23:13 +0100)
committerVincent Le Gallic <legallic@crans.org>
Sat, 1 Feb 2014 22:13:16 +0000 (23:13 +0100)
config.py
quotes.py [new file with mode: 0644]

index c650d469ade141ff6218a8861c02ade65a130f7e..c42357e6f9ce1cb872f42630483433b36c3f0193 100644 (file)
--- 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<content>.*?)\s*("|»|') ?~ ?(?P<author>.*)"""
+
+#: 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 (file)
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])