From: Vincent Le Gallic Date: Fri, 25 May 2012 17:48:38 +0000 (+0200) Subject: .gitignore X-Git-Url: http://gitweb.pimeys.fr/?a=commitdiff_plain;h=811c0d6ae4071e956e44f03a8cfdb07cdaadc21e;p=bots%2Fsalesman.git .gitignore --- 811c0d6ae4071e956e44f03a8cfdb07cdaadc21e diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..464d41d --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +# Custom # +################### +*~ +played.*.txt +scores.pickle + +# Compiled source # +################### +*.pyc + +# Packages # +############ +# it's better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip + +# Logs # +###################### +*.log + +# OS generated files # +###################### +.DS_Store* +*ehthumbs.db +Icon? +*Thumbs.db diff --git a/Salesman.crans.log b/Salesman.crans.log new file mode 100644 index 0000000..9946c47 --- /dev/null +++ b/Salesman.crans.log @@ -0,0 +1,26 @@ +2012-05-25 19:30:09 Connected +2012-05-25 19:30:09 JOIN #bot +2012-05-25 19:30:19 [#bot:$Énigme$] Douchanbé | Tadjikistan + +2012-05-25 19:31:10 [#bot:[20-100]] dégage[successful] +2012-05-25 19:31:18 [priv:[20-100]] die[successful] +2012-05-25 19:32:52 Connected +2012-05-25 19:32:52 JOIN #bot +2012-05-25 19:32:56 [#bot:$Énigme$] Bénin + | Porto-Novo +2012-05-25 19:33:10 [#bot:[20-100]$win] Porto-Novo +2012-05-25 19:34:25 Connected +2012-05-25 19:34:25 JOIN #bot +2012-05-25 19:34:39 [#bot:$Énigme$] Palikir | Micronésie + +2012-05-25 19:40:26 Connected +2012-05-25 19:40:26 JOIN #bot +2012-05-25 19:40:31 [#bot:$Énigme$] Achgabat | Turkménistan + +2012-05-25 19:41:40 Connected +2012-05-25 19:41:40 JOIN #bot +2012-05-25 19:41:48 [#bot:$Énigme$] Grèce + | Athènes +2012-05-25 19:42:02 [#bot:[20-100]$win] Athènes +2012-05-25 19:43:07 [#bot:$Énigme$] Podgorica | Monténégro + diff --git a/Salesman.py b/Salesman.py new file mode 100755 index 0000000..523d960 --- /dev/null +++ b/Salesman.py @@ -0,0 +1,617 @@ +#!/usr/bin/python +# -*- coding:utf8 -*- + +# Codé par 20-100 le 23/04/12 + +# Un bot IRC qui sort des déconnaissances + +import irclib +import ircbot +import threading +import random +import time +import pickle +import re +from remplace_accents import remplace_accents + +config_password="Yamoussoukro" +config_pseudo="Salesman" +config_chanlist=["#bot","#flood"] +config_play_channels=["#flood"] +config_stay_channels=["#flood","#bot"] +config_overops=["[20-100]","[20-100]_"] +config_ops=["PEB","Petite-Peste"] + +config_source_file="capitales.txt" +config_played_file_template="played.%s.txt" #il faut rajouter le nom du serveur +def get_config_played_file(serveur): + serveurs={"acoeur.crans.org":"acoeur","irc.crans.org":"crans"} + return config_played_file_template%(serveurs[serveur]) +ttrig=120 #time trigger (normalement 120, mais diminué pour les tests) +Ttrig=600 #between two enigms +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…"] + +config_level2=[] +config_level3=[] + +config_debug_stdout = True +config_logfile_template="Salesman.%s.log" +def get_config_logfile(serveur): + serveurs={"acoeur.crans.org":"acoeur","irc.crans.org":"crans"} + return config_logfile_template%(serveurs[serveur]) + +config_quit_messages=[u"goto Tombouctou"] + +config_leave_messages=[u"On continuera à jouer plus tard ;)"] + +class UnicodeBotError(Exception): + pass +def bot_unicode(chain): + try: + unicode(chain,"utf8") + except UnicodeDecodeError: + raise UnicodeBotError + +def log(serveur,channel,auteur=None,message=None): + f=open(get_config_logfile(serveur),"a") + if auteur==message==None: + # alors c'est que c'est pas un channel mais juste une ligne de log + chain="%s %s"%(time.strftime("%F %T"),channel) + else: + chain="%s [%s:%s] %s"%(time.strftime("%F %T"),channel,auteur,message) + f.write(chain+"\n") + if config_debug_stdout: + print chain + f.close() + + +def reussi(message,answer,auteur): + if auteur in config_level3: + return answer in message + if auteur in config_level2: + return remplace_accents(answer) in message + else: + if re.match(remplace_accents(answer).lower(),remplace_accents(message).lower()): + return True + +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 + +class Deconnaisseur(ircbot.SingleServerIRCBot): + def __init__(self,serveur,debug=False): + temporary_pseudo=config_pseudo+str(random.randrange(10000,100000)) + ircbot.SingleServerIRCBot.__init__(self, [(serveur, 6667)], + temporary_pseudo,"Un bot irc.[flagellez 20-100, il le mérite]", 10) + self.debug=debug + self.serveur=serveur + self.overops=config_overops + self.ops=self.overops+config_ops + self.chanlist=config_chanlist + 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)) + serv.privmsg("NickServ","RELEASE %s %s"%(config_pseudo,config_password)) + time.sleep(0.3) + serv.nick(config_pseudo) + + def on_welcome(self, serv, ev): + self.serv=serv # ça serv ira :) + self.give_me_my_pseudo(serv) + serv.privmsg("NickServ","identify %s"%(config_password)) + log(self.serveur,"Connected") + if self.debug: + self.chanlist=["#bot"] + self.play_channels=["#bot"] + for c in self.chanlist: + log(self.serveur,"JOIN %s"%(c)) + serv.join(c) + for c in self.play_channels: + token=time.time()-3600 + self.play_status[c]=[0,token] + serv.execute_delayed(random.randrange(ttrig),self.start_enigme,(serv,c,token)) + + def start_enigme(self,serv,channel,token=None): + if self.play_status[channel][0]==0 and channel in self.play_channels: + ok="skip" + if token==self.play_status[channel][-1]: + ok="do_it" + if token==None: + if time.time() > self.play_status[channel][-1]+config_time_incompressible: + ok="do_it" + else: + ok="refuse" + if ok=="do_it": + enigme,indice,answer=self.get_enigme() + log(self.serveur,channel,u"$Énigme$".encode("utf8"),("%s | %s"%(enigme, answer)).encode("utf8")) + serv.privmsg(channel,enigme.encode("utf8")) + token=time.time() + self.play_status[channel]=[1,enigme,indice,answer_reg,answer,token] + serv.execute_delayed(random.randrange(ttrig*3,ttrig*5),self.give_indice,(serv,channel,token)) + elif ok=="refuse": + raise RefuseError + def give_indice(self,serv,channel,token): + if self.play_status[channel][0]==1: + if token==None: + # c'est donc que l'indice a été demandé + if self.play_status[channel][-1]+config_time_incompressible_cluesize and message[size]==":": + return (True,message[size+1:].strip(" ")) + else: + return (False,message) + + def on_privmsg(self, serv, ev): + message=ev.arguments()[0] + auteur = irclib.nm_to_n(ev.source()) + try: + test=bot_unicode(message) + except UnicodeBotError: + serv.privmsg(auteur, + "Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…") + return + message=message.split() + cmd=message[0].lower() + notunderstood=False + if cmd=="help": + helpmsg_default="""Liste des commandes : + 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" + 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 + STATUS Montre l'état courant + DIE Mourir""" + helpmsg=helpmsg_default + if auteur in self.ops: + helpmsg+=helpmsg_ops + if auteur in self.overops: + helpmsg+=helpmsg_overops + for ligne in helpmsg.split("\n"): + serv.privmsg(auteur,ligne) + elif cmd=="join": + if auteur in self.ops: + if len(message)>1: + if message[1] in self.chanlist: + serv.privmsg(auteur,"Je suis déjà sur %s"%(message[1])) + else: + serv.join(message[1]) + self.chanlist.append(message[1]) + serv.privmsg(auteur,"Channels : "+" ".join(self.chanlist)) + log(self.serveur,"priv",auteur," ".join(message)) + else: + serv.privmsg(auteur,"Channels : "+" ".join(self.chanlist)) + else: + notunderstood=True + elif cmd=="leave": + if auteur in self.ops and len(message)>1: + if message[1] in self.chanlist: + if not (message[1] in self.stay_channels) or auteur in self.overops: + self.quitter(message[1]," ".join(message[2:])) + self.chanlist.remove(message[1]) + log(self.serveur,"priv",auteur," ".join(message)+"[successful]") + else: + serv.privmsg(auteur,"Non, je reste !") + log(self.serveur,"priv",auteur," ".join(message)+"[failed]") + else: + serv.privmsg(auteur,"Je ne suis pas sur %s"%(message[1])) + else: + notunderstood=True + elif cmd=="stay": + if auteur in self.overops: + if len(message)>1: + if message[1] in self.stay_channels: + serv.privmsg(auteur,"Je stay déjà sur %s."%(message[1])) + log(self.serveur,"priv",auteur," ".join(message)+"[failed]") + else: + self.stay_channels.append(message[1]) + serv.privmsg(auteur,"Stay channels : "+" ".join(self.stay_channels)) + log(self.serveur,"priv",auteur," ".join(message)+"[successful]") + else: + serv.privmsg(auteur,"Stay channels : "+" ".join(self.stay_channels)) + else: + notunderstood=True + elif cmd=="nostay": + if auteur in self.overops: + if len(message)>1: + if message[1] in self.stay_channels: + self.stay_channels.remove(message[1]) + serv.privmsg(auteur,"Stay channels : "+" ".join(self.stay_channels)) + log(self.serveur,"priv",auteur," ".join(message)+"[successful]") + else: + serv.privmsg(auteur,"Je ne stay pas sur %s."%(message[1])) + log(self.serveur,"priv",auteur," ".join(message)+"[failed]") + else: + notunderstood=True + elif cmd=="play": + if auteur in self.ops: + if len(message)>1: + if message[1] in self.play_channels: + serv.privmsg(auteur,"Je play déjà sur %s."%(message[1])) + log(self.serveur,"priv",auteur," ".join(message)+"[failed]") + else: + self.play_channels.append(message[1]) + self.play_status[message[1]]=[0,time.time()-3600] + serv.privmsg(auteur,"Play channels : "+" ".join(self.play_channels)) + log(self.serveur,"priv",auteur," ".join(message)+"[successful]") + else: + serv.privmsg(auteur,"Play channels : "+" ".join(self.play_channels)) + else: + notunderstood=True + elif cmd=="noplay": + if auteur in self.ops: + if len(message)>1: + if message[1] in self.play_channels: + self.play_channels.remove(message[1]) + serv.privmsg(auteur,"Play channels : "+" ".join(self.play_channels)) + log(self.serveur,"priv",auteur," ".join(message)+"[successful]") + else: + serv.privmsg(auteur,"Je ne play pas sur %s."%(message[1])) + log(self.serveur,"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(): + serv.privmsg(auteur,(u"%s : %s"%(k,"; ".join([unicode(i) for i in self.play_status[k]]))).encode("utf8") ) + elif cmd=="say": + if auteur in self.overops and len(message)>2: + serv.privmsg(message[1]," ".join(message[2:])) + log(self.serveur,"priv",auteur," ".join(message)) + elif len(message)<=2: + serv.privmsg(auteur,"Syntaxe : SAY ") + else: + notunderstood=True + elif cmd=="die": + if auteur in self.overops: + log(self.serveur,"priv",auteur," ".join(message)+"[successful]") + self.mourir() + 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())) + 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: + serv.privmsg(auteur,"Je n'ai pas compris. Essaye HELP…") + + def on_pubmsg(self, serv, ev): + auteur = irclib.nm_to_n(ev.source()) + canal = ev.target() + message = ev.arguments()[0] + try: + test=bot_unicode(message) + except UnicodeBotError: + 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()!=[]: + cmd=message.split()[0].lower() + try: + args=" ".join(message.split()[1:]) + except: + args="" + if cmd in ["meurs","die","crève"]: + if auteur in self.overops: + self.mourir() + log(self.serveur,canal,auteur,message+"[successful]") + else: + serv.privmsg(canal,"%s: crève !"%(auteur)) + log(self.serveur,canal,auteur,message+"[failed]") + 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): + self.quitter(canal) + log(self.serveur,canal,auteur,message+"[successful]") + self.chanlist.remove(canal) + else: + serv.privmsg(canal,"%s: Non, je reste !"%(auteur)) + log(self.serveur,canal,auteur,message+"[failed]") + + if cmd in ["deviens","pseudo"]: + if auteur in self.ops: + become=args + serv.nick(become) + log(self.serveur,canal,auteur,message+"[successful]") + if cmd in ["coucou"] and not canal in self.quiet_channels: + serv.privmsg(canal,"%s: coucou"%(auteur)) + 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: + if self.play_status.get(canal,[-1])[0]==0: + try: + self.start_enigme(serv,canal) + except RefuseError: + serv.privmsg(canal,"%s: Je peux souffler une minute ?"%(auteur)) + else: + serv.privmsg(canal,("%s: Rappel : %s"%(auteur,self.play_status[canal][1])).encode("utf8") ) + else: + serv.privmsg(canal,"%s: pas ici…"%(auteur)) + if cmd in ["score","!score"]: + serv.privmsg(auteur,"Votre score : %s"%(self.get_scores().get(auteur,0)) ) + if cmd in ["scores","!scores"]: + 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])) + 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: + tryother=True + if tryother: + if self.play_status.get(canal,[-1])[0] in [1,2]: + answer_regexp=self.play_status[canal][3] + answer=self.play_status[canal][4] + if reussi(message.decode("utf8"),answer,answer_regexp,auteur): + serv.privmsg(canal,(u"%s: bravo ! (C'était %s)"%(auteur,answer)).encode("utf8")) + log(self.serveur,canal,auteur+"$win",message) + 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 on_kick(self,serv,ev): + auteur = irclib.nm_to_n(ev.source()) + channel = ev.target() + victime = ev.arguments()[0] + raison = ev.arguments()[1] + if victime==self.nick: + log(self.serveur,"%s kické par %s (raison : %s)" %(victime,auteur,raison)) + time.sleep(5) + serv.join(channel) + # on ne dit rien au rejoin + #l1,l2=config_kick_answers,config_kick_actions + #n1,n2=len(l1),len(l2) + #i=random.randrange(n1+n2) + #if i>=n1: + # serv.action(channel,l2[i-n1].format(auteur).encode("utf8")) + #else: + # serv.privmsg(channel,l1[i].format(auteur).encode("utf8")) + + def quitter(self,chan,leave_message=None): + if leave_message==None: + leave_message=random.choice(config_leave_messages) + self.serv.part(chan,message=leave_message.encode("utf8")) + + def mourir(self): + quit_message=random.choice(config_quit_messages) + self.die(msg=quit_message.encode("utf8")) + + 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() + + def _getnick(self): + return self.serv.get_nickname() + nick = property(_getnick) + +if __name__=="__main__": + import sys + if len(sys.argv)==1: + print "Usage : deconnaisseur.py [--debug]" + exit(1) + serveur=sys.argv[1] + if "debug" in sys.argv or "--debug" in sys.argv: + debug=True + else: + debug=False + serveurs={"a♡":"acoeur.crans.org","acoeur":"acoeur.crans.org","acoeur.crans.org":"acoeur.crans.org", + "irc":"irc.crans.org","crans":"irc.crans.org","irc.crans.org":"irc.crans.org"} + try: + serveur=serveurs[serveur] + except KeyError: + print "Server Unknown : %s"%(serveur) + exit(404) + deco=Deconnaisseur(serveur,debug) + deco.start() diff --git a/capitales.txt b/capitales.txt new file mode 100644 index 0000000..919fe0c --- /dev/null +++ b/capitales.txt @@ -0,0 +1,112 @@ + 0 | Abidjan | Côte d'Ivoire + 1 | Abuja | Nigeria + 2 | Achgabat | Turkménistan + 3 | Alger | Algérie + 4 | Amsterdam | Pays-Bas + 5 | Ankara | Turquie + 6 | Apia | Samoa + 7 | Astana | Kazakhstan + 8 | Athènes | Grèce + 9 | Bakou | Azerbaïdjan + 10 | Bandar Seri Begawan | Brunei + 11 | Bangui | République centrafricaine + 12 | Basseterre | Saint-Christophe-et-Niévès + 13 | Belmopan | Belize + 14 | Berne | Suisse + 15 | Bichkek | Kirghizistan + 16 | Bogota | Colombie + 17 | Bratislava | Slovaquie + 18 | Bridgetown | Barbade + 19 | Buenos Aires | Argentine + 20 | Castries | Sainte-Lucie + 21 | Colombo | Sri Lanka + 22 | Copenhague | Danemark + 23 | Damas | Syrie + 24 | Delap-Uliga-Darrit | Marshall + 25 | Dili | Timor oriental + 26 | Dodoma | Tanzanie + 27 | Douchanbé | Tadjikistan + 28 | Erevan | Arménie + 29 | Freetown | Sierra Leone + 30 | Funafuti | Tuvalu + 31 | Georgetown | Guyana + 32 | Guatemala | Guatemala + 33 | Hagåtña | Guam + 34 | Hamilton | Bermudes + 35 | Hanoï | Viêt Nam + 36 | Helsinki | Finlande + 37 | Kaboul | Afghanistan + 38 | Kampala | Ouganda + 39 | Khartoum | Soudan + 40 | Kigali | Rwanda + 41 | Kingstown | Saint-Vincent-et-les-Grenadines + 42 | Koror | Palaos + 43 | Kuala Lumpur | Malaisie + 44 | Lilongwe | Malawi + 45 | Lisbonne | Portugal + 46 | Lomé | Togo + 47 | Luanda | Angola + 48 | Luxembourg | Luxembourg + 49 | Malé | Maldives + 50 | Manama | Bahreïn + 51 | Maputo | Mozambique + 52 | Mascate | Oman + 53 | Maseru | Lesotho + 54 | Minsk | Biélorussie + 55 | Monrovia | Liberia + 56 | Moroni | Comores + 57 | Nassau | Bahamas + 58 | New Delhi | Inde + 59 | Niamey | Niger + 60 | Nicosie | Chypre + 61 | Nuku'alofa | Tonga + 62 | Oranjestad | Aruba + 63 | Oslo | Norvège + 64 | Ottawa | Canada + 65 | Oulan Bator | Mongolie + 66 | Palikir | Micronésie + 67 | Panama | Panama + 68 | Paris | France + 69 | Pékin | Chine + 70 | Podgorica | Monténégro + 71 | Port-Louis | Maurice + 72 | Porto-Novo | Bénin + 73 | Prague | République tchèque + 74 | Praia | Cap-Vert + 75 | Putrajaya | Malaisie + 76 | Pyinmana | Birmanie + 77 | Quito | Équateur + 78 | Rangoon | Birmanie + 79 | Riga | Lettonie + 80 | Rome | Italie + 81 | Saint John's | Antigua-et-Barbuda + 82 | Saint-Marin | Saint-Marin + 83 | Saint-Pierre-Port | Guernesey + 84 | San José | Costa Rica + 85 | Sanaa | Yémen + 86 | São Tomé | Sao Tomé-et-Principe + 87 | Séoul | Corée du Sud + 88 | Skopje | Macédoine + 89 | Sri Jayawardenapura | Sri Lanka + 90 | Sucre | Bolivie + 91 | Tachkent | Ouzbékistan + 92 | Téhéran | Iran + 93 | The Valley | Anguilla + 94 | Tokyo | Japon + 95 | Tunis | Tunisie + 96 | Vatican | Vatican + 97 | Vienne | Autriche + 98 | Vilnius | Lituanie + 99 | Wellington | Nouvelle-Zélande +100 | Willemstad | Curaçao +101 | Windhoek | Namibie +102 | Yamoussoukro | Côte d'Ivoire +103 | Yaren | Nauru +104 | Hargeisa | Somaliland +105 | Jérusalem | Israël +106 | Ramallah | Autorité palestinienne +107 | Nankin | Taïwan +108 | Nicosie | Chypre du Nord +109 | Soukhoumi | Abkhazie +110 | Stepanakert | Haut-Karabagh +111 | Tiraspol | Transnistrie diff --git a/played.crans.txt b/played.crans.txt new file mode 100644 index 0000000..fc23933 --- /dev/null +++ b/played.crans.txt @@ -0,0 +1,112 @@ +0 : 0 +1 : 0 +2 : 1 +3 : 0 +4 : 0 +5 : 0 +6 : 0 +7 : 0 +8 : 1 +9 : 0 +10 : 0 +11 : 0 +12 : 0 +13 : 0 +14 : 0 +15 : 0 +16 : 0 +17 : 0 +18 : 0 +19 : 0 +20 : 0 +21 : 0 +22 : 0 +23 : 0 +24 : 0 +25 : 0 +26 : 0 +27 : 1 +28 : 0 +29 : 0 +30 : 0 +31 : 0 +32 : 0 +33 : 0 +34 : 0 +35 : 0 +36 : 0 +37 : 0 +38 : 0 +39 : 0 +40 : 0 +41 : 0 +42 : 0 +43 : 0 +44 : 0 +45 : 0 +46 : 0 +47 : 0 +48 : 0 +49 : 0 +50 : 0 +51 : 0 +52 : 0 +53 : 0 +54 : 0 +55 : 0 +56 : 0 +57 : 0 +58 : 0 +59 : 0 +60 : 0 +61 : 0 +62 : 0 +63 : 0 +64 : 0 +65 : 0 +66 : 1 +67 : 0 +68 : 0 +69 : 0 +70 : 1 +71 : 0 +72 : 1 +73 : 0 +74 : 0 +75 : 0 +76 : 0 +77 : 0 +78 : 0 +79 : 0 +80 : 0 +81 : 0 +82 : 0 +83 : 0 +84 : 0 +85 : 0 +86 : 0 +87 : 0 +88 : 0 +89 : 0 +90 : 0 +91 : 0 +92 : 0 +93 : 0 +94 : 0 +95 : 0 +96 : 0 +97 : 0 +98 : 0 +99 : 0 +100 : 0 +101 : 0 +102 : 0 +103 : 0 +104 : 0 +105 : 0 +106 : 0 +107 : 0 +108 : 0 +109 : 0 +110 : 0 +111 : 0 \ No newline at end of file diff --git a/remplace_accents.py b/remplace_accents.py new file mode 100644 index 0000000..440a9c0 --- /dev/null +++ b/remplace_accents.py @@ -0,0 +1,26 @@ +#!/usr/bin/python +# -*- coding:utf8 -*- + +# Tout petit script à importé partout où on en a besoin +# pour enlevé les accents/œ/æ/trémas d'une chaîne unicode + +def remplace_accents(chaine): + remplacements = { + u"’":u"'", + u"á":u"a", u"à":u"a", u"â":u"a", u"ä":u"a", + u"Á":u"A", u"À":u"A", u"Â":u"A", u"Ä":u"A", + u"é":u"e", u"è":u"e", u"ê":u"e", u"ë":u"e", + u"É":u"E", u"È":u"E", u"Ê":u"E", u"Ë":u"E", + u"í":u"i", u"ì":u"i", u"î":u"i", u"ï":u"i", + u"Í":u"I", u"Ì":u"I", u"Î":u"I", u"Ï":u"I", + u"ó":u"o", u"ò":u"o", u"ô":u"o", u"ö":u"o", + u"Ó":u"O", u"Ò":u"O", u"Ô":u"O", u"Ö":u"O", + u"ú":u"u", u"ù":u"u", u"û":u"u", u"ü":u"u", + u"Ú":u"U", u"Ù":u"U", u"Û":u"U", u"Ü":u"U", + u"ý":u"y", u"ỳ":u"y", u"ŷ":u"y", u"ÿ":u"y", + u"Ý":u"Y", u"Ỳ":u"Y", u"Ŷ":u"Y", u"Ÿ":u"Y", + u"œ":u"oe", u"æ":u"ae", + u"Œ":u"OE", u"Æ":u"AE"} + for avant,apres in remplacements.items(): + chaine=chaine.replace(avant,apres) + return chaine diff --git a/remplace_accents.pyc b/remplace_accents.pyc new file mode 100644 index 0000000..75eb173 Binary files /dev/null and b/remplace_accents.pyc differ diff --git a/scores.pickle b/scores.pickle new file mode 100644 index 0000000..32e5d29 --- /dev/null +++ b/scores.pickle @@ -0,0 +1,5 @@ +(dp0 +S'[20-100]' +p1 +I1 +s. \ No newline at end of file