]>
gitweb.pimeys.fr Git - bots/historien.git/blob - historien.py
4 # Codé par 20-100 le 25/05/12
6 # Un bot IRC qui pose des questions d'histoire
16 from cast_as_date
import *
18 # Oui, j'ai recodé ma version d'irclib pour pouvoir rattrapper les SIGHUP
19 sys
.path
.insert(0, "/home/vincent/scripts/python-myirclib")
26 def get_config_played_file(serveur
):
27 serveurs
={"acoeur.crans.org":"acoeur","irc.crans.org":"crans"}
28 return config
.played_file_template
%(serveurs
[serveur
])
30 def get_config_logfile(serveur
):
31 serveurs
={"acoeur.crans.org":"acoeur","irc.crans.org":"crans"}
32 return config
.logfile_template
%(serveurs
[serveur
])
34 class UnicodeBotError(Exception):
36 def bot_unicode(chain
):
39 except UnicodeDecodeError:
42 def log(serveur
,channel
,auteur
=None,message
=None):
43 f
=open(get_config_logfile(serveur
),"a")
44 if auteur
==message
==None:
45 # alors c'est que c'est pas un channel mais juste une ligne de log
46 chain
="%s %s"%(time
.strftime("%F %T"),channel
)
48 chain
="%s [%s:%s] %s"%(time
.strftime("%F %T"),channel
,auteur
,message
)
50 if config
.debug_stdout
:
55 class GoodCentury(Exception):
58 class GoodDeceny(Exception):
61 def reussi(message
,answer
,auteur
):
62 if auteur
in config
.level3
:
63 return answer
in message
64 if auteur
in config
.level2
:
65 return answer
in message
68 date
=cast_as_date(message
.lower().strip())
69 except ThisIsNotADate
:
71 realdate
=map(lambda x
:int(x
), answer
.split('/'))
74 if date
[0]==realdate
[0]:
75 score
=config
.score_annee
76 if date
[1]==realdate
[1]:
77 score
+=config
.score_mois
78 if date
[2]==realdate
[2]:
79 score
+=config
.score_jour
80 elif date
[0]/10 == realdate
[0]/10:
82 elif date
[0]/100 == realdate
[0]/100:
86 def is_something(chain
,matches
,avant
=u
".*(?:^| )",apres
=u
"(?:$|\.| |,|;).*",case_sensitive
=False,debug
=False):
88 chain
=unicode(chain
,"utf8")
90 chain
=unicode(chain
,"utf8").lower()
91 allmatches
="("+"|".join(matches
)+")"
92 reg
=(avant
+allmatches
+apres
).lower()
97 return is_something(chain
,config
.tag_triggers
)
99 class RefuseError(Exception):
102 class Historien(ircbot
.SingleServerIRCBot
):
103 def __init__(self
,serveur
,debug
=False):
104 temporary_pseudo
=config
.pseudo
+str(random
.randrange(10000,100000))
105 ircbot
.SingleServerIRCBot
.__init
__(self
, [(serveur
, 6667)],
106 temporary_pseudo
,"Un bot irc qui a au moins l'agreg d'histoire", 10)
109 self
.overops
=config
.overops
110 self
.ops
=self
.overops
+config
.ops
111 self
.chanlist
=config
.chanlist
112 self
.stay_channels
=config
.stay_channels
113 self
.play_channels
=config
.play_channels
114 self
.play_status
={i
:[0] for i
in self
.play_channels
}
115 self
.last_activity
={}
116 self
.quiet_channels
=[]
118 def give_me_my_pseudo(self
,serv
):
119 serv
.privmsg("NickServ","RECOVER %s %s"%(config
.pseudo
,config
.password
))
120 serv
.privmsg("NickServ","RELEASE %s %s"%(config
.pseudo
,config
.password
))
122 serv
.nick(config
.pseudo
)
124 def on_welcome(self
, serv
, ev
):
125 self
.serv
=serv
# ça serv ira :)
126 self
.give_me_my_pseudo(serv
)
127 serv
.privmsg("NickServ","identify %s"%(config
.password
))
128 log(self
.serveur
,"Connected")
130 self
.chanlist
=["#bot"]
131 self
.play_channels
=["#bot"]
132 for c
in self
.chanlist
:
133 log(self
.serveur
,"JOIN %s"%(c))
135 self
.update_activity(c
,"") # la chaîne vide ne sera jamais un nom de bot et donc marchera toujours
136 for c
in self
.play_channels
:
137 token
=time
.time()-3600
138 self
.play_status
[c
]=[0,token
]
139 serv
.execute_delayed(random
.randrange(config
.ttrig
),self
.start_enigme
,(serv
,c
,token
))
141 def start_enigme(self
,serv
,channel
,token
=None):
142 # On reste silencieux si lechan n'est pas actif
143 if not self
.is_active(channel
):
144 serv
.execute_delayed(config
.ttrig
*5,self
.start_enigme
,(serv
,channel
,token
))
146 if self
.play_status
[channel
][0]==0 and channel
in self
.play_channels
:
148 if token
==self
.play_status
[channel
][-1]:
151 if time
.time() > self
.play_status
[channel
][-1]+config
.time_incompressible
:
156 date
,evenement
=self
.get_enigme()
157 log(self
.serveur
,channel
,u
"$Date$".encode("utf8"),("%s : %s"%(date
, evenement
)).encode("utf8"))
158 serv
.privmsg(channel
,evenement
.encode("utf8"))
160 # le 0 est le flag "bon siècle" n'a pas encore été dit
161 self
.play_status
[channel
]=[1,date
,evenement
,0,token
]
162 serv
.execute_delayed(random
.randrange(config
.ttrig
*3,config
.ttrig
*5),self
.give_indice
,(serv
,channel
,token
))
165 def give_indice(self
,serv
,channel
,token
):
166 if self
.play_status
[channel
][0]==1:
168 # c'est donc que l'indice a été demandé
169 if self
.play_status
[channel
][-1]+config
.time_incompressible_clue
<time
.time():
170 token
=self
.play_status
[channel
][-1]
171 if self
.play_status
[channel
][-1]==token
:
172 date
=self
.play_status
[channel
][1]
174 serv
.privmsg(channel
,"indice : %s"%(indice).encode("utf8"))
175 self
.play_status
[channel
][0]=2
176 serv
.execute_delayed(random
.randrange(config
.ttrig
*1,config
.ttrig
*3),self
.give_answer
,(serv
,channel
,token
))
177 def give_answer(self
,serv
,channel
,token
):
178 if self
.play_status
[channel
][0]==2 and self
.play_status
[channel
][-1]==token
:
179 date
=self
.play_status
[channel
][1]
180 serv
.privmsg(channel
,"C'était le %s"%(date).encode("utf8"))
182 self
.play_status
[channel
]=[0,token
]
183 serv
.execute_delayed(random
.randrange(config
.Ttrig
*5,config
.Ttrig
*10),self
.start_enigme
,(serv
,channel
,token
))
185 def get_enigme(self
):
186 # on récupère les dates
187 f
=open(config
.source_file
)
190 l
=[i
.split(" : ",2) for i
in l
]
191 dates
={int(i
[0]):i
[1:] for i
in l
}
192 # on va chercher combien de fois elles ont été jouées
193 played_file
=get_config_played_file(self
.serveur
)
197 l
=re
.findall("(.*):(.*)",t
)
198 played
={int(i
[0]):int(i
[1]) for i
in l
}
199 # on récupère le nombre d'occurrences le plus faible
200 mini
=min(played
.values())
201 # on choisit un id dans ceux qui ont ce nombre d'occurences
202 id_choisi
=random
.choice([k
for k
,v
in played
.items() if v
==mini
])
203 date
,evenement
=dates
[id_choisi
]
204 evenement
=evenement
.replace("\n","")
205 # on incrémente la choisie
207 # on enregistre le played_file
208 f
=open(played_file
,"w")
209 f
.write("\n".join(["%-4s : %s"%(k
,v
) for k
,v
in played
.items()]))
211 return map(lambda x
:x
.decode("utf8"), [date
,evenement
])
213 def pourmoi(self
, serv
, message
):
216 if message
[:size
]==pseudo
and len(message
)>size
and message
[size
]==":":
217 return (True,message
[size
+1:].strip(" "))
219 return (False,message
)
221 def on_privmsg(self
, serv
, ev
):
222 message
=ev
.arguments()[0]
223 auteur
= irclib
.nm_to_n(ev
.source())
225 test
=bot_unicode(message
)
226 except UnicodeBotError
:
227 if config
.utf8_trigger
:
228 serv
.privmsg(auteur
, random
.choice(config
.utf8_fail_answers
).encode("utf8"))
230 message
=message
.split()
231 cmd
=message
[0].lower()
234 helpmsg_default
="""Liste des commandes :
235 HELP Affiche ce message d'aide
236 SCORE Affiche ton score (SCORE TRANSFERT <pseudo> [<n>] pour transférer des points)
237 SCORES Affiche les scores"""
239 JOIN Faire rejoindre un channel (sans paramètres, donne la liste des chans actuels)
240 LEAVE Faire quitter un channel
241 PLAY Passe un channel en mode "jouer"
242 NOPLAY Passe un channel en mode "ne pas jouer"
243 QUIET Se taire sur un channel
244 NOQUIET Opposé de QUIET"""
246 SCORES {DEL|ADD|SUB} Tu veux un dessin ?
247 SAY Fais envoyer un message sur un chan ou à une personne
248 STAY Ignorera les prochains LEAVE pour un chan
249 NOSTAY Opposé de STAY
250 STATUS Montre l'état courant
252 helpmsg
=helpmsg_default
253 if auteur
in self
.ops
:
255 if auteur
in self
.overops
:
256 helpmsg
+=helpmsg_overops
257 for ligne
in helpmsg
.split("\n"):
258 serv
.privmsg(auteur
,ligne
)
260 if auteur
in self
.ops
:
262 if message
[1] in self
.chanlist
:
263 serv
.privmsg(auteur
,"Je suis déjà sur %s"%(message
[1]))
265 serv
.join(message
[1])
266 self
.chanlist
.append(message
[1])
267 serv
.privmsg(auteur
,"Channels : "+" ".join(self
.chanlist
))
268 log(self
.serveur
,"priv",auteur
," ".join(message
))
270 serv
.privmsg(auteur
,"Channels : "+" ".join(self
.chanlist
))
274 if auteur
in self
.ops
and len(message
)>1:
275 if message
[1] in self
.chanlist
:
276 if not (message
[1] in self
.stay_channels
) or auteur
in self
.overops
:
277 self
.quitter(message
[1]," ".join(message
[2:]))
278 self
.chanlist
.remove(message
[1])
279 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
281 serv
.privmsg(auteur
,"Non, je reste !")
282 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
284 serv
.privmsg(auteur
,"Je ne suis pas sur %s"%(message
[1]))
288 if auteur
in self
.overops
:
290 if message
[1] in self
.stay_channels
:
291 serv
.privmsg(auteur
,"Je stay déjà sur %s."%(message
[1]))
292 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
294 self
.stay_channels
.append(message
[1])
295 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
296 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
298 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
302 if auteur
in self
.overops
:
304 if message
[1] in self
.stay_channels
:
305 self
.stay_channels
.remove(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
,"Je ne stay pas sur %s."%(message
[1]))
310 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
314 if auteur
in self
.ops
:
316 if message
[1] in self
.play_channels
:
317 serv
.privmsg(auteur
,"Je play déjà sur %s."%(message
[1]))
318 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
320 self
.play_channels
.append(message
[1])
321 self
.play_status
[message
[1]]=[0,time
.time()-3600]
322 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
323 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
325 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
329 if auteur
in self
.ops
:
331 if message
[1] in self
.play_channels
:
332 self
.play_channels
.remove(message
[1])
333 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
334 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
336 serv
.privmsg(auteur
,"Je ne play pas sur %s."%(message
[1]))
337 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
341 if auteur
in self
.ops
:
343 if message
[1] in self
.quiet_channels
:
344 serv
.privmsg(auteur
,"Je me la ferme déjà sur %s"%(message
[1]))
345 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
347 self
.quiet_channels
.append(message
[1])
348 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
349 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
351 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
355 if auteur
in self
.ops
:
357 if message
[1] in self
.quiet_channels
:
358 self
.quiet_channels
.remove(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
,"Je ne me la ferme pas sur %s."%(message
[1]))
363 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
366 elif cmd
in ["states","status"]:
367 if auteur
in self
.overops
:
368 for k
in self
.play_status
.keys():
369 serv
.privmsg(auteur
,(u
"%s : %s"%(k
," | ".join([unicode(i
) for i
in self
.play_status
[k
]]))).encode("utf8") )
371 if auteur
in self
.overops
and len(message
)>2:
372 serv
.privmsg(message
[1]," ".join(message
[2:]))
373 log(self
.serveur
,"priv",auteur
," ".join(message
))
374 elif len(message
)<=2:
375 serv
.privmsg(auteur
,"Syntaxe : SAY <channel> <message>")
379 if auteur
in self
.overops
:
380 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
384 if len(message
) in [3,4] and message
[1].lower()=="transfert":
385 scores
=self
.get_scores()
386 de
,to
=auteur
,message
[2]
387 value
=scores
.get(de
,0)
390 asked
=int(message
[3])
392 serv
.privmsg(auteur
,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
397 serv
.privmsg(auteur
,"Vous n'avez pas de points")
400 serv
.privmsg(auteur
,"Bien tenté…")
403 serv
.privmsg(auteur
,"Vous n'avez que %s points"%(value))
406 self
.add_score(de
,-asked
)
407 self
.add_score(to
,asked
)
408 serv
.privmsg(auteur
,"Transfert de %s points de %s à %s"%(asked
,de
,to
))
410 serv
.privmsg(auteur
,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
412 serv
.privmsg(auteur
,"Votre score : %s"%(self
.get_scores().get(auteur
,0)) )
415 scores
=self
.get_scores().items()
417 scores
.sort(lambda x
,y
:cmp(x
[1],y
[1]))
419 serv
.privmsg(auteur
,"Scores by score : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
421 scores
.sort(lambda x
,y
:cmp(x
[0].lower(),y
[0].lower()))
422 serv
.privmsg(auteur
,"Scores by pseudo : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
423 elif auteur
in self
.overops
:
424 souscmd
=message
[1].lower()
428 scores
=self
.get_scores()
429 if scores
.has_key(todelete
):
431 self
.save_scores(scores
)
432 serv
.privmsg(auteur
,"Score de %s supprimé"%(todelete))
434 serv
.privmsg(auteur
,"Ce score n'existe pas : %s"%(todelete))
436 serv
.privmsg(auteur
,"Syntaxe : SCORES DEL <pseudo>")
437 elif souscmd
in ["add","sub"]:
439 toadd
,val
=message
[2],message
[3]
443 serv
.privmsg(auteur
,"Syntaxe : SCORES {ADD|SUB} <pseudo> <n>")
447 self
.add_score(toadd
,val
)
448 serv
.privmsg(auteur
,"Done")
450 serv
.privmsg(auteur
,"Syntaxe : SCORES {ADD|SUB} <pseudo> <n>")
452 serv
.privmsg(auteur
,"Syntaxe : SCORES {DEL|ADD|SUB} <pseudo> [<n>]")
458 serv
.privmsg(auteur
,"Je n'ai pas compris. Essaye HELP…")
460 def on_pubmsg(self
, serv
, ev
):
461 auteur
= irclib
.nm_to_n(ev
.source())
463 message
= ev
.arguments()[0]
464 self
.update_activity(canal
,auteur
)
466 test
=bot_unicode(message
)
467 except UnicodeBotError
:
468 if config
.utf8_trigger
and not canal
in self
.quiet_channels
:
469 serv
.privmsg(canal
, (u
"%s: %s"%(auteur
, random
.choice(config
.utf8_fail_answers
))).encode("utf8"))
472 pour_moi
,message
=self
.pourmoi(serv
,message
)
473 if pour_moi
and message
.split()!=[]:
474 cmd
=message
.split()[0].lower()
476 args
=" ".join(message
.split()[1:])
479 if cmd
in ["meurs","die","crève"]:
480 if auteur
in self
.overops
:
482 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
484 serv
.privmsg(canal
,"%s: crève !"%(auteur))
485 log(self
.serveur
,canal
,auteur
,message
+"[failed]")
486 if cmd
in ["meur", "meurt","meurre","meurres"] and not canal
in self
.quiet_channels
:
487 serv
.privmsg(canal
,'%s: Mourir, impératif, 2ème personne du singulier : "meurs" (de rien)'%(auteur))
488 if cmd
in ["part","leave","dégage"]:
489 if auteur
in self
.ops
and (not (canal
in self
.stay_channels
)
490 or auteur
in self
.overops
):
492 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
493 self
.chanlist
.remove(canal
)
495 serv
.privmsg(canal
,"%s: Non, je reste !"%(auteur))
496 log(self
.serveur
,canal
,auteur
,message
+"[failed]")
498 if cmd
in ["deviens","pseudo"]:
499 if auteur
in self
.ops
:
502 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
503 if cmd
in ["coucou"] and not canal
in self
.quiet_channels
:
504 serv
.privmsg(canal
,"%s: coucou"%(auteur))
505 if cmd
in ["ping"] and not canal
in self
.quiet_channels
:
506 serv
.privmsg(canal
,"%s: pong"%(auteur))
507 if cmd
in ["date","dates","histoire","énigme","enigme","encore"]:
508 if canal
in self
.play_channels
:
509 if self
.play_status
.get(canal
,[-1])[0]==0:
511 self
.start_enigme(serv
,canal
)
513 serv
.privmsg(canal
,"%s: Je peux souffler une minute ?"%(auteur))
515 serv
.privmsg(canal
,("%s: Rappel : %s"%(auteur
,self
.play_status
[canal
][2])).encode("utf8") )
517 serv
.privmsg(canal
,"%s: pas ici…"%(auteur))
518 if cmd
in ["score","!score"]:
519 serv
.privmsg(auteur
,"Votre score : %s"%(self
.get_scores().get(auteur
,0)) )
520 if cmd
in ["scores","!scores"]:
521 scores
=self
.get_scores().items()
523 scores
.sort(lambda x
,y
:cmp(x
[1],y
[1]))
525 serv
.privmsg(auteur
,"Scores by score : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
527 scores
.sort(lambda x
,y
:cmp(x
[0].lower(),y
[0].lower()))
528 serv
.privmsg(auteur
,"Scores by pseudo : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
529 if cmd
=="indice" and canal
in self
.play_channels
:
530 self
.give_indice(serv
,canal
,None)
531 if is_tag(message
) and not canal
in self
.quiet_channels
:
532 if auteur
in self
.ops
:
533 action
=random
.choice(config
.tag_actions
)
534 serv
.action(canal
,action
.encode("utf8"))
535 self
.quiet_channels
.append(canal
)
537 answer
=random
.choice(config
.tag_answers
)
538 for ligne
in answer
.split("\n"):
539 serv
.privmsg(canal
,"%s: %s"%(auteur
,ligne
.encode("utf8")))
545 if self
.play_status
.get(canal
,[-1])[0] in [1,2]:
546 answer
=self
.play_status
[canal
][1]
547 flag_century
=self
.play_status
[canal
][3]
549 score_obtenu
=reussi(message
.decode("utf8"),answer
,auteur
)
552 serv
.privmsg(canal
,"%s: C'est le bon siècle, mais pas la bonne année, cherche encore ;)"%(auteur))
553 self
.play_status
[canal
][3]=1
556 if flag_century
in [0,1]:
557 serv
.privmsg(canal
,"%s: C'est la bonne décennie, mais pas la bonne année, encore un effort ;)"%(auteur))
558 self
.play_status
[canal
][3]=2
561 if self
.play_status
[canal
][0]==1:
562 bonusmsg
=u
" [+bonus_mois"*(score_obtenu
>config
.score_annee
)+u
"+bonus_jour"*(score_obtenu
>config
.score_annee
+config
.score_mois
)
568 serv
.privmsg(canal
,(u
"%s: bravo ! (C'était le %s)%s"%(auteur
,answer
,bonusmsg
)).encode("utf8"))
569 log(self
.serveur
,canal
,auteur
+"$win",message
)
570 if auteur
in config
.noscore
:
572 self
.add_score(auteur
,score_obtenu
)
574 self
.play_status
[canal
]=[0,token
]
575 serv
.execute_delayed(random
.randrange(config
.Ttrig
*5,config
.Ttrig
*10),self
.start_enigme
,(serv
,canal
,token
))
577 def on_kick(self
,serv
,ev
):
578 auteur
= irclib
.nm_to_n(ev
.source())
579 channel
= ev
.target()
580 victime
= ev
.arguments()[0]
581 raison
= ev
.arguments()[1]
582 if victime
==self
.nick
:
583 log(self
.serveur
,"%s kické de %s par %s (raison : %s)" %(victime
,channel
,auteur
,raison
))
586 self
.update_activity(channel
,"")
587 # on ne dit rien au rejoin
588 #l1,l2=config.kick_answers,config.kick_actions
589 #n1,n2=len(l1),len(l2)
590 #i=random.randrange(n1+n2)
592 # serv.action(channel,l2[i-n1].format(auteur).encode("utf8"))
594 # serv.privmsg(channel,l1[i].format(auteur).encode("utf8"))
596 def quitter(self
,chan
,leave_message
=None):
597 if leave_message
==None:
598 leave_message
=random
.choice(config
.leave_messages
)
600 leave_message
=leave_message
%(time
.strftime("le %d/%m/%Y à %T").decode("utf8"),self
.nick
)
603 self
.serv
.part(chan
,message
=leave_message
.encode("utf8"))
606 quit_message
=random
.choice(config
.quit_messages
)
608 quit_message
=quit_message
%(time
.strftime("le %d/%m/%Y à %T").decode("utf8"),self
.nick
)
611 self
.die(msg
=quit_message
.encode("utf8"))
613 def get_scores(self
):
614 f
=open(config
.score_file
)
615 scores
=pickle
.load(f
)
619 def add_score(self
,pseudo
,value
):
620 scores
=self
.get_scores()
621 if scores
.has_key(pseudo
):
622 scores
[pseudo
]+=value
625 self
.save_scores(scores
)
627 def save_scores(self
,scores
):
628 f
=open(config
.score_file
,"w")
629 pickle
.dump(scores
,f
)
633 return self
.serv
.get_nickname()
634 nick
= property(_getnick
)
636 def update_activity(self
,canal
,pseudo
):
637 if not pseudo
in config
.idle_bots
:
638 self
.last_activity
[canal
]=time
.time()
639 def is_active(self
,canal
):
640 return time
.time()-self
.last_activity
[canal
]<config
.idle_time
642 def start_as_daemon(self
, outfile
):
643 sys
.stderr
= Logger(outfile
)
647 class Logger(object):
648 """Pour écrire ailleurs que sur stdout"""
649 def __init__(self
, filename
="historien.full.log"):
650 self
.filename
= filename
652 def write(self
, message
):
653 f
= open(self
.filename
, "a")
658 if __name__
=="__main__":
661 print "Usage : historien.py <serveur> [--debug] [--no-output] [--daemon [--pidfile]] [--outfile]"
662 print " --outfile sans --no-output ni --daemon n'a aucun effet"
665 if "--daemon" in sys
.argv
:
666 thisfile
= os
.path
.realpath(__file__
)
667 thisdirectory
= thisfile
.rsplit("/", 1)[0]
668 os
.chdir(thisdirectory
)
672 if "debug" in sys
.argv
or "--debug" in sys
.argv
:
676 if "--no-output" in sys
.argv
or "--daemon" in sys
.argv
:
677 outfile
= "/var/log/bots/historien.full.log"
680 if arg
[0].strip('-') in ["out", "outfile", "logfile"]:
682 sys
.stdout
= Logger(outfile
)
683 serveurs
={"a♡":"acoeur.crans.org","acoeur":"acoeur.crans.org","acoeur.crans.org":"acoeur.crans.org",
684 "irc":"irc.crans.org","crans":"irc.crans.org","irc.crans.org":"irc.crans.org"}
686 serveur
=serveurs
[serveur
]
688 print "Server Unknown : %s"%(serveur)
690 historien
=Historien(serveur
,debug
)
692 child_pid
= os
.fork()
695 historien
.start_as_daemon(outfile
)
697 # on enregistre le pid de historien
698 pidfile
= "/var/run/bots/historien.pid"
701 if arg
[0].strip('-') in ["pidfile"]:
703 f
= open(pidfile
, "w")
704 f
.write("%s\n" % child_pid
)