X-Git-Url: http://gitweb.pimeys.fr/?a=blobdiff_plain;f=deconnaisseur.py;h=f2e405c50e7669604b297f03b5e56895bc843268;hb=6a778527b32b182c8b8d8984fd71dce45e914296;hp=1d8517f2a03d6ed2574f66a474bbdbc1517483fe;hpb=9ea11941adf3d6aa6c643c4a6d4fdc176e1566a1;p=bots%2Fdeconnaisseur.git diff --git a/deconnaisseur.py b/deconnaisseur.py index 1d8517f..f2e405c 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 @@ -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 [] 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,80 @@ 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 []") + 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": + 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: @@ -308,9 +386,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()!=[]: @@ -369,10 +448,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