]> gitweb.pimeys.fr Git - bots/deconnaisseur.git/blobdiff - deconnaisseur.py
Il faut maintenant s'adresser au bot pour répondre
[bots/deconnaisseur.git] / deconnaisseur.py
index 8007c9e9d363ae7095ebf764998801a773e58260..d0ff4dd8a016239fd7dbc6ffe02216c4b7d3e565 100755 (executable)
@@ -51,6 +51,17 @@ def log(serveur,channel,auteur=None,message=None):
         print chain
     f.close()
 
         print chain
     f.close()
 
+def ignore_event(serv, ev):
+    """Retourne ``True`` si il faut ignorer cet évènement."""
+    for (blackmask, exceptmask) in config.blacklisted_masks:
+        usermask = ev.source()
+        if exceptmask is None:
+            exceptit = False
+        else:
+            exceptit = bool(irclib.mask_matches(usermask, exceptmask))
+        blackit = bool(irclib.mask_matches(usermask, blackmask))
+        if blackit and not exceptit:
+            return True
 
 def reussi(message,answer,answer_regexp,auteur):
     if auteur in config.level3:
 
 def reussi(message,answer,answer_regexp,auteur):
     if auteur in config.level3:
@@ -58,7 +69,7 @@ def reussi(message,answer,answer_regexp,auteur):
     if auteur in config.level2:
         return remplace_accents(answer) in message
     else:
     if auteur in config.level2:
         return remplace_accents(answer) in message
     else:
-        if re.match(remplace_accents(answer_regexp).lower(),remplace_accents(message).lower()):
+        if re.match(".*" + remplace_accents(answer_regexp).lower(),remplace_accents(message).lower()):
             return True
 
 def is_something(chain,matches,avant=u".*(?:^| )",apres=u"(?:$|\.| |,|;).*",case_sensitive=False,debug=False):
             return True
 
 def is_something(chain,matches,avant=u".*(?:^| )",apres=u"(?:$|\.| |,|;).*",case_sensitive=False,debug=False):
@@ -110,16 +121,17 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
         for c in self.chanlist:
             log(self.serveur,"JOIN %s"%(c))
             serv.join(c)
         for c in self.chanlist:
             log(self.serveur,"JOIN %s"%(c))
             serv.join(c)
-            self.update_activity(c,"") # la chaîne vide ne sera jamais un nom de bot et donc marchera toujours
         for c in self.play_channels:
             token=time.time()-3600
             self.play_status[c]=[0,token]
         for c in self.play_channels:
             token=time.time()-3600
             self.play_status[c]=[0,token]
-            serv.execute_delayed(random.randrange(config.ttrig),self.start_enigme,(serv,c,token))
+            if config.auto_trigger:
+                serv.execute_delayed(random.randrange(config.ttrig),self.start_enigme,(serv,c,token))
 
     def start_enigme(self,serv,channel,token=None):
         # On reste silencieux si lechan n'est pas actif
         if not self.is_active(channel):
 
     def start_enigme(self,serv,channel,token=None):
         # On reste silencieux si lechan n'est pas actif
         if not self.is_active(channel):
-            serv.execute_delayed(config.ttrig*5,self.start_enigme,(serv,channel,token))
+            if config.auto_trigger:
+                serv.execute_delayed(config.ttrig*5,self.start_enigme,(serv,channel,token))
             return
         if self.play_status[channel][0]==0 and channel in self.play_channels:
             ok="skip"
             return
         if self.play_status[channel][0]==0 and channel in self.play_channels:
             ok="skip"
@@ -156,7 +168,8 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
             serv.privmsg(channel,"C'était : %s"%(answer).encode("utf8"))
             token=time.time()
             self.play_status[channel]=[0,token]
             serv.privmsg(channel,"C'était : %s"%(answer).encode("utf8"))
             token=time.time()
             self.play_status[channel]=[0,token]
-            serv.execute_delayed(random.randrange(config.Ttrig*5,config.Ttrig*10),self.start_enigme,(serv,channel,token))
+            if config.auto_trigger:
+                serv.execute_delayed(random.randrange(config.Ttrig*5,config.Ttrig*10),self.start_enigme,(serv,channel,token))
 
     def get_enigme(self):
         # on récupère les déconnaissances
 
     def get_enigme(self):
         # on récupère les déconnaissances
