27
27
from gozerbot.thr import start_new_thread
28
28
from gozerbot.fleet import fleet
29
29
from gozerbot.runner import runner
30
from gozerplugs.plugs.jcoll import jcheck
30
from gozerbot.botbase import BotBase
31
31
from xmpp.simplexml import Node
32
32
import xmpp, time, Queue, os, threading, thread, types, xml
36
36
outlocked = lockdec(jabberoutlock)
37
37
inlocked = lockdec(jabberinlock)
39
class Jabberbot(object):
39
class Jabberbot(BotBase):
41
41
""" jabber bot class """
43
def __init__(self, botname, owner=""):
43
def __init__(self, name='jabbermain', owner=[]):
44
BotBase.__init__(self, name, owner)
44
46
self.outqueue = Queue.Queue()
54
51
self.username = None
58
self.starttime = time.time()
59
self.owner = owner or config['jabberowner']
62
56
self.connecttime = 0
63
57
self.connection = None
65
58
self.privwait = Jabberwait()
66
59
self.errorwait = Jabbererrorwait()
68
61
self.connectok = threading.Event()
73
self.userchannels = Dol()
74
64
self.timejoined = {}
75
self.state = Pdod(datadir + os.sep + '%s.state' % self.name)
76
self.channels = Channels(datadir + os.sep + '%s.channels' % self.name)
77
if not self.state.has_key('joinedchannels'):
78
self.state['joinedchannels'] = []
79
65
if not self.state.has_key('ratelimit'):
80
66
self.state['ratelimit'] = 0
84
68
def _resumedata(self): # stateful reboot request, just shutdown
200
186
self.connectok.set()
203
def ownercheck(self, ievent, txt=None):
204
if type(config['jabberowner']) == types.ListType:
205
if ievent.userhost in config['jabberowner']:
207
elif config['jabberowner'] == ievent.userhost:
211
ievent.reply("only jabberowner (see config file) is allowed \
212
to perform this command")
214
ievent.reply("only jabberowner (see config file) %s" % txt)
217
189
def connect(self, host, user, password, port=5222, reconnect=True):
245
217
rlog(10, self.name, 'failed to join %s: %s' % (i, result))
220
def broadcast(self, txt):
221
for i in self.state['joinedchannels']:
248
224
def sendpresence(self, to):
249
225
""" send presence """
250
226
presence = xmpp.Presence(to=to)
299
275
m.txt = m.txt[1:]
300
276
if go and not 'dojcoll' in str(m.id):
278
if plugins.woulddispatch(self, m):
302
280
plugins.trydispatch(self, m)
304
282
handle_exception()
305
283
nm = Jabbermsg(msg)
307
285
jcallbacks.check(self, nm)
286
if nm.getType() == 'error':
287
err = nm.getErrorCode()
289
rlog(10, self.name + '.error', "%s => %s: %s" % (nm.getFrom(),\
291
rlog(10, self.name + '.error', str(nm))
292
self.errorwait.check(nm)
310
294
def presenceHandler(self, conn, pres):
311
295
""" overloaded presence handler """
360
344
jcallbacks.check(self, p)
361
self.errorwait.check(p)
345
if p.getType() == 'error':
346
err = p.getErrorCode()
348
rlog(10, self.name + '.error', "%s => %s: %s" % (p.getFrom(),\
350
rlog(10, self.name + '.error', str(p))
351
self.errorwait.check(p)
363
353
def reconnect(self):
364
354
rlog(100, self.name, 'reconnecting .. sleeping 15 seconds')
403
394
handle_exception()
405
def action(self, printto, txt, groupchat=True):
396
def action(self, printto, txt, fromm=None, groupchat=True):
406
397
""" action txt to printto """
407
398
txt = "/me " + txt
408
401
if printto in self.state['joinedchannels'] and groupchat:
409
402
message = xmpp.Message(to=printto, body=txt, typ='groupchat')
411
404
message = xmpp.Message(to=printto, body=txt)
406
message.setFrom(fromm)
412
407
self.send(message)
414
def say(self, printto, txt, fromm=None, groupchat=True):
409
def say(self, printto, txt, fromm=None, groupchat=True, speed=5):
415
410
""" say txt to printto """
416
411
txt = jabberstrip(txt)
417
414
if printto in self.state['joinedchannels'] and groupchat:
418
message = xmpp.Message(to=printto, body=txt, frm=self.jid, \
415
message = xmpp.Message(to=printto, body=txt, typ='groupchat')
421
message = xmpp.Message(to=printto, body=txt, frm=self.jid, \
417
message = xmpp.Message(to=printto, body=txt, typ='chat')
419
message.setFrom(fromm)
423
420
self.send(message)
425
def saynocb(self, printto, txt, fromm=None, groupchat=True):
422
def saynocb(self, printto, txt, fromm=None, groupchat=True, speed=5):
426
423
""" say txt to printto """
427
424
txt = jabberstrip(txt)
428
427
if printto in self.state['joinedchannels'] and groupchat:
429
message = xmpp.Message(to=printto, body=txt, frm=self.jid, \
428
message = xmpp.Message(to=printto, body=txt, typ='groupchat')
432
message = xmpp.Message(to=printto, body=txt, frm=self.jid, \
430
message = xmpp.Message(to=printto, body=txt, typ='chat')
434
431
self.sendnocb(message)
436
433
def wait(self, msg, txt):
486
482
q = Queue.Queue()
487
483
self.errorwait.register("409", q, 3)
488
484
self.errorwait.register("401", q, 3)
485
self.errorwait.register("400", q, 3)
489
486
# do the actual join
490
487
presence = xmpp.Presence(to=channel + '/' + nick)
491
presence.setFrom(self.me)
488
#presence.setFrom(self.me)
493
490
passnode = Node('password')
494
491
passnode.addData(password)