Advertisement
Guest User

Pidgin Bridge++ish

a guest
Sep 3rd, 2011
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.13 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. import os
  4. import htmllib, formatter
  5. import StringIO
  6. import time
  7. import socket
  8. import threading
  9. import dbus, gobject
  10. from dbus.mainloop.glib import DBusGMainLoop
  11.  
  12. botname = ['screenname1','ircbot@irc.ubuntu.com']
  13. bannedsenders = []
  14. allowedsenders = []
  15.  
  16. purplelock = threading.Lock()
  17.  
  18. class ChadProtoThread(threading.Thread):
  19.     def getquit(self):
  20.         self.lock.acquire()
  21.         quit = self.quit
  22.         self.lock.release()
  23.  
  24.     def setquit(self,val):
  25.         self.lock.acquire()
  26.         self.quit = val
  27.         self.lock.release()
  28.    
  29.     def writemessage(self,message,echoed=True):
  30.         self.sock.sendall(message + "\r\n")
  31.         self.listlock.acquire()
  32.         try:
  33.             self.last = time.time()
  34.             if echoed:
  35.                 self.list.append(message)
  36.         finally:
  37.             self.listlock.release()
  38.  
  39.     def run(self):
  40.         self.listlock = threading.Lock()
  41.         self.list = []
  42.         self.last = time.time()
  43.         self.lock = threading.Lock()
  44.         self.quit = False
  45.         self.sock = None
  46.  
  47.         ip = 'youprobablydontcareaboutthisbecausethisisacustomchatprotocolmyfriendused.doesntexist.com'
  48.         port = 9054
  49.         retry = 3
  50.  
  51.         while (retry > 0) and not self.getquit():
  52.             try:
  53.                 print "Connecting to ChadProto (%s:%d) port...\n" % (ip,port)
  54.                 self.sock = socket.socket()
  55.                 self.sock.connect((ip,port))
  56.                 self.sock.setblocking(0)
  57.                 retry = 3
  58.                 messages = ''
  59.                 print "Connected to ChadProto ... \n"
  60.                 while not self.getquit():
  61.                     time.sleep(0.1)
  62.                     self.listlock.acquire()
  63.                     try:
  64.                         ping = (time.time() - self.last) > 60.00
  65.                     finally:
  66.                         self.listlock.release()
  67.                     if ping:
  68.                         print 'PING!'
  69.                         self.writemessage('ping',False)
  70.                     buffer = ""
  71.                     try:
  72.                         buffer = self.sock.recv(1024).strip("\x00")
  73.                         if buffer.upper().startswith('SETNOTE'):
  74.                             buffer = buffer + '\r\n'
  75.                     except socket.error, err:
  76.                         if err.args[0]==11:
  77.                             pass
  78.                         else:
  79.                             raise
  80.                     messages = (messages + buffer).split("\r\n")
  81.                     for message in messages[:-1]:
  82.                         self.listlock.acquire()
  83.                         try:
  84.                             skip = message in self.list
  85.                             if skip:
  86.                                 self.list.remove(message)
  87.                         finally:
  88.                             self.listlock.release()
  89.                         if not skip and not message.upper().startswith('PING'):
  90.                             print message
  91.                             purplelock.acquire()
  92.                             try:
  93.                                 for i in purple.PurpleGetConversations():
  94.                                     if purple.PurpleAccountGetUsername(purple.PurpleConversationGetAccount(i)) in botname:
  95.                                         if purple.PurpleConversationGetType(i)==1:
  96.                                             purple.PurpleConvImSend(purple.PurpleConvIm(i), message)
  97.                                         else:
  98.                                             purple.PurpleConvChatSend(purple.PurpleConvChat(i), message)
  99.                             finally:
  100.                                 purplelock.release()
  101.                     messages = messages[len(messages)-1]
  102.             except Exception, e:
  103.                 try:
  104.                     self.sock.close()
  105.                 except:
  106.                     pass
  107.                 self.sock = None
  108.                 print "Connect to ChadProto failed: %s\n" % e
  109.                 retry = retry - 1
  110.         print "Permanently disconnecting from ChadProto"
  111.         self.sock = None
  112.  
  113. chad = ChadProtoThread()
  114.  
  115. def my_func(account, sender, message, conversation, flags):
  116.     accountname = purple.PurpleAccountGetUsername(account)
  117.     if (accountname in botname) and (sender not in botname) and (sender not in bannedsenders) and ((sender in allowedsenders) or (len(allowedsenders)==0)):
  118.         sendertyp = purple.PurpleConversationGetType(conversation)
  119.         if message[0]=='`':
  120.             print sender + " commanded: " + message[1:]
  121.             chad.writemessage(message[1:])
  122.         else:
  123.             print sender + " said: " + message
  124.             chad.writemessage(sender + ": " + message)
  125.             for i in purple.PurpleGetConversations():
  126.                 if (purple.PurpleAccountGetUsername(purple.PurpleConversationGetAccount(i)) in botname) and (i!=conversation):
  127.                     if purple.PurpleConversationGetType(i)==1:
  128.                         purple.PurpleConvImSend(purple.PurpleConvIm(i), sender + ": " + message)
  129.                     else:
  130.                         purple.PurpleConvChatSend(purple.PurpleConvChat(i), sender + ": " + message)
  131.  
  132. dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
  133. bus = dbus.SessionBus()
  134.  
  135. obj = bus.get_object("im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject")
  136. purple = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface")
  137.  
  138. bus.add_signal_receiver(my_func,
  139.                         dbus_interface="im.pidgin.purple.PurpleInterface",
  140.                         signal_name="ReceivedChatMsg")
  141. bus.add_signal_receiver(my_func,
  142.                         dbus_interface="im.pidgin.purple.PurpleInterface",
  143.                         signal_name="ReceivedImMsg")
  144.  
  145. print "Available Accounts: ",
  146. for i in purple.PurpleAccountsGetAll():
  147.     print purple.PurpleAccountGetUsername(i)," ",
  148. print ""
  149.  
  150. loop = gobject.MainLoop()
  151. gobject.threads_init()
  152. chad.start()
  153. context = loop.get_context()
  154. while True:
  155.     purplelock.acquire()
  156.     try:
  157.         context.iteration(False)
  158.     finally:
  159.         purplelock.release()
  160.     time.sleep(0.1)
  161. chad.setquit(True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement