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")
23 config_password
="Yamoussoukro"
24 config_pseudo
="salesman"
25 config_chanlist
=["#bot","#flood"]
26 config_play_channels
=["#flood"]
27 config_stay_channels
=["#flood","#bot"]
28 config_overops
=["[20-100]","[20-100]_"]
29 config_ops
=["PEB","Petite-Peste"]
31 config_source_file
="capitales.txt"
32 config_played_file_template
="played.%s.txt" #il faut rajouter le nom du serveur
33 def get_config_played_file(serveur
):
34 serveurs
={"acoeur.crans.org":"acoeur","irc.crans.org":"crans"}
35 return config_played_file_template
%(serveurs
[serveur
])
36 ttrig
=120 #time trigger (normalement 120, mais diminué pour les tests)
37 Ttrig
=600 #between two enigms
38 config_time_incompressible
=15 #on peut pas retrigger en dessous de ce temps (60)
39 config_time_incompressible_clue
=60 #on peut pas forcer la demande d'indice en dessous
41 config_score_file
="scores.pickle"
43 config_tag_triggers
=[u
"t(|a)g",u
"ta gueule",u
"la ferme",u
"ferme( |-)la",u
"tais-toi",u
"chut"]
44 config_tag_actions
=[u
"se tait",u
"ferme sa gueule",u
"se la ferme",u
"la ferme"]
45 config_tag_answers
=[u
"J'me tais si j'veux !",
46 u
"Je t'entends pas :°",
48 u
"Non, j'ai pas envie",
49 u
"Peut-être quand toi tu la fermeras, et encore…"]
54 config_debug_stdout
= True
55 config_logfile_template
="salesman.%s.log"
56 def get_config_logfile(serveur
):
57 serveurs
={"acoeur.crans.org":"acoeur","irc.crans.org":"crans"}
58 return config_logfile_template
%(serveurs
[serveur
])
60 config_quit_messages
=[u
"goto Tombouctou"]
62 config_leave_messages
=[u
"On continuera à jouer plus tard ;)"]
64 # Quand personne ne cause, on finit par se taire
65 # temps au bout duquel, si personne n'a parlé, on se tait
66 config_idle_time
=20*60
67 # liste des bots, qui ne sont pas considérés comme de l'activité
68 config_idle_bots
=["deconnaisseur","Basile","historien","hung","salesman","Shadobot","Wen","___","Sanctuary","Saturnin"]
70 class UnicodeBotError(Exception):
72 def bot_unicode(chain
):
75 except UnicodeDecodeError:
78 def log(serveur
,channel
,auteur
=None,message
=None):
79 f
=open(get_config_logfile(serveur
),"a")
80 if auteur
==message
==None:
81 # alors c'est que c'est pas un channel mais juste une ligne de log
82 chain
="%s %s"%(time
.strftime("%F %T"),channel
)
84 chain
="%s [%s:%s] %s"%(time
.strftime("%F %T"),channel
,auteur
,message
)
86 if config_debug_stdout
:
91 def reussi(message
,answer
,auteur
):
92 if auteur
in config_level3
:
93 return answer
in message
94 if auteur
in config_level2
:
95 return remplace_accents(answer
) in message
97 if re
.match(".*"+remplace_accents(answer
).lower(),remplace_accents(message
).lower()):
100 def is_something(chain
,matches
,avant
=u
".*(?:^| )",apres
=u
"(?:$|\.| |,|;).*",case_sensitive
=False,debug
=False):
102 chain
=unicode(chain
,"utf8")
104 chain
=unicode(chain
,"utf8").lower()
105 allmatches
="("+"|".join(matches
)+")"
106 reg
=(avant
+allmatches
+apres
).lower()
107 o
=re
.match(reg
,chain
)
111 return is_something(chain
,config_tag_triggers
)
113 class RefuseError(Exception):
116 class Salesman(ircbot
.SingleServerIRCBot
):
117 def __init__(self
,serveur
,debug
=False):
118 temporary_pseudo
=config_pseudo
+str(random
.randrange(10000,100000))
119 ircbot
.SingleServerIRCBot
.__init
__(self
, [(serveur
, 6667)],
120 temporary_pseudo
,"Un bot irc.[flagellez 20-100, il le mérite]", 10)
123 self
.overops
=config_overops
124 self
.ops
=self
.overops
+config_ops
125 self
.chanlist
=config_chanlist
126 self
.stay_channels
=config_stay_channels
127 self
.play_channels
=config_play_channels
128 self
.play_status
={i
:[0] for i
in self
.play_channels
}
129 self
.last_activity
={}
130 self
.quiet_channels
=[]
132 def give_me_my_pseudo(self
,serv
):
133 serv
.privmsg("NickServ","RECOVER %s %s"%(config_pseudo
,config_password
))
134 serv
.privmsg("NickServ","RELEASE %s %s"%(config_pseudo
,config_password
))
136 serv
.nick(config_pseudo
)
138 def on_welcome(self
, serv
, ev
):
139 self
.serv
=serv
# ça serv ira :)
140 self
.give_me_my_pseudo(serv
)
141 serv
.privmsg("NickServ","identify %s"%(config_password))
142 log(self
.serveur
,"Connected")
144 self
.chanlist
=["#bot"]
145 self
.play_channels
=["#bot"]
146 for c
in self
.chanlist
:
147 log(self
.serveur
,"JOIN %s"%(c))
149 self
.update_activity(c
,"") # la chaîne vide ne sera jamais un nom de bot et donc marchera toujours
150 for c
in self
.play_channels
:
151 token
=time
.time()-3600
152 self
.play_status
[c
]=[0,token
]
153 serv
.execute_delayed(random
.randrange(ttrig
),self
.start_enigme
,(serv
,c
,token
))
155 def start_enigme(self
,serv
,channel
,token
=None):
156 # On reste silencieux si lechan n'est pas actif
157 if not self
.is_active(channel
):
158 serv
.execute_delayed(ttrig
*5,self
.start_enigme
,(serv
,channel
,token
))
160 if self
.play_status
[channel
][0]==0 and channel
in self
.play_channels
:
162 if token
==self
.play_status
[channel
][-1]:
165 if time
.time() > self
.play_status
[channel
][-1]+config_time_incompressible
:
170 enigme
,answer
=self
.get_enigme()
171 log(self
.serveur
,channel
,u
"$Énigme$".encode("utf8"),("%s | %s"%(enigme
, answer
)).encode("utf8"))
172 serv
.privmsg(channel
,enigme
.encode("utf8"))
174 self
.play_status
[channel
]=[1,enigme
,answer
,token
]
175 # ce bot n'a pas d'indices
176 serv
.execute_delayed(random
.randrange(ttrig
*7,ttrig
*10),self
.give_answer
,(serv
,channel
,token
))
179 def give_answer(self
,serv
,channel
,token
):
180 if self
.play_status
[channel
][0]==1 and self
.play_status
[channel
][-1]==token
:
181 answer
=self
.play_status
[channel
][2]
182 serv
.privmsg(channel
,"C'était : %s"%(answer).encode("utf8"))
184 self
.play_status
[channel
]=[0,token
]
185 serv
.execute_delayed(random
.randrange(Ttrig
*5,Ttrig
*10),self
.start_enigme
,(serv
,channel
,token
))
187 def get_enigme(self
):
188 # on récupère les capitales
189 f
=open(config_source_file
)
190 l
=[i
.strip("\n") for i
in f
.readlines()]
192 l
=[i
.split(" | ") for i
in l
]
193 dec
={int(i
[0]):list(i
[1:]) for i
in l
}
194 # on va chercher combien de fois elles ont été jouées
195 played_file
=get_config_played_file(self
.serveur
)
199 l
=re
.findall("(.*):(.*)",t
)
200 played
={int(i
[0]):int(i
[1]) for i
in l
}
201 # on récupère le nombre d'occurrences le plus faible
202 mini
=min(played
.values())
203 # on choisit un id dans ceux qui ont ce nombre d'occurences
204 id_choisi
=random
.choice([k
for k
,v
in played
.items() if v
==mini
])
205 capitale
,pays
=dec
[id_choisi
]
206 # on peut jouer capitale -> pays ou pays -> capitale
207 enigme
,answer
=random
.choice([[capitale
,pays
],[pays
,capitale
]])
208 # on incrémente la choisie
210 # on enregistre le played_file
211 f
=open(played_file
,"w")
212 f
.write("\n".join(["%-3s : %s"%(k
,v
) for k
,v
in played
.items()]))
214 return map(lambda x
:x
.decode("utf8"), [enigme
,answer
])
216 def pourmoi(self
, serv
, message
):
219 if message
[:size
]==pseudo
and len(message
)>size
and message
[size
]==":":
220 return (True,message
[size
+1:].strip(" "))
222 return (False,message
)
224 def on_privmsg(self
, serv
, ev
):
225 message
=ev
.arguments()[0]
226 auteur
= irclib
.nm_to_n(ev
.source())
228 test
=bot_unicode(message
)
229 except UnicodeBotError
:
231 "Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…")
233 message
=message
.split()
234 cmd
=message
[0].lower()
237 helpmsg_default
="""Liste des commandes :
238 HELP Affiche ce message d'aide
239 SCORE Affiche ton score (SCORE TRANSFERT <pseudo> [<n>] pour transférer des points)
240 SCORES Affiche les scores"""
242 JOIN Faire rejoindre un channel (sans paramètres, donne la liste des chans actuels)
243 LEAVE Faire quitter un channel
244 PLAY Passe un channel en mode "jouer"
245 NOPLAY Passe un channel en mode "ne pas jouer"
246 QUIET Se taire sur un channel
247 NOQUIET Opposé de QUIET"""
249 SCORES {DEL|ADD|SUB} Tu veux un dessin ?
250 SAY Fais envoyer un message sur un chan ou à une personne
251 STAY Ignorera les prochains LEAVE pour un chan
252 NOSTAY Opposé de STAY
253 STATUS Montre l'état courant
255 helpmsg
=helpmsg_default
256 if auteur
in self
.ops
:
258 if auteur
in self
.overops
:
259 helpmsg
+=helpmsg_overops
260 for ligne
in helpmsg
.split("\n"):
261 serv
.privmsg(auteur
,ligne
)
263 if auteur
in self
.ops
:
265 if message
[1] in self
.chanlist
:
266 serv
.privmsg(auteur
,"Je suis déjà sur %s"%(message
[1]))
268 serv
.join(message
[1])
269 self
.chanlist
.append(message
[1])
270 serv
.privmsg(auteur
,"Channels : "+" ".join(self
.chanlist
))
271 log(self
.serveur
,"priv",auteur
," ".join(message
))
273 serv
.privmsg(auteur
,"Channels : "+" ".join(self
.chanlist
))
277 if auteur
in self
.ops
and len(message
)>1:
278 if message
[1] in self
.chanlist
:
279 if not (message
[1] in self
.stay_channels
) or auteur
in self
.overops
:
280 self
.quitter(message
[1]," ".join(message
[2:]))
281 self
.chanlist
.remove(message
[1])
282 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
284 serv
.privmsg(auteur
,"Non, je reste !")
285 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
287 serv
.privmsg(auteur
,"Je ne suis pas sur %s"%(message
[1]))
291 if auteur
in self
.overops
:
293 if message
[1] in self
.stay_channels
:
294 serv
.privmsg(auteur
,"Je stay déjà sur %s."%(message
[1]))
295 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
297 self
.stay_channels
.append(message
[1])
298 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
299 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
301 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
305 if auteur
in self
.overops
:
307 if message
[1] in self
.stay_channels
:
308 self
.stay_channels
.remove(message
[1])
309 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
310 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
312 serv
.privmsg(auteur
,"Je ne stay pas sur %s."%(message
[1]))
313 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
317 if auteur
in self
.ops
:
319 if message
[1] in self
.play_channels
:
320 serv
.privmsg(auteur
,"Je play déjà sur %s."%(message
[1]))
321 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
323 self
.play_channels
.append(message
[1])
324 self
.play_status
[message
[1]]=[0,time
.time()-3600]
325 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
326 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
328 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
332 if auteur
in self
.ops
:
334 if message
[1] in self
.play_channels
:
335 self
.play_channels
.remove(message
[1])
336 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
337 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
339 serv
.privmsg(auteur
,"Je ne play pas sur %s."%(message
[1]))
340 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
344 if auteur
in self
.ops
:
346 if message
[1] in self
.quiet_channels
:
347 serv
.privmsg(auteur
,"Je me la ferme déjà sur %s"%(message
[1]))
348 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
350 self
.quiet_channels
.append(message
[1])
351 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
352 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
354 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
358 if auteur
in self
.ops
:
360 if message
[1] in self
.quiet_channels
:
361 self
.quiet_channels
.remove(message
[1])
362 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
363 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
365 serv
.privmsg(auteur
,"Je ne me la ferme pas sur %s."%(message
[1]))
366 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
369 elif cmd
in ["states","status"]:
370 if auteur
in self
.overops
:
371 for k
in self
.play_status
.keys():
372 serv
.privmsg(auteur
,(u
"%s : %s"%(k
," | ".join([unicode(i
) for i
in self
.play_status
[k
]]))).encode("utf8") )
374 if auteur
in self
.overops
and len(message
)>2:
375 serv
.privmsg(message
[1]," ".join(message
[2:]))
376 log(self
.serveur
,"priv",auteur
," ".join(message
))
377 elif len(message
)<=2:
378 serv
.privmsg(auteur
,"Syntaxe : SAY <channel> <message>")
382 if auteur
in self
.overops
:
383 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
387 if len(message
) in [3,4] and message
[1].lower()=="transfert":
388 scores
=self
.get_scores()
389 de
,to
=auteur
,message
[2]
390 value
=scores
.get(de
,0)
393 asked
=int(message
[3])
395 serv
.privmsg(auteur
,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
400 serv
.privmsg(auteur
,"Vous n'avez pas de points")
403 serv
.privmsg(auteur
,"Bien tenté…")
406 serv
.privmsg(auteur
,"Vous n'avez que %s points"%(value))
409 self
.add_score(de
,-asked
)
410 self
.add_score(to
,asked
)
411 serv
.privmsg(auteur
,"Transfert de %s points de %s à %s"%(asked
,de
,to
))
413 serv
.privmsg(auteur
,"Syntaxe : SCORE TRANSFERT <pseudo> [<n>]")
415 serv
.privmsg(auteur
,"Votre score : %s"%(self
.get_scores().get(auteur
,0)) )
418 scores
=self
.get_scores().items()
420 scores
.sort(lambda x
,y
:cmp(x
[1],y
[1]))
422 serv
.privmsg(auteur
,"Scores by score : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
424 scores
.sort(lambda x
,y
:cmp(x
[0].lower(),y
[0].lower()))
425 serv
.privmsg(auteur
,"Scores by pseudo : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
426 elif auteur
in self
.overops
:
427 souscmd
=message
[1].lower()
431 scores
=self
.get_scores()
432 if scores
.has_key(todelete
):
434 self
.save_scores(scores
)
435 serv
.privmsg(auteur
,"Score de %s supprimé"%(todelete))
437 serv
.privmsg(auteur
,"Ce score n'existe pas : %s"%(todelete))
439 serv
.privmsg(auteur
,"Syntaxe : SCORES DEL <pseudo>")
440 elif souscmd
in ["add","sub"]:
442 toadd
,val
=message
[2],message
[3]
446 serv
.privmsg(auteur
,"Syntaxe : SCORES {ADD|SUB} <pseudo> <n>")
450 self
.add_score(toadd
,val
)
451 serv
.privmsg(auteur
,"Done")
453 serv
.privmsg(auteur
,"Syntaxe : SCORES {ADD|SUB} <pseudo> <n>")
455 serv
.privmsg(auteur
,"Syntaxe : SCORES {DEL|ADD|SUB} <pseudo> [<n>]")
461 serv
.privmsg(auteur
,"Je n'ai pas compris. Essaye HELP…")
463 def on_pubmsg(self
, serv
, ev
):
464 auteur
= irclib
.nm_to_n(ev
.source())
466 message
= ev
.arguments()[0]
467 self
.update_activity(canal
,auteur
)
469 test
=bot_unicode(message
)
470 except UnicodeBotError
:
471 if not canal
in self
.quiet_channels
:
473 "%s: Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…"%(auteur))
476 pour_moi
,message
=self
.pourmoi(serv
,message
)
477 if pour_moi
and message
.split()!=[]:
478 cmd
=message
.split()[0].lower()
480 args
=" ".join(message
.split()[1:])
483 if cmd
in ["meurs","die","crève"]:
484 if auteur
in self
.overops
:
486 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
488 serv
.privmsg(canal
,"%s: crève !"%(auteur))
489 log(self
.serveur
,canal
,auteur
,message
+"[failed]")
490 if cmd
in ["meur", "meurt","meurre","meurres"] and not canal
in self
.quiet_channels
:
491 serv
.privmsg(canal
,'%s: Mourir, impératif, 2ème personne du singulier : "meurs" (de rien)'%(auteur))
492 if cmd
in ["part","leave","dégage"]:
493 if auteur
in self
.ops
and (not (canal
in self
.stay_channels
)
494 or auteur
in self
.overops
):
496 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
497 self
.chanlist
.remove(canal
)
499 serv
.privmsg(canal
,"%s: Non, je reste !"%(auteur))
500 log(self
.serveur
,canal
,auteur
,message
+"[failed]")
502 if cmd
in ["deviens","pseudo"]:
503 if auteur
in self
.ops
:
506 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
507 if cmd
in ["coucou"] and not canal
in self
.quiet_channels
:
508 serv
.privmsg(canal
,"%s: coucou"%(auteur))
509 if cmd
in ["ping"] and not canal
in self
.quiet_channels
:
510 serv
.privmsg(canal
,"%s: pong"%(auteur))
511 if cmd
in ["ville","capitale","pays","énigme","enigme","encore"]:
512 if canal
in self
.play_channels
:
513 if self
.play_status
.get(canal
,[-1])[0]==0:
515 self
.start_enigme(serv
,canal
)
517 serv
.privmsg(canal
,"%s: Je peux souffler une minute ?"%(auteur))
519 serv
.privmsg(canal
,("%s: Rappel : %s"%(auteur
,self
.play_status
[canal
][1])).encode("utf8") )
521 serv
.privmsg(canal
,"%s: pas ici…"%(auteur))
522 if cmd
in ["score","!score"]:
523 serv
.privmsg(auteur
,"Votre score : %s"%(self
.get_scores().get(auteur
,0)) )
524 if cmd
in ["scores","!scores"]:
525 scores
=self
.get_scores().items()
527 scores
.sort(lambda x
,y
:cmp(x
[1],y
[1]))
529 serv
.privmsg(auteur
,"Scores by score : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
531 scores
.sort(lambda x
,y
:cmp(x
[0].lower(),y
[0].lower()))
532 serv
.privmsg(auteur
,"Scores by pseudo : "+" ; ".join(["%s %s"%(i
[0],i
[1]) for i
in scores
]))
533 if is_tag(message
) and not canal
in self
.quiet_channels
:
534 if auteur
in self
.ops
:
535 action
=random
.choice(config_tag_actions
)
536 serv
.action(canal
,action
.encode("utf8"))
537 self
.quiet_channels
.append(canal
)
539 answer
=random
.choice(config_tag_answers
)
540 for ligne
in answer
.split("\n"):
541 serv
.privmsg(canal
,"%s: %s"%(auteur
,ligne
.encode("utf8")))
547 if self
.play_status
.get(canal
,[-1])[0]==1:
548 answer
=self
.play_status
[canal
][2]
549 if reussi(message
.decode("utf8"),answer
,auteur
):
550 serv
.privmsg(canal
,(u
"%s: bravo ! (C'était %s)"%(auteur
,answer
)).encode("utf8"))
551 log(self
.serveur
,canal
,auteur
+"$win",message
)
552 self
.add_score(auteur
,1)
554 self
.play_status
[canal
]=[0,token
]
555 serv
.execute_delayed(random
.randrange(Ttrig
*5,Ttrig
*10),self
.start_enigme
,(serv
,canal
,token
))
557 def on_kick(self
,serv
,ev
):
558 auteur
= irclib
.nm_to_n(ev
.source())
559 channel
= ev
.target()
560 victime
= ev
.arguments()[0]
561 raison
= ev
.arguments()[1]
562 if victime
==self
.nick
:
563 log(self
.serveur
,"%s kické de %s par %s (raison : %s)" %(victime
,channel
,auteur
,raison
))
566 self
.update_activity(channel
,"")
567 # on ne dit rien au rejoin
568 #l1,l2=config_kick_answers,config_kick_actions
569 #n1,n2=len(l1),len(l2)
570 #i=random.randrange(n1+n2)
572 # serv.action(channel,l2[i-n1].format(auteur).encode("utf8"))
574 # serv.privmsg(channel,l1[i].format(auteur).encode("utf8"))
576 def quitter(self
,chan
,leave_message
=None):
577 if leave_message
==None:
578 leave_message
=random
.choice(config_leave_messages
)
579 self
.serv
.part(chan
,message
=leave_message
.encode("utf8"))
582 quit_message
=random
.choice(config_quit_messages
)
583 self
.die(msg
=quit_message
.encode("utf8"))
585 def get_scores(self
):
586 f
=open(config_score_file
)
587 scores
=pickle
.load(f
)
591 def add_score(self
,pseudo
,value
):
592 scores
=self
.get_scores()
593 if scores
.has_key(pseudo
):
594 scores
[pseudo
]+=value
597 self
.save_scores(scores
)
599 def save_scores(self
,scores
):
600 f
=open(config_score_file
,"w")
601 pickle
.dump(scores
,f
)
605 return self
.serv
.get_nickname()
606 nick
= property(_getnick
)
608 def update_activity(self
,canal
,pseudo
):
609 if not pseudo
in config_idle_bots
:
610 self
.last_activity
[canal
]=time
.time()
611 def is_active(self
,canal
):
612 return time
.time()-self
.last_activity
[canal
]<config_idle_time
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
="salesman.full.log"):
622 self
.filename
= filename
624 def write(self
, message
):
625 f
= open(self
.filename
, "a")
630 if __name__
=="__main__":
633 print "Usage : salesman.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 if "--no-output" in sys
.argv
or "--daemon" in sys
.argv
:
649 outfile
= "/var/log/bots/salesman.full.log"
652 if arg
[0].strip('-') in ["out", "outfile", "logfile"]:
654 sys
.stdout
= Logger(outfile
)
655 serveurs
={"a♡":"acoeur.crans.org","acoeur":"acoeur.crans.org","acoeur.crans.org":"acoeur.crans.org",
656 "irc":"irc.crans.org","crans":"irc.crans.org","irc.crans.org":"irc.crans.org"}
658 serveur
=serveurs
[serveur
]
660 print "Server Unknown : %s"%(serveur)
662 salesman
=Salesman(serveur
,debug
)
664 child_pid
= os
.fork()
667 salesman
.start_as_daemon(outfile
)
669 # on enregistre le pid de salesman
670 pidfile
= "/var/run/bots/salesman.pid"
673 if arg
[0].strip('-') in ["pidfile"]:
675 f
= open(pidfile
, "w")
676 f
.write("%s\n" % child_pid
)