]> gitweb.pimeys.fr Git - bots/deconnaisseur.git/blobdiff - deconnaisseur.py
indice triggerable
[bots/deconnaisseur.git] / deconnaisseur.py
index b8953e7d4f84614b96762f2c2e68e006eda84fcb..9444519bc7ca3eb60f9c2931b55f3464cb306309 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
@@ -79,7 +80,6 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
         self.stay_channels=config_stay_channels
         self.play_channels=config_play_channels
         self.play_status={i:[0] for i in self.play_channels}
-        self.scores={}
 
     def give_me_my_pseudo(self,serv):
         serv.privmsg("NickServ","RECOVER %s %s"%(config_pseudo,config_password))
@@ -125,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]
@@ -183,6 +183,7 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
         if cmd=="help":
             helpmsg_default="""Liste des commandes :
  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)
@@ -190,6 +191,7 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
  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
@@ -299,15 +301,79 @@ class Deconnaisseur(ircbot.SingleServerIRCBot):
             if auteur in self.overops:
                 self.die()
         elif cmd=="score":
-            serv.privmsg(auteur,"Votre score : %s"%(self.scores.get(auteur,0)) )
+            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":
-            scores=self.scores.items()
-            # trie par score
-            scores.sort(lambda x,y:cmp(x[1],y[1]))
-            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],y[0]))
-            serv.privmsg(auteur,"Scores by score : "+" ; ".join(["%s %s"%(i[0],i[1]) for i in 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()))
+                scores.reverse()
+                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:
@@ -372,6 +438,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:
@@ -382,16 +450,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.scoreplus(auteur)
+                    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 scoreplus(self,pseudo):
-        if self.scores.has_key(pseudo):
-            self.scores[pseudo]+=1
+    def add_score(self,pseudo,value):
+        scores=self.get_scores()
+        if scores.has_key(pseudo):
+            scores[pseudo]+=value
         else:
-            self.scores[pseudo]=1
+            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