@@ -194,13 +207,15 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
             return (False,message)
 
     def on_privmsg(self, serv, ev):
             return (False,message)
 
     def on_privmsg(self, serv, ev):
+        if ignore_event(serv, ev):
+            return
         message=ev.arguments()[0]
         auteur = irclib.nm_to_n(ev.source())
         try:
             test=bot_unicode(message)
         except UnicodeBotError:
             if config.utf8_trigger:
         message=ev.arguments()[0]
         auteur = irclib.nm_to_n(ev.source())
         try:
             test=bot_unicode(message)
         except UnicodeBotError:
             if config.utf8_trigger:
-                serv.privmsg(auteur, config.utf8_fail_answers)
+                serv.privmsg(auteur, random.choice(config.utf8_fail_answers).encode("utf8"))
             return
         message=message.split()
         cmd=message[0].lower()
             return
         message=message.split()
         cmd=message[0].lower()
@@ -217,7 +232,7 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
  NOPLAY     Passe un channel en mode "ne pas jouer"
  QUIET      Se taire sur un channel
  NOQUIET    Opposé de QUIET
  NOPLAY     Passe un channel en mode "ne pas jouer"
  QUIET      Se taire sur un channel
  NOQUIET    Opposé de QUIET
- RELOAD     Recharge lac config"""
+ RELOAD     Recharge la config"""
             helpmsg_overops="""
  SCORES {DEL|ADD|SUB}   Tu veux un dessin ?
  SAY        Fais envoyer un message sur un chan ou à une personne
             helpmsg_overops="""
  SCORES {DEL|ADD|SUB}   Tu veux un dessin ?
  SAY        Fais envoyer un message sur un chan ou à une personne
@@ -240,7 +255,7 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
                     else:
                         serv.join(message[1])
                         self.chanlist.append(message[1])
                     else:
                         serv.join(message[1])
                         self.chanlist.append(message[1])
-                        self.update_activity(message[1],"")
+                        self.update_activity(message[1],force=True)
                         serv.privmsg(auteur,"Channels : "+" ".join(self.chanlist))
                         log(self.serveur,"priv",auteur," ".join(message))
                 else:
                         serv.privmsg(auteur,"Channels : "+" ".join(self.chanlist))
                         log(self.serveur,"priv",auteur," ".join(message))
                 else:
@@ -389,6 +404,7 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
                         self.add_score(de,-asked)
                         self.add_score(to,asked)
                         serv.privmsg(auteur,"Transfert de %s points de %s à %s"%(asked,de,to))
                         self.add_score(de,-asked)
                         self.add_score(to,asked)
                         serv.privmsg(auteur,"Transfert de %s points de %s à %s"%(asked,de,to))
