]> gitweb.pimeys.fr Git - bots/historien.git/blobdiff - historien.py
Ignorer marcel
[bots/historien.git] / historien.py
index 0d4842dd9377850138affaa3a4f2e0a9d84593dc..66a4ff6a9b604b2d7d79793c1da72445a6e0d32d 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
 
 class GoodCentury(Exception):
     pass
 
 class GoodCentury(Exception):
     pass
@@ -132,16 +143,17 @@ class Historien(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"
@@ -180,7 +192,8 @@ class Historien(ircbot.SingleServerIRCBot):
             serv.privmsg(channel,"C'était le %s"%(date).encode("utf8"))
             token=time.time()
             self.play_status[channel]=[0,token]
             serv.privmsg(channel,"C'était le %s"%(date).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 dates
 
     def get_enigme(self):
         # on récupère les dates
@@ -219,6 +232,8 @@ class Historien(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:
         message=ev.arguments()[0]
         auteur = irclib.nm_to_n(ev.source())
         try:
@@ -241,7 +256,8 @@ class Historien(ircbot.SingleServerIRCBot):
  PLAY       Passe un channel en mode "jouer"
  NOPLAY     Passe un channel en mode "ne pas jouer"
  QUIET      Se taire sur un channel
  PLAY       Passe un channel en mode "jouer"
  NOPLAY     Passe un channel en mode "ne pas jouer"
  QUIET      Se taire sur un channel
- NOQUIET    Opposé de QUIET"""
+ NOQUIET    Opposé de QUIET
+ RELOAD     Me fait recharger la conf"""
             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
@@ -363,6 +379,12 @@ class Historien(ircbot.SingleServerIRCBot):
                         log(self.serveur,"priv",auteur," ".join(message)+"[failed]")
             else:
                 notunderstood=True
                         log(self.serveur,"priv",auteur," ".join(message)+"[failed]")
             else:
                 notunderstood=True
+        elif cmd=="reload":
+            if auteur in self.ops:
+                self.reload(auteur)
+                log(self.serveur,"priv",auteur," ".join(message)+"[successful]")
+            else:
+                notunderstood=True
         elif cmd in ["states","status"]:
             if auteur in self.overops:
                 for k in self.play_status.keys():
         elif cmd in ["states","status"]:
             if auteur in self.overops:
                 for k in self.play_status.keys():
@@ -458,10 +480,12 @@ class Historien(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:
@@ -483,9 +507,13 @@ class Historien(ircbot.SingleServerIRCBot):
                 else:
                     serv.privmsg(canal,"%s: crève !"%(auteur))
                     log(self.serveur,canal,auteur,message+"[failed]")
                 else:
                     serv.privmsg(canal,"%s: crève !"%(auteur))
                     log(self.serveur,canal,auteur,message+"[failed]")
-            if cmd in ["meur", "meurt","meurre","meurres"] and not canal in self.quiet_channels:
+            elif cmd in ["meur", "meurt","meurre","meurres"] and not canal in self.quiet_channels:
                 serv.privmsg(canal,'%s: Mourir, impératif, 2ème personne du singulier : "meurs" (de rien)'%(auteur))
                 serv.privmsg(canal,'%s: Mourir, impératif, 2ème personne du singulier : "meurs" (de rien)'%(auteur))
-            if cmd in ["part","leave","dégage"]:
+            elif cmd == "reload":
+                if auteur in self.ops:
+                    log(self.serveur, canal, auteur, message+"[successful]")
+                    self.reload(canal)
+            elif cmd in ["part","leave","dégage"]:
                 if auteur in self.ops and (not (canal in self.stay_channels)
                                            or auteur in self.overops):
                     self.quitter(canal)
                 if auteur in self.ops and (not (canal in self.stay_channels)
                                            or auteur in self.overops):
                     self.quitter(canal)
@@ -495,16 +523,16 @@ class Historien(ircbot.SingleServerIRCBot):
                     serv.privmsg(canal,"%s: Non, je reste !"%(auteur))
                     log(self.serveur,canal,auteur,message+"[failed]")
     
                     serv.privmsg(canal,"%s: Non, je reste !"%(auteur))
                     log(self.serveur,canal,auteur,message+"[failed]")
     
-            if cmd in ["deviens","pseudo"]:
+            elif cmd in ["deviens","pseudo"]:
                 if auteur in self.ops:
                     become=args
                     serv.nick(become)
                     log(self.serveur,canal,auteur,message+"[successful]")
                 if auteur in self.ops:
                     become=args
                     serv.nick(become)
                     log(self.serveur,canal,auteur,message+"[successful]")
-            if cmd in ["coucou"] and not canal in self.quiet_channels:
+            elif cmd in ["coucou"] and not canal in self.quiet_channels:
                 serv.privmsg(canal,"%s: coucou"%(auteur))
                 serv.privmsg(canal,"%s: coucou"%(auteur))
-            if cmd in ["ping"] and not canal in self.quiet_channels:
+            elif cmd in ["ping"] and not canal in self.quiet_channels:
                 serv.privmsg(canal,"%s: pong"%(auteur))
                 serv.privmsg(canal,"%s: pong"%(auteur))
-            if cmd in ["date","dates","histoire","énigme","enigme","encore"]:
+            elif cmd in ["date","dates","histoire","énigme","enigme","encore"]:
                 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:
@@ -515,9 +543,9 @@ class Historien(ircbot.SingleServerIRCBot):
                         serv.privmsg(canal,("%s: Rappel : %s"%(auteur,self.play_status[canal][2])).encode("utf8") )
                 else:
                     serv.privmsg(canal,"%s: pas ici…"%(auteur))
                         serv.privmsg(canal,("%s: Rappel : %s"%(auteur,self.play_status[canal][2])).encode("utf8") )
                 else:
                     serv.privmsg(canal,"%s: pas ici…"%(auteur))
-            if cmd in ["score","!score"]:
+            elif cmd in ["score","!score"]:
                 serv.privmsg(auteur,"Votre score : %s"%(self.get_scores().get(auteur,0)) )
                 serv.privmsg(auteur,"Votre score : %s"%(self.get_scores().get(auteur,0)) )
-            if cmd in ["scores","!scores"]:
+            elif cmd in ["scores","!scores"]:
                 scores=self.get_scores().items()
                 # trie par score
                 scores.sort(lambda x,y:cmp(x[1],y[1]))
                 scores=self.get_scores().items()
                 # trie par score
                 scores.sort(lambda x,y:cmp(x[1],y[1]))
@@ -526,9 +554,9 @@ class Historien(ircbot.SingleServerIRCBot):
                 # trie par pseudo
                 scores.sort(lambda x,y:cmp(x[0].lower(),y[0].lower()))
                 serv.privmsg(auteur,"Scores by pseudo : "+" ; ".join(["%s %s"%(i[0],i[1]) for i in scores]))
                 # trie par pseudo
                 scores.sort(lambda x,y:cmp(x[0].lower(),y[0].lower()))
                 serv.privmsg(auteur,"Scores by pseudo : "+" ; ".join(["%s %s"%(i[0],i[1]) for i in scores]))
-            if cmd=="indice" and canal in self.play_channels:
+            elif cmd == "indice" and canal in self.play_channels:
                 self.give_indice(serv,canal,None)
                 self.give_indice(serv,canal,None)
-            if is_tag(message) and not canal in self.quiet_channels:
+            elif is_tag(message) and not canal in self.quiet_channels:
                 if auteur in self.ops:
                     action=random.choice(config.tag_actions)
                     serv.action(canal,action.encode("utf8"))
                 if auteur in self.ops:
                     action=random.choice(config.tag_actions)
                     serv.action(canal,action.encode("utf8"))
@@ -572,7 +600,8 @@ class Historien(ircbot.SingleServerIRCBot):
                     self.add_score(auteur,score_obtenu)
                     token=time.time()
                     self.play_status[canal]=[0,token]
                     self.add_score(auteur,score_obtenu)
                     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())
@@ -583,7 +612,7 @@ class Historien(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)
@@ -633,11 +662,22 @@ class Historien(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)
+        if auteur in [None, "SIGHUP"]:
+            towrite = "Config reloaded" + " (SIGHUP received)"*(auteur == "SIGHUP")
+            for to in config.report_bugs_to:
+                self.serv.privmsg(to, towrite)
+            log(self.serveur, towrite)
+        else:
+            self.serv.privmsg(auteur,"Config reloaded")
     
     def start_as_daemon(self, outfile):
         sys.stderr = Logger(outfile)
     
     def start_as_daemon(self, outfile):
         sys.stderr = Logger(outfile)
@@ -688,6 +728,10 @@ if __name__=="__main__":
         print "Server Unknown : %s"%(serveur)
         exit(404)
     historien=Historien(serveur,debug)
         print "Server Unknown : %s"%(serveur)
         exit(404)
     historien=Historien(serveur,debug)
+    # Si on reçoit un SIGHUP, on reload la config
+    def sighup_handler(signum, frame):
+        historien.reload("SIGHUP")
+    signal.signal(signal.SIGHUP, sighup_handler)
     if daemon:
         child_pid = os.fork()
         if child_pid == 0:
     if daemon:
         child_pid = os.fork()
         if child_pid == 0: