Advertisement
MegaLoler

Tinychat Library

Apr 27th, 2012
1,264
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.89 KB | None | 0 0
  1. import rtmp_protocol
  2. import httplib
  3. from xml.dom.minidom import parseString
  4. import thread
  5. import time
  6. import random
  7.  
  8. # Tinychat Library by MegaLoler
  9.  
  10. DEBUG = False
  11.  
  12. def httpRequest(server, resource):
  13.     conn = httplib.HTTPConnection(server)
  14.     conn.request("GET", resource)
  15.     r1 = conn.getresponse()
  16.     data1 = r1.read()
  17.     conn.close()
  18.     return data1
  19.    
  20. class TinychatMessage():
  21.     def __init__(self, msg, nick, user=None, recipient=None, color=None):
  22.         self.msg = msg
  23.         self.nick = nick
  24.         self.user = user
  25.         self.recipient = recipient
  26.         self.color = color
  27.    
  28.     def printFormatted(self):
  29.         print(self.recipient + ": " + self.nick + ": " + self.msg)
  30.  
  31. class TinychatUser():
  32.     def __init__(self, nick, id=None, color=None, lastMsg=None):
  33.         self.nick = nick
  34.         self.id = id
  35.         self.color = color
  36.         self.lastMsg = lastMsg
  37.  
  38. TINYCHAT_COLORS = ["#7db257", "#a78901", "#9d5bb5", "#5c1a7a", "#c53332", "#821615", "#a08f23", "#487d21", "#c356a3", "#1d82eb", "#919104", "#a990", "#b9807f", "#7bb224", "#1965b6", "#32a5d9"]
  39.  
  40. class TinychatRoom():
  41.     # Manages a single room connection 
  42.     def __init__(self, room, nick=None):
  43.         self.room = room
  44.         self.tcUrl = self._getTcUrl()
  45.         parts = self.tcUrl.split("/")
  46.         server = parts[2].split(":")
  47.         self.server = server[0]
  48.         self.port = int(server[1])
  49.         self.app = parts[3]
  50.         self.url = "http://tinychat.com/" + room
  51.         self.connected = False
  52.         self.queue = []
  53.         self.color = TINYCHAT_COLORS[random.randint(0, len(TINYCHAT_COLORS) - 1)]
  54.         self.nick = nick
  55.         self.users = {}
  56.         self.echo = __name__ == "__main__"
  57.         self.stack = False
  58.  
  59.     def connect(self):
  60.         self.connection = rtmp_protocol.RtmpClient(self.server, self.port, self.tcUrl, self.url, '', self.app)
  61.         self.connection.connect([self.room])
  62.         self.connected = True
  63.         self._listen()
  64.    
  65.     def disconnect(self):
  66.         self.connected = False
  67.    
  68.     def poll(self):
  69.         q = self.queue
  70.         self.queue = []
  71.         return q
  72.        
  73.     # Commands
  74.     def say(self, msg):
  75.         if len(msg) > 152: return
  76.         self._sendCommand("privmsg", [u"" + self._encodeMessage(msg), u"" + self.color + ",en"])
  77.        
  78.     def pm(self, msg, recipient):
  79.         if len(msg) > 152: return
  80.         self._sendCommand("privmsg", [u"" + self._encodeMessage("/msg " + recipient + " " + msg), u"" + self.color + ",en", u"n" + self._getUser(recipient).id + "-" + recipient])
  81.        
  82.     def setNick(self, nick=None):
  83.         if not nick: nick = self.nick
  84.         self.nick = nick
  85.         self._sendCommand("nick", [u"" + nick])
  86.    
  87.     def cycleColor(self):
  88.         try:
  89.             i = TINYCHAT_COLORS.index(self.color)
  90.         except:
  91.             i = TINYCHAT_COLORS[random.randint(0, len(TINYCHAT_COLORS) - 1)]
  92.         i = (i + 1) % len(TINYCHAT_COLORS)
  93.         self.color = TINYCHAT_COLORS[i]
  94.    
  95.     # Events
  96.     def onMessage(self, user, message):
  97.         if self.echo: message.printFormatted()
  98.    
  99.     def onQuit(self, user):
  100.         if self.echo: print(self.room + ": " + user.nick + " left the room.")
  101.    
  102.     def onJoin(self, user):
  103.         if self.echo: print(self.room + ": " + user.nick + " entered the room.")
  104.    
  105.     def onRegister(self, user):
  106.         if self.echo: print("You have connected to " + self.room + ".")
  107.    
  108.     def onNickChange(self, new, old, user):
  109.         if self.echo: print(self.room + ": " + old + " changed nickname to " + new + ".")
  110.    
  111.     # Helper methods
  112.     def _listen(self):
  113.         while self.connected:
  114.             msg = self.connection.reader.next()
  115.             if DEBUG: print("SERVER: " + str(msg))
  116.             if msg['msg'] == rtmp_protocol.DataTypes.COMMAND:
  117.                 pars = msg['command']
  118.                 cmd = pars[0].encode("ascii", "ignore").lower()
  119.                 if len(pars) > 3:
  120.                     pars = pars[3:]
  121.                 else:
  122.                     pars = []
  123.                 for i in range(len(pars)):
  124.                     if type(pars[i]) == str: pars[i] = pars[i].encode("ascii", "ignore")
  125.                 if cmd == "privmsg":
  126.                     recipient = pars[0]
  127.                     message = pars[1]
  128.                     color = pars[2].lower().split(",")[0]
  129.                     nick = pars[3]
  130.                     if recipient[0] == "#":
  131.                         recipient = "^".join(recipient.split("^")[1:])
  132.                     else:
  133.                         recipient = "-".join(recipient.split("-")[1:])
  134.                     user = self._getUser(nick)
  135.                     message = TinychatMessage(self._decodeMessage(message), nick, user, recipient, color)
  136.                     user.lastMsg = message
  137.                     user.color = color
  138.                     if self.stack: self.queue.append(message)
  139.                     self.onMessage(user, message)
  140.                 elif cmd == "registered":
  141.                     if self.nick: self.setNick()
  142.                     user = self._getUser(pars[0])
  143.                     user.id = pars[1]
  144.                     self.onRegister(user)
  145.                 elif cmd == "nick":
  146.                     user = self._getUser(pars[0])
  147.                     old = user.nick
  148.                     user.nick = pars[1]
  149.                     self.onNickChange(user.nick, old, user)
  150.                 elif cmd == "quit":
  151.                     user = self.users[pars[0].lower()]
  152.                     del self.users[pars[0].lower()]
  153.                     self.onQuit(user)
  154.                 elif cmd == "join":
  155.                     user = self._getUser(pars[1])
  156.                     user.id = pars[0]
  157.                     self.onJoin(user)
  158.                 elif cmd == "joins":
  159.                     for i in range((len(pars) - 1) / 2):
  160.                         user = self._getUser(pars[i*2 + 2])
  161.                         user.id = pars[i*2 + 1]
  162.                         self.onJoin(user)
  163.                    
  164.     def _getUser(self, nick):
  165.         if not nick.lower() in self.users.keys(): self.users[nick.lower()] = TinychatUser(nick)
  166.         return self.users[nick.lower()]
  167.    
  168.     def _decodeMessage(self, msg):
  169.         chars = msg.split(",")
  170.         msg = ""
  171.         for i in chars:
  172.             msg += chr(int(i))
  173.         return msg
  174.        
  175.     def _encodeMessage(self, msg):
  176.         msg2 = []
  177.         for i in msg:
  178.             msg2.append(str(ord(i)))
  179.         return ",".join(msg2)
  180.    
  181.     def _sendCommand(self, cmd, pars=[]):
  182.         msg = {"msg": rtmp_protocol.DataTypes.COMMAND, "command": [u"" + cmd, 0, None] + pars}
  183.         if DEBUG: print("CLIENT: " + str(msg))
  184.         self.connection.writer.write(msg)
  185.         self.connection.writer.flush()
  186.    
  187.     def _getTcUrl(self):   
  188.         return parseString(httpRequest("tinychat.com", "/api/find.room/" + self.room)).getElementsByTagName("response")[0].getAttribute("rtmp")
  189.  
  190. if __name__ == "__main__":
  191.     room = TinychatRoom(raw_input("Enter room name: "), raw_input("Enter username: "))
  192.     thread.start_new_thread(room.connect, ())
  193.     while not room.connected: time.sleep(1)
  194.     while room.connected: room.say(raw_input())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement