class BoardListenMessageSocketHandler(tornado.websocket.WebSocketHandler):
#TODO Merge these code with long-polling functions. avoid frequently db access
	@authenticate
	def open(self):
		print "WebSocket opened","x" * 20
		self.mongodb = self.application.settings['_db']
		user		= self.user
		exchange	= self.session['exchange']

		messages = [ msg.content for msg in BoardMessage.find_all(id=self.session.session_id)]
		if len(messages) > 0:
			self.write_message(json.dumps(messages["message-list"]))

		session = self.mongodb.board.find_one({"id":self.session.session_id})

		self.mongoSession = session
		self.messagesBuffer = messages
		binding_keys= (self.session['public_key'], self.session['private_key'])
		print "QUEUE NAME",session['queue']
		self.channel= PersistentChannel(
				self.application.channel,
				str(session['queue']), exchange, binding_keys, self,arguments = {"x-expires":int(600000)})
		self.channel.add_message_action(self.message_call_back, None)
		self.channel.connect()
		self.lastestTimestamp = 0
		self._isClosed = False

	def clean_matured_message(self, timestamp):
		self.lastestTimestamp = timestamp
		self.messagesBuffer = filter(lambda x: int(x['timestamp']) > timestamp, self.messagesBuffer)


	def isClosed(self):
		return self._isClosed

	def on_connection_close(self):
		self._isClosed = True
		DatabaseConnection()[BoardMessage.table_name].remove({
						"id":self.session.session_id,
						'timestamp':{'$lte':self.lastestTimestamp}
						})

		id			= self.session.session_id
		for content in self.messagesBuffer:
			BoardMessage.new(id,int(content['timestamp']),content)
		self.channel.close()

	def message_call_back(self, argument):
		new_messages	= self.channel.get_messages()
		print "=======================Mr.%s's Message============================" % (self.user.username)
		print "+++++++++++++++++++++++++++++++++++"
		print new_messages
		print "+++++++++++++++++++++++++++++++++++"

		if self.isClosed():
			for msg in new_messages:
				BoardMessage.new(id,int(content['timestamp']),msg)
		else:
			self.messagesBuffer.extend(new_messages)
			self.write_message(json.dumps(new_messages))
		#board_messages	= self.mongodb.board.find_one({"user_id": user_id})
		#board_messages["message-list"].extend(new_messages)
		#self.mongodb.board.save(board_messages)
		#self.board_messages = board_messages["message-list"]
		#self.mongoSession = board_messages


	def on_message(self, message):
		msg = json.loads(message)
		if 'timestamp' in msg:
			timestamp	= int(msg['timestamp'])
			self.clean_matured_message(timestamp)
		elif 'action' in msg:
			message					= msg
			message['user_id']		= str(self.session['user_id'])
			message['method']		= 'action'
			message['private_key']	= self.session['private_key']
			message['room_id']		= str(self.mongoSession['room_id'])
			self.channel.publish_message("dealer", json.dumps(message));

	def cancel_ok(self):
		pass

	def on_close(self):
		self.channel.close();
		print "WebSocket closed"

	def allow_draft76(self):
		return True
class BoardListenMessageSocketHandler(tornado.websocket.WebSocketHandler):
    #TODO Merge these code with long-polling functions. avoid frequently db access
    @authenticate
    def open(self):
        print "WebSocket opened", "x" * 20
        self.mongodb = self.application.settings['_db']
        user = self.user
        exchange = self.session['exchange']

        messages = [
            msg.content
            for msg in BoardMessage.find_all(id=self.session.session_id)
        ]
        if len(messages) > 0:
            self.write_message(json.dumps(messages["message-list"]))

        session = self.mongodb.board.find_one({"id": self.session.session_id})

        self.mongoSession = session
        self.messagesBuffer = messages
        binding_keys = (self.session['public_key'],
                        self.session['private_key'])
        print "QUEUE NAME", session['queue']
        self.channel = PersistentChannel(self.application.channel,
                                         str(session['queue']),
                                         exchange,
                                         binding_keys,
                                         self,
                                         arguments={"x-expires": int(600000)})
        self.channel.add_message_action(self.message_call_back, None)
        self.channel.connect()
        self.lastestTimestamp = 0
        self._isClosed = False

    def clean_matured_message(self, timestamp):
        self.lastestTimestamp = timestamp
        self.messagesBuffer = filter(lambda x: int(x['timestamp']) > timestamp,
                                     self.messagesBuffer)

    def isClosed(self):
        return self._isClosed

    def on_connection_close(self):
        self._isClosed = True
        DatabaseConnection()[BoardMessage.table_name].remove({
            "id":
            self.session.session_id,
            'timestamp': {
                '$lte': self.lastestTimestamp
            }
        })

        id = self.session.session_id
        for content in self.messagesBuffer:
            BoardMessage.new(id, int(content['timestamp']), content)
        self.channel.close()

    def message_call_back(self, argument):
        new_messages = self.channel.get_messages()
        print "=======================Mr.%s's Message============================" % (
            self.user.username)
        print "+++++++++++++++++++++++++++++++++++"
        print new_messages
        print "+++++++++++++++++++++++++++++++++++"

        if self.isClosed():
            for msg in new_messages:
                BoardMessage.new(id, int(content['timestamp']), msg)
        else:
            self.messagesBuffer.extend(new_messages)
            self.write_message(json.dumps(new_messages))
        #board_messages	= self.mongodb.board.find_one({"user_id": user_id})
        #board_messages["message-list"].extend(new_messages)
        #self.mongodb.board.save(board_messages)
        #self.board_messages = board_messages["message-list"]
        #self.mongoSession = board_messages

    def on_message(self, message):
        msg = json.loads(message)
        if 'timestamp' in msg:
            timestamp = int(msg['timestamp'])
            self.clean_matured_message(timestamp)
        elif 'action' in msg:
            message = msg
            message['user_id'] = str(self.session['user_id'])
            message['method'] = 'action'
            message['private_key'] = self.session['private_key']
            message['room_id'] = str(self.mongoSession['room_id'])
            self.channel.publish_message("dealer", json.dumps(message))

    def cancel_ok(self):
        pass

    def on_close(self):
        self.channel.close()
        print "WebSocket closed"

    def allow_draft76(self):
        return True