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"
class UnicodeBotError(Exception):
pass
self.stay_channels=config_stay_channels
self.play_channels=config_play_channels
self.play_status={i:[0] for i in self.play_channels}
+ self.quiet_channels={}
def give_me_my_pseudo(self,serv):
serv.privmsg("NickServ","RECOVER %s %s"%(config_pseudo,config_password))
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]
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 <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)
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
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():
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 <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":
+ 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 <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:
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):
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:
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:
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