Advertisement
MegaLoler

Updated Tinychat Library

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