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 # le 0 est le flag "bon siècle" n' pas encore été dit
180 self
.play_status
[channel
]=[1,date
,evenement
,0,token
]
181 serv
.execute_delayed(random
.randrange(ttrig
*3,ttrig
*5),self
.give_indice
,(serv
,channel
,token
))
184 def give_indice(self
,serv
,channel
,token
):
185 if self
.play_status
[channel
][0]==1:
187 # c'est donc que l'indice a été demandé
188 if self
.play_status
[channel
][-1]+config_time_incompressible_clue
<time
.time():
189 token
=self
.play_status
[channel
][-1]
190 if self
.play_status
[channel
][-1]==token
:
191 date
=self
.play_status
[channel
][1]
193 serv
.privmsg(channel
,"indice : %s"%(indice).encode("utf8"))
194 self
.play_status
[channel
][0]=2
195 serv
.execute_delayed(random
.randrange(ttrig
*1,ttrig
*3),self
.give_answer
,(serv
,channel
,token
))
196 def give_answer(self
,serv
,channel
,token
):
197 if self
.play_status
[channel
][0]==2 and self
.play_status
[channel
][-1]==token
:
198 date
=self
.play_status
[channel
][1]
199 serv
.privmsg(channel
,"C'était le %s"%(date).encode("utf8"))
201 self
.play_status
[channel
]=[0,token
]
202 serv
.execute_delayed(random
.randrange(Ttrig
*5,Ttrig
*10),self
.start_enigme
,(serv
,channel
,token
))
204 def get_enigme(self
):
205 # on récupère les dates
206 f
=open(config_source_file
)
209 l
=[i
.split(" : ",2) for i
in l
]
210 dates
={int(i
[0]):i
[1:] for i
in l
}
211 # on va chercher combien de fois elles ont été jouées
212 played_file
=get_config_played_file(self
.serveur
)
216 l
=re
.findall("(.*):(.*)",t
)
217 played
={int(i
[0]):int(i
[1]) for i
in l
}
218 # on récupère le nombre d'occurrences le plus faible
219 mini
=min(played
.values())
220 # on choisit un id dans ceux qui ont ce nombre d'occurences
221 id_choisi
=random
.choice([k
for k
,v
in played
.items() if v
==mini
])
222 date
,evenement
=dates
[id_choisi
]
223 evenement
=evenement
.replace("\n","")
224 # on incrémente la choisie
226 # on enregistre le played_file
227 f
=open(played_file
,"w")
228 f
.write("\n".join(["%-4s : %s"%(k
,v
) for k
,v
in played
.items()]))
230 return map(lambda x
:x
.decode("utf8"), [date
,evenement
])
232 def pourmoi(self
, serv
, message
):
235 if message
[:size
]==pseudo
and len(message
)>size
and message
[size
]==":":
236 return (True,message
[size
+1:].strip(" "))
238 return (False,message
)
240 def on_privmsg(self
, serv
, ev
):
241 message
=ev
.arguments()[0]
242 auteur
= irclib
.nm_to_n(ev
.source())
244 test
=bot_unicode(message
)
245 except UnicodeBotError
:
247 "Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…")
249 message
=message
.split()
250 cmd
=message
[0].lower()
253 helpmsg_default
="""Liste des commandes :
254 HELP Affiche ce message d'aide
255 SCORE Affiche ton score (SCORE TRANSFERT <pseudo> [<n>] pour transférer des points)
256 SCORES Affiche les scores"""
258 JOIN Faire rejoindre un channel (sans paramètres, donne la liste des chans actuels)
259 LEAVE Faire quitter un channel
260 PLAY Passe un channel en mode "jouer"
261 NOPLAY Passe un channel en mode "ne pas jouer"
262 QUIET Se taire sur un channel
263 NOQUIET Opposé de QUIET"""
265 SCORES {DEL|ADD|SUB} Tu veux un dessin ?
266 SAY Fais envoyer un message sur un chan ou à une personne
267 STAY Ignorera les prochains LEAVE pour un chan
268 NOSTAY Opposé de STAY
269 STATUS Montre l'état courant
271 helpmsg
=helpmsg_default
272 if auteur
in self
.ops
:
274 if auteur
in self
.overops
:
275 helpmsg
+=helpmsg_overops
276 for ligne
in helpmsg
.split("\n"):
277 serv
.privmsg(auteur
,ligne
)
279 if auteur
in self
.ops
:
281 if message
[1] in self
.chanlist
:
282 serv
.privmsg(auteur
,"Je suis déjà sur %s"%(message
[1]))
284 serv
.join(message
[1])
285 self
.chanlist
.append(message
[1])
286 serv
.privmsg(auteur
,"Channels : "+" ".join(self
.chanlist
))
287 log(self
.serveur
,"priv",auteur
," ".join(message
))
289 serv
.privmsg(auteur
,"Channels : "+" ".join(self
.chanlist
))
293 if auteur
in self
.ops
and len(message
)>1:
294 if message
[1] in self
.chanlist
:
295 if not (message
[1] in self
.stay_channels
) or auteur
in self
.overops
:
296 self
.quitter(message
[1]," ".join(message
[2:]))
297 self
.chanlist
.remove(message
[1])
298 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
300 serv
.privmsg(auteur
,"Non, je reste !")
301 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
303 serv
.privmsg(auteur
,"Je ne suis pas sur %s"%(message
[1]))
307 if auteur
in self
.overops
:
309 if message
[1] in self
.stay_channels
:
310 serv
.privmsg(auteur
,"Je stay déjà sur %s."%(message
[1]))
311 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
313 self
.stay_channels
.append(message
[1])
314 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
315 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
317 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
321 if auteur
in self
.overops
:
323 if message
[1] in self
.stay_channels
:
324 self
.stay_channels
.remove(message
[1])
325 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
326 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
328 serv
.privmsg(auteur
,"Je ne stay pas sur %s."%(message
[1]))
329 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
333 if auteur
in self
.ops
:
335 if message
[1] in self
.play_channels
:
336 serv
.privmsg(auteur
,"Je play déjà sur %s."%(message
[1]))
337 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
339 self
.play_channels
.append(message
[1])
340 self
.play_status
[message
[1]]=[0,time
.time()-3600]
341 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
342 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
344 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
348 if auteur
in self
.ops
:
350 if message
[1] in self
.play_channels
:
351 self
.play_channels
.remove(message
[1])
352 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
353 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
355 serv
.privmsg(auteur
,"Je ne play pas sur %s."%(message
[1]))
356 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
360 if auteur
in self
.ops
:
362 if message
[1] in self
.quiet_channels
:
363 serv
.privmsg(auteur
,"Je me la ferme déjà sur %s"%(message
[1]))
364 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
366 self
.quiet_channels
.append(message
[1])
367 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
368 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
370 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
374 if auteur
in self
.ops
:
376 if message
[1] in self
.quiet_channels
:
377 self
.quiet_channels
.remove(message
[1])
378 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
379 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
381 serv
.privmsg(auteur
,"Je ne me la ferme pas sur %s."%(message
[1]))
382 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
385 elif cmd
in ["states","status"]:
386 if auteur
in self
.overops
:
387 for k
in self
.play_status
.keys():
388 serv
.privmsg(auteur
,(u
"%s : %s"%(k
," | ".join([unicode(i
) for i
in self
.play_status
[k
]]))).encode("utf8") )
390 if auteur
in self
.overops
and len(message
)>2:
391 serv
.privmsg(message
[1]," ".join(message
[2:]))
392 log(self
.serveur
,"priv",auteur
," ".join(message
))
393 elif len(message
)<=2:
394 serv
.privmsg(auteur
,"Syntaxe : SAY <channel> <message>")
398 if auteur
in self
.overops
:
399 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
403 if len(message
) in [3,4] and message
[1].lower()=="transfert":
404 scores
=self
.get_scores()
405 de
,to
=auteur
,message
[2]
406 value
=scores
.get(de
,0)
409 asked
=int(message
[3])
411 serv
.privmsg(auteur
,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
416 serv
.privmsg(auteur
,"Vous n'avez pas de points")
419 serv
.privmsg(auteur
,"Bien tenté…")
422 serv
.privmsg(auteur
,"Vous n'avez que %s points"%(value))
425 self
.add_score(de
,-asked
)
426 self
.add_score(to
,asked
)
427 serv
.privmsg(auteur
,"Transfert de %s points de %s à %s"%(asked
,de
,to
))
429 serv
.privmsg(auteur
,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
431 serv
.privmsg(auteur
,"Votre score : %s"%(self
.get_scores().get(auteur
,0)) )
434 scores
=self
.get_scores().items()
436 scores
.sort(lambda x
,y
:cmp(x
[1],y
[1]))
438 serv
.privmsg(auteur
,"Scores by score : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
440 scores
.sort(lambda x
,y
:cmp(x
[0].lower(),y
[0].lower()))
441 serv
.privmsg(auteur
,"Scores by pseudo : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
442 elif auteur
in self
.overops
:
443 souscmd
=message
[1].lower()
447 scores
=self
.get_scores()
448 if scores
.has_key(todelete
):
450 self
.save_scores(scores
)
451 serv
.privmsg(auteur
,"Score de %s supprimé"%(todelete))
453 serv
.privmsg(auteur
,"Ce score n'existe pas : %s"%(todelete))
455 serv
.privmsg(auteur
,"Syntaxe : SCORES DEL <pseudo>")
456 elif souscmd
in ["add","sub"]:
458 toadd
,val
=message
[2],message
[3]
462 serv
.privmsg(auteur
,"Syntaxe : SCORES {ADD|SUB} <pseudo> <n>")
466 self
.add_score(toadd
,val
)
467 serv
.privmsg(auteur
,"Done")
469 serv
.privmsg(auteur
,"Syntaxe : SCORES {ADD|SUB} <pseudo> <n>")
471 serv
.privmsg(auteur
,"Syntaxe : SCORES {DEL|ADD|SUB} <pseudo> [<n>]")
477 serv
.privmsg(auteur
,"Je n'ai pas compris. Essaye HELP…")
479 def on_pubmsg(self
, serv
, ev
):
480 auteur
= irclib
.nm_to_n(ev
.source())
482 message
= ev
.arguments()[0]
484 test
=bot_unicode(message
)
485 except UnicodeBotError
:
486 if not canal
in self
.quiet_channels
:
488 "%s: Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…"%(auteur))
491 pour_moi
,message
=self
.pourmoi(serv
,message
)
492 if pour_moi
and message
.split()!=[]:
493 cmd
=message
.split()[0].lower()
495 args
=" ".join(message
.split()[1:])
498 if cmd
in ["meurs","die","crève"]:
499 if auteur
in self
.overops
:
501 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
503 serv
.privmsg(canal
,"%s: crève !"%(auteur))
504 log(self
.serveur
,canal
,auteur
,message
+"[failed]")
505 if cmd
in ["meur", "meurt","meurre","meurres"] and not canal
in self
.quiet_channels
:
506 serv
.privmsg(canal
,'%s: Mourir, impératif, 2ème personne du singulier : "meurs" (de rien)'%(auteur))
507 if cmd
in ["part","leave","dégage"]:
508 if auteur
in self
.ops
and (not (canal
in self
.stay_channels
)
509 or auteur
in self
.overops
):
511 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
512 self
.chanlist
.remove(canal
)
514 serv
.privmsg(canal
,"%s: Non, je reste !"%(auteur))
515 log(self
.serveur
,canal
,auteur
,message
+"[failed]")
517 if cmd
in ["deviens","pseudo"]:
518 if auteur
in self
.ops
:
521 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
522 if cmd
in ["coucou"] and not canal
in self
.quiet_channels
:
523 serv
.privmsg(canal
,"%s: coucou"%(auteur))
524 if cmd
in ["ping"] and not canal
in self
.quiet_channels
:
525 serv
.privmsg(canal
,"%s: pong"%(auteur))
526 if cmd
in ["date","dates","histoire","énigme","enigme","encore"]:
527 if canal
in self
.play_channels
:
528 if self
.play_status
.get(canal
,[-1])[0]==0:
530 self
.start_enigme(serv
,canal
)
532 serv
.privmsg(canal
,"%s: Je peux souffler une minute ?"%(auteur))
534 serv
.privmsg(canal
,("%s: Rappel : %s"%(auteur
,self
.play_status
[canal
][2])).encode("utf8") )
536 serv
.privmsg(canal
,"%s: pas ici…"%(auteur))
537 if cmd
in ["score","!score"]:
538 serv
.privmsg(auteur
,"Votre score : %s"%(self
.get_scores().get(auteur
,0)) )
539 if cmd
in ["scores","!scores"]:
540 scores
=self
.get_scores().items()
542 scores
.sort(lambda x
,y
:cmp(x
[1],y
[1]))
544 serv
.privmsg(auteur
,"Scores by score : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
546 scores
.sort(lambda x
,y
:cmp(x
[0].lower(),y
[0].lower()))
547 serv
.privmsg(auteur
,"Scores by pseudo : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
548 if cmd
=="indice" and canal
in self
.play_channels
:
549 self
.give_indice(serv
,canal
,None)
550 if is_tag(message
) and not canal
in self
.quiet_channels
:
551 if auteur
in self
.ops
:
552 action
=random
.choice(config_tag_actions
)
553 serv
.action(canal
,action
.encode("utf8"))
554 self
.quiet_channels
.append(canal
)
556 answer
=random
.choice(config_tag_answers
)
557 for ligne
in answer
.split("\n"):
558 serv
.privmsg(canal
,"%s: %s"%(auteur
,ligne
.encode("utf8")))
564 if self
.play_status
.get(canal
,[-1])[0] in [1,2]:
565 answer
=self
.play_status
[canal
][1]
566 flag_century
=self
.play_status
[canal
][3]
568 score_obtenu
=reussi(message
.decode("utf8"),answer
,auteur
)
571 serv
.privmsg(canal
,"%s: C'est le bon siècle, mais pas la bonne année, cherche encore ;)"%(auteur))
572 self
.play_status
[canal
][3]=1
575 if self
.play_status
[canal
][0]==1:
576 bonusmsg
=u
" [+bonus_mois"*(score_obtenu
>config_score_annee
)+u
"+bonus_jour"*(score_obtenu
>config_score_annee
+config_score_mois
)+u
"]"
580 serv
.privmsg(canal
,(u
"%s: bravo ! (C'était le %s)%s"%(auteur
,answer
,bonusmsg
)).encode("utf8"))
581 log(self
.serveur
,canal
,auteur
+"$win",message
)
582 if auteur
in config_noscore
:
584 self
.add_score(auteur
,score_obtenu
)
586 self
.play_status
[canal
]=[0,token
]
587 serv
.execute_delayed(random
.randrange(Ttrig
*5,Ttrig
*10),self
.start_enigme
,(serv
,canal
,token
))
589 def on_kick(self
,serv
,ev
):
590 auteur
= irclib
.nm_to_n(ev
.source())
591 channel
= ev
.target()
592 victime
= ev
.arguments()[0]
593 raison
= ev
.arguments()[1]
594 if victime
==self
.nick
:
595 log(self
.serveur
,"%s kické par %s (raison : %s)" %(victime
,auteur
,raison
))
598 # on ne dit rien au rejoin
599 #l1,l2=config_kick_answers,config_kick_actions
600 #n1,n2=len(l1),len(l2)
601 #i=random.randrange(n1+n2)
603 # serv.action(channel,l2[i-n1].format(auteur).encode("utf8"))
605 # serv.privmsg(channel,l1[i].format(auteur).encode("utf8"))
607 def quitter(self
,chan
,leave_message
=None):
608 if leave_message
==None:
609 leave_message
=random
.choice(config_leave_messages
)
611 leave_message
=leave_message
%(time
.strftime("le %d/%m/%Y à %T").decode("utf8"),self
.nick
)
614 self
.serv
.part(chan
,message
=leave_message
.encode("utf8"))
617 quit_message
=random
.choice(config_quit_messages
)
619 quit_message
=quit_message
%(time
.strftime("le %d/%m/%Y à %T").decode("utf8"),self
.nick
)
622 self
.die(msg
=quit_message
.encode("utf8"))
624 def get_scores(self
):
625 f
=open(config_score_file
)
626 scores
=pickle
.load(f
)
630 def add_score(self
,pseudo
,value
):
631 scores
=self
.get_scores()
632 if scores
.has_key(pseudo
):
633 scores
[pseudo
]+=value
636 self
.save_scores(scores
)
638 def save_scores(self
,scores
):
639 f
=open(config_score_file
,"w")
640 pickle
.dump(scores
,f
)
644 return self
.serv
.get_nickname()
645 nick
= property(_getnick
)
647 if __name__
=="__main__":
650 print "Usage : historien.py <serveur> [--debug]"
653 if "debug" in sys
.argv
or "--debug" in sys
.argv
:
657 serveurs
={"a♡":"acoeur.crans.org","acoeur":"acoeur.crans.org","acoeur.crans.org":"acoeur.crans.org",
658 "irc":"irc.crans.org","crans":"irc.crans.org","irc.crans.org":"irc.crans.org"}
660 serveur
=serveurs
[serveur
]
662 print "Server Unknown : %s"%(serveur)
664 historien
=Historien(serveur
,debug
)