X-Git-Url: http://gitweb.pimeys.fr/?a=blobdiff_plain;f=deconnaisseur.py;h=8777db6a196ef3ffe8fa46155da3dfdd89fdc87d;hb=2d729424a3bbabae7567a16d9a18b940686c8e58;hp=b8953e7d4f84614b96762f2c2e68e006eda84fcb;hpb=5fbd10b3e6cd8b6ca31171ae3c75a766669de1c2;p=bots%2Fdeconnaisseur.git diff --git a/deconnaisseur.py b/deconnaisseur.py index b8953e7..8777db6 100755 --- a/deconnaisseur.py +++ b/deconnaisseur.py @@ -27,9 +27,18 @@ def get_config_source_file(serveur): return config_source_file_template%(serveurs[serveur]) ttrig=120 #time trigger (normalement 120, mais diminué pour les tests) Ttrig=600 #between two enigms -config_time_incompressible=60 #on peut pas retrigger en dessous de ce temps (60) +config_time_incompressible=15 #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" + +config_tag_triggers=[u"t(|a)g",u"ta gueule",u"la ferme",u"ferme( |-)la",u"tais-toi",u"chut"] +config_tag_actions=[u"se tait",u"ferme sa gueule",u"se la ferme",u"la ferme"] +config_tag_answers=[u"J'me tais si j'veux !", +u"Je t'entends pas :°", +u"Héhé, try again", +u"Non, j'ai pas envie", +u"Peut-être quand toi tu la fermeras, et encore…"] class UnicodeBotError(Exception): pass @@ -39,7 +48,7 @@ def bot_unicode(chain): except UnicodeDecodeError: raise UnicodeBotError -def log(channel,auteur=None,message=None): +def log(serveur,channel="prout",auteur=None,message=None): #f=open(config_logfile,"a") #if auteur==message==None: # chain=channel @@ -63,6 +72,19 @@ def tolere(regexp): reg=reg.replace(u"œ",u"(œ|oe)").replace(u"æ",u"(æ|ae)") return reg +def is_something(chain,matches,avant=u".*(?:^| )",apres=u"(?:$|\.| |,|;).*",case_sensitive=False,debug=False): + if case_sensitive: + chain=unicode(chain,"utf8") + else: + chain=unicode(chain,"utf8").lower() + allmatches="("+"|".join(matches)+")" + reg=(avant+allmatches+apres).lower() + o=re.match(reg,chain) + return o + +def is_tag(chain): + return is_something(chain,config_tag_triggers) + class RefuseError(Exception): pass @@ -79,7 +101,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={} + self.quiet_channels=[] def give_me_my_pseudo(self,serv): serv.privmsg("NickServ","RECOVER %s %s"%(config_pseudo,config_password)) @@ -125,7 +147,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) LEAVE Faire quitter un channel PLAY Passe un channel en mode "jouer" - NOPLAY Passe un channel en mode "ne pas jouer" """ + NOPLAY Passe un channel en mode "ne pas jouer" + QUIET Se taire sur un channel + NOQUIET Opposé de QUIET""" 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 @@ -283,6 +309,32 @@ class Deconnaisseur(ircbot.SingleServerIRCBot): log("priv",auteur," ".join(message)+"[failed]") else: notunderstood=True + elif cmd=="quiet": + if auteur in self.ops: + if len(message)>1: + if message[1] in self.quiet_channels: + serv.privmsg(auteur,"Je me la ferme déjà sur %s"%(message[1])) + log(self.serveur,"priv",auteur," ".join(message)+"[failed]") + else: + self.quiet_channels.append(message[1]) + serv.privmsg(auteur,"Quiet channels : "+" ".join(self.quiet_channels)) + log(self.serveur,"priv",auteur," ".join(message)+"[successful]") + else: + serv.privmsg(auteur,"Quiet channels : "+" ".join(self.quiet_channels)) + else: + notunderstood=True + elif cmd=="noquiet": + if auteur in self.ops: + if len(message)>1: + if message[1] in self.quiet_channels: + self.quiet_channels.remove(message[1]) + serv.privmsg(auteur,"Quiet channels : "+" ".join(self.quiet_channels)) + log(self.serveur,"priv",auteur," ".join(message)+"[successful]") + else: + serv.privmsg(auteur,"Je ne me la ferme pas sur %s."%(message[1])) + log(self.serveur,"priv",auteur," ".join(message)+"[failed]") + else: + notunderstood=True elif cmd in ["states","status"]: if auteur in self.overops: for k in self.play_status.keys(): @@ -299,15 +351,78 @@ 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 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())) + 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: @@ -323,7 +438,7 @@ class Deconnaisseur(ircbot.SingleServerIRCBot): 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 + return tryother=False pour_moi,message=self.pourmoi(serv,message) if pour_moi and message.split()!=[]: @@ -339,8 +454,8 @@ class Deconnaisseur(ircbot.SingleServerIRCBot): else: serv.privmsg(canal,"%s: crève !"%(auteur)) log(canal,auteur,message+"[failed]") - if cmd in ["meur", "meurt","meurre","meurres"]: - serv.privmsg(canal,'%s: Mourir, impératif, 2ème personne du pluriel : "meurs" (de rien)'%(auteur)) + if cmd in ["meur", "meurt","meurre","meurres"] and not canal in self.quiet_channels: + serv.privmsg(canal,'%s: Mourir, impératif, 2ème personne du singulier : "meurs" (de rien)'%(auteur)) if cmd in ["part","leave","dégage"]: if auteur in self.ops and (not (canal in self.stay_channels) or auteur in self.overops): @@ -357,9 +472,9 @@ class Deconnaisseur(ircbot.SingleServerIRCBot): serv.nick(become) log(canal,auteur,message+"[successful]") - if cmd in ["coucou"]: + if cmd in ["coucou"] and not canal in self.quiet_channels: serv.privmsg(canal,"%s: coucou"%(auteur)) - if cmd in ["ping"]: + if cmd in ["ping"] and not canal in self.quiet_channels: serv.privmsg(canal,"%s: pong"%(auteur)) if cmd in ["déconnaissance","deconnaissance","énigme","enigme","encore"]: if canal in self.play_channels: @@ -372,6 +487,17 @@ 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) + if is_tag(message) and not canal in self.quiet_channels: + if auteur in self.ops: + action=random.choice(config_tag_actions) + serv.action(canal,action.encode("utf8")) + self.quiet_channels.append(canal) + else: + answer=random.choice(config_tag_answers) + for ligne in answer.split("\n"): + serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8"))) else: tryother=True else: @@ -382,16 +508,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