]> gitweb.pimeys.fr Git - bots/saturnin.git/blobdiff - saturnin.py
IRC, I hate you
[bots/saturnin.git] / saturnin.py
index 3b43531fb133e9c3f8d04afd321438432c90e348..848019c2ea51a4001b4295f0862eb468ddb1fae8 100755 (executable)
@@ -56,11 +56,18 @@ def is_something(chain,matches,avant=u".*(?:^| )",apres=u"(?:$|\.| |,|;).*",case
 regexp_pan = re.compile(u".*(" + "|".join(config.killwords) + u").*")
 def is_pan(chain):
     return regexp_pan.match(unicode(chain,"utf8").lower())
-def ignore_pan(serv, ev):
-    """Retourne ``True`` si il faut ignorer ce pan."""
-    for (blackmask, exceptmask) in config.ignored_pan_masks:
+
+def ignore_event(serv, ev):
+    """Retourne ``True`` si il faut ignorer cet évènement."""
+    for (blackmask, exceptmask) in config.blacklisted_masks:
         usermask = ev.source()
-        return bool(irclib.mask_matches(usermask, blackmask) and not irclib.mask_matches(usermasl, exceptmask))
+        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 UnicodeBotError(Exception):
     pass
@@ -121,6 +128,8 @@ class Saturnin(ircbot.SingleServerIRCBot):
             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:
@@ -195,6 +204,8 @@ class Saturnin(ircbot.SingleServerIRCBot):
                         helpmsg+="\n"+helpmsgs[2]
                     else:
                         helpmsg=helpmsgs[2]
+                if not helpmsg: # Un non-op a demandé de l'aide sur une commande dont il n'est pas censé connaître l'existence
+                    helpmsg = "Commande inacessible."
             for ligne in helpmsg.split("\n"):
                 serv.privmsg(auteur,ligne)
         elif cmd=="join":
@@ -396,6 +407,13 @@ class Saturnin(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))
+                elif len(message) == 2:
+                    scores = self.get_scores()
+                    asked = message[1]
+                    if asked in scores:
+                        serv.privmsg(auteur, "Score de %s : %s" % (asked, scores[asked]))
+                    else:
+                        serv.privmsg(auteur, "%s n'a encore jamais joué (avec succès)." % (asked,))
                 else:
                     serv.privmsg(auteur,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
             else:
@@ -443,20 +461,34 @@ class Saturnin(ircbot.SingleServerIRCBot):
     def sendscore(self, to):
         self.serv.privmsg(to, "Votre score : %s"%(self.get_scores().get(to,0)) )
     
+    def _sendscores(self, to, scores):
+        message = ''
+        for [nick, score] in scores:
+            score = '{}: {}'.format(nick, score)
+            if len(message) < config.MAX_LENGTH - len(score):
+                message += ' ' + score
+            else:
+                self.serv.privmsg(to, message)
+                message = score
+        if message:
+            self.serv.privmsg(to, message)
+
     def sendscores(self, to):
         scores=self.get_scores().items()
         # trie par score
         scores.sort(lambda x,y:cmp(x[1],y[1]))
         scores.reverse()
-        self.serv.privmsg(to, "Scores by score : "+" ; ".join(["%s %s"%(i[0],i[1]) for i in scores]))
+        self.serv.privmsg(to, "Scores by score : ")
+        self._sendscores(to, scores)
         # trie par pseudo
         scores.sort(lambda x,y:cmp(x[0].lower(),y[0].lower()))
-        self.serv.privmsg(to, "Scores by pseudo : "+" ; ".join(["%s %s"%(i[0],i[1]) for i in scores]))
+        self.serv.privmsg(to, "Scores by pseudo : ")
+        self._sendscores(to, scores)
     
     def on_pubmsg(self, serv, ev):
-        auteur = irclib.nm_to_n(ev.source())
-        if re.match(config.ignored_pseudos, auteur):
+        if ignore_event(serv, ev):
             return
+        auteur = irclib.nm_to_n(ev.source())
         channel = ev.target()
         message = ev.arguments()[0]
         try:
@@ -497,13 +529,17 @@ class Saturnin(ircbot.SingleServerIRCBot):
                 self.sendscore(auteur)
             elif cmd == "scores":
                 self.sendscores(auteur)
-        else:
-            if is_pan(message):
-                if ignore_pan(serv, ev):
-                    return
-                self.shot(channel, auteur)
+            elif cmd in [u"deviens", u"pseudo"]:
+                if auteur in self.ops:
+                    become = args
+                    serv.nick(become)
+                    log(self.serveur, channel, auteur, message + "[successful]")
+        if is_pan(message):
+            self.shot(channel, auteur)
     
     def on_action(self, serv, ev):
+        if ignore_event(serv, ev):
+            return
         action = ev.arguments()[0]
         auteur = irclib.nm_to_n(ev.source())
         channel = ev.target()