2 # -*- encoding: utf-8 -*-
4 """ Gestion des quotes """
14 quote_matcher
= re
.compile(config
.quote_regexp
, flags
=re
.UNICODE
)
15 quote_matcher_with_timestamp
= re
.compile(config
.quote_regexp_with_timestamp
, flags
=re
.UNICODE
)
18 """ Renvoie la date actuelle """
19 return datetime
.datetime(*time
.localtime()[:6])
23 def __init__(self
, author
, content
, timestamp
=None):
26 elif isinstance(timestamp
, basestring
):
27 timestamp
= datetime
.datetime(*time
.strptime(timestamp
, u
"%Y-%m-%d_%H:%M:%S")[:6])
29 self
.content
= content
30 self
.timestamp
= timestamp
33 d
= {"author" : self
.author
, "content" : self
.content
,
34 "timestamp" : self
.timestamp
.strftime(u
"%F_%T")}
37 def __unicode__(self
):
38 """ Retourne la quote affichable """
39 return config
.quote_template
% self
.__dict
__
41 return unicode(self
).encode("utf-8")
43 def __eq__(self
, otherquote
):
44 """ Vérifie si cette phrase n'a pas déjà été dite par la même personne.
45 Indépendamment de la date. """
46 return [self
.author
, self
.content
] == [otherquote
.author
, otherquote
.content
]
49 def parse(text
, date
=None):
50 """ Parse le ``text`` et renvoie une quote ou None. """
53 get
= quote_matcher
.match(text
)
56 return Quote(d
["author"], d
["content"], date
)
58 def load_file(filename
):
59 """ Récupère les quotes depuis le fichier """
60 with
open(filename
) as f
:
61 jsonquotes
= json
.load(f
)
62 quotes
= [Quote(**q
) for q
in jsonquotes
]
65 def save_file(quotes
, filename
):
66 """ Enregistre les quotes dans le fichier """
67 with
open(filename
, "w") as f
:
68 raws
= [q
.jsonize() for q
in quotes
]
71 class QuoteDB(object):
72 """ Stocke et distribue des quotes. """
77 """ Charge le fichier de quotes dans la DB """
78 self
.quotelist
= load_file(config
.quote_file
)
81 """ Sauvegarde la DB dans le fichier de quotes """
82 save_file(self
.quotelist
, config
.quote_file
)
84 def store(self
, author
, content
, timestamp
=None):
85 """ Enregistre une nouvelle quote, sauf si elle existe déjà.
86 Renvoie ``True`` si elle a été ajoutée, ``False`` si elle existait. """
87 newquote
= Quote(author
, content
, timestamp
)
88 if not newquote
in self
.quotelist
:
89 self
.quotelist
.append(newquote
)
94 return repr(self
.quotelist
)
97 """ Sort une quote aléatoire """
98 return random
.choice(self
.quotelist
)
99 def randomfrom(self
, author
):
100 """ Sort une quote aléatoire de ``author`` """
101 return random
.choice([q
for q
in self
.quotelist
if q
.author
== author
])
103 def search(self
, inquote
=None, author
=None, regexp
=False):
104 """Fait une recherche dans les quotes."""
110 qreg
= re
.compile(inquote
, flags
=re
.UNICODE
)
111 areg
= re
.compile(author
, flags
=re
.UNICODE
)
112 l
= [q
for q
in self
.quotelist
if qreg
.match(q
.content
) and areg
.match(q
.author
)]
118 l
= [q
for q
in self
.quotelist
if inquote
in q
.content
and author
in q
.author
]
121 def search_authors(self
, author
=None, regexp
=False):
122 """Renvoie la liste des auteurs contenant ``author`` ou qui matchent la regexp."""
126 areg
= re
.compile(author
, flags
=re
.UNICODE
)
127 l
= list(set([q
.author
for q
in self
.quotelist
if areg
.match(q
.author
)]))
131 l
= list(set([q
.author
for q
in self
.quotelist
if author
in q
.author
]))
134 def dump(quotedb
, dump_file
=None):
135 """Pour exporter les quotes dans un format readable vers un fichier."""
136 if dump_file
is None:
137 dump_file
= config
.quote_dump_file
138 t
= "\n".join(["%s %s" % (q
.timestamp
.strftime("%F_%T"), q
) for q
in quotedb
.quotelist
]) + "\n"
139 with
open(dump_file
, "w") as f
:
142 def restore(dump_file
=None):
143 """Crée un DB de quotes en parsant le contenu d'un fichier de dump."""
144 if dump_file
is None:
145 dump_file
= config
.quote_dump_file
146 with
open(dump_file
) as f
:
148 t
= t
.decode("utf-8") # Oui, ça peut fail, mais on ne doit alors pas continuer
149 l
= [m
.groupdict() for m
in quote_matcher_with_timestamp
.finditer(t
)]
150 # On instancie les quotes grâce aux dicos qui ont déjà la bonne tronche
151 l
= [Quote(**q
) for q
in l
]
152 newquotedb
= QuoteDB()
153 newquotedb
.quotelist
= l