mirror of
https://gitee.com/Zhaoxin59/my-chat_-client.git
synced 2026-02-14 00:51:48 +08:00
add Message received
This commit is contained in:
@ -50,13 +50,55 @@ namespace network {
|
||||
|
||||
connect(&websocketClient, &QWebSocket::binaryMessageReceived, this, [=](const QByteArray& byteArray) {
|
||||
LOG() << "webSocket 收到二进制的消息" << byteArray.length();
|
||||
//TODO
|
||||
bite_im::NotifyMessage notifyMessage;
|
||||
notifyMessage.deserialize(&serializer, byteArray);
|
||||
handleWsResponse(notifyMessage);
|
||||
});
|
||||
|
||||
//和服务器真正建立连接
|
||||
websocketClient.open(WEBSOCKET_URL);
|
||||
}
|
||||
|
||||
void NetClient::handleWsResponse(const bite_im::NotifyMessage& notifyMessage)
|
||||
{
|
||||
if (notifyMessage.notifyType() == bite_im::NotifyTypeGadget::NotifyType::CHAT_MESSAGE_NOTIFY) {
|
||||
//收到消息
|
||||
//把pb中的MessageInfo转成客户端自己的message
|
||||
Message message;
|
||||
message.load(notifyMessage.newMessageInfo().messageInfo());
|
||||
//针对自己的message做进一步的处理
|
||||
handleWsMessage(message);
|
||||
}
|
||||
else if (notifyMessage.notifyType() == bite_im::NotifyTypeGadget::NotifyType::CHAT_SESSION_CREATE_NOTIFY) {
|
||||
|
||||
}
|
||||
else if (notifyMessage.notifyType() == bite_im::NotifyTypeGadget::NotifyType::FRIEND_ADD_APPLY_NOTIFY) {
|
||||
|
||||
}
|
||||
else if (notifyMessage.notifyType() == bite_im::NotifyTypeGadget::NotifyType::FRIEND_ADD_PROCESS_NOTIFY) {
|
||||
|
||||
}
|
||||
else if (notifyMessage.notifyType() == bite_im::NotifyTypeGadget::NotifyType::FRIEND_REMOVE_NOTIFY) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void NetClient::handleWsMessage(const model::Message& message)
|
||||
{
|
||||
// 这里要考虑两种情况
|
||||
QList<Message>* messageList = dataCenter->getRecentMessageList(message.chatSessionId);
|
||||
if (messageList == nullptr) {
|
||||
//如果当前这个消息所属的会话,里面的消息列表没有在本地加载,此时需要通过网络先加载整个消息列表
|
||||
connect(dataCenter, &DataCenter::getRecentMessageListDoneNoUI, this, &NetClient::receiveMessage, Qt::UniqueConnection);
|
||||
dataCenter->getRecnetMessageListAsync(message.chatSessionId, false);
|
||||
}
|
||||
else {
|
||||
//若已经在本地加载了,直接把这个消息尾插到消息列表中即可
|
||||
messageList->push_back(message);
|
||||
this->receiveMessage(message.chatSessionId);
|
||||
}
|
||||
}
|
||||
|
||||
void NetClient::sendAuth()
|
||||
{
|
||||
bite_im::ClientAuthenticationReq req;
|
||||
@ -250,7 +292,7 @@ namespace network {
|
||||
|
||||
}
|
||||
|
||||
void NetClient::getRecentMessageList(const QString& loginSessionId, const QString& chatSessionId)
|
||||
void NetClient::getRecentMessageList(const QString& loginSessionId, const QString& chatSessionId, bool updateUI)
|
||||
{
|
||||
//通过protobuf构造请求body
|
||||
bite_im::GetRecentMsgReq req;
|
||||
@ -281,7 +323,12 @@ namespace network {
|
||||
dataCenter->resetRecentMessageList(chatSessionId, pbResp);
|
||||
|
||||
//发送信号,告知界面进行更新
|
||||
emit dataCenter->getRecentMessageListDone(chatSessionId);
|
||||
if (updateUI) {
|
||||
emit dataCenter->getRecentMessageListDone(chatSessionId);
|
||||
}
|
||||
else {
|
||||
emit dataCenter->getRecentMessageListDoneNoUI(chatSessionId);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -367,4 +414,23 @@ namespace network {
|
||||
LOG() << "发送消息->响应处理完毕 requestId=" << pbResp->requestId();
|
||||
});
|
||||
}
|
||||
|
||||
void NetClient::receiveMessage(const QString& chatSessionId)
|
||||
{
|
||||
//要先判定一下,这个收到消息对应的会话是否是正在被用户选中的“当前会话”
|
||||
//当前会话,就需要把消息显示到消息展示区,也需要更新会话列表消息预览
|
||||
//若不是,只更新消息预览,并且更新“未读消息数目”
|
||||
if (chatSessionId == dataCenter->getCurrentSessionId()) {
|
||||
//说明是选中的会话
|
||||
const Message& lastMessage = dataCenter->getRecentMessageList(chatSessionId)->back();
|
||||
//通过信号,让NetClient模块能够通知界面
|
||||
emit dataCenter->receiveMessageDone(lastMessage);
|
||||
}
|
||||
else {
|
||||
//说明不是
|
||||
dataCenter->addUnread(chatSessionId);
|
||||
}
|
||||
//统一更新会话列表的消息预览
|
||||
emit dataCenter->updateLastMessage(chatSessionId);
|
||||
}
|
||||
} //end namespace network
|
||||
@ -36,6 +36,9 @@ namespace network {
|
||||
//初始化websocket
|
||||
void initWebSocket();
|
||||
|
||||
void handleWsResponse(const bite_im::NotifyMessage& notifyMessage);
|
||||
void handleWsMessage(const model::Message& message);
|
||||
|
||||
//发送身份认证请求
|
||||
void sendAuth();
|
||||
|
||||
@ -83,9 +86,11 @@ namespace network {
|
||||
void getFriendList(const QString& loginSessionId);
|
||||
void getChatSessionList(const QString& loginSessionId);
|
||||
void getApplyList(const QString& loginSessionId);
|
||||
void getRecentMessageList(const QString& loginSessionId, const QString& chatSessionId);
|
||||
void getRecentMessageList(const QString& loginSessionId, const QString& chatSessionId, bool updateUI);
|
||||
void sendMessage(const QString& loginSessionId, const QString& chatSessionId, model::MessageType messageType,
|
||||
const QByteArray& content, const QString& extraInfo);
|
||||
|
||||
void receiveMessage(const QString& chatSessionId);
|
||||
private:
|
||||
model::DataCenter* dataCenter;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user