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 # Quand personne ne cause, on finit par se taire
59 # temps au bout duquel, si personne n'a parlé, on se tait
60 config_idle_time
=20*60
61 # liste des bots, qui ne sont pas considérés comme de l'activité
62 config_idle_bots
=["deconnaisseur","Basile","historien","hung","salesman","Shadobot","Wen","___"]
64 class UnicodeBotError(Exception):
66 def bot_unicode(chain
):
69 except UnicodeDecodeError:
72 def log(serveur
,channel
,auteur
=None,message
=None):
73 f
=open(get_config_logfile(serveur
),"a")
74 if auteur
==message
==None:
75 # alors c'est que c'est pas un channel mais juste une ligne de log
76 chain
="%s %s"%(time
.strftime("%F %T"),channel
)
78 chain
="%s [%s:%s] %s"%(time
.strftime("%F %T"),channel
,auteur
,message
)
80 if config_debug_stdout
:
89 config_noscore
=["[20-100]","[20-100]_"] # parce que 20-100 est nul en histoire
91 class GoodCentury(Exception):
94 class GoodDeceny(Exception):
97 def reussi(message
,answer
,auteur
):
98 if auteur
in config_level3
:
99 return answer
in message
100 if auteur
in config_level2
:
101 return answer
in message
104 date
=cast_as_date(message
.lower().strip())
105 except ThisIsNotADate
:
107 realdate
=map(lambda x
:int(x
), answer
.split('/'))
110 if date
[0]==realdate
[0]:
111 score
=config_score_annee
112 if date
[1]==realdate
[1]:
113 score
+=config_score_mois
114 if date
[2]==realdate
[2]:
115 score
+=config_score_jour
116 elif date
[0]/10 == realdate
[0]/10:
118 elif date
[0]/100 == realdate
[0]/100:
122 def is_something(chain
,matches
,avant
=u
".*(?:^| )",apres
=u
"(?:$|\.| |,|;).*",case_sensitive
=False,debug
=False):
124 chain
=unicode(chain
,"utf8")
126 chain
=unicode(chain
,"utf8").lower()
127 allmatches
="("+"|".join(matches
)+")"
128 reg
=(avant
+allmatches
+apres
).lower()
129 o
=re
.match(reg
,chain
)
133 return is_something(chain
,config_tag_triggers
)
135 class RefuseError(Exception):
138 class Historien(ircbot
.SingleServerIRCBot
):
139 def __init__(self
,serveur
,debug
=False):
140 temporary_pseudo
=config_pseudo
+str(random
.randrange(10000,100000))
141 ircbot
.SingleServerIRCBot
.__init
__(self
, [(serveur
, 6667)],
142 temporary_pseudo
,"Un bot irc qui a au moins l'agreg d'histoire", 10)
145 self
.overops
=config_overops
146 self
.ops
=self
.overops
+config_ops
147 self
.chanlist
=config_chanlist
148 self
.stay_channels
=config_stay_channels
149 self
.play_channels
=config_play_channels
150 self
.play_status
={i
:[0] for i
in self
.play_channels
}
151 self
.last_activity
={}
152 self
.quiet_channels
=[]
154 def give_me_my_pseudo(self
,serv
):
155 serv
.privmsg("NickServ","RECOVER %s %s"%(config_pseudo
,config_password
))
156 serv
.privmsg("NickServ","RELEASE %s %s"%(config_pseudo
,config_password
))
158 serv
.nick(config_pseudo
)
160 def on_welcome(self
, serv
, ev
):
161 self
.serv
=serv
# ça serv ira :)
162 self
.give_me_my_pseudo(serv
)
163 serv
.privmsg("NickServ","identify %s"%(config_password))
164 log(self
.serveur
,"Connected")
166 self
.chanlist
=["#bot"]
167 self
.play_channels
=["#bot"]
168 for c
in self
.chanlist
:
169 log(self
.serveur
,"JOIN %s"%(c))
171 self
.update_activity(c
,"") # la chaîne vide ne sera jamais un nom de bot et donc marchera toujours
172 for c
in self
.play_channels
:
173 token
=time
.time()-3600
174 self
.play_status
[c
]=[0,token
]
175 serv
.execute_delayed(random
.randrange(ttrig
),self
.start_enigme
,(serv
,c
,token
))
177 def start_enigme(self
,serv
,channel
,token
=None):
178 # On reste silencieux si lechan n'est pas actif
179 if not self
.is_active(channel
):
180 serv
.execute_delayed(ttrig
*5,self
.start_enigme
,(serv
,channel
,token
))
182 if self
.play_status
[channel
][0]==0 and channel
in self
.play_channels
:
184 if token
==self
.play_status
[channel
][-1]:
187 if time
.time() > self
.play_status
[channel
][-1]+config_time_incompressible
:
192 date
,evenement
=self
.get_enigme()
193 log(self
.serveur
,channel
,u
"$Date$".encode("utf8"),("%s : %s"%(date
, evenement
)).encode("utf8"))
194 serv
.privmsg(channel
,evenement
.encode("utf8"))
196 # le 0 est le flag "bon siècle" n'a pas encore été dit
197 self
.play_status
[channel
]=[1,date
,evenement
,0,token
]
198 serv
.execute_delayed(random
.randrange(ttrig
*3,ttrig
*5),self
.give_indice
,(serv
,channel
,token
))
201 def give_indice(self
,serv
,channel
,token
):
202 if self
.play_status
[channel
][0]==1:
204 # c'est donc que l'indice a été demandé
205 if self
.play_status
[channel
][-1]+config_time_incompressible_clue
<time
.time():
206 token
=self
.play_status
[channel
][-1]
207 if self
.play_status
[channel
][-1]==token
:
208 date
=self
.play_status
[channel
][1]
210 serv
.privmsg(channel
,"indice : %s"%(indice).encode("utf8"))
211 self
.play_status
[channel
][0]=2
212 serv
.execute_delayed(random
.randrange(ttrig
*1,ttrig
*3),self
.give_answer
,(serv
,channel
,token
))
213 def give_answer(self
,serv
,channel
,token
):
214 if self
.play_status
[channel
][0]==2 and self
.play_status
[channel
][-1]==token
:
215 date
=self
.play_status
[channel
][1]
216 serv
.privmsg(channel
,"C'était le %s"%(date).encode("utf8"))
218 self
.play_status
[channel
]=[0,token
]
219 serv
.execute_delayed(random
.randrange(Ttrig
*5,Ttrig
*10),self
.start_enigme
,(serv
,channel
,token
))
221 def get_enigme(self
):
222 # on récupère les dates
223 f
=open(config_source_file
)
226 l
=[i
.split(" : ",2) for i
in l
]
227 dates
={int(i
[0]):i
[1:] for i
in l
}
228 # on va chercher combien de fois elles ont été jouées
229 played_file
=get_config_played_file(self
.serveur
)
233 l
=re
.findall("(.*):(.*)",t
)
234 played
={int(i
[0]):int(i
[1]) for i
in l
}
235 # on récupère le nombre d'occurrences le plus faible
236 mini
=min(played
.values())
237 # on choisit un id dans ceux qui ont ce nombre d'occurences
238 id_choisi
=random
.choice([k
for k
,v
in played
.items() if v
==mini
])
239 date
,evenement
=dates
[id_choisi
]
240 evenement
=evenement
.replace("\n","")
241 # on incrémente la choisie
243 # on enregistre le played_file
244 f
=open(played_file
,"w")
245 f
.write("\n".join(["%-4s : %s"%(k
,v
) for k
,v
in played
.items()]))
247 return map(lambda x
:x
.decode("utf8"), [date
,evenement
])
249 def pourmoi(self
, serv
, message
):
252 if message
[:size
]==pseudo
and len(message
)>size
and message
[size
]==":":
253 return (True,message
[size
+1:].strip(" "))
255 return (False,message
)
257 def on_privmsg(self
, serv
, ev
):
258 message
=ev
.arguments()[0]
259 auteur
= irclib
.nm_to_n(ev
.source())
261 test
=bot_unicode(message
)
262 except UnicodeBotError
:
264 "Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…")
266 message
=message
.split()
267 cmd
=message
[0].lower()
270 helpmsg_default
="""Liste des commandes :
271 HELP Affiche ce message d'aide
272 SCORE Affiche ton score (SCORE TRANSFERT <pseudo> [<n>] pour transférer des points)
273 SCORES Affiche les scores"""
275 JOIN Faire rejoindre un channel (sans paramètres, donne la liste des chans actuels)
276 LEAVE Faire quitter un channel
277 PLAY Passe un channel en mode "jouer"
278 NOPLAY Passe un channel en mode "ne pas jouer"
279 QUIET Se taire sur un channel
280 NOQUIET Opposé de QUIET"""
282 SCORES {DEL|ADD|SUB} Tu veux un dessin ?
283 SAY Fais envoyer un message sur un chan ou à une personne
284 STAY Ignorera les prochains LEAVE pour un chan
285 NOSTAY Opposé de STAY
286 STATUS Montre l'état courant
288 helpmsg
=helpmsg_default
289 if auteur
in self
.ops
:
291 if auteur
in self
.overops
:
292 helpmsg
+=helpmsg_overops
293 for ligne
in helpmsg
.split("\n"):
294 serv
.privmsg(auteur
,ligne
)
296 if auteur
in self
.ops
:
298 if message
[1] in self
.chanlist
:
299 serv
.privmsg(auteur
,"Je suis déjà sur %s"%(message
[1]))
301 serv
.join(message
[1])
302 self
.chanlist
.append(message
[1])
303 serv
.privmsg(auteur
,"Channels : "+" ".join(self
.chanlist
))
304 log(self
.serveur
,"priv",auteur
," ".join(message
))
306 serv
.privmsg(auteur
,"Channels : "+" ".join(self
.chanlist
))
310 if auteur
in self
.ops
and len(message
)>1:
311 if message
[1] in self
.chanlist
:
312 if not (message
[1] in self
.stay_channels
) or auteur
in self
.overops
:
313 self
.quitter(message
[1]," ".join(message
[2:]))
314 self
.chanlist
.remove(message
[1])
315 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
317 serv
.privmsg(auteur
,"Non, je reste !")
318 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
320 serv
.privmsg(auteur
,"Je ne suis pas sur %s"%(message
[1]))
324 if auteur
in self
.overops
:
326 if message
[1] in self
.stay_channels
:
327 serv
.privmsg(auteur
,"Je stay déjà sur %s."%(message
[1]))
328 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
330 self
.stay_channels
.append(message
[1])
331 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
332 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
334 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
338 if auteur
in self
.overops
:
340 if message
[1] in self
.stay_channels
:
341 self
.stay_channels
.remove(message
[1])
342 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
343 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
345 serv
.privmsg(auteur
,"Je ne stay pas sur %s."%(message
[1]))
346 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
350 if auteur
in self
.ops
:
352 if message
[1] in self
.play_channels
:
353 serv
.privmsg(auteur
,"Je play déjà sur %s."%(message
[1]))
354 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
356 self
.play_channels
.append(message
[1])
357 self
.play_status
[message
[1]]=[0,time
.time()-3600]
358 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
359 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
361 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
365 if auteur
in self
.ops
:
367 if message
[1] in self
.play_channels
:
368 self
.play_channels
.remove(message
[1])
369 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
370 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
372 serv
.privmsg(auteur
,"Je ne play pas sur %s."%(message
[1]))
373 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
377 if auteur
in self
.ops
:
379 if message
[1] in self
.quiet_channels
:
380 serv
.privmsg(auteur
,"Je me la ferme déjà sur %s"%(message
[1]))
381 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
383 self
.quiet_channels
.append(message
[1])
384 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
385 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
387 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
391 if auteur
in self
.ops
:
393 if message
[1] in self
.quiet_channels
:
394 self
.quiet_channels
.remove(message
[1])
395 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
396 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
398 serv
.privmsg(auteur
,"Je ne me la ferme pas sur %s."%(message
[1]))
399 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
402 elif cmd
in ["states","status"]:
403 if auteur
in self
.overops
:
404 for k
in self
.play_status
.keys():
405 serv
.privmsg(auteur
,(u
"%s : %s"%(k
," | ".join([unicode(i
) for i
in self
.play_status
[k
]]))).encode("utf8") )
407 if auteur
in self
.overops
and len(message
)>2:
408 serv
.privmsg(message
[1]," ".join(message
[2:]))
409 log(self
.serveur
,"priv",auteur
," ".join(message
))
410 elif len(message
)<=2:
411 serv
.privmsg(auteur
,"Syntaxe : SAY <channel> <message>")
415 if auteur
in self
.overops
:
416 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
420 if len(message
) in [3,4] and message
[1].lower()=="transfert":
421 scores
=self
.get_scores()
422 de
,to
=auteur
,message
[2]
423 value
=scores
.get(de
,0)
426 asked
=int(message
[3])
428 serv
.privmsg(auteur
,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
433 serv
.privmsg(auteur
,"Vous n'avez pas de points")
436 serv
.privmsg(auteur
,"Bien tenté…")
439 serv
.privmsg(auteur
,"Vous n'avez que %s points"%(value))
442 self
.add_score(de
,-asked
)
443 self
.add_score(to
,asked
)
444 serv
.privmsg(auteur
,"Transfert de %s points de %s à %s"%(asked
,de
,to
))
446 serv
.privmsg(auteur
,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
448 serv
.privmsg(auteur
,"Votre score : %s"%(self
.get_scores().get(auteur
,0)) )
451 scores
=self
.get_scores().items()
453 scores
.sort(lambda x
,y
:cmp(x
[1],y
[1]))
455 serv
.privmsg(auteur
,"Scores by score : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
457 scores
.sort(lambda x
,y
:cmp(x
[0].lower(),y
[0].lower()))
458 serv
.privmsg(auteur
,"Scores by pseudo : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
459 elif auteur
in self
.overops
:
460 souscmd
=message
[1].lower()
464 scores
=self
.get_scores()
465 if scores
.has_key(todelete
):
467 self
.save_scores(scores
)
468 serv
.privmsg(auteur
,"Score de %s supprimé"%(todelete))
470 serv
.privmsg(auteur
,"Ce score n'existe pas : %s"%(todelete))
472 serv
.privmsg(auteur
,"Syntaxe : SCORES DEL <pseudo>")
473 elif souscmd
in ["add","sub"]:
475 toadd
,val
=message
[2],message
[3]
479 serv
.privmsg(auteur
,"Syntaxe : SCORES {ADD|SUB} <pseudo> <n>")
483 self
.add_score(toadd
,val
)
484 serv
.privmsg(auteur
,"Done")
486 serv
.privmsg(auteur
,"Syntaxe : SCORES {ADD|SUB} <pseudo> <n>")
488 serv
.privmsg(auteur
,"Syntaxe : SCORES {DEL|ADD|SUB} <pseudo> [<n>]")
494 serv
.privmsg(auteur
,"Je n'ai pas compris. Essaye HELP…")
496 def on_pubmsg(self
, serv
, ev
):
497 auteur
= irclib
.nm_to_n(ev
.source())
499 message
= ev
.arguments()[0]
500 self
.update_activity(canal
,auteur
)
502 test
=bot_unicode(message
)
503 except UnicodeBotError
:
504 if not canal
in self
.quiet_channels
:
506 "%s: Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…"%(auteur))
509 pour_moi
,message
=self
.pourmoi(serv
,message
)
510 if pour_moi
and message
.split()!=[]:
511 cmd
=message
.split()[0].lower()
513 args
=" ".join(message
.split()[1:])
516 if cmd
in ["meurs","die","crève"]:
517 if auteur
in self
.overops
:
519 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
521 serv
.privmsg(canal
,"%s: crève !"%(auteur))
522 log(self
.serveur
,canal
,auteur
,message
+"[failed]")
523 if cmd
in ["meur", "meurt","meurre","meurres"] and not canal
in self
.quiet_channels
:
524 serv
.privmsg(canal
,'%s: Mourir, impératif, 2ème personne du singulier : "meurs" (de rien)'%(auteur))
525 if cmd
in ["part","leave","dégage"]:
526 if auteur
in self
.ops
and (not (canal
in self
.stay_channels
)
527 or auteur
in self
.overops
):
529 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
530 self
.chanlist
.remove(canal
)
532 serv
.privmsg(canal
,"%s: Non, je reste !"%(auteur))
533 log(self
.serveur
,canal
,auteur
,message
+"[failed]")
535 if cmd
in ["deviens","pseudo"]:
536 if auteur
in self
.ops
:
539 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
540 if cmd
in ["coucou"] and not canal
in self
.quiet_channels
:
541 serv
.privmsg(canal
,"%s: coucou"%(auteur))
542 if cmd
in ["ping"] and not canal
in self
.quiet_channels
:
543 serv
.privmsg(canal
,"%s: pong"%(auteur))
544 if cmd
in ["date","dates","histoire","énigme","enigme","encore"]:
545 if canal
in self
.play_channels
:
546 if self
.play_status
.get(canal
,[-1])[0]==0:
548 self
.start_enigme(serv
,canal
)
550 serv
.privmsg(canal
,"%s: Je peux souffler une minute ?"%(auteur))
552 serv
.privmsg(canal
,("%s: Rappel : %s"%(auteur
,self
.play_status
[canal
][2])).encode("utf8") )
554 serv
.privmsg(canal
,"%s: pas ici…"%(auteur))
555 if cmd
in ["score","!score"]:
556 serv
.privmsg(auteur
,"Votre score : %s"%(self
.get_scores().get(auteur
,0)) )
557 if cmd
in ["scores","!scores"]:
558 scores
=self
.get_scores().items()
560 scores
.sort(lambda x
,y
:cmp(x
[1],y
[1]))
562 serv
.privmsg(auteur
,"Scores by score : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
564 scores
.sort(lambda x
,y
:cmp(x
[0].lower(),y
[0].lower()))
565 serv
.privmsg(auteur
,"Scores by pseudo : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
566 if cmd
=="indice" and canal
in self
.play_channels
:
567 self
.give_indice(serv
,canal
,None)
568 if is_tag(message
) and not canal
in self
.quiet_channels
:
569 if auteur
in self
.ops
:
570 action
=random
.choice(config_tag_actions
)
571 serv
.action(canal
,action
.encode("utf8"))
572 self
.quiet_channels
.append(canal
)
574 answer
=random
.choice(config_tag_answers
)
575 for ligne
in answer
.split("\n"):
576 serv
.privmsg(canal
,"%s: %s"%(auteur
,ligne
.encode("utf8")))
582 if self
.play_status
.get(canal
,[-1])[0] in [1,2]:
583 answer
=self
.play_status
[canal
][1]
584 flag_century
=self
.play_status
[canal
][3]
586 score_obtenu
=reussi(message
.decode("utf8"),answer
,auteur
)
589 serv
.privmsg(canal
,"%s: C'est le bon siècle, mais pas la bonne année, cherche encore ;)"%(auteur))
590 self
.play_status
[canal
][3]=1
593 if flag_century
in [0,1]:
594 serv
.privmsg(canal
,"%s: C'est la bonne décennie, mais pas la bonne année, encore un effort ;)"%(auteur))
595 self
.play_status
[canal
][3]=2
598 if self
.play_status
[canal
][0]==1:
599 bonusmsg
=u
" [+bonus_mois"*(score_obtenu
>config_score_annee
)+u
"+bonus_jour"*(score_obtenu
>config_score_annee
+config_score_mois
)
605 serv
.privmsg(canal
,(u
"%s: bravo ! (C'était le %s)%s"%(auteur
,answer
,bonusmsg
)).encode("utf8"))
606 log(self
.serveur
,canal
,auteur
+"$win",message
)
607 if auteur
in config_noscore
:
609 self
.add_score(auteur
,score_obtenu
)
611 self
.play_status
[canal
]=[0,token
]
612 serv
.execute_delayed(random
.randrange(Ttrig
*5,Ttrig
*10),self
.start_enigme
,(serv
,canal
,token
))
614 def on_kick(self
,serv
,ev
):
615 auteur
= irclib
.nm_to_n(ev
.source())
616 channel
= ev
.target()
617 victime
= ev
.arguments()[0]
618 raison
= ev
.arguments()[1]
619 if victime
==self
.nick
:
620 log(self
.serveur
,"%s kické de %s par %s (raison : %s)" %(victime
,channel
,auteur
,raison
))
623 self
.update_activity(channel
,"")
624 # on ne dit rien au rejoin
625 #l1,l2=config_kick_answers,config_kick_actions
626 #n1,n2=len(l1),len(l2)
627 #i=random.randrange(n1+n2)
629 # serv.action(channel,l2[i-n1].format(auteur).encode("utf8"))
631 # serv.privmsg(channel,l1[i].format(auteur).encode("utf8"))
633 def quitter(self
,chan
,leave_message
=None):
634 if leave_message
==None:
635 leave_message
=random
.choice(config_leave_messages
)
637 leave_message
=leave_message
%(time
.strftime("le %d/%m/%Y à %T").decode("utf8"),self
.nick
)
640 self
.serv
.part(chan
,message
=leave_message
.encode("utf8"))
643 quit_message
=random
.choice(config_quit_messages
)
645 quit_message
=quit_message
%(time
.strftime("le %d/%m/%Y à %T").decode("utf8"),self
.nick
)
648 self
.die(msg
=quit_message
.encode("utf8"))
650 def get_scores(self
):
651 f
=open(config_score_file
)
652 scores
=pickle
.load(f
)
656 def add_score(self
,pseudo
,value
):
657 scores
=self
.get_scores()
658 if scores
.has_key(pseudo
):
659 scores
[pseudo
]+=value
662 self
.save_scores(scores
)
664 def save_scores(self
,scores
):
665 f
=open(config_score_file
,"w")
666 pickle
.dump(scores
,f
)
670 return self
.serv
.get_nickname()
671 nick
= property(_getnick
)
673 def update_activity(self
,canal
,pseudo
):
674 if not pseudo
in config_idle_bots
:
675 self
.last_activity
[canal
]=time
.time()
676 def is_active(self
,canal
):
677 return time
.time()-self
.last_activity
[canal
]<config_idle_time
679 if __name__
=="__main__":
682 print "Usage : historien.py <serveur> [--debug]"
685 if "debug" in sys
.argv
or "--debug" in sys
.argv
:
689 serveurs
={"a♡":"acoeur.crans.org","acoeur":"acoeur.crans.org","acoeur.crans.org":"acoeur.crans.org",
690 "irc":"irc.crans.org","crans":"irc.crans.org","irc.crans.org":"irc.crans.org"}
692 serveur
=serveurs
[serveur
]
694 print "Server Unknown : %s"%(serveur)
696 historien
=Historien(serveur
,debug
)