"""Restaure les quotes à partir du dump. ``asked_where=None`` signifie en privé."""
self.quotedb = quotes.restore()
self.acknowledge(asked_by, asked_where, "Quotes restaurées à partir du dump (pas de backup effectué).")
+ many = self.quotedb.get_clash_authors()
+ if many:
+ self.acknowledge(asked_by, asked_where, "Auteurs de casse différente : %s" % (many))
### Surcharge des events du Bot
def on_welcome(self, serv, ev):
quote_matcher_with_timestamp = re.compile(config.quote_regexp_with_timestamp, flags=re.UNICODE)
spaces_matcher = re.compile(u"\s", flags=re.U)
+def equivalence_partition(iterable, relation):
+ """ Partitionne l'itérable en classes d'équivalences. """
+ classes = []
+ for o in iterable:
+ # find the class it is in
+ found = False
+ for c in classes:
+ if relation( iter(c).next(), o ): # is it equivalent to this class?
+ c.add( o )
+ found = True
+ break
+ if not found: # it is in a new class
+ classes.append( set( [ o ] ) )
+ return classes
+
def get_now():
""" Renvoie la date actuelle """
return datetime.datetime(*time.localtime()[:6])
""" Sauvegarde la DB dans le fichier de quotes """
save_file(self.quotelist, config.quote_file)
+ def _collapse_author(self, author):
+ """ Renvoie ``author`` avec la casse déjà utilisée si il a déjà été quoté
+ sinon, le renvoie sans le modifier. """
+ authors = list(set([q.author for q in self.quotelist if q.author.lower() == author.lower()]))
+ if len(authors) > 1:
+ print "Warning : authors %s" % authors
+ if authors:
+ return authors[0]
+ else:
+ return author
+
+ def get_clash_authors(self):
+ """ Renvoie une liste de liste d'auteurs qui sont enresgitrés avec des casses différentes. """
+ authors = list(set([q.author for q in self.quotelist]))
+ authors = equivalence_partition(authors, lambda x,y: x.lower() == y.lower())
+ authors = [list(c) for c in authors if len(c) > 1]
+ return authors
+
def store(self, author, content, timestamp=None):
""" Enregistre une nouvelle quote, sauf si elle existe déjà.
+ Force l'auteur à utiliser la même casse si un auteur de casse différente existait déjà.
Renvoie ``True`` si elle a été ajoutée, ``False`` si elle existait. """
- newquote = Quote(author, content, timestamp)
+ newquote = Quote(self._collapse_author(author), content, timestamp)
if not newquote in self.quotelist:
+ self.search
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)
author = ""
l = [q for q in self.quotelist if inquote in q.content and author in q.author]
return l
-
+
def search_authors(self, author=None, regexp=False):
"""Renvoie la liste des auteurs contenant ``author`` ou qui matchent la regexp."""
if regexp: