add sendMessage function

This commit is contained in:
xyz
2025-06-18 18:21:23 +08:00
parent c50f574eed
commit 971ab64769
11 changed files with 319 additions and 9 deletions

View File

@ -30,6 +30,7 @@ namespace network {
});
}
void NetClient::initWebSocket()
{
//准备好所需要的信号槽
@ -283,4 +284,87 @@ namespace network {
emit dataCenter->getRecentMessageListDone(chatSessionId);
});
}
//此处的extraInfo可以用来传递扩展信息尤其是对文件消息来说通过这个字段表示“文件名”
//其他类型的消息暂时不涉及,就直接设置为空,如果后续有消息类型需要,都可以给这个参数,赋予一定的特殊意义
void NetClient::sendMessage(const QString& loginSessionId, const QString& chatSessionId,
model::MessageType messageType, const QByteArray& content, const QString& extraInfo)
{
//通过protobuf 构造 body
bite_im::NewMessageReq req;
req.setRequestId(makeRequestId());
req.setSessionId(loginSessionId);
req.setChatSessionId(chatSessionId);
//构造MessageContent
bite_im::MessageContent messageContent;
if (messageType == MessageType::TEXT_TYPE) {
messageContent.setMessageType(bite_im::MessageTypeGadget::MessageType::STRING);
bite_im::StringMessageInfo stringMessageInfo;
stringMessageInfo.setContent(content);
messageContent.setStringMessage(stringMessageInfo);
}
else if (messageType == MessageType::IMAGE_TYPE) {
messageContent.setMessageType(bite_im::MessageTypeGadget::MessageType::IMAGE);
bite_im::ImageMessageInfo imageMessageInfo;
imageMessageInfo.setFileId("");
imageMessageInfo.setImageContent(content);
messageContent.setImageMessage(imageMessageInfo);
}
else if (messageType == MessageType::FILE_TYPE) {
messageContent.setMessageType(bite_im::MessageTypeGadget::MessageType::FILE);
bite_im::FileMessageInfo fileMessageInfo;
fileMessageInfo.setFileId("");
fileMessageInfo.setFileSize(content.size());
fileMessageInfo.setFileName(extraInfo);
fileMessageInfo.setFileContents(content);
messageContent.setFileMessage(fileMessageInfo);
}
else if (messageType == MessageType::SPEECH_TYPE) {
messageContent.setMessageType(bite_im::MessageTypeGadget::MessageType::SPEECH);
bite_im::SpeechMessageInfo speechMessageInfo;
speechMessageInfo.setFileId("");
speechMessageInfo.setFileContents(content);
messageContent.setSpeechMessage(speechMessageInfo);
}
else {
LOG() << "错误的消息类型 messageType= " << messageType;
}
req.setMessage(messageContent);
//序列化操作
QByteArray body = req.serialize(&serializer);
LOG() << "发送消息->发送请求 requestId= " << req.requestId() << ", loginSessionId=" << req.sessionId() <<
", chatSessionId= " << req.chatSessionId() << ", messageType=" << req.message().messageType();
//发送HTTP请求
QNetworkReply* resp = this->sendHttpRequest("/service/message_transmit/new_message", body);
//处理HTTP响应
connect(resp, &QNetworkReply::finished, this, [=]() {
//针对响应结果,进行解析
bool ok = false;
QString reason;
auto pbResp = this->handleHttpResponse<bite_im::NewMessageRsp>(resp, &ok, &reason);
//判定响应是否正确
if (!ok) {
LOG() << "发送消息->处理出错 reason= " << reason;
return;
}
//此处只是记录成功和失败不需要把内写入到DataCenter中
//通知调用者,响应处理完毕
emit dataCenter->sendMessageDone(messageType, content, extraInfo);
//打印日志
LOG() << "发送消息->响应处理完毕 requestId=" << pbResp->requestId();
});
}
} //end namespace network

View File

@ -84,6 +84,8 @@ namespace network {
void getChatSessionList(const QString& loginSessionId);
void getApplyList(const QString& loginSessionId);
void getRecentMessageList(const QString& loginSessionId, const QString& chatSessionId);
void sendMessage(const QString& loginSessionId, const QString& chatSessionId, model::MessageType messageType,
const QByteArray& content, const QString& extraInfo);
private:
model::DataCenter* dataCenter;