4 # Codé par 20-100 le 25/05/12
6 # Un bot IRC qui pose des questions d'histoire
15 from cast_as_date
import *
17 config_password
="EtTaMère,ElleEstNéeQuand?"
18 config_pseudo
="historien"
19 config_chanlist
=["#bot","#flood"]
20 config_play_channels
=["#flood"]
21 config_stay_channels
=["#flood","#bot"]
22 config_overops
=["[20-100]","[20-100]_"]
23 config_ops
=["PEB","Petite-Peste"]
25 config_source_file
="dates.txt"
26 config_played_file_template
="played.%s.txt" #il faut rajouter le nom du serveur
27 def get_config_played_file(serveur
):
28 serveurs
={"acoeur.crans.org":"acoeur","irc.crans.org":"crans"}
29 return config_played_file_template
%(serveurs
[serveur
])
30 ttrig
=120 #time trigger (normalement 120, mais diminué pour les tests)
31 Ttrig
=600 #between two enigms
32 config_time_incompressible
=15 #on peut pas retrigger en dessous de ce temps (60)
33 config_time_incompressible_clue
=60 #on peut pas forcer la demande d'indice en dessous
35 config_score_file
="scores.pickle"
37 config_tag_triggers
=[u
"t(|a)g",u
"ta gueule",u
"la ferme",u
"ferme( |-)la",u
"tais-toi",u
"chut"]
38 config_tag_actions
=[u
"se tait",u
"ferme sa gueule",u
"se la ferme",u
"la ferme"]
39 config_tag_answers
=[u
"J'me tais si j'veux !",
40 u
"Je t'entends pas :°",
42 u
"Non, j'ai pas envie",
43 u
"Peut-être quand toi tu la fermeras, et encore…"]
48 config_debug_stdout
= True
49 config_logfile_template
="historien.%s.log"
50 def get_config_logfile(serveur
):
51 serveurs
={"acoeur.crans.org":"acoeur","irc.crans.org":"crans"}
52 return config_logfile_template
%(serveurs
[serveur
])
54 config_quit_messages
=[u
"%s : %s quitte le serveur IRC"]
56 config_leave_messages
=[u
"%s : %s quitte le channel"]
58 class UnicodeBotError(Exception):
60 def bot_unicode(chain
):
63 except UnicodeDecodeError:
66 def log(serveur
,channel
,auteur
=None,message
=None):
67 f
=open(get_config_logfile(serveur
),"a")
68 if auteur
==message
==None:
69 # alors c'est que c'est pas un channel mais juste une ligne de log
70 chain
="%s %s"%(time
.strftime("%F %T"),channel
)
72 chain
="%s [%s:%s] %s"%(time
.strftime("%F %T"),channel
,auteur
,message
)
74 if config_debug_stdout
:
83 config_noscore
=["[20-100]","[20-100]_"] # parce que 20-100 est nul en histoire
85 class GoodCentury(Exception):
88 def reussi(message
,answer
,auteur
):
89 if auteur
in config_level3
:
90 return answer
in message
91 if auteur
in config_level2
:
92 return answer
in message
95 date
=cast_as_date(message
.lower().strip())
96 except ThisIsNotADate
:
98 realdate
=map(lambda x
:int(x
), answer
.split('/'))
101 if date
[0]==realdate
[0]:
102 score
=config_score_annee
103 if date
[1]==realdate
[1]:
104 score
+=config_score_mois
105 if date
[2]==realdate
[2]:
106 score
+=config_score_jour
107 elif date
[0]/100 == realdate
[0]/100:
111 def is_something(chain
,matches
,avant
=u
".*(?:^| )",apres
=u
"(?:$|\.| |,|;).*",case_sensitive
=False,debug
=False):
113 chain
=unicode(chain
,"utf8")
115 chain
=unicode(chain
,"utf8").lower()
116 allmatches
="("+"|".join(matches
)+")"
117 reg
=(avant
+allmatches
+apres
).lower()
118 o
=re
.match(reg
,chain
)
122 return is_something(chain
,config_tag_triggers
)
124 class RefuseError(Exception):
127 class Historien(ircbot
.SingleServerIRCBot
):
128 def __init__(self
,serveur
,debug
=False):
129 temporary_pseudo
=config_pseudo
+str(random
.randrange(10000,100000))
130 ircbot
.SingleServerIRCBot
.__init
__(self
, [(serveur
, 6667)],
131 temporary_pseudo
,"Un bot irc qui a au moins l'agreg d'histoire", 10)
134 self
.overops
=config_overops
135 self
.ops
=self
.overops
+config_ops
136 self
.chanlist
=config_chanlist
137 self
.stay_channels
=config_stay_channels
138 self
.play_channels
=config_play_channels
139 self
.play_status
={i
:[0] for i
in self
.play_channels
}
140 self
.quiet_channels
=[]
142 def give_me_my_pseudo(self
,serv
):
143 serv
.privmsg("NickServ","RECOVER %s %s"%(config_pseudo
,config_password
))
144 serv
.privmsg("NickServ","RELEASE %s %s"%(config_pseudo
,config_password
))
146 serv
.nick(config_pseudo
)
148 def on_welcome(self
, serv
, ev
):
149 self
.serv
=serv
# ça serv ira :)
150 self
.give_me_my_pseudo(serv
)
151 serv
.privmsg("NickServ","identify %s"%(config_password))
152 log(self
.serveur
,"Connected")
154 self
.chanlist
=["#bot"]
155 self
.play_channels
=["#bot"]
156 for c
in self
.chanlist
:
157 log(self
.serveur
,"JOIN %s"%(c))
159 for c
in self
.play_channels
:
160 token
=time
.time()-3600
161 self
.play_status
[c
]=[0,token
]
162 serv
.execute_delayed(random
.randrange(ttrig
),self
.start_enigme
,(serv
,c
,token
))
164 def start_enigme(self
,serv
,channel
,token
=None):
165 if self
.play_status
[channel
][0]==0 and channel
in self
.play_channels
:
167 if token
==self
.play_status
[channel
][-1]:
170 if time
.time() > self
.play_status
[channel
][-1]+config_time_incompressible
:
175 date
,evenement
=self
.get_enigme()
176 log(self
.serveur
,channel
,u
"$Date$".encode("utf8"),("%s : %s"%(date
, evenement
)).encode("utf8"))
177 serv
.privmsg(channel
,evenement
.encode("utf8"))
179 self
.play_status
[channel
]=[1,date
,evenement
,token
]
180 serv
.execute_delayed(random
.randrange(ttrig
*3,ttrig
*5),self
.give_indice
,(serv
,channel
,token
))
183 def give_indice(self
,serv
,channel
,token
):
184 if self
.play_status
[channel
][0]==1:
186 # c'est donc que l'indice a été demandé
187 if self
.play_status
[channel
][-1]+config_time_incompressible_clue
<time
.time():
188 token
=self
.play_status
[channel
][-1]
189 if self
.play_status
[channel
][-1]==token
:
190 date
=self
.play_status
[channel
][1]
192 serv
.privmsg(channel
,"indice : %s"%(indice).encode("utf8"))
193 self
.play_status
[channel
][0]=2
194 serv
.execute_delayed(random
.randrange(ttrig
*1,ttrig
*3),self
.give_answer
,(serv
,channel
,token
))
195 def give_answer(self
,serv
,channel
,token
):
196 if self
.play_status
[channel
][0]==2 and self
.play_status
[channel
][-1]==token
:
197 date
=self
.play_status
[channel
][1]
198 serv
.privmsg(channel
,"C'était le %s"%(date).encode("utf8"))
200 self
.play_status
[channel
]=[0,token
]
201 serv
.execute_delayed(random
.randrange(Ttrig
*5,Ttrig
*10),self
.start_enigme
,(serv
,channel
,token
))
203 def get_enigme(self
):
204 # on récupère les dates
205 f
=open(config_source_file
)
208 l
=[i
.split(" : ",2) for i
in l
]
209 dates
={int(i
[0]):i
[1:] for i
in l
}
210 # on va chercher combien de fois elles ont été jouées
211 played_file
=get_config_played_file(self
.serveur
)
215 l
=re
.findall("(.*):(.*)",t
)
216 played
={int(i
[0]):int(i
[1]) for i
in l
}
217 # on récupère le nombre d'occurrences le plus faible
218 mini
=min(played
.values())
219 # on choisit un id dans ceux qui ont ce nombre d'occurences
220 id_choisi
=random
.choice([k
for k
,v
in played
.items() if v
==mini
])
221 date
,evenement
=dates
[id_choisi
]
222 evenement
=evenement
.replace("\n","")
223 # on incrémente la choisie
225 # on enregistre le played_file
226 f
=open(played_file
,"w")
227 f
.write("\n".join(["%-4s : %s"%(k
,v
) for k
,v
in played
.items()]))
229 return map(lambda x
:x
.decode("utf8"), [date
,evenement
])
231 def pourmoi(self
, serv
, message
):
234 if message
[:size
]==pseudo
and len(message
)>size
and message
[size
]==":":
235 return (True,message
[size
+1:].strip(" "))
237 return (False,message
)
239 def on_privmsg(self
, serv
, ev
):
240 message
=ev
.arguments()[0]
241 auteur
= irclib
.nm_to_n(ev
.source())
243 test
=bot_unicode(message
)
244 except UnicodeBotError
:
246 "Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…")
248 message
=message
.split()
249 cmd
=message
[0].lower()
252 helpmsg_default
="""Liste des commandes :
253 HELP Affiche ce message d'aide
254 SCORE Affiche ton score (SCORE TRANSFERT <pseudo> [<n>] pour transférer des points)
255 SCORES Affiche les scores"""
257 JOIN Faire rejoindre un channel (sans paramètres, donne la liste des chans actuels)
258 LEAVE Faire quitter un channel
259 PLAY Passe un channel en mode "jouer"
260 NOPLAY Passe un channel en mode "ne pas jouer"
261 QUIET Se taire sur un channel
262 NOQUIET Opposé de QUIET"""
264 SCORES {DEL|ADD|SUB} Tu veux un dessin ?
265 SAY Fais envoyer un message sur un chan ou à une personne
266 STAY Ignorera les prochains LEAVE pour un chan
267 NOSTAY Opposé de STAY
268 STATUS Montre l'état courant
270 helpmsg
=helpmsg_default
271 if auteur
in self
.ops
:
273 if auteur
in self
.overops
:
274 helpmsg
+=helpmsg_overops
275 for ligne
in helpmsg
.split("\n"):
276 serv
.privmsg(auteur
,ligne
)
278 if auteur
in self
.ops
:
280 if message
[1] in self
.chanlist
:
281 serv
.privmsg(auteur
,"Je suis déjà sur %s"%(message
[1]))
283 serv
.join(message
[1])
284 self
.chanlist
.append(message
[1])
285 serv
.privmsg(auteur
,"Channels : "+" ".join(self
.chanlist
))
286 log(self
.serveur
,"priv",auteur
," ".join(message
))
288 serv
.privmsg(auteur
,"Channels : "+" ".join(self
.chanlist
))
292 if auteur
in self
.ops
and len(message
)>1:
293 if message
[1] in self
.chanlist
:
294 if not (message
[1] in self
.stay_channels
) or auteur
in self
.overops
:
295 self
.quitter(message
[1]," ".join(message
[2:]))
296 self
.chanlist
.remove(message
[1])
297 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
299 serv
.privmsg(auteur
,"Non, je reste !")
300 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
302 serv
.privmsg(auteur
,"Je ne suis pas sur %s"%(message
[1]))
306 if auteur
in self
.overops
:
308 if message
[1] in self
.stay_channels
:
309 serv
.privmsg(auteur
,"Je stay déjà sur %s."%(message
[1]))
310 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
312 self
.stay_channels
.append(message
[1])
313 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
314 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
316 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
320 if auteur
in self
.overops
:
322 if message
[1] in self
.stay_channels
:
323 self
.stay_channels
.remove(message
[1])
324 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
325 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
327 serv
.privmsg(auteur
,"Je ne stay pas sur %s."%(message
[1]))
328 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
332 if auteur
in self
.ops
:
334 if message
[1] in self
.play_channels
:
335 serv
.privmsg(auteur
,"Je play déjà sur %s."%(message
[1]))
336 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
338 self
.play_channels
.append(message
[1])
339 self
.play_status
[message
[1]]=[0,time
.time()-3600]
340 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
341 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
343 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
347 if auteur
in self
.ops
:
349 if message
[1] in self
.play_channels
:
350 self
.play_channels
.remove(message
[1])
351 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
352 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
354 serv
.privmsg(auteur
,"Je ne play pas sur %s."%(message
[1]))
355 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
359 if auteur
in self
.ops
:
361 if message
[1] in self
.quiet_channels
:
362 serv
.privmsg(auteur
,"Je me la ferme déjà sur %s"%(message
[1]))
363 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
365 self
.quiet_channels
.append(message
[1])
366 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
367 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
369 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
373 if auteur
in self
.ops
:
375 if message
[1] in self
.quiet_channels
:
376 self
.quiet_channels
.remove(message
[1])
377 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
378 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
380 serv
.privmsg(auteur
,"Je ne me la ferme pas sur %s."%(message
[1]))
381 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
384 elif cmd
in ["states","status"]:
385 if auteur
in self
.overops
:
386 for k
in self
.play_status
.keys():
387 serv
.privmsg(auteur
,(u
"%s : %s"%(k
," | ".join([unicode(i
) for i
in self
.play_status
[k
]]))).encode("utf8") )
389 if auteur
in self
.overops
and len(message
)>2:
390 serv
.privmsg(message
[1]," ".join(message
[2:]))
391 log(self
.serveur
,"priv",auteur
," ".join(message
))
392 elif len(message
)<=2:
393 serv
.privmsg(auteur
,"Syntaxe : SAY <channel> <message>")
397 if auteur
in self
.overops
:
398 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
402 if len(message
) in [3,4] and message
[1].lower()=="transfert":
403 scores
=self
.get_scores()
404 de
,to
=auteur
,message
[2]
405 value
=scores
.get(de
,0)
408 asked
=int(message
[3])
410 serv
.privmsg(auteur
,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
415 serv
.privmsg(auteur
,"Vous n'avez pas de points")
418 serv
.privmsg(auteur
,"Bien tenté…")
421 serv
.privmsg(auteur
,"Vous n'avez que %s points"%(value))
424 self
.add_score(de
,-asked
)
425 self
.add_score(to
,asked
)
426 serv
.privmsg(auteur
,"Transfert de %s points de %s à %s"%(asked
,de
,to
))
428 serv
.privmsg(auteur
,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
430 serv
.privmsg(auteur
,"Votre score : %s"%(self
.get_scores().get(auteur
,0)) )
433 scores
=self
.get_scores().items()
435 scores
.sort(lambda x
,y
:cmp(x
[1],y
[1]))
437 serv
.privmsg(auteur
,"Scores by score : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
439 scores
.sort(lambda x
,y
:cmp(x
[0].lower(),y
[0].lower()))
440 serv
.privmsg(auteur
,"Scores by pseudo : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
441 elif auteur
in self
.overops
:
442 souscmd
=message
[1].lower()
446 scores
=self
.get_scores()
447 if scores
.has_key(todelete
):
449 self
.save_scores(scores
)
450 serv
.privmsg(auteur
,"Score de %s supprimé"%(todelete))
452 serv
.privmsg(auteur
,"Ce score n'existe pas : %s"%(todelete))
454 serv
.privmsg(auteur
,"Syntaxe : SCORES DEL <pseudo>")
455 elif souscmd
in ["add","sub"]:
457 toadd
,val
=message
[2],message
[3]
461 serv
.privmsg(auteur
,"Syntaxe : SCORES {ADD|SUB} <pseudo> <n>")
465 self
.add_score(toadd
,val
)
466 serv
.privmsg(auteur
,"Done")
468 serv
.privmsg(auteur
,"Syntaxe : SCORES {ADD|SUB} <pseudo> <n>")
470 serv
.privmsg(auteur
,"Syntaxe : SCORES {DEL|ADD|SUB} <pseudo> [<n>]")
476 serv
.privmsg(auteur
,"Je n'ai pas compris. Essaye HELP…")
478 def on_pubmsg(self
, serv
, ev
):
479 auteur
= irclib
.nm_to_n(ev
.source())
481 message
= ev
.arguments()[0]
483 test
=bot_unicode(message
)
484 except UnicodeBotError
:
485 if not canal
in self
.quiet_channels
:
487 "%s: Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…"%(auteur))
490 pour_moi
,message
=self
.pourmoi(serv
,message
)
491 if pour_moi
and message
.split()!=[]:
492 cmd
=message
.split()[0].lower()
494 args
=" ".join(message
.split()[1:])
497 if cmd
in ["meurs","die","crève"]:
498 if auteur
in self
.overops
:
500 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
502 serv
.privmsg(canal
,"%s: crève !"%(auteur))
503 log(self
.serveur
,canal
,auteur
,message
+"[failed]")
504 if cmd
in ["meur", "meurt","meurre","meurres"] and not canal
in self
.quiet_channels
:
505 serv
.privmsg(canal
,'%s: Mourir, impératif, 2ème personne du singulier : "meurs" (de rien)'%(auteur))
506 if cmd
in ["part","leave","dégage"]:
507 if auteur
in self
.ops
and (not (canal
in self
.stay_channels
)
508 or auteur
in self
.overops
):
510 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
511 self
.chanlist
.remove(canal
)
513 serv
.privmsg(canal
,"%s: Non, je reste !"%(auteur))
514 log(self
.serveur
,canal
,auteur
,message
+"[failed]")
516 if cmd
in ["deviens","pseudo"]:
517 if auteur
in self
.ops
:
520 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
521 if cmd
in ["coucou"] and not canal
in self
.quiet_channels
:
522 serv
.privmsg(canal
,"%s: coucou"%(auteur))
523 if cmd
in ["ping"] and not canal
in self
.quiet_channels
:
524 serv
.privmsg(canal
,"%s: pong"%(auteur))
525 if cmd
in ["date","dates","histoire","énigme","enigme","encore"]:
526 if canal
in self
.play_channels
:
527 if self
.play_status
.get(canal
,[-1])[0]==0:
529 self
.start_enigme(serv
,canal
)
531 serv
.privmsg(canal
,"%s: Je peux souffler une minute ?"%(auteur))
533 serv
.privmsg(canal
,("%s: Rappel : %s"%(auteur
,self
.play_status
[canal
][2])).encode("utf8") )
535 serv
.privmsg(canal
,"%s: pas ici…"%(auteur))
536 if cmd
in ["score","!score"]:
537 serv
.privmsg(auteur
,"Votre score : %s"%(self
.get_scores().get(auteur
,0)) )
538 if cmd
in ["scores","!scores"]:
539 scores
=self
.get_scores().items()
541 scores
.sort(lambda x
,y
:cmp(x
[1],y
[1]))
543 serv
.privmsg(auteur
,"Scores by score : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
545 scores
.sort(lambda x
,y
:cmp(x
[0].lower(),y
[0].lower()))
546 serv
.privmsg(auteur
,"Scores by pseudo : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
547 if cmd
=="indice" and canal
in self
.play_channels
:
548 self
.give_indice(serv
,canal
,None)
549 if is_tag(message
) and not canal
in self
.quiet_channels
:
550 if auteur
in self
.ops
:
551 action
=random
.choice(config_tag_actions
)
552 serv
.action(canal
,action
.encode("utf8"))
553 self
.quiet_channels
.append(canal
)
555 answer
=random
.choice(config_tag_answers
)
556 for ligne
in answer
.split("\n"):
557 serv
.privmsg(canal
,"%s: %s"%(auteur
,ligne
.encode("utf8")))
563 if self
.play_status
.get(canal
,[-1])[0] in [1,2]:
564 answer
=self
.play_status
[canal
][1]
566 score_obtenu
=reussi(message
.decode("utf8"),answer
,auteur
)
568 serv
.privmsg(canal
,"%s: C'est le bon siècle, mais pas la bonne année, cherche encore ;)"%(auteur))
571 if self
.play_status
[canal
][0]==1:
572 bonusmsg
=u
" [+bonus_mois"*(score_obtenu
>config_score_annee
)+u
"+bonus_jour"*(score_obtenu
>config_score_annee
+config_score_mois
)+u
"]"
576 serv
.privmsg(canal
,(u
"%s: bravo ! (C'était le %s)%s"%(auteur
,answer
,bonusmsg
)).encode("utf8"))
577 log(self
.serveur
,canal
,auteur
+"$win",message
)
578 if auteur
in config_noscore
:
580 self
.add_score(auteur
,score_obtenu
)
582 self
.play_status
[canal
]=[0,token
]
583 serv
.execute_delayed(random
.randrange(Ttrig
*5,Ttrig
*10),self
.start_enigme
,(serv
,canal
,token
))
585 def on_kick(self
,serv
,ev
):
586 auteur
= irclib
.nm_to_n(ev
.source())
587 channel
= ev
.target()
588 victime
= ev
.arguments()[0]
589 raison
= ev
.arguments()[1]
590 if victime
==self
.nick
:
591 log(self
.serveur
,"%s kické par %s (raison : %s)" %(victime
,auteur
,raison
))
594 # on ne dit rien au rejoin
595 #l1,l2=config_kick_answers,config_kick_actions
596 #n1,n2=len(l1),len(l2)
597 #i=random.randrange(n1+n2)
599 # serv.action(channel,l2[i-n1].format(auteur).encode("utf8"))
601 # serv.privmsg(channel,l1[i].format(auteur).encode("utf8"))
603 def quitter(self
,chan
,leave_message
=None):
604 if leave_message
==None:
605 leave_message
=random
.choice(config_leave_messages
)
607 leave_message
=leave_message
%(time
.strftime("le %d/%m/%Y à %T").decode("utf8"),self
.nick
)
610 self
.serv
.part(chan
,message
=leave_message
.encode("utf8"))
613 quit_message
=random
.choice(config_quit_messages
)
615 quit_message
=quit_message
%(time
.strftime("le %d/%m/%Y à %T").decode("utf8"),self
.nick
)
618 self
.die(msg
=quit_message
.encode("utf8"))
620 def get_scores(self
):
621 f
=open(config_score_file
)
622 scores
=pickle
.load(f
)
626 def add_score(self
,pseudo
,value
):
627 scores
=self
.get_scores()
628 if scores
.has_key(pseudo
):
629 scores
[pseudo
]+=value
632 self
.save_scores(scores
)
634 def save_scores(self
,scores
):
635 f
=open(config_score_file
,"w")
636 pickle
.dump(scores
,f
)
640 return self
.serv
.get_nickname()
641 nick
= property(_getnick
)
643 if __name__
=="__main__":
646 print "Usage : historien.py <serveur> [--debug]"
649 if "debug" in sys
.argv
or "--debug" in sys
.argv
:
653 serveurs
={"a♡":"acoeur.crans.org","acoeur":"acoeur.crans.org","acoeur.crans.org":"acoeur.crans.org",
654 "irc":"irc.crans.org","crans":"irc.crans.org","irc.crans.org":"irc.crans.org"}
656 serveur
=serveurs
[serveur
]
658 print "Server Unknown : %s"%(serveur)
660 historien
=Historien(serveur
,debug
)