+                        log(self.serveur,"Transfert de %s points de %s à %s"%(asked,de,to))
                 else:
                     serv.privmsg(auteur,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
             else:
                 else:
                     serv.privmsg(auteur,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
             else:
@@ -441,15 +457,17 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
             serv.privmsg(auteur,"Je n'ai pas compris. Essaye HELP…")
     
     def on_pubmsg(self, serv, ev):
             serv.privmsg(auteur,"Je n'ai pas compris. Essaye HELP…")
     
     def on_pubmsg(self, serv, ev):
+        if ignore_event(serv, ev):
+            return
         auteur = irclib.nm_to_n(ev.source())
         canal = ev.target()
         message = ev.arguments()[0]
         auteur = irclib.nm_to_n(ev.source())
         canal = ev.target()
         message = ev.arguments()[0]
-        self.update_activity(canal,auteur)
+        self.update_activity(canal,auteur,message)
         try:
             test=bot_unicode(message)
         except UnicodeBotError:
         try:
             test=bot_unicode(message)
         except UnicodeBotError:
-            if not canal in self.quiet_channels and config.utf8_trigger:
-                serv.privmsg(canal, "%s: %s"%(auteur,config.utf8_fail_answers))
+            if config.utf8_trigger and not canal in self.quiet_channels:
+                serv.privmsg(canal, (u"%s: %s"%(auteur,random.choice(config.utf8_fail_answers))).encode("utf8"))
             return
         tryother=False
         pour_moi,message=self.pourmoi(serv,message)
             return
         tryother=False
         pour_moi,message=self.pourmoi(serv,message)
@@ -491,7 +509,7 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
                 serv.privmsg(canal,"%s: coucou"%(auteur))
             elif cmd in ["ping"] and not canal in self.quiet_channels:
                 serv.privmsg(canal,"%s: pong"%(auteur))
                 serv.privmsg(canal,"%s: coucou"%(auteur))
             elif cmd in ["ping"] and not canal in self.quiet_channels:
                 serv.privmsg(canal,"%s: pong"%(auteur))
-            elif cmd in ["déconnaissance","deconnaissance","énigme","enigme","encore"]:
+            elif cmd in ["déconnaissance","deconnaissance","énigme","enigme","encore","aco","moo","moo !","moo !"]:
                 if canal in self.play_channels:
                     if self.play_status.get(canal,[-1])[0]==0:
                         try:
                 if canal in self.play_channels:
                     if self.play_status.get(canal,[-1])[0]==0:
                         try:
@@ -530,7 +548,7 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
                 tryother=True
         else:
             tryother=True
                 tryother=True
         else:
             tryother=True
-        if tryother:
+        if tryother and pour_moi:
             if self.play_status.get(canal,[-1])[0] in [1,2]:
                 answer_regexp=self.play_status[canal][3]
                 answer=self.play_status[canal][4]
             if self.play_status.get(canal,[-1])[0] in [1,2]:
                 answer_regexp=self.play_status[canal][3]
                 answer=self.play_status[canal][4]
@@ -540,7 +558,8 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
                     self.add_score(auteur,1)
                     token=time.time()
                     self.play_status[canal]=[0,token]
                     self.add_score(auteur,1)
                     token=time.time()
                     self.play_status[canal]=[0,token]
-                    serv.execute_delayed(random.randrange(config.Ttrig*5,config.Ttrig*10),self.start_enigme,(serv,canal,token))
+                    if config.auto_trigger:
+                        serv.execute_delayed(random.randrange(config.Ttrig*5,config.Ttrig*10),self.start_enigme,(serv,canal,token))
     
     def on_kick(self,serv,ev):
         auteur = irclib.nm_to_n(ev.source())
     
     def on_kick(self,serv,ev):
         auteur = irclib.nm_to_n(ev.source())
@@ -551,7 +570,7 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
             log(self.serveur,"%s kické de %s par %s (raison : %s)" %(victime,channel,auteur,raison))
             time.sleep(5)
             serv.join(channel)
             log(self.serveur,"%s kické de %s par %s (raison : %s)" %(victime,channel,auteur,raison))
             time.sleep(5)
             serv.join(channel)
-            self.update_activity(channel,"")
+            self.update_activity(channel,force=True)
             # on ne dit rien au rejoin
             #l1,l2=config.kick_answers,config.kick_actions
             #n1,n2=len(l1),len(l2)
             # on ne dit rien au rejoin
             #l1,l2=config.kick_answers,config.kick_actions
             #n1,n2=len(l1),len(l2)
@@ -594,11 +613,12 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
         return self.serv.get_nickname()
     nick = property(_getnick)
     
         return self.serv.get_nickname()
     nick = property(_getnick)
     
-    def update_activity(self,canal,pseudo):
-        if not pseudo in config.idle_bots:
+    def update_activity(self,canal="",pseudo="",message="",force=False):
+        if force or (not pseudo in config.idle_bots and all([not re.match(ignore, message) for ignore in config.idle_messages])):
             self.last_activity[canal]=time.time()
     def is_active(self,canal):
             self.last_activity[canal]=time.time()
     def is_active(self,canal):
-        return time.time()-self.last_activity[canal]<config.idle_time
+        # Si on n'a pas d'info sur le chan, il est inactif
+        return time.time()-self.last_activity.get(canal, config.idle_time)<config.idle_time
     
     def reload(self, auteur=None):
         reload(config)
     
     def reload(self, auteur=None):
         reload(config)
@@ -679,4 +699,4 @@ if __name__=="__main__":
             f.write("%s\n" % child_pid)
             f.close()
     else:
             f.write("%s\n" % child_pid)
             f.close()
     else:
-        deconnaisseur.start()
\ No newline at end of file
+        deconnaisseur.start()