IM 即时通讯
获取频道最后一条消息
更新时间: 2022/12/21 15:55:40
网易云信 IM 的圈组模块支持在频道列表显示当前各频道的最后一条消息,且开发者可通过在应用上层自行开发相关业务逻辑,实现频道列表动态更新各频道的最后一条消息。
频道列表显示最后一条消息的简易 UI 示例如下:
技术原理
网易云信 QChat Web SDK 的QChatMsgServiceInterface
接口提供getLastMessageOfChannels
方法,用于获取多个频道的最后一条消息的初始数据。
- 该方法的接口原型如下:
/**
* 获取若干个频道的最后一条消息
* 注:被撤回的消息仍旧能被查到,而被删除的消息无法查到
*/
getLastMessageOfChannels(options: QChatGetLastMessageOfChannelsOptions): Promise<QChatGetLastMessageOfChannelsResult>
- 该方法的响应
QChatGetLastMessageOfChannelsResult
返回的结果为 map, key 值对应每一个channelId
,value 值是消息体QChatMessage
。
type QChatGetLastMessageOfChannelsResult = {
/**
* 其中 key 为 channelId
*/
[key: string]: QChatMessage
}
实现方法
前提条件
已接入圈组,并已创建圈组服务器和频道。
实现流程
-
获取频道最后一条消息的初始数据。
- 调用
getChannelsByPage
拉取频道列表。 - 调用
getLastMessageOfChannels
获取若干个频道的最后一条消息。
- 您需自行维护调用该方法返回的结果。
- 被撤回的消息仍能通过调用该方法查到,但被删除的消息无法查到。如果最后一条消息是撤回消息,推荐把对应的最后一条消息置空,并给出提示表明“撤回消息”。
- 在您的应用内存中维护相关频道的最后一条消息。
- 调用
-
监听消息接收事件(
message
)和消息更新事件(messageUpdate
)。 -
参照下表,在您的应用层自行开发,实现后续频道最后一条消息在不同场景下的动态更新。
场景场景说明 推荐处理方法 事件触发更新最后一条消息 频道内,其他用户发送消息或重发消息,触发 message
事件更新频道最后一条消息 频道内,其他用户撤回、更新或删除消息,触发 messageUpdate
事件判断撤回、更新、删除的消息是否为频道最后一条消息,若非最后一条消息,则忽略;若为最后一条消息,且: - 为撤回或删除消息,则把最后一条消息置空
- 为更新消息,则更新频道最后一条消息
用户自己调用 API 后触发更新最后一条消息 自己在频道内发送、重发或更新消息 更新频道内最后一条消息 自己在频道内撤回或删除消息 判断撤回或删除的消息是否为频道最后一条消息,若非最后一条消息,则忽略;若为最后一条消息,则把最后一条消息置空
API调用时序示例
下图以用户A、用户B 和用户C 的消息交互为例,为您展示实现频道最后一条消息动态更新的 API 调用时序,供您参考。
示例代码
获取初始数据
/* 初始数据获取,设置 lastMessage */
const channels = await qchat.qchatChannel.getChannelsByPage({
serverId: 'YOUR_SERVER_ID',
timetag: 0,
limit: 100
})
if (channels.datas.length === 0) {
return
}
const channelsMap = channels.datas.reduce((total, next) => {
channelsMap[next.channelId] = next
return channelsMap
}, {})
const serverId = channels.datas[0].serverId
const channelIds = channels.datas.map(item => item.channelId)
const lastMessageMap = await qchat.qchatMsg.getLastMessageOfChannels({
serverId,
channelIdList: channelIds
})
Object.keys(lastMessageMap).forEach(key => {
channelsMap[key].lastMessage = lastMessageMap[key]
})
事件触发更新最后一条消息
/* 设置监听,触发的更新 */
qchat.on('message', function (msg) {
channelsMap[msg.channelId].lastMessage = msg
})
qchat.on('messageUpdate', function (msg) {
// 撤回,单向删除消息把 lastMessage 设置为空
if (msg.status === 1 || msg.status === 2) {
channelsMap[msg.channelId].lastMessage = null
} else {
channelsMap[msg.channelId].lastMessage = msg
}
})
用户自己调用API后触发更新最后一条消息
/* 自己调用的 API 导致的 lastMessage 更新 */
// 发送消息
const theSendMessage = await qchat.qchatMsg.sendMessage({
serverId: 'YOUR_SERVREID',
channelId: 'YOUR_CHANNELID',
type: 'text',
body: 'This is a text message'
})
channelsMap[theSendMessage.channelId].lastMessage = theSendMessage
// 更新消息
const theUpdateMessage = await qchat.qchatMsg.updateMessage({
message: {
...theSendMessage,
body: 'This is a text message after update'
}
})
channelsMap[theSendMessage.channelId].lastMessage = theUpdateMessage
// 重发消息
const theResendMessage = await qchat.qchatMsg.resendMessage(theSendMessage)
channelsMap[theResendMessage.channelId].lastMessage = theResendMessage
// 撤回消息
await qchat.qchatMsg.revokeMessage({
message: theSendMessage
})
channelsMap[theSendMessage.channelId].lastMessage = null
// 删除消息
await qchat.qchatMsg.deleteMessage({
message: theSendMessage
})
channelsMap[theSendMessage.channelId].lastMessage = null
API参考
API |
说明 |
---|---|
getLastMessageOfChannels |
获取多个频道的最后一条消息 |
此文档是否对你有帮助?
有帮助
我要吐槽