View difference between Paste ID: TvJp0Gcx and aVJuiLK4
SHOW: | | - or go back to the newest paste.
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):
13+
def httpRequest(server, resource, body="", headers={}, method="GET"):
14-
	conn = httplib.HTTPConnection(server)
14+
	connection = httplib.HTTPConnection(server)
15-
	conn.request("GET", resource)
15+
	connection.request(method, resource, body, headers)
16-
	r1 = conn.getresponse()
16+
	response = connection.getresponse()
17-
	data1 = r1.read()
17+
	headers = response.getheaders()
18-
	conn.close()
18+
	data = response.read()
19-
	return data1
19+
	connection.close()
20
	return (headers, data)
21
	
22
class TinychatMessage():
23
	def __init__(self, msg, nick, user=None, recipient=None, color=None, pm=False):
24
		self.msg = msg
25
		self.nick = nick
26
		self.user = user
27
		self.recipient = recipient
28
		self.color = color
29
		self.pm = pm
30
	
31
	def printFormatted(self):
32
		if self.pm:
33
			pm = "(PM) "
34
		else:
35
			pm = ""
36
		print(pm + self.recipient + ": " + self.nick + ": " + self.msg)
37
38
class TinychatUser():
39
	def __init__(self, nick, id=None, color=None, lastMsg=None):
40
		self.nick = nick
41
		self.id = id
42
		self.color = color
43
		self.lastMsg = lastMsg
44
45
TINYCHAT_COLORS = ["#7db257", "#a78901", "#9d5bb5", "#5c1a7a", "#c53332", "#821615", "#a08f23", "#487d21", "#c356a3", "#1d82eb", "#919104", "#a990", "#b9807f", "#7bb224", "#1965b6", "#32a5d9"]
46
47
class TinychatRoom():
48-
	def __init__(self, room, nick=None):
48+
49
	def __init__(self, room, nick=None, passwd=None):
50
		self.room = room
51
		self.tcUrl = self._getTcUrl()
52
		parts = self.tcUrl.split("/")
53
		server = parts[2].split(":")
54
		self.server = server[0]
55
		self.port = int(server[1])
56
		self.app = parts[3]
57
		self.url = "http://tinychat.com/" + room
58
		self.connected = False
59
		self.queue = []
60
		self.color = TINYCHAT_COLORS[random.randint(0, len(TINYCHAT_COLORS) - 1)]
61
		self.nick = nick
62
		self.passwd = passwd
63
		if self.nick == "": self.nick = None
64
		if self.passwd == "": self.passwd = None
65
		self.topic = None
66
		self.users = {}
67
		self.echo = __name__ == "__main__"
68
		self.stack = False
69-
			self.connection.connect([self.room])
69+
70
	def connect(self):
71
		if not self.connected:
72
			self.connection = rtmp_protocol.RtmpClient(self.server, self.port, self.tcUrl, self.url, '', self.app)
73
			if self.nick:
74
				n = self.nick.lower()
75
			else:
76
				n = ""
77
			self.connection.connect([self.room, self._getAutoOp(), u'show', u'tinychat', n])
78
			self.connected = True
79
			self._listen()
80
	
81
	def disconnect(self):
82
		if self.connected:
83
			self.connected = False
84
			self.connection.socket.shutdown(socket.SHUT_RDWR)
85
	
86
	def poll(self):
87
		q = self.queue
88
		self.queue = []
89
		return q
90
		
91
	# Commands
92
	def say(self, msg):
93
		if len(msg) > 152: return
94
		self._sendCommand("privmsg", [u"" + self._encodeMessage(msg), u"" + self.color + ",en"])
95
		
96
	def pm(self, msg, recipient):
97
		if len(msg) > 152: return
98
		self._sendCommand("privmsg", [u"" + self._encodeMessage("/msg " + recipient + " " + msg), u"" + self.color + ",en", u"n" + self._getUser(recipient).id + "-" + recipient])
99
		
100
	def setNick(self, nick=None):
101
		if not nick: nick = self.nick
102
		self.nick = nick
103
		self._sendCommand("nick", [u"" + nick])
104
	
105
	def cycleColor(self):
106
		try:
107
			i = TINYCHAT_COLORS.index(self.color)
108
		except:
109
			i = TINYCHAT_COLORS[random.randint(0, len(TINYCHAT_COLORS) - 1)]
110
		i = (i + 1) % len(TINYCHAT_COLORS)
111
		self.color = TINYCHAT_COLORS[i]
112
	
113
	# Events
114
	def onMessage(self, user, message):
115
		if self.echo: message.printFormatted()
116
		
117
	def onPM(self, user, message):
118
		if self.echo: message.printFormatted()
119
	
120
	def onQuit(self, user):
121
		if self.echo: print(self.room + ": " + user.nick + " left the room.")
122
	
123
	def onJoin(self, user):
124
		if self.echo: print(self.room + ": " + user.nick + " entered the room.")
125
	
126
	def onRegister(self, user):
127
		if self.echo: print("You have connected to " + self.room + ".")
128
	
129
	def onNickChange(self, new, old, user):
130
		if self.echo: print(self.room + ": " + old + " changed nickname to " + new + ".")
131
	
132
	def onTopic(self, topic):
133
		if self.echo: print(self.room + ": Topic set to \"" + topic + "\".")
134
	
135
	def onUserList(self, users):
136
		pass
137
	
138
	# Helper methods
139
	def _listen(self):
140
		while self.connected:
