X-Git-Url: http://gitweb.pimeys.fr/?a=blobdiff_plain;f=deconnaisseur.py;h=666f60a61fb88b17a683b7a6ee9cead20c286206;hb=6e0a322ad3ba10ee7415808b91d21fa6ff1d1058;hp=e0a50936dccfdb0fb43b7d686f6523dd7fd09834;hpb=04403df248d79bf93354d1d9a10a023dc175adde;p=bots%2Fdeconnaisseur.git diff --git a/deconnaisseur.py b/deconnaisseur.py index e0a5093..666f60a 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 @@ -57,9 +58,9 @@ def tolere(regexp): reg=reg.replace(u"á",u"(á|a)").replace(u"à",u"(à|a)").replace(u"â",u"(â|a)").replace(u"ä",u"(ä|a)") reg=reg.replace(u"é",u"(é|e)").replace(u"è",u"(è|e)").replace(u"ê",u"(ê|e)").replace(u"ë",u"(ë|e)") reg=reg.replace(u"í",u"(í|i)").replace(u"ì",u"(ì|i)").replace(u"î",u"(î|i)").replace(u"ï",u"(ï|i)") - reg=reg.replace(u"ó",u"(ó|o)").replace(u"ò",u"(ò|o)").replace(u"ê",u"(ô|o)").replace(u"ö",u"(ö|o)") - reg=reg.replace(u"ú",u"(ú|u)").replace(u"ù",u"(ù|u)").replace(u"ê",u"(û|u)").replace(u"ü",u"(ü|u)") - reg=reg.replace(u"ý",u"(ý|y)").replace(u"ỳ",u"(ỳ|y)").replace(u"ê",u"(ŷ|y)").replace(u"ÿ",u"(ÿ|y)") + reg=reg.replace(u"ó",u"(ó|o)").replace(u"ò",u"(ò|o)").replace(u"ô",u"(ô|o)").replace(u"ö",u"(ö|o)") + reg=reg.replace(u"ú",u"(ú|u)").replace(u"ù",u"(ù|u)").replace(u"û",u"(û|u)").replace(u"ü",u"(ü|u)") + reg=reg.replace(u"ý",u"(ý|y)").replace(u"ỳ",u"(ỳ|y)").replace(u"ŷ",u"(ŷ|y)").replace(u"ÿ",u"(ÿ|y)") reg=reg.replace(u"œ",u"(œ|oe)").replace(u"æ",u"(æ|ae)") return reg @@ -79,6 +80,7 @@ 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)) @@ -162,7 +164,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,7 +183,8 @@ 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 + 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 @@ -296,6 +299,18 @@ class Deconnaisseur(ircbot.SingleServerIRCBot): elif cmd=="die": if auteur in self.overops: self.die() + elif cmd=="score": + serv.privmsg(auteur,"Votre score : %s"%(self.scores.get(auteur,0)) ) + elif cmd=="scores": + scores=self.get_scores().items() + # trie par score + scores.sort(lambda x,y:cmp(x[1].lower(),y[1].lower())) + 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],y[0])) + scores.reverse() + serv.privmsg(auteur,"Scores by pseudo : "+" ; ".join(["%s %s"%(i[0],i[1]) for i in scores])) else: notunderstood=True if notunderstood: @@ -308,9 +323,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()!=[]: @@ -333,6 +349,7 @@ class Deconnaisseur(ircbot.SingleServerIRCBot): or auteur in self.overops): serv.part(canal,message="Éjecté par %s"%(auteur)) log(canal,auteur,message+"[successful]") + self.chanlist.remove(canal) else: serv.privmsg(canal,"%s: Non, je reste !"%(auteur)) log(canal,auteur,message+"[failed]") @@ -364,13 +381,32 @@ class Deconnaisseur(ircbot.SingleServerIRCBot): tryother=True if tryother: if self.play_status.get(canal,[-1])[0] in [1,2]: - answer=self.play_status[canal][3] - if re.match(tolere(answer),unicode(message,"utf8").lower()): + answer_regexp=self.play_status[canal][3] + 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) 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): + scores=self.get_scores() + if scores.has_key(pseudo): + scores[pseudo]+=1 + else: + scores[pseudo]=1 + 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