Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- import os
- import htmllib, formatter
- import StringIO
- import time
- import socket
- import threading
- import dbus, gobject
- from dbus.mainloop.glib import DBusGMainLoop
- botname = ['screenname1','ircbot@irc.ubuntu.com']
- bannedsenders = []
- allowedsenders = []
- purplelock = threading.Lock()
- class ChadProtoThread(threading.Thread):
- def getquit(self):
- self.lock.acquire()
- quit = self.quit
- self.lock.release()
- def setquit(self,val):
- self.lock.acquire()
- self.quit = val
- self.lock.release()
- def writemessage(self,message,echoed=True):
- self.sock.sendall(message + "\r\n")
- self.listlock.acquire()
- try:
- self.last = time.time()
- if echoed:
- self.list.append(message)
- finally:
- self.listlock.release()
- def run(self):
- self.listlock = threading.Lock()
- self.list = []
- self.last = time.time()
- self.lock = threading.Lock()
- self.quit = False
- self.sock = None
- ip = 'youprobablydontcareaboutthisbecausethisisacustomchatprotocolmyfriendused.doesntexist.com'
- port = 9054
- retry = 3
- while (retry > 0) and not self.getquit():
- try:
- print "Connecting to ChadProto (%s:%d) port...\n" % (ip,port)
- self.sock = socket.socket()
- self.sock.connect((ip,port))
- self.sock.setblocking(0)
- retry = 3
- messages = ''
- print "Connected to ChadProto ... \n"
- while not self.getquit():
- time.sleep(0.1)
- self.listlock.acquire()
- try:
- ping = (time.time() - self.last) > 60.00
- finally:
- self.listlock.release()
- if ping:
- print 'PING!'
- self.writemessage('ping',False)
- buffer = ""
- try:
- buffer = self.sock.recv(1024).strip("\x00")
- if buffer.upper().startswith('SETNOTE'):
- buffer = buffer + '\r\n'
- except socket.error, err:
- if err.args[0]==11:
- pass
- else:
- raise
- messages = (messages + buffer).split("\r\n")
- for message in messages[:-1]:
- self.listlock.acquire()
- try:
- skip = message in self.list
- if skip:
- self.list.remove(message)
- finally:
- self.listlock.release()
- if not skip and not message.upper().startswith('PING'):
- print message
- purplelock.acquire()
- try:
- for i in purple.PurpleGetConversations():
- if purple.PurpleAccountGetUsername(purple.PurpleConversationGetAccount(i)) in botname:
- if purple.PurpleConversationGetType(i)==1:
- purple.PurpleConvImSend(purple.PurpleConvIm(i), message)
- else:
- purple.PurpleConvChatSend(purple.PurpleConvChat(i), message)
- finally:
- purplelock.release()
- messages = messages[len(messages)-1]
- except Exception, e:
- try:
- self.sock.close()
- except:
- pass
- self.sock = None
- print "Connect to ChadProto failed: %s\n" % e
- retry = retry - 1
- print "Permanently disconnecting from ChadProto"
- self.sock = None
- chad = ChadProtoThread()
- def my_func(account, sender, message, conversation, flags):
- accountname = purple.PurpleAccountGetUsername(account)
- if (accountname in botname) and (sender not in botname) and (sender not in bannedsenders) and ((sender in allowedsenders) or (len(allowedsenders)==0)):
- sendertyp = purple.PurpleConversationGetType(conversation)
- if message[0]=='`':
- print sender + " commanded: " + message[1:]
- chad.writemessage(message[1:])
- else:
- print sender + " said: " + message
- chad.writemessage(sender + ": " + message)
- for i in purple.PurpleGetConversations():
- if (purple.PurpleAccountGetUsername(purple.PurpleConversationGetAccount(i)) in botname) and (i!=conversation):
- if purple.PurpleConversationGetType(i)==1:
- purple.PurpleConvImSend(purple.PurpleConvIm(i), sender + ": " + message)
- else:
- purple.PurpleConvChatSend(purple.PurpleConvChat(i), sender + ": " + message)
- dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
- bus = dbus.SessionBus()
- obj = bus.get_object("im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject")
- purple = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface")
- bus.add_signal_receiver(my_func,
- dbus_interface="im.pidgin.purple.PurpleInterface",
- signal_name="ReceivedChatMsg")
- bus.add_signal_receiver(my_func,
- dbus_interface="im.pidgin.purple.PurpleInterface",
- signal_name="ReceivedImMsg")
- print "Available Accounts: ",
- for i in purple.PurpleAccountsGetAll():
- print purple.PurpleAccountGetUsername(i)," ",
- print ""
- loop = gobject.MainLoop()
- gobject.threads_init()
- chad.start()
- context = loop.get_context()
- while True:
- purplelock.acquire()
- try:
- context.iteration(False)
- finally:
- purplelock.release()
- time.sleep(0.1)
- chad.setquit(True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement