]> gitweb.pimeys.fr Git - bots/hung.git/blob - hung.py
Code de base importé de Shadobot-hacker et légèrement fusionné avec deconnaisseur
[bots/hung.git] / hung.py
1 #!/usr/bin/python
2 # -*- coding:utf8 -*-
3
4 # Codé par 20-100 le 23/04/12
5
6 # Un test de bot irc, parce que c'est cool
7
8 import irclib
9 import ircbot
10 import threading
11 import random
12 import time
13 import socket, ssl, json
14 import pickle
15 import re
16 import os
17 from commands import getstatusoutput as ex
18
19 import sys
20 config_debug_stdout=True
21 if "--quiet" in sys.argv:
22 config_debug_stdout=False
23
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]_"]
34 config_ops=[]
35 config_report_bugs_to=["[20-100]"]
36
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)
42 else:
43 chain="%s [%s:%s] %s"%(time.strftime("%F %T"),channel,auteur,message)
44 f.write(chain+"\n")
45 if config_debug_stdout:
46 print chain
47 f.close()
48
49 class UnicodeBotError(Exception):
50 pass
51 def bot_unicode(chain):
52 try:
53 unicode(chain,"utf8")
54 except UnicodeDecodeError as exc:
55 raise UnicodeBotError
56
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)
62 self.debug=debug
63 self.serveur=serveur
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
71
72
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))
76 time.sleep(0.3)
77 serv.nick(config_irc_pseudo)
78
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")
83 if self.debug:
84 self.chanlist=["#bot"]
85 self.play_channels=["#bot"]
86 for c in self.chanlist:
87 log(self.serveur,"JOIN %s"%(c))
88 serv.join(c)
89
90 def pourmoi(self, serv, message):
91 """renvoie (False,lemessage) ou (True, le message amputé de "pseudo: ")"""
92 pseudo=serv.get_nickname()
93 size=len(pseudo)
94 if message[:size]==pseudo and len(message)>size and message[size]==":":
95 return (True,message[size+1:].lstrip(" "))
96 else:
97 return (False,message)
98
99 def on_privmsg(self, serv, ev):
100 message=ev.arguments()[0]
101 auteur = irclib.nm_to_n(ev.source())
102 try:
103 test=bot_unicode(message)
104 except UnicodeBotError:
105 serv.privmsg(auteur,
106 "Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…")
107 return
108 message=message.split()
109 cmd=message[0].lower()
110 notunderstood=False
111 if cmd=="join":
112 if auteur in self.ops:
113 if len(message)>1:
114 if message[1] in self.chanlist:
115 serv.privmsg(auteur,"Je suis déjà sur %s"%(message[1]))
116 else:
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))
121 else:
122 serv.privmsg(auteur,"Channels : "+" ".join(self.chanlist))
123 else:
124 notunderstood=True
125 elif cmd=="leave":
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]")
132 else:
133 serv.privmsg(auteur,"Non, je reste !")
134 log(self.serveur,"priv",auteur," ".join(message)+"[failed]")
135 else:
136 serv.privmsg(auteur,"Je ne suis pas sur %s"%(message[1]))
137 else:
138 notunderstood=True
139 elif cmd=="play":
140 if auteur in self.ops:
141 if len(message)>1:
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]")
145 else:
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]")
150 else:
151 serv.privmsg(auteur,"Play channels : "+" ".join(self.play_channels))
152 else:
153 notunderstood=True
154 elif cmd=="noplay":
155 if auteur in self.ops:
156 if len(message)>1:
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]")
161 else:
162 serv.privmsg(auteur,"Je ne play pas sur %s."%(message[1]))
163 log("priv",auteur," ".join(message)+"[failed]")
164 else:
165 notunderstood=True
166 elif cmd=="stay":
167 if auteur in self.overops:
168 if len(message)>1:
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]))
172 else:
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))
176 else:
177 serv.privmsg(auteur,"Stay channels : "+" ".join(self.stay_channels))
178 else:
179 notunderstood=True
180 elif cmd=="nostay":
181 if auteur in self.overops:
182 if len(message)>1:
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))
187 else:
188 log(self.serveur,"priv",auteur," ".join(message)+"[failed]")
189 serv.privmsg(auteur,"Je ne stay pas sur %s."%(message[1]))
190
191 else:
192 notunderstood=True
193 elif cmd=="die":
194 if auteur in self.overops:
195 log(self.serveur,"priv",auteur," ".join(message)+"[successful]")
196 self.die()
197 else:
198 notunderstood=True
199 elif cmd=="quiet":
200 if auteur in self.ops:
201 if len(message)>1:
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]")
205 else:
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]")
209 else:
210 serv.privmsg(auteur,"Quiet channels : "+" ".join(self.quiet_channels))
211 else:
212 notunderstood=True
213 elif cmd=="noquiet":
214 if auteur in self.ops:
215 if len(message)>1:
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]")
220 else:
221 serv.privmsg(auteur,"Je ne me la ferme pas sur %s."%(message[1]))
222 log(self.serveur,"priv",auteur," ".join(message)+"[failed]")
223 else:
224 notunderstood=True
225 elif cmd=="say":
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>")
231 else:
232 notunderstood=True
233 elif cmd=="do":
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>")
239 else:
240 notunderstood=True
241 else:
242 notunderstood=True
243 if notunderstood:
244 serv.privmsg(auteur,"Je n'ai pas compris. Essaye HELP…")
245
246 def on_pubmsg(self, serv, ev):
247 auteur = irclib.nm_to_n(ev.source())
248 canal = ev.target()
249 message = ev.arguments()[0]
250 try:
251 test=bot_unicode(message)
252 except UnicodeBotError:
253 if not canal in self.quiet_channels:
254 serv.privmsg(canal,
255 "%s: Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…"%(auteur))
256 return
257 pour_moi,message=self.pourmoi(serv,message)
258 if pour_moi and message.split()!=[]:
259 cmd=message.split()[0].lower()
260 try:
261 args=" ".join(message.split()[1:])
262 except:
263 args=""
264 if cmd in ["meurs","die","crève"]:
265 if auteur in self.overops:
266 log(self.serveur,canal,auteur,message+"[successful]")
267 self.die()
268 else:
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)
278 else:
279 serv.privmsg(canal,"%s: Non, je reste !"%(auteur))
280 log(self.serveur,canal,auteur,message+"[failed]")
281
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))
284 else:
285 pass
286
287 def on_action(self, serv, ev):
288 action = ev.arguments()[0]
289 auteur = irclib.nm_to_n(ev.source())
290 channel = ev.target()
291 try:
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))
296 return
297 mypseudo=serv.get_nickname()
298
299 if __name__=="__main__":
300 import sys
301 if len(sys.argv)==1:
302 print "Usage : hung.py <serveur> [--debug]"
303 exit(1)
304 serveur=sys.argv[1]
305 if "debug" in sys.argv or "--debug" in sys.argv:
306 debug=True
307 else:
308 debug=False
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"}
311 try:
312 serveur=serveurs[serveur]
313 except KeyError:
314 print "Server Unknown : %s"%(serveur)
315 exit(404)
316 hung=Hung(serveur,debug)
317 hung.start()