]> gitweb.pimeys.fr Git - bots/parrot.git/commitdiff
On collapse les auteur sur la casse du premier enregistré.
authorVincent Le Gallic <legallic@crans.org>
Mon, 14 Apr 2014 13:01:47 +0000 (15:01 +0200)
committerVincent Le Gallic <legallic@crans.org>
Mon, 14 Apr 2014 13:01:47 +0000 (15:01 +0200)
parrot.py
quotes.py

index 26a204a46ecd702ecad93c5a667b5902cc5b699c..1072896cb8f98b687d94283d0b8cf66864f670b6 100755 (executable)
--- 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é).")
         """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):
     
     ### Surcharge des events du Bot
     def on_welcome(self, serv, ev):
index fae0df089c31212721df79c84991a264f29dd80a..2ff299e65a19b779e9b2db4f402c8021d4fdcdf6 100644 (file)
--- 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)
 
 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])
 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)
     
         """ 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à.
     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. """
             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:
         if not newquote in self.quotelist:
+            self.search
             self.quotelist.append(newquote)
             return True
         return False
             self.quotelist.append(newquote)
             return True
         return False
-
+    
     def __repr__(self):
         return repr(self.quotelist)
     def __repr__(self):
         return repr(self.quotelist)
-
+    
     def random(self):
         """ Sort une quote aléatoire """
         return random.choice(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
                 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:
     def search_authors(self, author=None, regexp=False):
         """Renvoie la liste des auteurs contenant ``author`` ou qui matchent la regexp."""
         if regexp: