Esempio n. 1
0
    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()
Esempio n. 2
0
    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)
Esempio n. 3
0
    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)
Esempio n. 4
0
    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)
Esempio n. 5
0
    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
            )
Esempio n. 6
0
    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
            )
Esempio n. 7
0
    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)
Esempio n. 8
0
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
Esempio n. 9
0
    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)
Esempio n. 10
0
    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)
Esempio n. 11
0
    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
Esempio n. 12
0
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
Esempio n. 13
0
    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
Esempio n. 14
0
    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)
Esempio n. 15
0
    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']))
Esempio n. 16
0
    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)
Esempio n. 17
0
    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})
Esempio n. 18
0
    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)