保利威文档中心

幫助中心

訊息列表實作概述

更新時間:2021-09-01 10:25:13

本篇主要介紹保利威聊天室訊息列表基本實作邏輯。

一、歷史聊天訊息

訊息列表中的訊息來源,主要分為歷史訊息以及即時訊息,而歷史訊息又有場次歷史訊息和頻道歷史訊息之分。

場次歷史訊息

每場直播都會對應一個唯一的場次 id(sessionId),該場直播中所有使用者的發言都關聯了該 id,可以透過 getSessionHistory 方法取得該場次直播的歷史聊天訊息。

可根據回傳資料中 curPagetotalPage 欄位的比對,判斷目前是否載入到末頁。

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,
    // ...
  }
);
联系客服,在线咨询