]> gitweb.pimeys.fr Git - bots/deconnaisseur.git/blobdiff - deconnaisseur.py
bourde sur le classement des scores by pseudo
[bots/deconnaisseur.git] / deconnaisseur.py
index 1d8517f2a03d6ed2574f66a474bbdbc1517483fe..5ebbbf8ed9dfc51f4e32af0b5d59539e1f6e8c7a 100755 (executable)
@@ -30,6 +30,7 @@ Ttrig=600 #between two enigms
 config_time_incompressible=60 #on peut pas retrigger en dessous de ce temps (60)
 config_time_incompressible_clue=60 #on peut pas forcer la demande d'indice en dessous
 
+config_score_file="scores.pickle"
 
 class UnicodeBotError(Exception):
     pass
@@ -124,7 +125,7 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
         if self.play_status[channel][0]==1:
             if token==None:
                 # c'est donc que l'indice a été demandé
-                if self.play_status[channe][-1]+config_time_incompressible_clue<time.time():
+                if self.play_status[channel][-1]+config_time_incompressible_clue<time.time():
                     token=self.play_status[channel][-1]
             if self.play_status[channel][-1]==token:
                 indice=self.play_status[channel][2]
@@ -162,7 +163,7 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
     def pourmoi(self, serv, message):
         pseudo=serv.get_nickname()
         size=len(pseudo)
-        if message[:size]==pseudo and message[size]==":":
+        if message[:size]==pseudo and len(message)>size and message[size]==":":
             return (True,message[size+1:].strip(" "))
         else:
             return (False,message)
@@ -181,13 +182,16 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
         notunderstood=False
         if cmd=="help":
             helpmsg_default="""Liste des commandes :
- HELP       Affiche ce message d'aide"""
+ HELP       Affiche ce message d'aide
+ SCORE      Affiche ton score (SCORE TRANSFERT <pseudo> [<n>] pour transférer des points)
+ SCORES     Affiche les scores"""
             helpmsg_ops="""
  JOIN       Faire rejoindre un channel (sans paramètres, donne la liste des chans actuels)
  LEAVE      Faire quitter un channel
  PLAY       Passe un channel en mode "jouer"
  NOPLAY     Passe un channel en mode "ne pas jouer" """
             helpmsg_overops="""
+ SCORES {DEL|ADD|SUB}   Tu veux un dessin ?
  SAY        Fais envoyer un message sur un chan ou à une personne
  STAY       Ignorera les prochains LEAVE pour un chan
  NOSTAY     Opposé de STAY
@@ -296,6 +300,79 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
         elif cmd=="die":
             if auteur in self.overops:
                 self.die()
+        elif cmd=="score":
+            if len(message)>1:
+                if len(message) in [3,4] and message[1].lower()=="transfert":
+                    scores=self.get_scores()
+                    de,to=auteur,message[2]
+                    value=scores.get(de,0)
+                    if len(message)==4:
+                        try:
+                            asked=int(message[3])
+                        except ValueError:
+                            serv.privmsg(auteur,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
+                            return
+                    else:
+                        asked=value
+                    if value==0:
+                        serv.privmsg(auteur,"Vous n'avez pas de points")
+                        return
+                    elif asked<=0:
+                        serv.privmsg(auteur,"Bien tenté…")
+                        return
+                    elif asked>value:
+                        serv.privmsg(auteur,"Vous n'avez que %s points"%(value))
+                        return
+                    else:
+                        self.add_score(de,-asked)
+                        self.add_score(to,asked)
+                        serv.privmsg(auteur,"Transfert de %s points de %s à %s"%(asked,de,to))
+                else:
+                    serv.privmsg(auteur,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
+            else:
+                serv.privmsg(auteur,"Votre score : %s"%(self.get_scores().get(auteur,0)) )
+        elif cmd=="scores":
+            if len(message)==1:
+                scores=self.get_scores().items()
+                # trie par score
+                scores.sort(lambda x,y:cmp(x[1],y[1]))
+                scores.reverse()
+                serv.privmsg(auteur,"Scores by score : "+" ; ".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]))
+            elif auteur in self.overops:
+                souscmd=message[1].lower()
+                if souscmd=="del":
+                    if len(message)==3:
+                        todelete=message[2]
+                        scores=self.get_scores()
+                        if scores.has_key(todelete):
+                            del scores[todelete]
+                            self.save_scores(scores)
+                            serv.privmsg(auteur,"Score de %s supprimé"%(todelete))
+                        else:
+                            serv.privmsg(auteur,"Ce score n'existe pas : %s"%(todelete))
+                    else:
+                        serv.privmsg(auteur,"Syntaxe : SCORES DEL <pseudo>")
+                elif souscmd in ["add","sub"]:
+                    if len(message)==4:
+                        toadd,val=message[2],message[3]
+                        try:
+                            val=int(val)
+                        except ValueError:
+                            serv.privmsg(auteur,"Syntaxe : SCORES {ADD|SUB} <pseudo> <n>")
+                            return
+                        if souscmd=="sub":
+                            val=-val
+                        self.add_score(toadd,val)
+                        serv.privmsg(auteur,"Done")
+                    else:
+                        serv.privmsg(auteur,"Syntaxe : SCORES {ADD|SUB} <pseudo> <n>")
+                else:
+                    serv.privmsg(auteur,"Syntaxe : SCORES {DEL|ADD|SUB} <pseudo> [<n>]")
+            else:
+                notunderstood=True
         else:
             notunderstood=True
         if notunderstood:
@@ -308,9 +385,10 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
         try:
             test=bot_unicode(message)
         except UnicodeBotError:
-            serv.privmsg(canal,
-              "%s: Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…"%(auteur))
-            return
+            if not canal in self.quiet_channels:
+                serv.privmsg(canal,
+                   "%s: Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…"%(auteur))
+                return
         tryother=False
         pour_moi,message=self.pourmoi(serv,message)
         if pour_moi and message.split()!=[]:
@@ -359,6 +437,8 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
                         serv.privmsg(canal,"%s: Rappel : %s"%(auteur,self.play_status[canal][1]))
                 else:
                     serv.privmsg(canal,"%s: pas ici…"%(auteur))
+            if cmd=="indice" and canal in self.play_channels:
+                self.give_indice(serv,canal,None)
             else:
                 tryother=True
         else:
@@ -369,10 +449,28 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
                 if re.match(tolere(answer_regexp),unicode(message,"utf8").lower()):
                     answer=self.play_status[canal][4]
                     serv.privmsg(canal,"%s: bravo ! (C'était %s)"%(auteur,answer))
+                    self.add_score(auteur,1)
                     token=time.time()
                     self.play_status[canal]=[0,token]
                     serv.execute_delayed(random.randrange(Ttrig*5,Ttrig*10),self.start_enigme,(serv,canal,token))
+    def get_scores(self):
+        f=open(config_score_file)
+        scores=pickle.load(f)
+        f.close()
+        return scores
+
+    def add_score(self,pseudo,value):
+        scores=self.get_scores()
+        if scores.has_key(pseudo):
+            scores[pseudo]+=value
+        else:
+            scores[pseudo]=value
+        self.save_scores(scores)
 
+    def save_scores(self,scores):
+        f=open(config_score_file,"w")
+        pickle.dump(scores,f)
+        f.close()
 
 if __name__=="__main__":
     import sys