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 def reussi(message
,answer
,auteur
):
84 if auteur
in config_level3
:
85 return answer
in message
86 if auteur
in config_level2
:
87 return answer
in message
90 date
=cast_as_date(message
.lower().strip())
91 except ThisIsNotADate
:
93 realdate
=map(lambda x
:int(x
), answer
.split('/'))
96 if date
[0]==realdate
[0]:
97 score
=config_score_annee
98 if date
[1]==realdate
[1]:
99 score
+=config_score_mois
100 if date
[2]==realdate
[2]:
101 score
+=config_score_jour
104 def is_something(chain
,matches
,avant
=u
".*(?:^| )",apres
=u
"(?:$|\.| |,|;).*",case_sensitive
=False,debug
=False):
106 chain
=unicode(chain
,"utf8")
108 chain
=unicode(chain
,"utf8").lower()
109 allmatches
="("+"|".join(matches
)+")"
110 reg
=(avant
+allmatches
+apres
).lower()
111 o
=re
.match(reg
,chain
)
115 return is_something(chain
,config_tag_triggers
)
117 class RefuseError(Exception):
120 class Historien(ircbot
.SingleServerIRCBot
):
121 def __init__(self
,serveur
,debug
=False):
122 temporary_pseudo
=config_pseudo
+str(random
.randrange(10000,100000))
123 ircbot
.SingleServerIRCBot
.__init
__(self
, [(serveur
, 6667)],
124 temporary_pseudo
,"Un bot irc qui a au moins l'agreg d'histoire", 10)
127 self
.overops
=config_overops
128 self
.ops
=self
.overops
+config_ops
129 self
.chanlist
=config_chanlist
130 self
.stay_channels
=config_stay_channels
131 self
.play_channels
=config_play_channels
132 self
.play_status
={i
:[0] for i
in self
.play_channels
}
133 self
.quiet_channels
=[]
135 def give_me_my_pseudo(self
,serv
):
136 serv
.privmsg("NickServ","RECOVER %s %s"%(config_pseudo
,config_password
))
137 serv
.privmsg("NickServ","RELEASE %s %s"%(config_pseudo
,config_password
))
139 serv
.nick(config_pseudo
)
141 def on_welcome(self
, serv
, ev
):
142 self
.serv
=serv
# ça serv ira :)
143 self
.give_me_my_pseudo(serv
)
144 serv
.privmsg("NickServ","identify %s"%(config_password))
145 log(self
.serveur
,"Connected")
147 self
.chanlist
=["#bot"]
148 self
.play_channels
=["#bot"]
149 for c
in self
.chanlist
:
150 log(self
.serveur
,"JOIN %s"%(c))
152 for c
in self
.play_channels
:
153 token
=time
.time()-3600
154 self
.play_status
[c
]=[0,token
]
155 serv
.execute_delayed(random
.randrange(ttrig
),self
.start_enigme
,(serv
,c
,token
))
157 def start_enigme(self
,serv
,channel
,token
=None):
158 if self
.play_status
[channel
][0]==0 and channel
in self
.play_channels
:
160 if token
==self
.play_status
[channel
][-1]:
163 if time
.time() > self
.play_status
[channel
][-1]+config_time_incompressible
:
168 date
,evenement
=self
.get_enigme()
169 log(self
.serveur
,channel
,u
"$Date$".encode("utf8"),("%s : %s"%(date
, evenement
)).encode("utf8"))
170 serv
.privmsg(channel
,evenement
.encode("utf8"))
172 self
.play_status
[channel
]=[1,date
,evenement
,token
]
173 serv
.execute_delayed(random
.randrange(ttrig
*3,ttrig
*5),self
.give_indice
,(serv
,channel
,token
))
176 def give_indice(self
,serv
,channel
,token
):
177 if self
.play_status
[channel
][0]==1:
179 # c'est donc que l'indice a été demandé
180 if self
.play_status
[channel
][-1]+config_time_incompressible_clue
<time
.time():
181 token
=self
.play_status
[channel
][-1]
182 if self
.play_status
[channel
][-1]==token
:
183 date
=self
.play_status
[channel
][1]
185 serv
.privmsg(channel
,"indice : %s"%(indice).encode("utf8"))
186 self
.play_status
[channel
][0]=2
187 serv
.execute_delayed(random
.randrange(ttrig
*1,ttrig
*3),self
.give_answer
,(serv
,channel
,token
))
188 def give_answer(self
,serv
,channel
,token
):
189 if self
.play_status
[channel
][0]==2 and self
.play_status
[channel
][-1]==token
:
190 date
=self
.play_status
[channel
][1]
191 serv
.privmsg(channel
,"C'était le %s"%(date).encode("utf8"))
193 self
.play_status
[channel
]=[0,token
]
194 serv
.execute_delayed(random
.randrange(Ttrig
*5,Ttrig
*10),self
.start_enigme
,(serv
,channel
,token
))
196 def get_enigme(self
):
197 # on récupère les dates
198 f
=open(config_source_file
)
201 l
=[i
.split(" : ",2) for i
in l
]
202 dates
={int(i
[0]):i
[1:] for i
in l
}
203 # on va chercher combien de fois elles ont été jouées
204 played_file
=get_config_played_file(self
.serveur
)
208 l
=re
.findall("(.*):(.*)",t
)
209 played
={int(i
[0]):int(i
[1]) for i
in l
}
210 # on récupère le nombre d'occurrences le plus faible
211 mini
=min(played
.values())
212 # on choisit un id dans ceux qui ont ce nombre d'occurences
213 id_choisi
=random
.choice([k
for k
,v
in played
.items() if v
==mini
])
214 date
,evenement
=dates
[id_choisi
]
215 evenement
=evenement
.replace("\n","")
216 # on incrémente la choisie
218 # on enregistre le played_file
219 f
=open(played_file
,"w")
220 f
.write("\n".join(["%-4s : %s"%(k
,v
) for k
,v
in played
.items()]))
222 return map(lambda x
:x
.decode("utf8"), [date
,evenement
])
224 def pourmoi(self
, serv
, message
):
227 if message
[:size
]==pseudo
and len(message
)>size
and message
[size
]==":":
228 return (True,message
[size
+1:].strip(" "))
230 return (False,message
)
232 def on_privmsg(self
, serv
, ev
):
233 message
=ev
.arguments()[0]
234 auteur
= irclib
.nm_to_n(ev
.source())
236 test
=bot_unicode(message
)
237 except UnicodeBotError
:
239 "Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…")
241 message
=message
.split()
242 cmd
=message
[0].lower()
245 helpmsg_default
="""Liste des commandes :
246 HELP Affiche ce message d'aide
247 SCORE Affiche ton score (SCORE TRANSFERT <pseudo> [<n>] pour transférer des points)
248 SCORES Affiche les scores"""
250 JOIN Faire rejoindre un channel (sans paramètres, donne la liste des chans actuels)
251 LEAVE Faire quitter un channel
252 PLAY Passe un channel en mode "jouer"
253 NOPLAY Passe un channel en mode "ne pas jouer"
254 QUIET Se taire sur un channel
255 NOQUIET Opposé de QUIET"""
257 SCORES {DEL|ADD|SUB} Tu veux un dessin ?
258 SAY Fais envoyer un message sur un chan ou à une personne
259 STAY Ignorera les prochains LEAVE pour un chan
260 NOSTAY Opposé de STAY
261 STATUS Montre l'état courant
263 helpmsg
=helpmsg_default
264 if auteur
in self
.ops
:
266 if auteur
in self
.overops
:
267 helpmsg
+=helpmsg_overops
268 for ligne
in helpmsg
.split("\n"):
269 serv
.privmsg(auteur
,ligne
)
271 if auteur
in self
.ops
:
273 if message
[1] in self
.chanlist
:
274 serv
.privmsg(auteur
,"Je suis déjà sur %s"%(message
[1]))
276 serv
.join(message
[1])
277 self
.chanlist
.append(message
[1])
278 serv
.privmsg(auteur
,"Channels : "+" ".join(self
.chanlist
))
279 log(self
.serveur
,"priv",auteur
," ".join(message
))
281 serv
.privmsg(auteur
,"Channels : "+" ".join(self
.chanlist
))
285 if auteur
in self
.ops
and len(message
)>1:
286 if message
[1] in self
.chanlist
:
287 if not (message
[1] in self
.stay_channels
) or auteur
in self
.overops
:
288 self
.quitter(message
[1]," ".join(message
[2:]))
289 self
.chanlist
.remove(message
[1])
290 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
292 serv
.privmsg(auteur
,"Non, je reste !")
293 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
295 serv
.privmsg(auteur
,"Je ne suis pas sur %s"%(message
[1]))
299 if auteur
in self
.overops
:
301 if message
[1] in self
.stay_channels
:
302 serv
.privmsg(auteur
,"Je stay déjà sur %s."%(message
[1]))
303 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
305 self
.stay_channels
.append(message
[1])
306 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
307 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
309 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
313 if auteur
in self
.overops
:
315 if message
[1] in self
.stay_channels
:
316 self
.stay_channels
.remove(message
[1])
317 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
318 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
320 serv
.privmsg(auteur
,"Je ne stay pas sur %s."%(message
[1]))
321 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
325 if auteur
in self
.ops
:
327 if message
[1] in self
.play_channels
:
328 serv
.privmsg(auteur
,"Je play déjà sur %s."%(message
[1]))
329 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
331 self
.play_channels
.append(message
[1])
332 self
.play_status
[message
[1]]=[0,time
.time()-3600]
333 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
334 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
336 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
340 if auteur
in self
.ops
:
342 if message
[1] in self
.play_channels
:
343 self
.play_channels
.remove(message
[1])
344 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
345 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
347 serv
.privmsg(auteur
,"Je ne play pas sur %s."%(message
[1]))
348 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
352 if auteur
in self
.ops
:
354 if message
[1] in self
.quiet_channels
:
355 serv
.privmsg(auteur
,"Je me la ferme déjà sur %s"%(message
[1]))
356 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
358 self
.quiet_channels
.append(message
[1])
359 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
360 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
362 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
366 if auteur
in self
.ops
:
368 if message
[1] in self
.quiet_channels
:
369 self
.quiet_channels
.remove(message
[1])
370 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
371 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
373 serv
.privmsg(auteur
,"Je ne me la ferme pas sur %s."%(message
[1]))
374 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
377 elif cmd
in ["states","status"]:
378 if auteur
in self
.overops
:
379 for k
in self
.play_status
.keys():
380 serv
.privmsg(auteur
,(u
"%s : %s"%(k
," | ".join([unicode(i
) for i
in self
.play_status
[k
]]))).encode("utf8") )
382 if auteur
in self
.overops
and len(message
)>2:
383 serv
.privmsg(message
[1]," ".join(message
[2:]))
384 log(self
.serveur
,"priv",auteur
," ".join(message
))
385 elif len(message
)<=2:
386 serv
.privmsg(auteur
,"Syntaxe : SAY <channel> <message>")
390 if auteur
in self
.overops
:
391 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
395 if len(message
) in [3,4] and message
[1].lower()=="transfert":
396 scores
=self
.get_scores()
397 de
,to
=auteur
,message
[2]
398 value
=scores
.get(de
,0)
401 asked
=int(message
[3])
403 serv
.privmsg(auteur
,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
408 serv
.privmsg(auteur
,"Vous n'avez pas de points")
411 serv
.privmsg(auteur
,"Bien tenté…")
414 serv
.privmsg(auteur
,"Vous n'avez que %s points"%(value))
417 self
.add_score(de
,-asked
)
418 self
.add_score(to
,asked
)
419 serv
.privmsg(auteur
,"Transfert de %s points de %s à %s"%(asked
,de
,to
))
421 serv
.privmsg(auteur
,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
423 serv
.privmsg(auteur
,"Votre score : %s"%(self
.get_scores().get(auteur
,0)) )
426 scores
=self
.get_scores().items()
428 scores
.sort(lambda x
,y
:cmp(x
[1],y
[1]))
430 serv
.privmsg(auteur
,"Scores by score : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
432 scores
.sort(lambda x
,y
:cmp(x
[0].lower(),y
[0].lower()))
433 serv
.privmsg(auteur
,"Scores by pseudo : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
434 elif auteur
in self
.overops
:
435 souscmd
=message
[1].lower()
439 scores
=self
.get_scores()
440 if scores
.has_key(todelete
):
442 self
.save_scores(scores
)
443 serv
.privmsg(auteur
,"Score de %s supprimé"%(todelete))
445 serv
.privmsg(auteur
,"Ce score n'existe pas : %s"%(todelete))
447 serv
.privmsg(auteur
,"Syntaxe : SCORES DEL <pseudo>")
448 elif souscmd
in ["add","sub"]:
450 toadd
,val
=message
[2],message
[3]
454 serv
.privmsg(auteur
,"Syntaxe : SCORES {ADD|SUB} <pseudo> <n>")
458 self
.add_score(toadd
,val
)
459 serv
.privmsg(auteur
,"Done")
461 serv
.privmsg(auteur
,"Syntaxe : SCORES {ADD|SUB} <pseudo> <n>")
463 serv
.privmsg(auteur
,"Syntaxe : SCORES {DEL|ADD|SUB} <pseudo> [<n>]")
469 serv
.privmsg(auteur
,"Je n'ai pas compris. Essaye HELP…")
471 def on_pubmsg(self
, serv
, ev
):
472 auteur
= irclib
.nm_to_n(ev
.source())
474 message
= ev
.arguments()[0]
476 test
=bot_unicode(message
)
477 except UnicodeBotError
:
478 if not canal
in self
.quiet_channels
:
480 "%s: Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…"%(auteur))
483 pour_moi
,message
=self
.pourmoi(serv
,message
)
484 if pour_moi
and message
.split()!=[]:
485 cmd
=message
.split()[0].lower()
487 args
=" ".join(message
.split()[1:])
490 if cmd
in ["meurs","die","crève"]:
491 if auteur
in self
.overops
:
493 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
495 serv
.privmsg(canal
,"%s: crève !"%(auteur))
496 log(self
.serveur
,canal
,auteur
,message
+"[failed]")
497 if cmd
in ["meur", "meurt","meurre","meurres"] and not canal
in self
.quiet_channels
:
498 serv
.privmsg(canal
,'%s: Mourir, impératif, 2ème personne du singulier : "meurs" (de rien)'%(auteur))
499 if cmd
in ["part","leave","dégage"]:
500 if auteur
in self
.ops
and (not (canal
in self
.stay_channels
)
501 or auteur
in self
.overops
):
503 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
504 self
.chanlist
.remove(canal
)
506 serv
.privmsg(canal
,"%s: Non, je reste !"%(auteur))
507 log(self
.serveur
,canal
,auteur
,message
+"[failed]")
509 if cmd
in ["deviens","pseudo"]:
510 if auteur
in self
.ops
:
513 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
514 if cmd
in ["coucou"] and not canal
in self
.quiet_channels
:
515 serv
.privmsg(canal
,"%s: coucou"%(auteur))
516 if cmd
in ["ping"] and not canal
in self
.quiet_channels
:
517 serv
.privmsg(canal
,"%s: pong"%(auteur))
518 if cmd
in ["date","dates","histoire","énigme","enigme","encore"]:
519 if canal
in self
.play_channels
:
520 if self
.play_status
.get(canal
,[-1])[0]==0:
522 self
.start_enigme(serv
,canal
)
524 serv
.privmsg(canal
,"%s: Je peux souffler une minute ?"%(auteur))
526 serv
.privmsg(canal
,("%s: Rappel : %s"%(auteur
,self
.play_status
[canal
][2])).encode("utf8") )
528 serv
.privmsg(canal
,"%s: pas ici…"%(auteur))
529 if cmd
in ["score","!score"]:
530 serv
.privmsg(auteur
,"Votre score : %s"%(self
.get_scores().get(auteur
,0)) )
531 if cmd
in ["scores","!scores"]:
532 scores
=self
.get_scores().items()
534 scores
.sort(lambda x
,y
:cmp(x
[1],y
[1]))
536 serv
.privmsg(auteur
,"Scores by score : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
538 scores
.sort(lambda x
,y
:cmp(x
[0].lower(),y
[0].lower()))
539 serv
.privmsg(auteur
,"Scores by pseudo : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
540 if cmd
=="indice" and canal
in self
.play_channels
:
541 self
.give_indice(serv
,canal
,None)
542 if is_tag(message
) and not canal
in self
.quiet_channels
:
543 if auteur
in self
.ops
:
544 action
=random
.choice(config_tag_actions
)
545 serv
.action(canal
,action
.encode("utf8"))
546 self
.quiet_channels
.append(canal
)
548 answer
=random
.choice(config_tag_answers
)
549 for ligne
in answer
.split("\n"):
550 serv
.privmsg(canal
,"%s: %s"%(auteur
,ligne
.encode("utf8")))
556 if self
.play_status
.get(canal
,[-1])[0] in [1,2]:
557 answer
=self
.play_status
[canal
][1]
558 score_obtenu
=reussi(message
.decode("utf8"),answer
,auteur
)
560 if self
.play_status
[canal
][0]==1:
561 bonusmsg
=u
" [+bonus_mois"*(score_obtenu
>config_score_annee
)+u
"+bonus_jour"*(score_obtenu
>config_score_annee
+config_score_mois
)+u
"]"
565 serv
.privmsg(canal
,(u
"%s: bravo ! (C'était le %s)%s"%(auteur
,answer
,bonusmsg
)).encode("utf8"))
566 log(self
.serveur
,canal
,auteur
+"$win",message
)
567 self
.add_score(auteur
,score_obtenu
)
569 self
.play_status
[canal
]=[0,token
]
570 serv
.execute_delayed(random
.randrange(Ttrig
*5,Ttrig
*10),self
.start_enigme
,(serv
,canal
,token
))
572 def on_kick(self
,serv
,ev
):
573 auteur
= irclib
.nm_to_n(ev
.source())
574 channel
= ev
.target()
575 victime
= ev
.arguments()[0]
576 raison
= ev
.arguments()[1]
577 if victime
==self
.nick
:
578 log(self
.serveur
,"%s kické par %s (raison : %s)" %(victime
,auteur
,raison
))
581 # on ne dit rien au rejoin
582 #l1,l2=config_kick_answers,config_kick_actions
583 #n1,n2=len(l1),len(l2)
584 #i=random.randrange(n1+n2)
586 # serv.action(channel,l2[i-n1].format(auteur).encode("utf8"))
588 # serv.privmsg(channel,l1[i].format(auteur).encode("utf8"))
590 def quitter(self
,chan
,leave_message
=None):
591 if leave_message
==None:
592 leave_message
=random
.choice(config_leave_messages
)
594 leave_message
=leave_message
%(time
.strftime("le %d/%m/%Y à %T").decode("utf8"),self
.nick
)
597 self
.serv
.part(chan
,message
=leave_message
.encode("utf8"))
600 quit_message
=random
.choice(config_quit_messages
)
602 quit_message
=quit_message
%(time
.strftime("le %d/%m/%Y à %T").decode("utf8"),self
.nick
)
605 self
.die(msg
=quit_message
.encode("utf8"))
607 def get_scores(self
):
608 f
=open(config_score_file
)
609 scores
=pickle
.load(f
)
613 def add_score(self
,pseudo
,value
):
614 scores
=self
.get_scores()
615 if scores
.has_key(pseudo
):
616 scores
[pseudo
]+=value
619 self
.save_scores(scores
)
621 def save_scores(self
,scores
):
622 f
=open(config_score_file
,"w")
623 pickle
.dump(scores
,f
)
627 return self
.serv
.get_nickname()
628 nick
= property(_getnick
)
630 if __name__
=="__main__":
633 print "Usage : historien.py <serveur> [--debug]"
636 if "debug" in sys
.argv
or "--debug" in sys
.argv
:
640 serveurs
={"a♡":"acoeur.crans.org","acoeur":"acoeur.crans.org","acoeur.crans.org":"acoeur.crans.org",
641 "irc":"irc.crans.org","crans":"irc.crans.org","irc.crans.org":"irc.crans.org"}
643 serveur
=serveurs
[serveur
]
645 print "Server Unknown : %s"%(serveur)
647 historien
=Historien(serveur
,debug
)