訊息列表實作概述
更新時間:2021-09-01 10:25:13
本篇主要介紹保利威聊天室訊息列表基本實作邏輯。
一、歷史聊天訊息
訊息列表中的訊息來源,主要分為歷史訊息以及即時訊息,而歷史訊息又有場次歷史訊息和頻道歷史訊息之分。
場次歷史訊息
每場直播都會對應一個唯一的場次 id(sessionId),該場直播中所有使用者的發言都關聯了該 id,可以透過 getSessionHistory 方法取得該場次直播的歷史聊天訊息。
可根據回傳資料中 curPage 跟 totalPage 欄位的比對,判斷目前是否載入到末頁。
async function getSessionHistory() {
const res = await chat.getSessionHistory({
// 场次 id(非必传,默认使用实例的 sessionId)
sessionId: '',
// 页数
page: 1,
// 条数(非必传,默认10)
size: 20,
});
const { curPage, totalPage, count, size, data = [] } = res;
const isLastPage = curPage === totalPage;
console.log('场次消息列表数据:', data);
}
頻道歷史訊息
可透過 getChannelHistory 方法取得頻道所有場次的聊天訊息。注意,每個頻道都有允許儲存的最大訊息數量,因此當訊息量超過最大數量時,會優先捨棄舊訊息。
async function getChannelHistory() {
let start = 0;
let end = 9;
const msgList = await chat.getChannelHistory({
// 房间号(若不传,默认为实例中的房间号/频道号)
roomId: '',
// 开始索引
start,
// 结束索引
end,
// 是否获取全部信息。1表示获取全部(默认),0表示过滤图片和自定义消息
fullMessage: 1,
// 是否仅获取特殊角色发言(讲师、助教、嘉宾),后端默认 0(全部获取)
getSpecialMessage: 0,
});
console.log('频道消息列表数据', msgList);
// 可根据返回的消息列表长度是否满足索引跨度,来判断当前是否加载到末尾。
if (msgList.length < end - start) {
console.log('已加载到消息列表末尾');
}
}
二、即時收發聊天訊息
他人的文字發言、傳送圖片、訊息被刪除、自訂訊息等,均會在 SDK 內觸發相應事件,可監聽這些事件,並根據參數去處理實際所需顯示的訊息。
接收訊息
此處列舉所有與聊天室訊息相關的事件,詳細事件、參數、欄位等,請參考 API 文件。以下擷取部分常用事件:
| 事件名 | 說明 |
|---|---|
| chat.events.SPEAK | 他人發言 |
| chat.events.CHAT_IMG | 他人聊天圖片訊息 |
| chat.events.SEND_MESSAGE | 個人發言。呼叫發言方法後將觸發該事件,此時可將個人發言插入到本地訊息列表。 |
| chat.events.SELF_CHAT_IMG | 個人開始傳送圖片訊息。在圖片開始上傳時,即觸發該事件,可基於該事件將訊息插入本地進行展示,並展示圖片上傳狀態。 |
| chat.events.SYS_MSG | 系統訊息。例如傳送訊息過快觸發限流時,會觸發該事件。可在監聽到此事件後給予使用者回饋。 |
| chat.events.CUSTOMER_MESSAGE | 自訂訊息 |
| chat.events.REMOVE_HISTORY | 管理員清空聊天室訊息。收到該事件時,聊天室記錄將被清除,相應地前端也需要將展示中的訊息進行清除。 |
| chat.events.REMOVE_CONTENT | 管理員移除單條訊息。可根據 id 將對應訊息刪除。 |
| chat.events.CLOSEROOM | 關閉聊天室。管理員等特殊角色關閉了聊天室,此時一般使用者禁止發言,前端可給予相應提示。 |
| chat.events.OPENROOM | 開啟聊天室。恢復一般使用者發言權限。 |
訊息類型列表
為了便於快速整合,本 SDK 基於保利威目前的訊息列表 UI 展示形式對部分聊天室事件進行了分類封裝,詳細類型常數可透過 chat.msgTypes 存取。
部分需要展示的事件資料會含有 msgType 欄位,只需要將其插入本地訊息列表,並根據該欄位展示對應形式的元件/樣式即可。同樣,歷史訊息也會封裝此欄位。下面列舉各 msgType 對應的事件。
| msgType | 訊息類型 |
|---|---|
| NORMAL | SEND_MESSAGE、SPEAK |
| CHAT_IMG | CHAT_IMG、CHAT_IMG_UPLOAD_PROGRESS、SELF_CHAT_IMG_RESULT(傳送圖片相關訊息,詳細可見傳送圖片訊息) |
| CUSTOMER_MESSAGE | CUSTOMER_MESSAGE |
| SYSTEM | SYS_MSG(本地觸發,如發言頻繁) |
| RED_PAPER_RESULT | RED_PAPER_RESULT(紅包被領取訊息) |
| REWARD | REWARD(打賞訊息) |
在監聽到上述事件時,可以考慮將訊息體加入到待顯示訊息列表中,然後根據具體 msgType 採用相應元件進行渲染展示。
傳送訊息
傳送文字訊息
可使用 send 方法傳送一般文字訊息。
chat.send(
'消息内容',
// 第二个参数为引用消息,非必传。
// 特殊角色使用公屏回复功能时需传入(完整传入,使SDK内部可封装、触发SEND_MESSAGE事件)
{
id,
// ...
}
);
