From: Vincent Le Gallic Date: Mon, 14 Apr 2014 13:01:47 +0000 (+0200) Subject: On collapse les auteur sur la casse du premier enregistré. X-Git-Url: http://gitweb.pimeys.fr/?p=bots%2Fparrot.git;a=commitdiff_plain;h=51b7d8da6804bd5018f5ecd169875fad92084ee6 On collapse les auteur sur la casse du premier enregistré. --- diff --git a/parrot.py b/parrot.py index 26a204a..1072896 100755 --- a/parrot.py +++ b/parrot.py @@ -180,6 +180,9 @@ class Parrot(ircbot.SingleServerIRCBot): """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): diff --git a/quotes.py b/quotes.py index fae0df0..2ff299e 100644 --- a/quotes.py +++ b/quotes.py @@ -15,6 +15,21 @@ quote_matcher = re.compile(config.quote_regexp, flags=re.UNICODE) 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]) @@ -86,18 +101,38 @@ class QuoteDB(object): """ 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) @@ -125,7 +160,7 @@ class QuoteDB(object): 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: