--- /dev/null
+#!/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])