Advertisement
Guest User

Tinychat Library by Platnimal (Zachary)

a guest
May 26th, 2015
274
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.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.  
  8. # Tinychat Library by Platnimal (Zachary)
  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