]>
gitweb.pimeys.fr Git - bots/deconnaisseur.git/blob - deconnaisseur.py
3cc3f4774d215a7c9ee6b06bdfd89e14469fd16a
4 # Codé par 20-100 le 23/04/12
6 # Un bot IRC qui sort des déconnaissances
16 from remplace_accents
import remplace_accents
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 def reussi(message
,answer
,answer_regexp
,auteur
):
56 if auteur
in config
.level3
:
57 return answer
in message
58 if auteur
in config
.level2
:
59 return remplace_accents(answer
) in message
61 if re
.match(remplace_accents(answer_regexp
).lower(),remplace_accents(message
).lower()):
64 def is_something(chain
,matches
,avant
=u
".*(?:^| )",apres
=u
"(?:$|\.| |,|;).*",case_sensitive
=False,debug
=False):
66 chain
=unicode(chain
,"utf8")
68 chain
=unicode(chain
,"utf8").lower()
69 allmatches
="("+"|".join(matches
)+")"
70 reg
=(avant
+allmatches
+apres
).lower()
75 return is_something(chain
,config
.tag_triggers
)
77 class RefuseError(Exception):
80 class Deconnaisseur(ircbot
.SingleServerIRCBot
):
81 def __init__(self
,serveur
,debug
=False):
82 temporary_pseudo
=config
.pseudo
+str(random
.randrange(10000,100000))
83 ircbot
.SingleServerIRCBot
.__init
__(self
, [(serveur
, 6667)],
84 temporary_pseudo
,"Un bot irc.[flagellez 20-100, il le mérite]", 10)
87 self
.overops
=config
.overops
88 self
.ops
=self
.overops
+config
.ops
89 self
.chanlist
=config
.chanlist
90 self
.stay_channels
=config
.stay_channels
91 self
.play_channels
=config
.play_channels
92 self
.play_status
={i
:[0] for i
in self
.play_channels
}
94 self
.quiet_channels
=[]
96 def give_me_my_pseudo(self
,serv
):
97 serv
.privmsg("NickServ","RECOVER %s %s"%(config
.pseudo
,config
.password
))
98 serv
.privmsg("NickServ","RELEASE %s %s"%(config
.pseudo
,config
.password
))
100 serv
.nick(config
.pseudo
)
102 def on_welcome(self
, serv
, ev
):
103 self
.serv
=serv
# ça serv ira :)
104 self
.give_me_my_pseudo(serv
)
105 serv
.privmsg("NickServ","identify %s"%(config
.password
))
106 log(self
.serveur
,"Connected")
108 self
.chanlist
=["#bot"]
109 self
.play_channels
=["#bot"]
110 for c
in self
.chanlist
:
111 log(self
.serveur
,"JOIN %s"%(c))
113 self
.update_activity(c
,"") # la chaîne vide ne sera jamais un nom de bot et donc marchera toujours
114 for c
in self
.play_channels
:
115 token
=time
.time()-3600
116 self
.play_status
[c
]=[0,token
]
117 serv
.execute_delayed(random
.randrange(config
.ttrig
),self
.start_enigme
,(serv
,c
,token
))
119 def start_enigme(self
,serv
,channel
,token
=None):
120 # On reste silencieux si lechan n'est pas actif
121 if not self
.is_active(channel
):
122 serv
.execute_delayed(config
.ttrig
*5,self
.start_enigme
,(serv
,channel
,token
))
124 if self
.play_status
[channel
][0]==0 and channel
in self
.play_channels
:
126 if token
==self
.play_status
[channel
][-1]:
129 if time
.time() > self
.play_status
[channel
][-1]+config
.time_incompressible
:
134 enigme
,indice
,answer_reg
,answer
=self
.get_enigme()
135 log(self
.serveur
,channel
,u
"$Énigme$".encode("utf8"),("%s; %s; %s; %s"%(enigme
, indice
, answer_reg
, answer
)).encode("utf8"))
136 serv
.privmsg(channel
,enigme
.encode("utf8"))
138 self
.play_status
[channel
]=[1,enigme
,indice
,answer_reg
,answer
,token
]
139 serv
.execute_delayed(random
.randrange(config
.ttrig
*3,config
.ttrig
*5),self
.give_indice
,(serv
,channel
,token
))
142 def give_indice(self
,serv
,channel
,token
):
143 if self
.play_status
[channel
][0]==1:
145 # c'est donc que l'indice a été demandé
146 if self
.play_status
[channel
][-1]+config
.time_incompressible_clue
<time
.time():
147 token
=self
.play_status
[channel
][-1]
148 if self
.play_status
[channel
][-1]==token
:
149 indice
=self
.play_status
[channel
][2]
150 serv
.privmsg(channel
,"indice : %s"%(indice).encode("utf8"))
151 self
.play_status
[channel
][0]=2
152 serv
.execute_delayed(random
.randrange(config
.ttrig
*1,config
.ttrig
*3),self
.give_answer
,(serv
,channel
,token
))
153 def give_answer(self
,serv
,channel
,token
):
154 if self
.play_status
[channel
][0]==2 and self
.play_status
[channel
][-1]==token
:
155 answer
=self
.play_status
[channel
][4]
156 serv
.privmsg(channel
,"C'était : %s"%(answer).encode("utf8"))
158 self
.play_status
[channel
]=[0,token
]
159 serv
.execute_delayed(random
.randrange(config
.Ttrig
*5,config
.Ttrig
*10),self
.start_enigme
,(serv
,channel
,token
))
161 def get_enigme(self
):
162 # on récupère les déconnaissances
163 f
=open(config
.source_file
)
166 l
=re
.findall("%\n(.*)\n(.*)\n(.*)\n(.*)\n(.*)\n",t
)
167 dec
={int(i
[0]):list(i
[1:]) for i
in l
if len(i
)==5}
168 # on va chercher combien de fois elles ont été jouées
169 played_file
=get_config_played_file(self
.serveur
)
173 l
=re
.findall("(.*):(.*)",t
)
174 played
={int(i
[0]):int(i
[1]) for i
in l
}
175 # on récupère le nombre d'occurrences le plus faible
176 mini
=min(played
.values())
177 # on choisit un id dans ceux qui ont ce nombre d'occurences
178 id_choisi
=random
.choice([k
for k
,v
in played
.items() if v
==mini
])
179 enigme
,indice
,answer_reg
,answer
=dec
[id_choisi
]
180 # on incrémente la choisie
182 # on enregistre le played_file
183 f
=open(played_file
,"w")
184 f
.write("\n".join(["%-3s : %s"%(k
,v
) for k
,v
in played
.items()]))
186 return enigme
.decode("utf8"),indice
.decode("utf8"),answer_reg
.decode("utf8"),answer
.decode("utf8")
188 def pourmoi(self
, serv
, message
):
191 if message
[:size
]==pseudo
and len(message
)>size
and message
[size
]==":":
192 return (True,message
[size
+1:].strip(" "))
194 return (False,message
)
196 def on_privmsg(self
, serv
, ev
):
197 message
=ev
.arguments()[0]
198 auteur
= irclib
.nm_to_n(ev
.source())
200 test
=bot_unicode(message
)
201 except UnicodeBotError
:
203 "Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…")
205 message
=message
.split()
206 cmd
=message
[0].lower()
209 helpmsg_default
="""Liste des commandes :
210 HELP Affiche ce message d'aide
211 SCORE Affiche ton score (SCORE TRANSFERT <pseudo> [<n>] pour transférer des points)
212 SCORES Affiche les scores"""
214 JOIN Faire rejoindre un channel (sans paramètres, donne la liste des chans actuels)
215 LEAVE Faire quitter un channel
216 PLAY Passe un channel en mode "jouer"
217 NOPLAY Passe un channel en mode "ne pas jouer"
218 QUIET Se taire sur un channel
219 NOQUIET Opposé de QUIET
220 RELOAD Recharge lac config"""
222 SCORES {DEL|ADD|SUB} Tu veux un dessin ?
223 SAY Fais envoyer un message sur un chan ou à une personne
224 STAY Ignorera les prochains LEAVE pour un chan
225 NOSTAY Opposé de STAY
226 STATUS Montre l'état courant
228 helpmsg
=helpmsg_default
229 if auteur
in self
.ops
:
231 if auteur
in self
.overops
:
232 helpmsg
+=helpmsg_overops
233 for ligne
in helpmsg
.split("\n"):
234 serv
.privmsg(auteur
,ligne
)
236 if auteur
in self
.ops
:
238 if message
[1] in self
.chanlist
:
239 serv
.privmsg(auteur
,"Je suis déjà sur %s"%(message
[1]))
241 serv
.join(message
[1])
242 self
.chanlist
.append(message
[1])
243 self
.update_activity(message
[1],"")
244 serv
.privmsg(auteur
,"Channels : "+" ".join(self
.chanlist
))
245 log(self
.serveur
,"priv",auteur
," ".join(message
))
247 serv
.privmsg(auteur
,"Channels : "+" ".join(self
.chanlist
))
251 if auteur
in self
.ops
and len(message
)>1:
252 if message
[1] in self
.chanlist
:
253 if not (message
[1] in self
.stay_channels
) or auteur
in self
.overops
:
254 self
.quitter(message
[1]," ".join(message
[2:]))
255 self
.chanlist
.remove(message
[1])
256 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
258 serv
.privmsg(auteur
,"Non, je reste !")
259 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
261 serv
.privmsg(auteur
,"Je ne suis pas sur %s"%(message
[1]))
265 if auteur
in self
.overops
:
267 if message
[1] in self
.stay_channels
:
268 serv
.privmsg(auteur
,"Je stay déjà sur %s."%(message
[1]))
269 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
271 self
.stay_channels
.append(message
[1])
272 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
273 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
275 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
279 if auteur
in self
.overops
:
281 if message
[1] in self
.stay_channels
:
282 self
.stay_channels
.remove(message
[1])
283 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
284 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
286 serv
.privmsg(auteur
,"Je ne stay pas sur %s."%(message
[1]))
287 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
291 if auteur
in self
.ops
:
293 if message
[1] in self
.play_channels
:
294 serv
.privmsg(auteur
,"Je play déjà sur %s."%(message
[1]))
295 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
297 self
.play_channels
.append(message
[1])
298 self
.play_status
[message
[1]]=[0,time
.time()-3600]
299 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
300 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
302 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
306 if auteur
in self
.ops
:
308 if message
[1] in self
.play_channels
:
309 self
.play_channels
.remove(message
[1])
310 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
311 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
313 serv
.privmsg(auteur
,"Je ne play pas sur %s."%(message
[1]))
314 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
318 if auteur
in self
.ops
:
320 if message
[1] in self
.quiet_channels
:
321 serv
.privmsg(auteur
,"Je me la ferme déjà sur %s"%(message
[1]))
322 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
324 self
.quiet_channels
.append(message
[1])
325 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
326 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
328 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
332 if auteur
in self
.ops
:
334 if message
[1] in self
.quiet_channels
:
335 self
.quiet_channels
.remove(message
[1])
336 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
337 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
339 serv
.privmsg(auteur
,"Je ne me la ferme pas sur %s."%(message
[1]))
340 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
344 if auteur
in self
.ops
:
346 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
349 elif cmd
in ["states","status"]:
350 if auteur
in self
.overops
:
351 for k
in self
.play_status
.keys():
352 serv
.privmsg(auteur
,(u
"%s : %s"%(k
,"; ".join([unicode(i
) for i
in self
.play_status
[k
]]))).encode("utf8") )
354 if auteur
in self
.overops
and len(message
)>2:
355 serv
.privmsg(message
[1]," ".join(message
[2:]))
356 log(self
.serveur
,"priv",auteur
," ".join(message
))
357 elif len(message
)<=2:
358 serv
.privmsg(auteur
,"Syntaxe : SAY <channel> <message>")
362 if auteur
in self
.overops
:
363 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
367 if len(message
) in [3,4] and message
[1].lower()=="transfert":
368 scores
=self
.get_scores()
369 de
,to
=auteur
,message
[2]
370 value
=scores
.get(de
,0)
373 asked
=int(message
[3])
375 serv
.privmsg(auteur
,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
380 serv
.privmsg(auteur
,"Vous n'avez pas de points")
383 serv
.privmsg(auteur
,"Bien tenté…")
386 serv
.privmsg(auteur
,"Vous n'avez que %s points"%(value))
389 self
.add_score(de
,-asked
)
390 self
.add_score(to
,asked
)
391 serv
.privmsg(auteur
,"Transfert de %s points de %s à %s"%(asked
,de
,to
))
393 serv
.privmsg(auteur
,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
395 serv
.privmsg(auteur
,"Votre score : %s"%(self
.get_scores().get(auteur
,0)) )
398 scores
=self
.get_scores().items()
400 scores
.sort(lambda x
,y
:cmp(x
[1],y
[1]))
402 serv
.privmsg(auteur
,"Scores by score : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
404 scores
.sort(lambda x
,y
:cmp(x
[0].lower(),y
[0].lower()))
405 serv
.privmsg(auteur
,"Scores by pseudo : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
406 elif auteur
in self
.overops
:
407 souscmd
=message
[1].lower()
411 scores
=self
.get_scores()
412 if scores
.has_key(todelete
):
414 self
.save_scores(scores
)
415 serv
.privmsg(auteur
,"Score de %s supprimé"%(todelete))
417 serv
.privmsg(auteur
,"Ce score n'existe pas : %s"%(todelete))
419 serv
.privmsg(auteur
,"Syntaxe : SCORES DEL <pseudo>")
420 elif souscmd
in ["add","sub"]:
422 toadd
,val
=message
[2],message
[3]
426 serv
.privmsg(auteur
,"Syntaxe : SCORES {ADD|SUB} <pseudo> <n>")
430 self
.add_score(toadd
,val
)
431 serv
.privmsg(auteur
,"Done")
433 serv
.privmsg(auteur
,"Syntaxe : SCORES {ADD|SUB} <pseudo> <n>")
435 serv
.privmsg(auteur
,"Syntaxe : SCORES {DEL|ADD|SUB} <pseudo> [<n>]")
441 serv
.privmsg(auteur
,"Je n'ai pas compris. Essaye HELP…")
443 def on_pubmsg(self
, serv
, ev
):
444 auteur
= irclib
.nm_to_n(ev
.source())
446 message
= ev
.arguments()[0]
447 self
.update_activity(canal
,auteur
)
449 test
=bot_unicode(message
)
450 except UnicodeBotError
:
451 if not canal
in self
.quiet_channels
:
453 "%s: Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…"%(auteur))
456 pour_moi
,message
=self
.pourmoi(serv
,message
)
457 if pour_moi
and message
.split()!=[]:
458 cmd
=message
.split()[0].lower()
460 args
=" ".join(message
.split()[1:])
463 if cmd
in ["meurs","die","crève"]:
464 if auteur
in self
.overops
:
466 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
468 serv
.privmsg(canal
,"%s: crève !"%(auteur))
469 log(self
.serveur
,canal
,auteur
,message
+"[failed]")
470 elif cmd
in ["meur", "meurt","meurre","meurres"] and not canal
in self
.quiet_channels
:
471 serv
.privmsg(canal
,'%s: Mourir, impératif, 2ème personne du singulier : "meurs" (de rien)'%(auteur))
472 elif cmd
== "reload":
473 if auteur
in self
.ops
:
474 log(self
.serveur
, canal
, auteur
, message
+"[successful]")
476 elif cmd
in ["part","leave","dégage"]:
477 if auteur
in self
.ops
and (not (canal
in self
.stay_channels
)
478 or auteur
in self
.overops
):
480 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
481 self
.chanlist
.remove(canal
)
483 serv
.privmsg(canal
,"%s: Non, je reste !"%(auteur))
484 log(self
.serveur
,canal
,auteur
,message
+"[failed]")
486 elif cmd
in ["deviens","pseudo"]:
487 if auteur
in self
.ops
:
490 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
491 elif cmd
in ["coucou"] and not canal
in self
.quiet_channels
:
492 serv
.privmsg(canal
,"%s: coucou"%(auteur))
493 elif cmd
in ["ping"] and not canal
in self
.quiet_channels
:
494 serv
.privmsg(canal
,"%s: pong"%(auteur))
495 elif cmd
in ["déconnaissance","deconnaissance","énigme","enigme","encore"]:
496 if canal
in self
.play_channels
:
497 if self
.play_status
.get(canal
,[-1])[0]==0:
499 self
.start_enigme(serv
,canal
)
501 serv
.privmsg(canal
,"%s: Je peux souffler une minute ?"%(auteur))
503 serv
.privmsg(canal
,("%s: Rappel : %s"%(auteur
,self
.play_status
[canal
][1])).encode("utf8") )
505 serv
.privmsg(canal
,"%s: pas ici…"%(auteur))
506 elif cmd
in ["score","!score"]:
507 serv
.privmsg(auteur
,"Votre score : %s"%(self
.get_scores().get(auteur
,0)) )
508 elif cmd
in ["scores","!scores"]:
509 scores
=self
.get_scores().items()
511 scores
.sort(lambda x
,y
:cmp(x
[1],y
[1]))
513 serv
.privmsg(auteur
,"Scores by score : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
515 scores
.sort(lambda x
,y
:cmp(x
[0].lower(),y
[0].lower()))
516 serv
.privmsg(auteur
,"Scores by pseudo : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
517 elif cmd
=="indice" and canal
in self
.play_channels
:
518 self
.give_indice(serv
,canal
,None)
519 elif is_tag(message
) and not canal
in self
.quiet_channels
:
520 if auteur
in self
.ops
:
521 action
=random
.choice(config
.tag_actions
)
522 serv
.action(canal
,action
.encode("utf8"))
523 self
.quiet_channels
.append(canal
)
525 answer
=random
.choice(config
.tag_answers
)
526 for ligne
in answer
.split("\n"):
527 serv
.privmsg(canal
,"%s: %s"%(auteur
,ligne
.encode("utf8")))
528 elif "Bâille, cru aile ou orld" in message
:
529 self
.mourir(u
"Un de mes easters eggs (non en fait j'en ai qu'un) a été découvert par %s !"%auteur
)
535 if self
.play_status
.get(canal
,[-1])[0] in [1,2]:
536 answer_regexp
=self
.play_status
[canal
][3]
537 answer
=self
.play_status
[canal
][4]
538 if reussi(message
.decode("utf8"),answer
,answer_regexp
,auteur
):
539 serv
.privmsg(canal
,(u
"%s: bravo ! (C'était %s)"%(auteur
,answer
)).encode("utf8"))
540 log(self
.serveur
,canal
,auteur
+"$win",message
)
541 self
.add_score(auteur
,1)
543 self
.play_status
[canal
]=[0,token
]
544 serv
.execute_delayed(random
.randrange(config
.Ttrig
*5,config
.Ttrig
*10),self
.start_enigme
,(serv
,canal
,token
))
546 def on_kick(self
,serv
,ev
):
547 auteur
= irclib
.nm_to_n(ev
.source())
548 channel
= ev
.target()
549 victime
= ev
.arguments()[0]
550 raison
= ev
.arguments()[1]
551 if victime
==self
.nick
:
552 log(self
.serveur
,"%s kické de %s par %s (raison : %s)" %(victime
,channel
,auteur
,raison
))
555 self
.update_activity(channel
,"")
556 # on ne dit rien au rejoin
557 #l1,l2=config.kick_answers,config.kick_actions
558 #n1,n2=len(l1),len(l2)
559 #i=random.randrange(n1+n2)
561 # serv.action(channel,l2[i-n1].format(auteur).encode("utf8"))
563 # serv.privmsg(channel,l1[i].format(auteur).encode("utf8"))
565 def quitter(self
,chan
,leave_message
=None):
566 if leave_message
==None:
567 leave_message
=random
.choice(config
.leave_messages
)
568 self
.serv
.part(chan
,message
=leave_message
.encode("utf8"))
570 def mourir(self
,quit_message
=None):
571 if quit_message
==None:
572 quit_message
=random
.choice(config
.quit_messages
)
573 self
.die(msg
=quit_message
.encode("utf8"))
575 def get_scores(self
):
576 f
=open(config
.score_file
)
577 scores
=pickle
.load(f
)
581 def add_score(self
,pseudo
,value
):
582 scores
=self
.get_scores()
583 if scores
.has_key(pseudo
):
584 scores
[pseudo
]+=value
587 self
.save_scores(scores
)
589 def save_scores(self
,scores
):
590 f
=open(config
.score_file
,"w")
591 pickle
.dump(scores
,f
)
595 return self
.serv
.get_nickname()
596 nick
= property(_getnick
)
598 def update_activity(self
,canal
,pseudo
):
599 if not pseudo
in config
.idle_bots
:
600 self
.last_activity
[canal
]=time
.time()
601 def is_active(self
,canal
):
602 return time
.time()-self
.last_activity
[canal
]<config
.idle_time
604 def reload(self
, auteur
=None):
606 if auteur
in [None, "SIGHUP"]:
607 towrite
= "Config reloaded" + " (SIGHUP received)"*(auteur
== "SIGHUP")
608 for to
in config
.report_bugs_to
:
609 self
.serv
.privmsg(to
, towrite
)
610 log(self
.serveur
, towrite
)
612 self
.serv
.privmsg(auteur
,"Config reloaded")
614 def start_as_daemon(self
, outfile
):
615 sys
.stderr
= Logger(outfile
)
619 class Logger(object):
620 """Pour écrire ailleurs que sur stdout"""
621 def __init__(self
, filename
="deconnaisseur.full.log"):
622 self
.filename
= filename
624 def write(self
, message
):
625 f
= open(self
.filename
, "a")
630 if __name__
=="__main__":
633 print "Usage : deconnaisseur.py <serveur> [--debug] [--no-output] [--daemon [--pidfile]] [--outfile]"
634 print " --outfile sans --no-output ni --daemon n'a aucun effet"
637 if "--daemon" in sys
.argv
:
638 thisfile
= os
.path
.realpath(__file__
)
639 thisdirectory
= thisfile
.rsplit("/", 1)[0]
640 os
.chdir(thisdirectory
)
644 if "debug" in sys
.argv
or "--debug" in sys
.argv
:
648 serveurs
={"a♡":"acoeur.crans.org","acoeur":"acoeur.crans.org","acoeur.crans.org":"acoeur.crans.org",
649 "irc":"irc.crans.org","crans":"irc.crans.org","irc.crans.org":"irc.crans.org"}
650 if "--no-output" in sys
.argv
or "--daemon" in sys
.argv
:
651 outfile
= "/var/log/bots/deconnaisseur.full.log"
654 if arg
[0].strip('-') in ["out", "outfile", "logfile"]:
656 sys
.stdout
= Logger(outfile
)
658 serveur
=serveurs
[serveur
]
660 print "Server Unknown : %s"%(serveur)
662 deconnaisseur
=Deconnaisseur(serveur
,debug
)
663 # Si on reçoit un SIGHUP, on reload la config
664 def sighup_handler(signum
, frame
):
665 deconnaisseur
.reload("SIGHUP")
666 signal
.signal(signal
.SIGHUP
, sighup_handler
)
668 child_pid
= os
.fork()
671 deconnaisseur
.start_as_daemon(outfile
)
673 # on enregistre le pid de deconnaisseur
674 pidfile
= "/var/run/bots/deconnaisseur.pid"
677 if arg
[0].strip('-') in ["pidfile"]:
679 f
= open(pidfile
, "w")
680 f
.write("%s\n" % child_pid
)
683 deconnaisseur
.start()