X-Git-Url: http://gitweb.pimeys.fr/?a=blobdiff_plain;f=deconnaisseur.py;h=9444519bc7ca3eb60f9c2931b55f3464cb306309;hb=35aaf028252abc0c87f200efd32ba36f25c10f00;hp=bc485e1ebdfd7eb7df482d05b42d89d6b4d931a7;hpb=462fe56110afc6c1f5ddbaaf418d249a537ae141;p=bots%2Fdeconnaisseur.git diff --git a/deconnaisseur.py b/deconnaisseur.py index bc485e1..9444519 100755 --- a/deconnaisseur.py +++ b/deconnaisseur.py @@ -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 [] 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 []") + 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 []") + 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 pseudo : "+" ; ".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 ") + 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} ") + return + if souscmd=="sub": + val=-val + self.add_score(toadd,val) + serv.privmsg(auteur,"Done") + else: + serv.privmsg(auteur,"Syntaxe : SCORES {ADD|SUB} ") + else: + serv.privmsg(auteur,"Syntaxe : SCORES {DEL|ADD|SUB} []") + 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