def new_message(self, data): '''收到nsq服务器的新消息, data必须具有`topic`和`message`两个字段, 分别用来保存消息的topic和具体消息内容, 你需要在相关消费者的handler里边封装之. data结构如下所示. { 'topic': xxx, 'message': xxx } ''' if self.request.connection.stream.closed(): return assert isinstance(data, dict) assert 'topic' in data assert 'message' in data MessageDocument.set_read_sync(self.current_user['_id'], data['topic']) if data['topic'] == MessageTopic.CHAT_MESSAGE_NEW: # 将该消息标记为已读 ChatMessageDocument.get_collection(pymongo=True).update( {'_id': ObjectId(data['message']['_id'])}, {'$set': {'read': True}} ) messages = [{ '_id': data['message']['sender'], 'messages': [data['message']] }] response_data = self._new_chat_message_handler(messages) else: response_data = self._new_message_handler(data) self.write_json(response_data) self.finish()
def new_message(self, data): '''收到nsq服务器的新消息, data必须具有`topic`和`message`两个字段, 分别用来保存消息的topic和具体消息内容, 你需要在相关消费者的handler里边封装之. data结构如下所示. { 'topic': xxx, 'message': xxx } ''' if self.request.connection.stream.closed(): return assert isinstance(data, dict) assert 'topic' in data assert 'message' in data MessageDocument.set_read_sync(self.current_user['_id'], data['topic']) if data['topic'] == MessageTopic.CHAT_MESSAGE_NEW: # 将该消息标记为已读 ChatMessageDocument.get_collection(pymongo=True).update( {'_id': ObjectId(data['message']['_id'])}, {'$set': {'read': True}} ) messages = [{ '_id': data['message']['sender'], 'messages': [data['message']] }] response_data = self._new_chat_message_handler(messages) else: response_data = self._new_message_handler(data) self.finish(response_data)
def message(self, msg): '''收到Ejabberd服务器发来的信息, 判断后发到browser端''' if msg['type'] == 'chat': # 只有上线后才能收到信息 ChatMessageDocument.get_collection(True).update( {'_id': ObjectId(str(msg['subject']))}, {'$set': {'received': True}}) BrowserClientManager.new_message(msg)
def message(self, msg): '''收到Ejabberd服务器发来的信息, 判断后发到browser端''' if msg['type'] == 'chat': # 只有上线后才能收到信息 ChatMessageDocument.get_collection(True).update( {'_id': ObjectId(str(msg['subject']))}, {'$set': { 'received': True }}) BrowserClientManager.new_message(msg)
def post(self): form = MessageUpdaterForm(self.request.arguments) if not form.validate(): raise HTTPError(404) n = form.n.data XMPPClientManager.get_xmppclient( self.current_user['_id'], self.current_user['password'] ) has_unreceived = MessageDocument.has_unreceived( self.current_user['_id'] ) has_unread_chat_message = ChatMessageDocument.has_unread_chat_message( self.current_user['_id'] ) if n == 1 or has_unreceived: unread_message_numbers = MessageDocument.get_unread_message_numbers( self.current_user['_id'] ) MessageDocument.set_received(self.current_user['_id']) kwargs = { 'unread_message_numbers': unread_message_numbers, 'MessageTopic': MessageTopic } html = self.render_string( 'message/template/message-header.html', **kwargs ) self.write_json({ 'topic': 'unread_message_numbers', 'html': html }) self.finish() elif has_unread_chat_message: messages = ChatMessageDocument.get_unread_messages( self.current_user['_id'] ) response_data = self._new_chat_message_handler(messages) ChatMessageDocument.set_read(self.current_user['_id']) self.write_json(response_data) self.finish() else: BrowserCallbackManager.add( self.current_user['_id'], self.new_message )
def post(self): form = MessageUpdaterForm(self.request.arguments) if not form.validate(): raise HTTPError(404) n = form.n.data XMPPClientManager.get_xmppclient( self.current_user['_id'], self.current_user['password'] ) has_unreceived = MessageDocument.has_unreceived( self.current_user['_id'] ) has_unread_chat_message = ChatMessageDocument.has_unread_chat_message( self.current_user['_id'] ) if n == 1 or has_unreceived: unread_message_numbers = MessageDocument.get_unread_message_numbers( self.current_user['_id'] ) MessageDocument.set_received(self.current_user['_id']) kwargs = { 'unread_message_numbers': unread_message_numbers, 'MessageTopic': MessageTopic } html = self.render_string( 'message/template/message-header.html', **kwargs ) self.finish(json.dumps({ 'topic': 'unread_message_numbers', 'html': html })) elif has_unread_chat_message: messages = ChatMessageDocument.get_unread_messages( self.current_user['_id'] ) response_data = self._new_chat_message_handler(messages) ChatMessageDocument.set_read(self.current_user['_id']) self.finish(response_data) else: BrowserCallbackManager.add( self.current_user['_id'], self.new_message )
def post(self): form = MessageHistoryForm(self.request.arguments) if not form.validate(): raise HTTPError(404) chat_with = form.chat_with.data since = datetime.fromtimestamp(form.since.data / 1000) id_a = self.current_user['_id'] id_b = chat_with response_data = {'has': 0} history_messages = yield ChatMessageDocument.get_history_messages( id_a, id_b, since ) if history_messages: since = time.mktime( history_messages[0]['send_time'].timetuple() ) * 1000 html = self.render_string( 'chat/template/message-chat.html', history_messages=history_messages ) response_data.update({'has': 1, 'since': since, 'html': html}) self.write_json(response_data)
def chat_message_handler(message): '''topic: 'CHAT_MESSAGE' 用户在线的话, 调用callback. 不在线的保存成离线消息. ''' from app.chat.document import ChatMessageDocument message = ChatMessageDocument.get_collection(pymongo=True).find_one( {'_id': ObjectId(message.body)}) if not message: return True user_id = message['recipient'].id callback = BrowserCallbackManager.get(user_id) if callback: message = {'topic': MessageTopic.CHAT_MESSAGE_NEW, 'message': message} try: callback(message) except: pass return True
def get(self): form = MessageForm(self.request.arguments) if not form.validate(): raise HTTPError(404) category = form.category.data kwargs = yield self.get_sidebar_arguments() if category == MessageTopic.CHAT_MESSAGE_NEW: message_list = yield ChatMessageDocument.get_chat_message_list( self.current_user['_id'], limit=HOME_SETTINGS['message_number_per_page'] ) else: message_list = yield MessageDocument.get_message_list( self.current_user['_id'], message_topic=category, limit=HOME_SETTINGS['message_number_per_page'] ) yield MessageDocument.set_read(self.current_user['_id'], category) kwargs.update({ 'message_list': message_list, 'category': category }) self.render('home/template/message/message.html', **kwargs)
def get_unread_message_numbers(recipient_id): '''得到未读的消息个数''' unread_message_numbers = { MessageTopic._FRIENDS_DYNAMIC: MessageDocument.get_message_number( recipient_id, MessageTopic._FRIENDS_DYNAMIC, read=False ), MessageTopic._COMMENT_AND_REPLY: MessageDocument.get_message_number( recipient_id, MessageTopic._COMMENT_AND_REPLY, read=False ), MessageTopic.LIKE: MessageDocument.get_message_number( recipient_id, MessageTopic.LIKE, read=False ), MessageTopic.CHAT_MESSAGE_NEW: ChatMessageDocument.get_message_number( recipient_id, read=False ), MessageTopic.LEAVE_MESSAGE_NEW: MessageDocument.get_message_number( recipient_id, MessageTopic.LEAVE_MESSAGE_NEW, read=False ), MessageTopic.FRIEND_REQUEST_NEW: MessageDocument.get_message_number( recipient_id, MessageTopic.FRIEND_REQUEST_NEW, read=False ) } return unread_message_numbers
def chat_message_handler(message): '''topic: 'CHAT_MESSAGE' 用户在线的话, 调用callback. 不在线的保存成离线消息. ''' from app.chat.document import ChatMessageDocument message = ChatMessageDocument.get_collection( pymongo=True).find_one({'_id': ObjectId(message.body)}) if not message: return True user_id = message['recipient'].id callback = BrowserCallbackManager.get(user_id) if callback: message = { 'topic': MessageTopic.CHAT_MESSAGE_NEW, 'message': message } try: callback(message) except: pass return True
def get_unread_message_numbers(recipient_id): '''得到未读的消息个数''' unread_message_numbers = { MessageTopic._FRIENDS_DYNAMIC: MessageDocument.get_message_number(recipient_id, MessageTopic._FRIENDS_DYNAMIC, read=False), MessageTopic._COMMENT_AND_REPLY: MessageDocument.get_message_number(recipient_id, MessageTopic._COMMENT_AND_REPLY, read=False), MessageTopic.LIKE: MessageDocument.get_message_number(recipient_id, MessageTopic.LIKE, read=False), MessageTopic.CHAT_MESSAGE_NEW: ChatMessageDocument.get_message_number(recipient_id, read=False), MessageTopic.LEAVE_MESSAGE_NEW: MessageDocument.get_message_number(recipient_id, MessageTopic.LEAVE_MESSAGE_NEW, read=False), MessageTopic.FRIEND_REQUEST_NEW: MessageDocument.get_message_number(recipient_id, MessageTopic.FRIEND_REQUEST_NEW, read=False) } return unread_message_numbers
def new_message(self, msg): '''新消息: Ejabberd服务器 => XMPPClient => Broswer => Here(callback)''' if self.request.connection.stream.closed(): return message = ChatMessageDocument.get_collection(pymongo=True).find_one( {'_id': ObjectId(str(msg['subject']))} ) BrowserClientManager.remove(self.current_user_id, self.chat_with_id) self.render('chat/template/message-others.html', message=message)
def new_message(cls, msg): '''收到XMPPClient端发来的消息''' current_user_id = str(msg['to']).split('@')[0] chat_with_id = str(msg['from']).split('@')[0] _id = ObjectId(str(msg['subject'])) callback = cls.get(current_user_id, chat_with_id) # 在线, 并且打开了聊天窗口 if callback: try: callback(msg) except: logging.error("Error in browser client callback", exc_info=True) ChatMessageDocument.get_collection(pymongo=True).update( {'_id': ObjectId(_id)}, {'$set': {'read': True}}) # 在线但是没有打开聊天窗口. 这种情况下, 交给nsq消息系统处理. else: WriterManager.pub(MessageTopic.CHAT_MESSAGE_NEW, str(msg['subject']))
def post(self): '''加载更多消息''' form = MessageMoreForm(self.request.arguments) if not form.validate(): raise HTTPError(404) page = form.page.data category = form.category.data skip = HOME_SETTINGS['message_number_per_page'] * page limit = HOME_SETTINGS['message_number_per_page'] if category == MessageTopic.CHAT_MESSAGE_NEW: message_list = yield ChatMessageDocument.get_chat_message_list( self.current_user['_id'], skip=skip, limit=limit ) else: message_list = yield MessageDocument.get_message_list( self.current_user['_id'], message_topic=category, skip=skip, limit=limit ) if category == MessageTopic._FRIENDS_DYNAMIC: path = 'message-friends-dynamic-list-item.html' elif category == MessageTopic._COMMENT_AND_REPLY: path = 'message-comment-and-reply-list-item.html' elif category == MessageTopic.AT: path = 'message-at-list-item.html' elif category == MessageTopic.CHAT_MESSAGE_NEW: path = 'message-chat-message-list-item.html' elif category == MessageTopic.FRIEND_REQUEST_NEW: path = 'message-friend-request-list-item.html' elif category == MessageTopic.LIKE: path = 'message-like-list-item.html' path = os.path.join("home/template/message", path) html = ''.join( self.render_string( path, message=message, MessageTopic=MessageTopic ) for message in message_list ) response_data = json.dumps({'html': html, 'page': page + 1}) self.finish(response_data)
def post(self): '''加载更多消息''' form = MessageMoreForm(self.request.arguments) if not form.validate(): raise HTTPError(404) page = form.page.data category = form.category.data skip = HOME_SETTINGS['message_number_per_page'] * page limit = HOME_SETTINGS['message_number_per_page'] if category == MessageTopic.CHAT_MESSAGE_NEW: message_list = yield ChatMessageDocument.get_chat_message_list( self.current_user['_id'], skip=skip, limit=limit ) else: message_list = yield MessageDocument.get_message_list( self.current_user['_id'], message_topic=category, skip=skip, limit=limit ) if category == MessageTopic._FRIENDS_DYNAMIC: path = 'message-friends-dynamic-list-item.html' elif category == MessageTopic._COMMENT_AND_REPLY: path = 'message-comment-and-reply-list-item.html' elif category == MessageTopic.AT: path = 'message-at-list-item.html' elif category == MessageTopic.CHAT_MESSAGE_NEW: path = 'message-chat-message-list-item.html' elif category == MessageTopic.FRIEND_REQUEST_NEW: path = 'message-friend-request-list-item.html' elif category == MessageTopic.LIKE: path = 'message-like-list-item.html' path = os.path.join("home/template/message", path) html = ''.join( self.render_string( path, message=message, MessageTopic=MessageTopic ) for message in message_list ) self.write_json({'html': html, 'page': page + 1})
def post(self): '''浏览器端发来消息''' form = MessageNewForm(self.request.arguments) if not form.validate() or form.chat_with.data == str( self.current_user['_id']): raise HTTPError(404) body = form.body.data chat_with = form.chat_with.data # 是否严格的设置不能同陌生人条聊天? # user_setting = yield UserSettingDocument.get_user_setting(chat_with) # is_friend = yield FriendDocument.is_friend(self.current_user['_id'], chat_with) # if not is_friend and not user_setting['allow_stranger_chat_with_me']: # raise HTTPError(404) mto = XMPPClient.make_jid(chat_with) sender = DBRef( UserDocument.meta['collection'], ObjectId(self.current_user['_id'])) recipient = DBRef(UserDocument.meta['collection'], ObjectId(chat_with)) between = [sender, recipient] message = { 'body': body, 'between': between, 'sender': sender, 'recipient': recipient, 'send_time': datetime.now(), } msg_id = yield ChatMessageDocument.insert(message) client = XMPPClientManager.get_xmppclient( self.current_user['_id'], self.current_user['password']) client.send_message( mto=mto, mbody=body, msubject=str(msg_id), mtype='chat') self.render('chat/template/message-mine.html', message=message)