141
			try:
142
				msg = self.connection.reader.next()
143
				if DEBUG: print("SERVER: " + str(msg))
144
				if msg['msg'] == rtmp_protocol.DataTypes.COMMAND:
145
					pars = msg['command']
146
					cmd = pars[0].encode("ascii", "ignore").lower()
147
					if len(pars) > 3:
148
						pars = pars[3:]
149
					else:
150
						pars = []
151
					for i in range(len(pars)):
152
						if type(pars[i]) == str: pars[i] = pars[i].encode("ascii", "ignore")
153
					if cmd == "privmsg":
154
						recipient = pars[0]
155
						message = pars[1]
156
						color = pars[2].lower().split(",")[0]
157
						nick = pars[3]
158
						if recipient[0] == "#":
159
							recipient = "^".join(recipient.split("^")[1:])
160
						else:
161
							recipient = "-".join(recipient.split("-")[1:])
162
						user = self._getUser(nick)
163
						message = TinychatMessage(self._decodeMessage(message), nick, user, recipient, color)
164
						user.lastMsg = message
165
						user.color = color
166
						if self.stack: self.queue.append(message)
167
						if recipient.lower() == self.nick.lower():
168
							message.pm = True
169
							if message.msg.startswith("/msg ") and len(message.msg.split(" ")) >= 2: message.msg = " ".join(message.msg.split(" ")[2:])
170
							self.onPM(user, message)
171
						else:
172
							self.onMessage(user, message)
173
					elif cmd == "registered":
174
						if self.nick: self.setNick()
175
						user = self._getUser(pars[0])
176
						user.id = pars[1]
177
						self.onRegister(user)
178
					elif cmd == "topic":
179
						self.topic = pars[0]
180
						self.onTopic(self.topic)
181
					elif cmd == "nick":
182
						user = self._getUser(pars[0])
183
						old = user.nick
184
						user.nick = pars[1]
185
						if old.lower() in self.users.keys():
186
							del self.users[old.lower()]
187
							self.users[user.nick.lower()] = user
188
						self.onNickChange(user.nick, old, user)
189
					elif cmd == "quit":
190
						user = self.users[pars[0].lower()]
191
						del self.users[pars[0].lower()]
192
						self.onQuit(user)
193
					elif cmd == "join":
194
						user = self._getUser(pars[1])
195
						user.id = pars[0]
196
						self.onJoin(user)
197
					elif cmd == "joins":
198
						for i in range((len(pars) - 1) / 2):
199
							user = self._getUser(pars[i*2 + 2])
200
							user.id = pars[i*2 + 1]
201
					elif cmd == "joinsdone":
202
						self.onUserList(self.users)
203
			except:
204
				pass
205
					
206
	def _getUser(self, nick):
207
		if not nick.lower() in self.users.keys(): self.users[nick.lower()] = TinychatUser(nick)
208
		return self.users[nick.lower()]
209
    
210
	def _decodeMessage(self, msg):
211
		chars = msg.split(",")
212
		msg = ""
213
		for i in chars:
214
			msg += chr(int(i))
215
		return msg
216
	    
217
	def _encodeMessage(self, msg):
218
		msg2 = []
219
		for i in msg:
220
			msg2.append(str(ord(i)))
221
		return ",".join(msg2)
222-
		return parseString(httpRequest("tinychat.com", "/api/find.room/" + self.room)).getElementsByTagName("response")[0].getAttribute("rtmp")
222+
223
	def _sendCommand(self, cmd, pars=[]):
224
		msg = {"msg": rtmp_protocol.DataTypes.COMMAND, "command": [u"" + cmd, 0, None] + pars}
225-
	room = TinychatRoom(raw_input("Enter room name: "), raw_input("Enter username: "))
225+
226
		self.connection.writer.write(msg)
227
		self.connection.writer.flush()
228
	
229
	def _getTcUrl(self):	
230
		return parseString(httpRequest("tinychat.com", "/api/find.room/" + self.room)[1]).getElementsByTagName("response")[0].getAttribute("rtmp")
231
		
232
	def _getAutoOp(self):
233
		if self.nick and self.passwd:
234
			headers = httpRequest("tinychat.com", "/login", "form_sent=1&referer=&next=&username=" + self.nick + "&password=" + self.passwd + "&passwordfake=Password&remember=1", {"Content-Type": "application/x-www-form-urlencoded"}, "POST")[0]
235
			cookies = []
236
			for header in headers:
237
				if header[0].lower() == "set-cookie":
238
					parts = header[1].split(", ")
239
					for i in range(len(parts)):
240
						part = parts[i]
241
						part2 = part.split(";")[0]
242
						if "=" in part2:
243
							if "," in part2:
244
								part2 = part2.split(", ")[1]
245
							cookies.append(part2)
246
					break
247
			if len(cookies) > 0:
248
				html = httpRequest("tinychat.com", "/" + self.room, "", {"Content-Type": "application/x-www-form-urlencoded", "Cookie": "; ".join(cookies)})[1]
249
				if ", autoop: \"" in html:
250
					return html.split(", autoop: \"")[1].split("\"")[0]
251
		return u"none"
252
253
if __name__ == "__main__":
254
	room = TinychatRoom(raw_input("Enter room name: "), raw_input("Enter username (optional): "), raw_input("Enter password (optional): "))
255
	thread.start_new_thread(room.connect, ())
256
	while not room.connected: time.sleep(1)
257
	while room.connected: room.say(raw_input())