]>
gitweb.pimeys.fr Git - bots/hung.git/blob - hung.py
4 # Codé par 20-100 le 23/04/12
6 # Un test de bot irc, parce que c'est cool
13 import socket
, ssl
, json
17 from commands
import getstatusoutput
as ex
20 config_debug_stdout
=True
21 if "--quiet" in sys
.argv
:
22 config_debug_stdout
=False
24 config_irc_password
="I'mAHungMan"
25 config_irc_pseudo
="Hung"
26 config_chanlist
=["#flood"]
27 config_stay_channels
=["#flood"]
28 config_quiet_channels
=[]
29 config_logfile_template
="hung.%s.log"
30 def get_config_logfile(serveur
):
31 serveurs
={"acoeur.crans.org":"acoeur","irc.crans.org":"crans"}
32 return config_logfile_template
%(serveurs
[serveur
])
33 config_overops
=["[20-100]","[20-100]_"]
35 config_report_bugs_to
=["[20-100]"]
37 def log(serveur
,channel
,auteur
=None,message
=None):
38 f
=open(get_config_logfile(serveur
),"a")
39 if auteur
==message
==None:
40 # alors c'est que c'est pas un channel mais juste une ligne de log
41 chain
="%s %s"%(time
.strftime("%F %T"),channel
)
43 chain
="%s [%s:%s] %s"%(time
.strftime("%F %T"),channel
,auteur
,message
)
45 if config_debug_stdout
:
49 class UnicodeBotError(Exception):
51 def bot_unicode(chain
):
54 except UnicodeDecodeError as exc
:
57 class Hung(ircbot
.SingleServerIRCBot
):
58 def __init__(self
,serveur
,debug
=False):
59 temporary_pseudo
=config_irc_pseudo
+str(random
.randrange(10000,100000))
60 ircbot
.SingleServerIRCBot
.__init
__(self
, [(serveur
, 6667)],
61 temporary_pseudo
,"Bot irc pour embêter Shadobot", 10)
64 self
.overops
=config_overops
65 self
.ops
=self
.overops
+config_ops
66 self
.report_bugs_to
=config_report_bugs_to
67 self
.chanlist
=config_chanlist
68 self
.stay_channels
=config_stay_channels
69 self
.play_channels
=config_play_channels
70 self
.quiet_channels
=config_quiet_channels
73 def give_me_my_pseudo(self
,serv
):
74 serv
.privmsg("NickServ","RECOVER %s %s"%(config_irc_pseudo
,config_irc_password
))
75 serv
.privmsg("NickServ","RELEASE %s %s"%(config_irc_pseudo
,config_irc_password
))
77 serv
.nick(config_irc_pseudo
)
79 def on_welcome(self
, serv
, ev
):
80 self
.give_me_my_pseudo(serv
)
81 serv
.privmsg("NickServ","IDENTIFY %s"%(config_irc_password))
82 log(self
.serveur
,"Connected")
84 self
.chanlist
=["#bot"]
85 self
.play_channels
=["#bot"]
86 for c
in self
.chanlist
:
87 log(self
.serveur
,"JOIN %s"%(c))
90 def pourmoi(self
, serv
, message
):
91 """renvoie (False,lemessage) ou (True, le message amputé de "pseudo: ")"""
92 pseudo
=serv
.get_nickname()
94 if message
[:size
]==pseudo
and len(message
)>size
and message
[size
]==":":
95 return (True,message
[size
+1:].lstrip(" "))
97 return (False,message
)
99 def on_privmsg(self
, serv
, ev
):
100 message
=ev
.arguments()[0]
101 auteur
= irclib
.nm_to_n(ev
.source())
103 test
=bot_unicode(message
)
104 except UnicodeBotError
:
106 "Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…")
108 message
=message
.split()
109 cmd
=message
[0].lower()
112 if auteur
in self
.ops
:
114 if message
[1] in self
.chanlist
:
115 serv
.privmsg(auteur
,"Je suis déjà sur %s"%(message
[1]))
117 serv
.join(message
[1])
118 self
.chanlist
.append(message
[1])
119 serv
.privmsg(auteur
,"Channels : "+" ".join(self
.chanlist
))
120 log(self
.serveur
,"priv",auteur
," ".join(message
))
122 serv
.privmsg(auteur
,"Channels : "+" ".join(self
.chanlist
))
126 if auteur
in self
.ops
and len(message
)>1:
127 if message
[1] in self
.chanlist
:
128 if not (message
[1] in self
.stay_channels
) or auteur
in self
.overops
:
129 serv
.part(message
[1])
130 self
.chanlist
.remove(message
[1])
131 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
133 serv
.privmsg(auteur
,"Non, je reste !")
134 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
136 serv
.privmsg(auteur
,"Je ne suis pas sur %s"%(message
[1]))
140 if auteur
in self
.ops
:
142 if message
[1] in self
.play_channels
:
143 serv
.privmsg(auteur
,"Je play déjà sur %s."%(message
[1]))
144 log("priv",auteur
," ".join(message
)+"[failed]")
146 self
.play_channels
.append(message
[1])
147 self
.play_status
[message
[1]]=None
148 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
149 log("priv",auteur
," ".join(message
)+"[successful]")
151 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
155 if auteur
in self
.ops
:
157 if message
[1] in self
.play_channels
:
158 self
.play_channels
.remove(message
[1])
159 serv
.privmsg(auteur
,"Play channels : "+" ".join(self
.play_channels
))
160 log("priv",auteur
," ".join(message
)+"[successful]")
162 serv
.privmsg(auteur
,"Je ne play pas sur %s."%(message
[1]))
163 log("priv",auteur
," ".join(message
)+"[failed]")
167 if auteur
in self
.overops
:
169 if message
[1] in self
.stay_channels
:
170 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
171 serv
.privmsg(auteur
,"Je stay déjà sur %s."%(message
[1]))
173 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
174 self
.stay_channels
.append(message
[1])
175 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
177 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
181 if auteur
in self
.overops
:
183 if message
[1] in self
.stay_channels
:
184 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
185 self
.stay_channels
.remove(message
[1])
186 serv
.privmsg(auteur
,"Stay channels : "+" ".join(self
.stay_channels
))
188 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
189 serv
.privmsg(auteur
,"Je ne stay pas sur %s."%(message
[1]))
194 if auteur
in self
.overops
:
195 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
200 if auteur
in self
.ops
:
202 if message
[1] in self
.quiet_channels
:
203 serv
.privmsg(auteur
,"Je me la ferme déjà sur %s"%(message
[1]))
204 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
206 self
.quiet_channels
.append(message
[1])
207 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
208 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
210 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
214 if auteur
in self
.ops
:
216 if message
[1] in self
.quiet_channels
:
217 self
.quiet_channels
.remove(message
[1])
218 serv
.privmsg(auteur
,"Quiet channels : "+" ".join(self
.quiet_channels
))
219 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[successful]")
221 serv
.privmsg(auteur
,"Je ne me la ferme pas sur %s."%(message
[1]))
222 log(self
.serveur
,"priv",auteur
," ".join(message
)+"[failed]")
226 if auteur
in self
.overops
and len(message
)>2:
227 serv
.privmsg(message
[1]," ".join(message
[2:]))
228 log(self
.serveur
,"priv",auteur
," ".join(message
))
229 elif len(message
)<=2:
230 serv
.privmsg(auteur
,"Syntaxe : SAY <channel> <message>")
234 if auteur
in self
.overops
and len(message
)>2:
235 serv
.action(message
[1]," ".join(message
[2:]))
236 log(self
.serveur
,"priv",auteur
," ".join(message
))
237 elif len(message
)<=2:
238 serv
.privmsg(auteur
,"Syntaxe : DO <channel> <action>")
244 serv
.privmsg(auteur
,"Je n'ai pas compris. Essaye HELP…")
246 def on_pubmsg(self
, serv
, ev
):
247 auteur
= irclib
.nm_to_n(ev
.source())
249 message
= ev
.arguments()[0]
251 test
=bot_unicode(message
)
252 except UnicodeBotError
:
253 if not canal
in self
.quiet_channels
:
255 "%s: Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…"%(auteur))
257 pour_moi
,message
=self
.pourmoi(serv
,message
)
258 if pour_moi
and message
.split()!=[]:
259 cmd
=message
.split()[0].lower()
261 args
=" ".join(message
.split()[1:])
264 if cmd
in ["meurs","die","crève"]:
265 if auteur
in self
.overops
:
266 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
269 serv
.privmsg(canal
,"%s: crève !"%(auteur))
270 log(self
.serveur
,canal
,auteur
,message
+"[failed]")
271 elif cmd
in ["part","leave","dégage"]:
272 if auteur
in self
.ops
and (not (canal
in self
.stay_channels
)
273 or auteur
in self
.overops
):
274 serv
.part(canal
,message
="Éjecté par %s"%(auteur))
275 log(self
.serveur
,canal
,auteur
,message
+"[successful]")
276 if canal
in self
.chanlist
:
277 self
.chanlist
.remove(canal
)
279 serv
.privmsg(canal
,"%s: Non, je reste !"%(auteur))
280 log(self
.serveur
,canal
,auteur
,message
+"[failed]")
282 if cmd
in ["meur", "meurt","meurre","meurres"] and not canal
in self
.quiet_channels
:
283 serv
.privmsg(canal
,'%s: Mourir, impératif, 2ème personne du singulier : "meurs" (de rien)'%(auteur))
287 def on_action(self
, serv
, ev
):
288 action
= ev
.arguments()[0]
289 auteur
= irclib
.nm_to_n(ev
.source())
290 channel
= ev
.target()
292 test
=bot_unicode(action
)
293 except UnicodeBotError
:
294 serv
.privmsg(channel
,
295 "%s : Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…"%(auteur))
297 mypseudo
=serv
.get_nickname()
299 if __name__
=="__main__":
302 print "Usage : hung.py <serveur> [--debug]"
305 if "debug" in sys
.argv
or "--debug" in sys
.argv
:
309 serveurs
={"a♡":"acoeur.crans.org","acoeur":"acoeur.crans.org","acoeur.crans.org":"acoeur.crans.org",
310 "irc":"irc.crans.org","crans":"irc.crans.org","irc.crans.org":"irc.crans.org"}
312 serveur
=serveurs
[serveur
]
314 print "Server Unknown : %s"%(serveur)
316 hung
=Hung(serveur
,debug
)