3 # Codé par 20-100 (commencé le 21/06/12)
5 # Un bot IRC pour kicker à tour de bras de #déprime
10 import socket
, ssl
, json
17 # Oui, j'ai recodé ma version d'irclib pour pouvoir rattrapper les SIGHUP
18 sys
.path
.insert(0, "/home/vincent/scripts/python-myirclib")
27 def get_config_logfile(serveur
):
28 serveurs
={"acoeur.crans.org":"acoeur","irc.crans.org":"crans"}
29 return config
.logfile_template
%(serveurs
[serveur
])
32 def log(serveur
,channel
,auteur
=None,message
=None):
33 f
=open(get_config_logfile(serveur
),"a")
34 if auteur
==message
==None:
35 # alors c'est que c'est pas un channel mais juste une ligne de log
36 chain
="%s %s"%(time
.strftime("%F %T"),channel
)
38 chain
="%s [%s:%s] %s"%(time
.strftime("%F %T"),channel
,auteur
,message
)
40 if config
.debug_stdout
:
44 def ignore_event(serv
, ev
):
45 """Retourne ``True`` si il faut ignorer cet évènement."""
46 for (blackmask
, exceptmask
) in config
.blacklisted_masks
:
47 usermask
= ev
.source()
48 if exceptmask
is None:
51 exceptit
= bool(irclib
.mask_matches(usermask
, exceptmask
))
52 blackit
= bool(irclib
.mask_matches(usermask
, blackmask
))
53 if blackit
and not exceptit
:
56 reg_is_smiley
= re
.compile(u
".*("+u
"|".join(config
.smileys
)+u
")")
58 chain
=unicode(chain
,"utf8")
59 o
=re
.match(reg_is_smiley
,chain
)
62 reg_is_anglicisme
= re
.compile(u
".*(?:^| )(" + u
"|".join(config
.anglicismes
) + u
")(?:$|\.| |,|;)")
63 def is_anglicisme(chain
):
64 chain
= unicode(chain
, "utf8").lower()
65 o
= re
.match(reg_is_anglicisme
, chain
)
68 # Cette liste contient la liste des raisons pour lesquelles on peut se faire kicker
69 # chaque élément contient :
70 # - la fonction de détection du kick (qui matchera une regexp et renverra l'objet de match)
71 # - la raison donnée au moment du kick ({0} étant remplacé par ce qui a matché)
72 config
.kicking_list
= [
73 [is_smiley
, u
'"{0}" ? Ici on déprime.'],
74 [is_anglicisme
, u
'"{0}" ? Get out, you and your fucking anglicism !']
77 def is_something(chain
,matches
,avant
=u
".*(?:^| )",apres
=u
"(?:$|\.| |,|;).*",case_sensitive
=False,debug
=False):
79 chain
=unicode(chain
,"utf8")
81 chain
=unicode(chain
,"utf8").lower()
82 allmatches
="("+"|".join(matches
)+")"
83 reg
=(avant
+allmatches
+apres
).lower()
87 def is_insult(chain
,debug
=True):
88 return is_something(chain
,config
.insultes
,avant
=".*(?:^| |')")
89 def is_not_insult(chain
):
90 chain
=unicode(chain
,"utf8")
91 insult_regexp
=u
"("+u
"|".join(config
.insultes
)+u
")"
92 middle_regexp
=u
"(une? (?:(?:putain|enfoiré) d(?:e |'))*|)(?:| super )(?: (?:gros|petit|grand|énorme) |)"
93 reg
=".*pas %s%s.*"%(middle_regexp
,insult_regexp
)
94 if re
.match(reg
,chain
):
98 def is_compliment(chain
,debug
=True):
99 return is_something(chain
,config
.compliment_triggers
,avant
=".*(?:^| |')")
101 return is_something(chain
,config
.perdu
)
103 return is_something(chain
,config
.tag_triggers
)
105 return is_something(chain
,config
.tesla_triggers
,avant
=u
"^",apres
=u
"$",debug
=True)
107 return is_something(chain
,config
.merci_triggers
)
108 def is_tamere(chain
):
109 return is_something(chain
,config
.tamere_triggers
)
110 def is_bad_action_trigger(chain
,pseudo
):
111 return is_something(chain
,config
.bad_action_triggers
,avant
=u
"^",
112 apres
="(?: [a-z]*ment)? %s($|\.| |,|;).*"%(pseudo))
113 def is_good_action_trigger(chain
,pseudo
):
114 return is_something(chain
,config
.good_action_triggers
,avant
=u
"^",
115 apres
="(?: [a-z]*ment)? %s($|\.| |,|;).*"%(pseudo))
116 def is_bonjour(chain
):
117 return is_something(chain
,config
.bonjour_triggers
,avant
=u
"^")
118 def is_bonne_nuit(chain
):
119 return is_something(chain
,config
.bonne_nuit_triggers
,avant
=u
"^")
121 return re
.match(u
"^(pan|bim|bang)( .*)?$",unicode(chain
,"utf8").lower().strip())
124 _
,_
,_
,h
,m
,s
,_
,_
,_
=time
.localtime()
125 return (conf
[0],0,0)<(h
,m
,s
)<(conf
[1],0,0)
127 return is_time(config
.daytime
)
129 return is_time(config
.nighttime
)
132 class UnicodeBotError(Exception):
134 def bot_unicode(chain
):
136 unicode(chain
,"utf8")
137 except UnicodeDecodeError as exc
:
138 raise UnicodeBotError
140 class Themis(ircbot
.SingleServerIRCBot
):
141 def __init__(self
,serveur
,debug
=False):
142 temporary_pseudo
=config
.irc_pseudo
+str(random
.randrange(10000,100000))
143 ircbot
.SingleServerIRCBot
.__init
__(self
, [(serveur
, 6667)],
144 temporary_pseudo
,"Des[bot]e de #déprime", 10)
147 self
.overops
=config
.overops
148 self
.ops
=self
.overops
+config
.ops
149 self
.report_bugs_to
=config
.report_bugs_to
150 self
.chanlist
=config
.chanlist
151 self
.kick_channels
=config
.kick_channels
152 self
.stay_channels
=config
.stay_channels
153 self
.quiet_channels
=config
.quiet_channels
157 def give_me_my_pseudo(self
,serv
):
158 serv
.privmsg("NickServ","RECOVER %s %s"%(config
.irc_pseudo
,config
.irc_password
))
159 serv
.privmsg("NickServ","RELEASE %s %s"%(config
.irc_pseudo
,config
.irc_password
))
161 serv
.nick(config
.irc_pseudo
)
163 def give_me_my_op_status(self
,serv
,chan
):
164 serv
.privmsg("ChanServ","OP %s"%(chan))
166 def on_welcome(self
, serv
, ev
):
167 self
.serv
=serv
# ça serv ira
168 self
.give_me_my_pseudo(serv
)
169 serv
.privmsg("NickServ","identify %s"%(config
.irc_password
))
170 log(self
.serveur
,"Connected")
172 self
.chanlist
=["#bot"]
173 self
.kick_channels
=["#bot"]
174 for c
in self
.chanlist
:
175 log(self
.serveur
,"JOIN %s"%(c))
177 self
.give_me_my_op_status(serv
,c
)
180 def lost(self
,serv
,channel
,forced
=False):
181 if self
.last_perdu
+config
.time_between_perdu
<time
.time() or forced
:
182 if not channel
in self
.quiet_channels
or forced
:
183 serv
.privmsg(channel
,"J'ai perdu !")
184 self
.last_perdu
=time
.time()
185 delay
=config
.time_between_perdu_trigger
186 delta
=config
.time_between_perdu_trigger_delta
187 serv
.execute_delayed(random
.randrange(delay
-delta
,delay
+delta
),self
.lost
,(serv
,channel
))
189 def pourmoi(self
, serv
, message
):
190 """renvoie (False,lemessage) ou (True, le message amputé de "pseudo: ")"""
193 if message
[:size
]==pseudo
and len(message
)>size
and message
[size
]==":":
194 return (True,message
[size
+1:].lstrip(" "))
196 return (False,message
)
198 def on_privmsg(self
, serv
, ev
):
199 if ignore_event(serv
, ev
):
201 message
=ev
.arguments()[0]
202 auteur
= irclib
.nm_to_n(ev
.source())
204 test
=bot_unicode(message
)
205 except UnicodeBotError
:
206 if config
.utf8_trigger
:
207 serv
.privmsg(auteur
, random
.choice(config
.utf8_fail_answers
).encode("utf8"))
209 message
=message
.split()
210 cmd
=message
[0].lower()
213 helpdico
={"help":["""HELP <commande>
214 Affiche de l'aide sur la commande""",None,None],
215 "join": [None, """JOIN <channel>
216 Me fait rejoindre le channel""",None],
217 "leave": [None,"""LEAVE <channel>
218 Me fait quitter le channel (sauf s'il est dans ma stay_list).""",None],
219 "quiet": [None,"""QUIET <channel>
220 Me rend silencieux sur le channel.""",None],
221 "noquiet": [None,"""NOQUIET <channel>
222 Me rend la parole sur le channel.""",None],
223 "reload": [None,"""RELOAD
224 Recharge la configuration.""",None],
225 "say": [None,None,"""SAY <channel> <message>
226 Me fait parler sur le channel."""],
227 "do": [None,None,"""DO <channel> <action>
228 Me fait faitre une action (/me) sur le channel."""],
229 "stay": [None,None,"""STAY <channel>
230 Ajoute le channel à ma stay_list."""],
231 "nostay": [None,None,"""NOSTAY <channel>
232 Retire le channel de ma stay_list."""],
233 "ops": [None,None,"""OPS
234 Affiche la liste des ops."""],
235 "overops": [None,None,"""OVEROPS
236 Affiche la liste des overops."""],
237 "kick": [None,None,"""KICK <channel> <pseudo> [<raison>]
238 Kicke <pseudo> du channel (Il faut bien entendu que j'y sois op)."""],
239 "die": [None,None,"""DIE
240 Me déconnecte du serveur IRC."""]
242 helpmsg_default
="Liste des commandes disponibles :\nHELP"
243 helpmsg_ops
=" JOIN LEAVE QUIET NOQUIET LOST RELOAD"
244 helpmsg_overops
=" SAY DO STAY NOSTAY OPS OVEROPS KICK DIE"
245 op
,overop
=auteur
in self
.ops
, auteur
in self
.overops
247 helpmsg
=helpmsg_default
251 helpmsg
+=helpmsg_overops
253 helpmsgs
=helpdico
.get(message
[1].lower(),["Commande inconnue.",None,None])
255 if op
and helpmsgs
[1]:
257 helpmsg
+="\n"+helpmsgs
[1]
260 if overop
and helpmsgs
[2]:
262 helpmsg
+="\n"+helpmsgs
[2]
265 for ligne
in helpmsg
.split("\n"):
266 serv
.privmsg(auteur
,ligne
)
268 if auteur
in self
.ops
:
270 if message
[1] in self
.chanlist
:
271 serv
.privmsg(auteur
,"Je suis déjà sur %s"%(message
[1]))
273 serv
.join(message
[1])
274 self
.chanlist
.append(message
[1])
275 serv
.privmsg(auteur
,"Channels : "+" ".join(self
.chanlist
))
276 log(self
.serveur
,"priv",auteur
," ".join(message
))
278 serv
.privmsg(auteur
,"Channels : "+" ".join(self
.chanlist
))
282 if auteur
in self
.ops
and len(message
)>1:
283 if message
[1] in self
.chanlist
:
284 if not (message
[1] in self
.stay_channels
) or auteur
in self
.overops
:
285 self
.quitter(message
[1]," ".join(message
[2:]))
286 self
.chanlist
.remove(message
[1])
287 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
289 serv
.privmsg(auteur
,random
.choice(config
.leave_fail_messages
))
290 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
292 serv
.privmsg(auteur
,"Je ne suis pas sur %s"%(message
[1]))
296 if auteur
in self
.overops
:
298 if message
[1] in self
.stay_channels
:
299 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
300 serv
.privmsg(auteur
,"Je stay déjà sur %s."%(message
[1]))
302 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
303 self
.stay_channels
.append(message
[1])
304 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
306 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
310 if auteur
in self
.overops
:
312 if message
[1] in self
.stay_channels
:
313 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
314 self
.stay_channels
.remove(message
[1])
315 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
317 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
318 serv
.privmsg(auteur
,"Je ne stay pas sur %s."%(message
[1]))
323 if auteur
in self
.overops
:
324 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
329 if auteur
in self
.ops
:
331 if message
[1] in self
.quiet_channels
:
332 serv
.privmsg(auteur
,"Je me la ferme déjà sur %s"%(message
[1]))
333 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
335 self
.quiet_channels
.append(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
,"Quiet channels : "+" ".join(self
.quiet_channels
))
343 if auteur
in self
.ops
:
345 if message
[1] in self
.quiet_channels
:
346 self
.quiet_channels
.remove(message
[1])
347 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
348 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
350 serv
.privmsg(auteur
,"Je ne me la ferme pas sur %s."%(message
[1]))
351 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
355 if auteur
in self
.ops
:
357 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
361 if auteur
in self
.overops
and len(message
)>2:
362 serv
.privmsg(message
[1]," ".join(message
[2:]))
363 log(self
.serveur
,"priv",auteur
," ".join(message
))
364 elif len(message
)<=2:
365 serv
.privmsg(auteur
,"Syntaxe : SAY <channel> <message>")
369 if auteur
in self
.overops
and len(message
)>2:
370 serv
.action(message
[1]," ".join(message
[2:]))
371 log(self
.serveur
,"priv",auteur
," ".join(message
))
372 elif len(message
)<=2:
373 serv
.privmsg(auteur
,"Syntaxe : DO <channel> <action>")
377 if auteur
in self
.overops
and len(message
)>2:
378 serv
.kick(message
[1],message
[2]," ".join(message
[3:]))
379 log(self
.serveur
,"priv",auteur
," ".join(message
))
380 elif len(message
)<=2:
381 serv
.privmsg(auteur
,"Syntaxe : KICK <channel> <pseudo> [<raison>]")
385 if auteur
in self
.overops
:
386 serv
.privmsg(auteur
," ".join(self
.ops
))
390 if auteur
in self
.overops
:
391 serv
.privmsg(auteur
," ".join(self
.overops
))
397 serv
.privmsg(auteur
,"Je n'ai pas compris. Essayez HELP…")
399 def on_pubmsg(self
, serv
, ev
):
400 if ignore_event(serv
, ev
):
402 auteur
= irclib
.nm_to_n(ev
.source())
404 message
= ev
.arguments()[0]
406 test
=bot_unicode(message
)
407 except UnicodeBotError
:
408 if config
.utf8_trigger
and not canal
in self
.quiet_channels
:
409 serv
.privmsg(canal
, (u
"%s: %s"%(auteur
,random
.choice(config
.utf8_fail_answers
))).encode("utf8"))
411 pour_moi
,message
=self
.pourmoi(serv
,message
)
412 for (detect
, reason
) in config
.kicking_list
:
413 matching
= detect(message
)
415 if canal
in self
.kick_channels
:
416 serv
.kick(canal
,auteur
,(reason
.format(matching
.groups()[0])).encode("utf8"))
418 if pour_moi
and message
.split()!=[]:
419 cmd
=message
.split()[0].lower()
421 args
=" ".join(message
.split()[1:])
424 if cmd
in ["meurs","die","crève","pends-toi"]:
425 if auteur
in self
.overops
:
426 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
429 serv
.privmsg(canal
,"%s: %s"%(auteur
,random
.choice(config
.quit_fail_messages
)))
430 log(self
.serveur
,canal
,auteur
,message
+"[failed]")
431 elif cmd
== "reload":
432 if auteur
in self
.ops
:
433 log(self
.serveur
, canal
, auteur
, message
+"[successful]")
435 elif cmd
in ["part","leave","dégage","va-t-en"]:
436 if auteur
in self
.ops
and (not (canal
in self
.stay_channels
)
437 or auteur
in self
.overops
):
439 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
440 if canal
in self
.chanlist
:
441 self
.chanlist
.remove(canal
)
443 serv
.privmsg(canal
,"%s: %s"%(auteur
,random
.choice(config
.leave_fail_messages
)))
444 log(self
.serveur
,canal
,auteur
,message
+"[failed]")
446 elif cmd
in ["deviens","pseudo"]:
447 if auteur
in self
.ops
:
450 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
452 elif cmd
in ["meur", "meurt","meurre","meurres"] and not canal
in self
.quiet_channels
:
453 serv
.privmsg(canal
,'%s: Mourir, impératif, 2ème personne du singulier : "meurs" (de rien)'%(auteur))
454 elif cmd
in ["ping"] and not canal
in self
.quiet_channels
:
455 serv
.privmsg(canal
,"%s: pong"%(auteur))
456 # if is_insult(message) and not canal in self.quiet_channels:
457 # if is_not_insult(message):
458 # answer=random.choice(config.compliment_answers)
459 # for ligne in answer.split("\n"):
460 # serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8")))
462 # answer=random.choice(config.insultes_answers)
463 # for ligne in answer.split("\n"):
464 # serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8")))
465 # elif is_compliment(message) and not canal in self.quiet_channels:
466 # answer=random.choice(config.compliment_answers)
467 # for ligne in answer.split("\n"):
468 # serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8")))
469 elif is_tesla(message
) and not canal
in self
.quiet_channels
:
470 l1
,l2
=config
.tesla_answers
,config
.tesla_actions
471 n1
,n2
=len(l1
),len(l2
)
472 i
=random
.randrange(n1
+n2
)
474 serv
.action(canal
,l2
[i
-n1
].encode("utf8"))
476 serv
.privmsg(canal
,"%s: %s"%(auteur
,l1
[i
].encode("utf8")))
477 elif is_tag(message
) and not canal
in self
.quiet_channels
:
478 if auteur
in self
.ops
:
479 action
=random
.choice(config
.tag_actions
)
480 serv
.action(canal
,action
.encode("utf8"))
481 self
.quiet_channels
.append(canal
)
483 answer
=random
.choice(config
.tag_answers
)
484 for ligne
in answer
.split("\n"):
485 serv
.privmsg(canal
,"%s: %s"%(auteur
,ligne
.encode("utf8")))
486 elif is_bonjour(message
) and not canal
in self
.quiet_channels
:
488 answer
=random
.choice(config
.night_answers
)
490 answer
=random
.choice(config
.bonjour_answers
)
492 answer
=random
.choice(config
.bonsoir_answers
)
493 serv
.privmsg(canal
,answer
.format(auteur
).encode("utf8"))
494 elif is_bonne_nuit(message
) and not canal
in self
.quiet_channels
:
495 answer
=random
.choice(config
.bonne_nuit_answers
)
496 serv
.privmsg(canal
,answer
.format(auteur
).encode("utf8"))
498 if not canal
in self
.quiet_channels
:
500 if re
.match((u
"^("+u
"|".join(config
.bonjour_triggers
)
501 +u
")( {}| all| tout le monde|(|à) tous)(\.|( |)!|)$"
502 ).format(mypseudo
).lower(), message
.strip().lower()):
503 answer
=random
.choice(config
.bonjour_answers
)
504 serv
.privmsg(canal
,answer
.format(auteur
).encode("utf8"))
506 def on_action(self
, serv
, ev
):
507 if ignore_event(serv
, ev
):
509 action
= ev
.arguments()[0]
510 auteur
= irclib
.nm_to_n(ev
.source())
511 channel
= ev
.target()
513 test
=bot_unicode(action
)
514 except UnicodeBotError
:
515 if config
.utf8_trigger
and not canal
in self
.quiet_channels
:
516 serv
.privmsg(canal
, (u
"%s: %s"%(auteur
,random
.choice(config
.utf8_fail_answers
))).encode("utf8"))
520 # if is_bad_action_trigger(action,mypseudo) and not channel in self.quiet_channels:
521 # l1,l2=config.bad_action_answers,config.bad_action_actions
522 # n1,n2=len(l1),len(l2)
523 # i=random.randrange(n1+n2)
525 # serv.action(channel,l2[i-n1].format(auteur).encode("utf8"))
527 # serv.privmsg(channel,l1[i].format(auteur).format(auteur).encode("utf8"))
528 # if is_good_action_trigger(action,mypseudo) and not channel in self.quiet_channels:
529 # l1,l2=config.good_action_answers,config.good_action_actions
530 # n1,n2=len(l1),len(l2)
531 # i=random.randrange(n1+n2)
533 # serv.action(channel,l2[i-n1].format(auteur).format(auteur).encode("utf8"))
535 # serv.privmsg(channel,l1[i].format(auteur).format(auteur).encode("utf8"))
537 def on_kick(self
,serv
,ev
):
538 auteur
= irclib
.nm_to_n(ev
.source())
539 channel
= ev
.target()
540 victime
= ev
.arguments()[0]
541 raison
= ev
.arguments()[1]
542 if victime
==self
.nick
:
543 log(self
.serveur
,"%s kické de %s par %s (raison : %s)" %(victime
,channel
,auteur
,raison
))
546 username
= irclib
.nm_to_u(ev
.source()).lower()
548 print channel
, username
549 if channel
== "#déprime" and "peb" in username
or "becue" in username
:
551 serv
.execute_delayed(5, serv
.kick
, (auteur
, "Va abuser de tes droits ailleurs !"))
553 def kicker(self
, chan
, pseudo
, raison
=None):
555 raison
= config
.kick_default_reason
556 self
.serv
.kick(chan
,pseudo
,raison
)
558 def quitter(self
,chan
,leave_message
=None):
559 if leave_message
==None:
560 leave_message
=random
.choice(config
.leave_messages
)
561 self
.serv
.part(chan
,message
=leave_message
.encode("utf8"))
564 quit_message
=random
.choice(config
.quit_messages
)
565 self
.die(msg
=quit_message
.encode("utf8"))
568 return self
.serv
.get_nickname()
569 nick
=property(_getnick
)
571 def reload(self
, auteur
=None):
573 if auteur
in [None, "SIGHUP"]:
574 towrite
= "Config reloaded" + " (SIGHUP received)"*(auteur
== "SIGHUP")
575 for to
in config
.report_bugs_to
:
576 self
.serv
.privmsg(to
, towrite
)
577 log(self
.serveur
, towrite
)
579 self
.serv
.privmsg(auteur
,"Config reloaded")
581 def start_as_daemon(self
, outfile
):
582 sys
.stderr
= Logger(outfile
)
586 class Logger(object):
587 """Pour écrire ailleurs que sur stdout"""
588 def __init__(self
, filename
="themis.full.log"):
589 self
.filename
= filename
591 def write(self
, message
):
592 f
= open(self
.filename
, "a")
597 if __name__
=="__main__":
600 print "Usage : themis.py <serveur> [--debug] [--no-output] [--daemon [--pidfile]] [--outfile]"
601 print " --outfile sans --no-output ni --daemon n'a aucun effet"
604 if "--daemon" in sys
.argv
:
605 thisfile
= os
.path
.realpath(__file__
)
606 thisdirectory
= thisfile
.rsplit("/", 1)[0]
607 os
.chdir(thisdirectory
)
611 if "debug" in sys
.argv
or "--debug" in sys
.argv
:
615 if "--no-output" in sys
.argv
or "--daemon" in sys
.argv
:
616 outfile
= "/var/log/bots/themis.full.log"
619 if arg
[0].strip('-') in ["out", "outfile", "logfile"]:
621 sys
.stdout
= Logger(outfile
)
622 serveurs
={"a♡":"acoeur.crans.org","acoeur":"acoeur.crans.org","acoeur.crans.org":"acoeur.crans.org",
623 "irc":"irc.crans.org","crans":"irc.crans.org","irc.crans.org":"irc.crans.org"}
625 serveur
=serveurs
[serveur
]
627 print "Server Unknown : %s"%(serveur)
629 themis
=Themis(serveur
,debug
)
630 # Si on reçoit un SIGHUP, on reload la config
631 def sighup_handler(signum
, frame
):
632 themis
.reload("SIGHUP")
633 signal
.signal(signal
.SIGHUP
, sighup_handler
)
635 child_pid
= os
.fork()
638 themis
.start_as_daemon(outfile
)
640 # on enregistre le pid de themis
641 pidfile
= "/var/run/bots/themis.pid"
644 if arg
[0].strip('-') in ["pidfile"]:
646 f
= open(pidfile
, "w")
647 f
.write("%s\n" % child_pid
)