]>
gitweb.pimeys.fr Git - bots/bbc.git/blob - bbc.py
2 # -*- encoding: utf-8 -*-
6 Un bot IRC qui ne fait rien. Base pour en coder un vrai.
14 from commands
import getstatusoutput
as ex
16 # on récupère la config
20 def get_config_logfile(serveur
):
21 """Renvoie le nom du fichier de log en fonction du serveur."""
22 serveurs
= {"acoeur.crans.org" : "acoeur", "irc.crans.org" : "crans"}
23 return config
.logfile_template
% (serveurs
[serveur
])
25 def log(serveur
, channel
, auteur
=None, message
=None):
26 f
= open(get_config_logfile(serveur
), "a")
27 if auteur
== message
== None:
28 # alors c'est que c'est pas un channel mais juste une ligne de log
29 chain
= "%s %s" % (time
.strftime("%F %T"), channel
)
31 chain
= "%s [%s:%s] %s" % (time
.strftime("%F %T"), channel
, auteur
, message
)
33 if config
.debug_stdout
:
37 class UnicodeBotError(Exception):
39 def bot_unicode(chain
):
41 unicode(chain
, "utf8")
42 except UnicodeDecodeError as exc
:
45 class Bbc(ircbot
.SingleServerIRCBot
):
46 def __init__(self
, serveur
, debug
=False):
47 temporary_pseudo
= config
.irc_pseudo
+ str(random
.randrange(10000, 100000))
48 ircbot
.SingleServerIRCBot
.__init
__(self
, [(serveur
, 6667)],
49 temporary_pseudo
, config
.ircname
, 10)
51 self
.serveur
= serveur
52 self
.overops
= config
.overops
53 self
.ops
= self
.overops
+ config
.ops
54 self
.chanlist
= config
.chanlist
55 self
.stay_channels
= config
.stay_channels
56 self
.quiet_channels
= config
.quiet_channels
59 def give_me_my_pseudo(self
, serv
):
60 serv
.privmsg("NickServ", "RECOVER %s %s" % (config
.irc_pseudo
, config
.irc_password
))
61 serv
.privmsg("NickServ", "RELEASE %s %s" % (config
.irc_pseudo
, config
.irc_password
))
63 serv
.nick(config
.irc_pseudo
)
65 def on_welcome(self
, serv
, ev
):
66 self
.serv
= serv
# ça serv ira :)
67 self
.give_me_my_pseudo(serv
)
68 serv
.privmsg("NickServ", "identify %s" % (config
.irc_password
))
69 log(self
.serveur
, "Connected")
71 self
.chanlist
= ["#bot"]
72 for c
in self
.chanlist
:
73 log(self
.serveur
, "JOIN %s" % (c
))
76 def pourmoi(self
, serv
, message
):
77 """renvoie (False, lemessage) ou (True, le message amputé de "pseudo: ")"""
80 if message
[:size
] == pseudo
and len(message
) > size
and message
[size
] == ":":
81 return (True, message
[size
+ 1:].lstrip(" "))
83 return (False, message
)
85 def on_privmsg(self
, serv
, ev
):
86 message
= ev
.arguments()[0]
87 auteur
= irclib
.nm_to_n(ev
.source())
90 except UnicodeBotError
:
91 if config
.utf8_trigger
:
92 serv
.privmsg(auteur
, random
.choice(config
.utf8_fail_answers
).encode("utf8"))
94 message
= message
.split()
95 cmd
= message
[0].lower()
98 helpdico
= config
.helpdico
99 helpmsg_default
= "Liste des commandes disponibles :\nHELP"
100 helpmsg_ops
= " JOIN LEAVE QUIET NOQUIET LOST RECONNECT"
101 helpmsg_overops
= " SAY DO STAY NOSTAY OPS OVEROPS KICK DIE OP DEOP"
102 op
, overop
= auteur
in self
.ops
, auteur
in self
.overops
103 if len(message
) == 1:
104 helpmsg
= helpmsg_default
106 helpmsg
+= helpmsg_ops
108 helpmsg
+= helpmsg_overops
110 helpmsgs
= helpdico
.get(message
[1].lower(), ["Commande inconnue.", None, None])
111 helpmsg
= helpmsgs
[0]
112 if op
and helpmsgs
[1]:
114 helpmsg
+= "\n" + helpmsgs
[1]
116 helpmsg
= helpmsgs
[1]
117 if overop
and helpmsgs
[2]:
119 helpmsg
+= "\n" + helpmsgs
[2]
121 helpmsg
= helpmsgs
[2]
122 for ligne
in helpmsg
.split("\n"):
123 serv
.privmsg(auteur
, ligne
)
125 if auteur
in self
.ops
:
127 if message
[1] in self
.chanlist
:
128 serv
.privmsg(auteur
, "Je suis déjà sur %s" % (message
[1]))
130 serv
.join(message
[1])
131 self
.chanlist
.append(message
[1])
132 serv
.privmsg(auteur
, "Channels : " + " ".join(self
.chanlist
))
133 log(self
.serveur
, "priv", auteur
, " ".join(message
))
135 serv
.privmsg(auteur
, "Channels : " + " ".join(self
.chanlist
))
139 if auteur
in self
.ops
and len(message
) > 1:
140 if message
[1] in self
.chanlist
:
141 if not (message
[1] in self
.stay_channels
) or auteur
in self
.overops
:
142 self
.quitter(message
[1], " ".join(message
[2:]))
143 self
.chanlist
.remove(message
[1])
144 log(self
.serveur
, "priv", auteur
, " ".join(message
) + "[successful]")
146 serv
.privmsg(auteur
, "Non, je reste !")
147 log(self
.serveur
, "priv", auteur
, " ".join(message
) + "[failed]")
149 serv
.privmsg(auteur
, "Je ne suis pas sur %s" % (message
[1]))
153 if auteur
in self
.overops
:
155 if message
[1] in self
.stay_channels
:
156 log(self
.serveur
, "priv", auteur
, " ".join(message
) + "[failed]")
157 serv
.privmsg(auteur
, "Je stay déjà sur %s." % (message
[1]))
159 log(self
.serveur
, "priv", auteur
, " ".join(message
) + "[successful]")
160 self
.stay_channels
.append(message
[1])
161 serv
.privmsg(auteur
, "Stay channels : " + " ".join(self
.stay_channels
))
163 serv
.privmsg(auteur
, "Stay channels : " + " ".join(self
.stay_channels
))
166 elif cmd
== "nostay":
167 if auteur
in self
.overops
:
169 if message
[1] in self
.stay_channels
:
170 log(self
.serveur
, "priv", auteur
, " ".join(message
) + "[successful]")
171 self
.stay_channels
.remove(message
[1])
172 serv
.privmsg(auteur
, "Stay channels : " + " ".join(self
.stay_channels
))
174 log(self
.serveur
, "priv", auteur
, " ".join(message
) + "[failed]")
175 serv
.privmsg(auteur
, "Je ne stay pas sur %s." % (message
[1]))
180 if auteur
in self
.overops
:
181 log(self
.serveur
, "priv", auteur
, " ".join(message
) + "[successful]")
186 if auteur
in self
.ops
:
188 if message
[1] in self
.quiet_channels
:
189 serv
.privmsg(auteur
, "Je me la ferme déjà sur %s" % (message
[1]))
190 log(self
.serveur
, "priv", auteur
, " ".join(message
) + "[failed]")
192 self
.quiet_channels
.append(message
[1])
193 serv
.privmsg(auteur
, "Quiet channels : " + " ".join(self
.quiet_channels
))
194 log(self
.serveur
, "priv", auteur
, " ".join(message
) + "[successful]")
196 serv
.privmsg(auteur
, "Quiet channels : " + " ".join(self
.quiet_channels
))
199 elif cmd
== "noquiet":
200 if auteur
in self
.ops
:
202 if message
[1] in self
.quiet_channels
:
203 self
.quiet_channels
.remove(message
[1])
204 serv
.privmsg(auteur
, "Quiet channels : " + " ".join(self
.quiet_channels
))
205 log(self
.serveur
, "priv", auteur
, " ".join(message
) + "[successful]")
207 serv
.privmsg(auteur
, "Je ne me la ferme pas sur %s." % (message
[1]))
208 log(self
.serveur
, "priv", auteur
, " ".join(message
) + "[failed]")
212 if auteur
in self
.overops
and len(message
) > 2:
213 serv
.privmsg(message
[1], " ".join(message
[2:]))
214 log(self
.serveur
, "priv", auteur
, " ".join(message
))
215 elif len(message
) <= 2:
216 serv
.privmsg(auteur
, "Syntaxe : SAY <channel> <message>")
220 if auteur
in self
.overops
and len(message
) > 2:
221 serv
.action(message
[1], " ".join(message
[2:]))
222 log(self
.serveur
, "priv", auteur
, " ".join(message
))
223 elif len(message
) <= 2:
224 serv
.privmsg(auteur
, "Syntaxe : DO <channel> <action>")
228 if auteur
in self
.overops
and len(message
) > 2:
229 serv
.kick(message
[1], message
[2], " ".join(message
[3:]))
230 log(self
.serveur
, "priv", auteur
, " ".join(message
))
231 elif len(message
) <= 2:
232 serv
.privmsg(auteur
, "Syntaxe : KICK <channel> <pseudo> [<raison>]")
236 if auteur
in self
.overops
:
237 serv
.privmsg(auteur
, " ".join(self
.ops
))
240 elif cmd
== "overops":
241 if auteur
in self
.overops
:
242 serv
.privmsg(auteur
, " ".join(self
.overops
))
246 if auteur
in self
.overops
:
248 serv
.mode(message
[1], "+o %s" % message
[2])
249 elif len(message
) > 1:
250 serv
.mode(message
[1], "+o %s" % auteur
)
252 serv
.privmsg(auteur
, config
.helpdico
["op"][2])
256 if auteur
in self
.overops
:
258 serv
.mode(message
[1], "-o %s" % message
[2])
259 elif len(message
) > 1:
260 serv
.mode(message
[1], "-o %s" % auteur
)
262 serv
.privmsg(auteur
, config
.helpdico
["deop"][2])
268 serv
.privmsg(auteur
, "Je n'ai pas compris. Essayez HELP…")
270 def on_pubmsg(self
, serv
, ev
):
271 auteur
= irclib
.nm_to_n(ev
.source())
273 message
= ev
.arguments()[0]
276 except UnicodeBotError
:
277 if config
.utf8_trigger
and not canal
in self
.quiet_channels
:
278 serv
.privmsg(canal
, (u
"%s: %s" % (auteur
, random
.choice(config
.utf8_fail_answers
))).encode("utf8"))
280 pour_moi
, message
= self
.pourmoi(serv
, message
)
281 if pour_moi
and message
.split() != []:
282 cmd
= message
.split()[0].lower()
284 args
= " ".join(message
.split()[1:])
287 if cmd
in ["meurs", "die", "crève"]:
288 if auteur
in self
.overops
:
289 log(self
.serveur
, canal
, auteur
, message
+ "[successful]")
292 serv
.privmsg(canal
, ("%s: %s" % (auteur
, random
.choice(config
.quit_fail_messages
))).encode("utf8"))
293 log(self
.serveur
, canal
, auteur
, message
+ "[failed]")
295 elif cmd
in ["part", "leave", "dégage", "va-t-en", "tut'tiresailleurs, c'estmesgalets"]:
296 if auteur
in self
.ops
and (not (canal
in self
.stay_channels
)
297 or auteur
in self
.overops
):
299 log(self
.serveur
, canal
, auteur
, message
+ "[successful]")
300 if canal
in self
.chanlist
:
301 self
.chanlist
.remove(canal
)
303 serv
.privmsg(canal
, ("%s: %s" % (auteur
, random
.choice(config
.leave_fail_messages
))).encode("utf8"))
304 log(self
.serveur
, canal
, auteur
, message
+ "[failed]")
306 elif cmd
in ["deviens", "pseudo"]:
307 if auteur
in self
.ops
:
310 log(self
.serveur
, canal
, auteur
, message
+ "[successful]")
312 elif cmd
in ["ping"] and not canal
in self
.quiet_channels
:
313 serv
.privmsg(canal
, "%s: pong" % (auteur
))
315 if not canal
in self
.quiet_channels
:
318 def on_action(self
, serv
, ev
):
319 action
= ev
.arguments()[0]
320 auteur
= irclib
.nm_to_n(ev
.source())
321 channel
= ev
.target()
324 except UnicodeBotError
:
325 if config
.utf8_trigger
and not channel
in self
.quiet_channels
:
326 serv
.privmsg(channel
, (u
"%s: %s" % (auteur
, random
.choice(config
.utf8_fail_answers
))).encode("utf8"))
330 def on_kick(self
, serv
, ev
):
331 auteur
= irclib
.nm_to_n(ev
.source())
332 channel
= ev
.target()
333 victime
= ev
.arguments()[0]
334 raison
= ev
.arguments()[1]
335 if victime
== self
.nick
:
336 log(self
.serveur
, "%s kické de %s par %s (raison : %s)" % (victime
, channel
, auteur
, raison
))
340 l1
, l2
= config
.kick_answers
, config
.kick_actions
341 n1
, n2
= len(l1
), len(l2
)
342 i
= random
.randrange(n1
+ n2
)
344 serv
.action(channel
, l2
[i
- n1
].format(auteur
).encode("utf8"))
346 serv
.privmsg(channel
, l1
[i
].format(auteur
).encode("utf8"))
348 def quitter(self
, chan
, leave_message
=None):
349 if leave_message
== None:
350 leave_message
= random
.choice(config
.leave_messages
)
351 self
.serv
.part(chan
, message
=leave_message
.encode("utf8"))
354 quit_message
= random
.choice(config
.quit_messages
)
355 self
.die(msg
=quit_message
.encode("utf8"))
358 return self
.serv
.get_nickname()
359 nick
= property(_getnick
)
362 if __name__
== "__main__":
364 if len(sys
.argv
) == 1:
365 print "Usage : bbc.py <serveur> [--debug]"
367 serveur
= sys
.argv
[1]
368 if "debug" in sys
.argv
or "--debug" in sys
.argv
:
372 if "--quiet" in sys
.argv
:
373 config
.debug_stdout
= False
374 serveurs
= {"irc" : "irc.crans.org", "crans" : "irc.crans.org", "irc.crans.org" : "irc.crans.org"}
376 serveur
= serveurs
[serveur
]
378 print "Server Unknown : %s" % (serveur
)
380 bot
= Bbc(serveur
, debug
)