聊天室
聊天室適合直播間、語聊房、活動互動區:沒有固定成員,使用者開啟頁面時進入、離開頁面時離開,一個聊天室可以有幾十萬人同時線上。訊息只推給此刻在聊天室裡的使用者,不進入會話列表,不計未讀數,也沒有離線推送;剛進入的使用者可以看到最近的幾十條訊息。
典型的用法是:你的服務端在直播開始時建立聊天室,把聊天室 ID 交給頁面;頁面呼叫 im.chatrooms.enter() 進入,得到一個 ChatroomHandle,用它讀取聊天室資訊、顯示訊息、傳送訊息;離開頁面時呼叫 leave()。
const room = await im.chatrooms.enter('100310941534519296');
room.subscribe(() => {
const { info, messages } = room.getSnapshot();
render(info.name, info.member_count, messages);
});
await room.send({ type: 'text', body: { text: '主播晚上好' } });聊天室的完整規則(人數上限、身份、訊息的優先順序與限流、最近的訊息、屬性)見服務端文件聊天室管理,本頁只說明在網頁中怎麼用。
| 要做什麼 | 看哪裡 |
|---|---|
| 顯示聊天室列表和線上人數 | 查詢聊天室 |
| 進入、切換、離開直播間 | 進入聊天室、切換直播間、離開聊天室 |
| 被踢、被封禁時提示使用者 | 被移出聊天室 |
| 顯示和傳送訊息、禮物特效 | 接收訊息、傳送訊息 |
| 點贊 | 點贊 |
| 語聊房的麥位 | 聊天室屬性 |
| 房管禁言、踢人、全員禁言 | 管理聊天室 |
| 在 React、Vue 元件中使用 | 在 React 和 Vue 中使用 |
查詢聊天室
im.chatrooms.list() 列出應用中對客戶端公開的聊天室(服務端建立時 listed 為 true、狀態正常的),可以按名稱字首搜尋;不公開的聊天室只能按 ID 進入。im.chatrooms.get() 查詢一個聊天室的資訊,不需要先進入。
const page = await im.chatrooms.list({ name_prefix: '周末', limit: 20 });
for (const item of page.items) {
console.log(item.room_id, item.name, item.member_count);
}
// 还有下一页时:im.chatrooms.list({ name_prefix: '周末', cursor: page.next_cursor })在列表頁上同時顯示多個聊天室的線上人數,用 onlineCounts() 一次查詢,最多 100 個:
const counts = await im.chatrooms.onlineCounts(['100310941534519296', '100311027031212032']);
// [{ room_id: '100310941534519296', member_count: 12034 }, ...],不存在和已解散的不在结果中線上人數按使用者計算(同一使用者多臺裝置只算一次),最多快取 5 秒,是近似值,適合“1.2 萬人線上”這樣的展示。
進入聊天室
enter() 在進入成功後兌現,返回這個聊天室的控制代碼。進入時可以帶一段最長 512 位元組的 ext(如“VIP3”),隨進入的通知發給其他成員。
import { DRError } from '@deeprespond/im-web';
try {
const room = await im.chatrooms.enter('100310941534519296', { ext: 'VIP3' });
console.log(room.getSnapshot().state); // 'in'
} catch (err) {
if (err instanceof DRError && err.reason === 'chatroom_banned') {
showToast('你已被禁止进入该直播间');
} else if (err instanceof DRError && err.code === 'not_found') {
showToast('直播已结束');
} else {
throw err;
}
}進入的條件:聊天室存在且正常;你沒有被這個聊天室封禁;聊天室沒有滿員(所有者和管理員不受人數上限的限制)。
- 同一個頁面多次進入:同一個標籤頁對同一個聊天室多次呼叫
enter(),得到的是同一個控制代碼,SDK 記下進入的次數,leave()呼叫同樣的次數後才真正離開。頁面中的幾個元件可以各自進入和離開同一個聊天室,互不影響。 - 進入的數量:同一瀏覽器(全部標籤頁合計)同時進入的聊天室數有上限(預設 10 個),超出時
enter()以limit_exceeded(connection_room_limit)拒絕。 - 進入太頻繁:同一時刻大量使用者進入同一個聊天室時,服務端會讓一部分人稍後再進入,SDK 自動等待並重試,
enter()可能需要幾秒才兌現。 - 還沒連上長連線:進入必須經過長連線,長連線沒有就緒時
enter()等待,最長 15 秒,超時以not_connected拒絕。
切換直播間
在直播間之間切換時,進入新的聊天室時帶上 leave_others: true,會同時離開本標籤頁進入的其他聊天室(其他標籤頁進入的不受影響),舊的控制代碼的 state 變為 left:
const next = await im.chatrooms.enter('100311027031212032', { leave_others: true });離開聊天室
const room = await im.chatrooms.enter('100310941534519296');
// ……
await room.leave();leave()立即離開,其他成員會收到離開的通知(人數不多的聊天室)。如果你沒有呼叫leave(),關閉頁面、重新整理頁面時 SDK 會自動離開;網路斷開 15 秒後服務端也會判定你已離開。- 單頁應用切換路由、元件解除安裝時,請呼叫
leave()。 - 離開之後控制代碼就結束了:快照的
state為left,不再變化,再呼叫send()等方法以invalid_state拒絕。要再次進入,重新呼叫enter(),會得到新的控制代碼。 im.chatrooms.entered是本標籤頁當前進入的聊天室(聊天室 ID 到控制代碼)。
多個標籤頁
同一瀏覽器的多個標籤頁共用一條長連線,每個標籤頁各自進入、離開自己的聊天室:
- 一個標籤頁進入的聊天室,只有這個標籤頁收到它的訊息和通知;
- 多個標籤頁進入同一個聊天室時,服務端看到的是同一個使用者、同一條連線,最後一個標籤頁離開時才真正離開;
- 關閉一個標籤頁,只離開它進入的聊天室;
leave_others只離開呼叫它的標籤頁進入的聊天室。
斷線後自動重新進入
網路斷開又恢復、SDK 重新建立長連線後,會自動重新進入斷開前所在的聊天室,控制代碼不變,你不需要做任何處理。重新進入期間快照的 state 為 reentering,可以顯示“正在重新連線”;成功後回到 in,並重新獲取聊天室資訊、屬性和最近的訊息。
斷開期間如果你被移出、被封禁,或聊天室已解散、已被封禁,重新進入不會成功,控制代碼按被移出處理。
斷開期間的訊息不會補發:聊天室訊息只推給此刻線上的連線。
被移出聊天室
你被所有者、管理員或你的服務端移出、封禁,或者聊天室被解散、被封禁時,控制代碼觸發 removed 事件,快照的 state 變為 removed,removed 中是原因。SDK 不會自動重新進入。
const room = await im.chatrooms.enter('100310941534519296');
room.on('removed', ({ reason, expires_at }) => {
const text: Record<string, string> = {
kicked: '你已被移出直播间',
banned: expires_at ? `你已被禁止进入,至 ${new Date(expires_at).toLocaleString()}` : '你已被永久禁止进入',
dismissed: '直播已结束',
disabled: '该直播间已被关闭',
};
showToast(text[reason] ?? '你已离开直播间');
});reason | 說明 |
|---|---|
kicked | 被移出,operator 為操作人的使用者名稱(你的服務端操作時為 null)。可以再次進入 |
banned | 被封禁,expires_at 為封禁的到期時間,永久封禁為 null。到期前不能再進入 |
dismissed | 聊天室已解散 |
disabled | 聊天室已被封禁 |
聊天室資訊與線上人數
快照的 info 是聊天室的資訊:名稱、簡介、封面、公告、所有者、管理員、線上人數、是否全員禁言等,見 ChatroomInfo。資料變化時(包括全員禁言、所有者和管理員的變化)SDK 自動更新快照,訂閱 subscribe() 即可:
const room = await im.chatrooms.enter('100310941534519296');
const off = room.subscribe(() => {
const { info } = room.getSnapshot();
render({
title: info.name,
cover: info.avatar_url,
online: info.member_count,
muteAll: info.mute_all,
});
});
// 不再需要时 off()info.self 是你在這個聊天室中的身份和狀態:
| 欄位 | 說明 |
|---|---|
role | owner 所有者 / admin 管理員 / member 普通使用者 |
muted、muted_until | 你是否被禁言、禁言的到期時間(永久禁言為 null)。禁言到期時 SDK 自動恢復為 false |
allowlisted | 你是否在白名單中:全員禁言時白名單中的使用者仍然可以發言 |
線上人數 member_count 在進入時取得;人數不多的聊天室(不超過執行策略 chatroom_member_notify_limit,預設 100 人)在有人進出時隨通知更新。人數更多的聊天室不推送進出通知,需要定時重新整理線上人數時,呼叫 refresh() 或 im.chatrooms.get():
const room = await im.chatrooms.enter('100310941534519296');
const timer = setInterval(() => void room.refresh().catch(() => {}), 30_000);接收訊息
快照的 messages 是進入後獲取的最近的訊息,加上之後收到和發出的訊息,按到達的順序排列,最多保留 500 條(更早的自動丟棄)。通常直接按 messages 渲染訊息列表:
const room = await im.chatrooms.enter('100310941534519296');
room.subscribe(() => {
for (const m of room.getSnapshot().messages) {
if (m.type === 'text') {
render(m.sender_nickname ?? m.sender, (m.body as { text: string }).text, m._local.status);
}
}
});需要對每條新訊息做處理(如播放禮物特效)時,監聽 message 事件:
const room = await im.chatrooms.enter('100310941534519296');
room.on('message', ({ message }) => {
if (message.type === 'custom' && message.body?.gift) {
render('gift', message.sender_nickname, message.body.gift);
}
});- 管理員和官方訊息:
sender_role為傳送時的身份(owner、admin、member),可以據此顯示“房管”標識;_local.trusted為true的訊息由你的服務端、控制檯或系統發出,不是使用者在客戶端傳送的,可以顯示為官方訊息。不要根據ext中的內容判斷,ext由傳送者自己填寫。 - 系統訊息:
sender_type為system的訊息,sender、sender_nickname、sender_avatar_url、sender_role都為null。 - 訊息過多時:熱鬧的聊天室中,服務端每秒推給每個連線的訊息有上限,超出時先丟棄低優先順序的,再丟棄普通的(高優先順序的正常情況下不會丟棄)。有訊息被丟棄時控制代碼觸發
dropped事件,可以提示“訊息過多,已省略部分”:
room.on('dropped', ({ count }) => {
render('hint', `消息过多,已省略 ${count} 条`);
});- 撤回:訊息被撤回時,SDK 把它從
messages中去掉,並觸發recalled事件; - 不保證送達和順序:網路異常時訊息可能丟失,不同使用者發出的訊息到達的先後可能略有不同。需要可靠送達的內容(如禮物結算)請以高優先順序傳送,並由你的業務另行保證。
最近的訊息
進入聊天室後,SDK 自動獲取最近的訊息並放在 messages 的前面,你不需要另外呼叫。最近的訊息只有普通和高優先順序的,最多 chatroom_history_size 條(執行策略,預設 50 條),只保留 24 小時;執行策略設為 0 時不儲存,進入後 messages 從空開始。最近的訊息不能向前翻頁。
收到服務端的提示、可能漏收了內容時,SDK 會自動重新獲取聊天室資訊、屬性和最近的訊息,並與已有的訊息合併、去重。你也可以呼叫 refresh() 手動重新整理。
傳送訊息
send() 傳送一條訊息,支援文字、圖片、語音、影片、檔案、位置和自定義訊息,內容的格式與單聊、群聊訊息相同,見訊息格式。
const room = await im.chatrooms.enter('100310941534519296');
const sent = await room.send({ type: 'text', body: { text: '唱得太好了!' } });
console.log(sent.message_id, sent._local.status); // 'sent'傳送時,普通和高優先順序的訊息先以 sending 狀態出現在 messages 中,成功後變為 sent,失敗時變為 failed 並以錯誤拒絕。網路錯誤、超時時 SDK 自動重試,1 分鐘內結束;被限流(rate_limited)時不自動重試,請提示使用者“傳送太頻繁”。
優先順序
每條聊天室訊息有一個優先順序,決定訊息過多時是否會被限流或丟棄:
priority | 用途 | 誰可以傳送 | 傳送時超出聊天室的額度 |
|---|---|---|---|
high | 系統通知、管理員公告、禮物結算等不能丟的訊息 | 所有者、管理員 | 以 rate_limited 拒絕 |
normal | 普通聊天,預設 | 所有人 | 以 rate_limited 拒絕 |
low | 點贊、彈幕特效、進場特效等丟了無妨的高頻訊息 | 所有人 | 靜默丟棄,返回的訊息 _local.status 為 dropped,不必提示使用者 |
const room = await im.chatrooms.enter('100310941534519296');
// 进场特效:低优先级
await room.send({ type: 'custom', body: { effect: 'enter', level: 3 } }, { priority: 'low' });
// 管理员公告:高优先级,普通用户发送以 permission_denied(priority_denied)拒绝
await room.send({ type: 'text', body: { text: '请文明发言' } }, { priority: 'high' });低優先順序的訊息不先出現在 messages 中,也不自動重試;服務端推回來後才出現在 messages 中,被丟棄的不會出現。
每個聊天室每秒接受的普通和低優先順序訊息數由執行策略 chatroom_msg_per_second 決定(預設 40 條),見訊息的優先順序與下發。
大小上限與圖片
一條聊天室訊息(型別、內容和 ext 合計)不能超過執行策略 max_chatroom_message_bytes(預設 2 KB),超出時 SDK 在本地以 local_validation(too_large)拒絕。
傳送圖片等附件時,先上傳檔案,再把地址寫進訊息(聊天室不支援直接傳入檔案):
declare const file: File; // 用户选择的图片
const room = await im.chatrooms.enter('100310941534519296');
const info = await im.files.upload(file, { purpose: 'attachment', kind: 'image' });
await room.send({
type: 'image',
body: { url: info.url, width: info.width ?? undefined, height: info.height ?? undefined, size: info.size },
});上傳和顯示附件見檔案。
禁言
你被禁言(info.self.muted 為 true),或聊天室開啟了全員禁言(info.mute_all 為 true)而你不是所有者、管理員、也不在白名單中時,不能傳送訊息和設定屬性,傳送以 chatroom_muted 拒絕,details.reason 為 member(你被禁言)或 all(全員禁言)。請據快照禁用輸入框:
const room = await im.chatrooms.enter('100310941534519296');
room.subscribe(() => {
const { info } = room.getSnapshot();
const self = info.self;
const privileged = self?.role === 'owner' || self?.role === 'admin' || self?.allowlisted === true;
const canSpeak = !self?.muted && (!info.mute_all || privileged);
render('input', { disabled: !canSpeak, placeholder: canSpeak ? '说点什么' : '你已被禁言' });
});禁言、解除禁言、全員禁言的變化會實時更新快照;禁言到期時 SDK 在本地自動恢復。使用者被全域性禁言(聊天室場景)時,傳送以 user_muted 拒絕,見聯絡人與使用者。
點贊
點贊這類高頻操作不要每點一次發一條訊息。like() 把一秒內的多次點贊合併成一條低優先順序的訊息傳送,不等待結果:
// 用户每点一次
room.like();
// 其他人的点赞(同一个人一秒内的合并为一次)
room.on('like', ({ username, count }) => {
render('hearts', username, count);
});點贊不會出現在 messages 中,只以 like 事件交給你。點贊是低優先順序的訊息,聊天室訊息過多時可能被丟棄。
撤回訊息
const room = await im.chatrooms.enter('100310941534519296');
const sent = await room.send({ type: 'text', body: { text: '发错了' } });
if (sent.message_id) {
await room.recall(sent.message_id);
}- 普通使用者可以在執行策略
recall_window_seconds(預設 120 秒)內撤回自己的訊息; - 管理員可以撤回傳送者現在是普通使用者的訊息,所有者可以撤回任何人的訊息;
- 只能撤回還在最近的訊息中的訊息,已經不在的以
not_found拒絕。
撤回後,所有人的 messages 中這條訊息被去掉,並觸發 recalled 事件:
room.on('recalled', ({ message_id, recalled_by }) => {
render('hint', recalled_by ? `${recalled_by} 撤回了一条消息` : '一条消息已被撤回');
});成員列表
members() 分頁返回此刻在聊天室裡的使用者,按進入時間從早到晚排列,每頁最多 100 個。翻頁時 SDK 已按使用者名稱去重。
const room = await im.chatrooms.enter('100310941534519296');
let page = await room.members({ limit: 50 });
render(page.items.map((m) => `${m.nickname || m.username}(${m.role})`));
if (page.next_cursor) {
page = await room.members({ cursor: page.next_cursor, limit: 50 });
}人數不多的聊天室(不超過執行策略 chatroom_member_notify_limit,預設 100 人),有人進入和離開時控制代碼觸發 memberJoined、memberLeft 事件,同時更新快照中的線上人數。人數更多的聊天室不推送這兩個事件;需要顯示“某某進入直播間”時,請讓進入的使用者自己發一條低優先順序的自定義訊息。
room.on('memberJoined', (p) => {
const { username, nickname, ext } = p as { username: string; nickname: string; ext: string | null };
render('hint', `${nickname || username} 进入了直播间`, ext);
});
room.on('memberLeft', (p) => {
const { username } = p as { username: string; reason: string };
render('hint', `${username} 离开了直播间`);
});| 事件 | 載荷的欄位 |
|---|---|
memberJoined | room_id、username、nickname、avatar_url、role、ext(進入時帶的 ext)、joined_at、member_count |
memberLeft | room_id、username、reason(left 主動離開 / disconnected 斷開 / kicked 被移出 / banned 被封禁)、member_count |
聊天室屬性
屬性是聊天室的自定義鍵值對,全體成員可見,常用於語聊房的麥位(如 seat_1 為 zhangsan)、直播間的玩法狀態。快照的 attributes 是當前的全部屬性,變化時 SDK 自動更新快照。
const room = await im.chatrooms.enter('100310941534519296');
room.subscribe(() => {
const { attributes } = room.getSnapshot();
render('seat1', attributes.seat_1?.value ?? '空位');
});設定和刪除屬性
const room = await im.chatrooms.enter('100310941534519296');
// 上麦:离开聊天室(包括断线 15 秒后)时自动删除,麦位不会一直被占着
const result = await room.setAttributes({ seat_1: 'zhangsan' }, { auto_delete: true });
if (result.failed.seat_1) {
showToast('这个麦位已经有人了');
}
// 下麦
await room.removeAttributes(['seat_1']);- 誰能修改:在聊天室裡的使用者可以設定和刪除沒人設定過的鍵和自己設定的鍵;別人設定的鍵在
failed中返回permission_denied(attribute_owned),其他鍵照常寫入。所有者和管理員帶上force: true可以覆蓋和刪除別人(包括你的服務端)設定的鍵,普通使用者帶force以permission_denied(role_required)拒絕。 - 禁言:被禁言的使用者,以及全員禁言時不在白名單中的普通使用者,不能設定屬性(以
chatroom_muted拒絕),可以刪除自己設定的屬性。 - 格式:每個聊天室最多 100 個鍵。鍵為 1 到 128 個字元,只能包含字母、數字和
_、-、.、:;值為字串,最長 4096 位元組。一次最多設定或刪除 20 個鍵,一次設定的鍵和值合計不超過 16 KB,超出時 SDK 在本地以local_validation拒絕。 - 頻率:每個聊天室每秒最多 20 次屬性寫入。每秒變化多次的狀態(如實時點贊數)不適合放在屬性中,請用低優先順序的自定義訊息。
- 設定後,屬性的值還會經過內容安全檢查,違規的屬性會被刪除。
公告
公告是快照中 info.announcement,每次修改都會更新 announcement_updated_at。要提示“公告已更新”,記下使用者看過的公告時間,與它比較:
const room = await im.chatrooms.enter('100310941534519296');
room.subscribe(() => {
const { info } = room.getSnapshot();
const seen = localStorage.getItem(`announcement:${info.room_id}`);
if (info.announcement && info.announcement_updated_at && info.announcement_updated_at !== seen) {
render('announcement', info.announcement);
localStorage.setItem(`announcement:${info.room_id}`, info.announcement_updated_at);
}
});所有者和管理員可以修改公告:
await room.manage.update({ announcement: '今晚 8 点开播,请文明发言' });管理聊天室
所有者和管理員可以在客戶端管理聊天室,介面在控制代碼的 manage 下(需要先進入聊天室)。身份不滿足時以 permission_denied(role_required,details.required_role 為需要的身份)拒絕。普通使用者的介面中請隱藏這些入口,按 info.self.role 判斷。
| 操作 | 方法 | 所有者 | 管理員 |
|---|---|---|---|
| 修改名稱、簡介、封面、公告 | manage.update() | 可以 | 可以 |
| 修改人數上限、是否出現在列表中 | manage.update() | 可以 | 不可以 |
| 開啟、關閉全員禁言 | manage.setMuteAll() | 可以 | 可以 |
| 禁言、解除禁言,檢視禁言名單 | manage.mute()、unmute()、mutes() | 可以 | 只能處置普通使用者 |
| 封禁、解除封禁,檢視封禁名單 | manage.ban()、unban()、bans() | 可以 | 只能處置普通使用者 |
| 移出 | manage.kick() | 可以 | 只能移出普通使用者 |
| 管理白名單 | manage.allowlist | 可以 | 可以 |
| 設定、取消管理員 | manage.setAdmin() | 可以 | 不可以 |
| 轉讓所有者 | manage.transferOwner() | 可以 | 不可以 |
| 解散聊天室 | manage.dismiss() | 可以 | 不可以 |
| 傳送高優先順序的訊息 | send() | 可以 | 可以 |
| 撤回別人的訊息 | recall() | 任何人的 | 普通使用者的 |
- 沒有人能禁言、移出或封禁所有者(
owner_protected);管理員不能處置其他管理員(admin_protected)。 - 解除禁言和封禁時,管理員只能解除管理員設定的,所有者和你的服務端設定的只有所有者能解除(
set_by_higher_role)。 - 聊天室被封禁期間,客戶端的管理操作都以
chatroom_disabled拒絕。 - 普通使用者可以進入、傳送普通和低優先順序的訊息、檢視成員和最近的訊息、設定屬性、撤回自己的訊息。
禁言、封禁與移出
禁言、封禁、移出和白名單都是批次操作,一次最多 100 人,逐個處理,某個使用者失敗不影響其他使用者,返回每個使用者的結果:
const room = await im.chatrooms.enter('100310941534519296');
// 禁言 10 分钟;省略 duration_seconds 为永久禁言
const results = await room.manage.mute(['spammer01', 'spammer02'], { duration_seconds: 600, reason: '刷屏' });
for (const r of results) {
if ('code' in r) showToast(`${r.username}:${r.code}`); // 如 permission_denied(owner_protected)
}
await room.manage.unmute(['spammer02']);
// 封禁:在聊天室里的会被立即移出,到期前不能再进入
await room.manage.ban(['troll01'], { duration_seconds: 24 * 3600 });
// 移出:之后可以再次进入
await room.manage.kick(['troll02']);- 禁言:不能傳送訊息和設定屬性,仍然可以留在聊天室裡、接收訊息。時長 1 秒到 10 年,或永久,到期自動解除。
- 封禁:在聊天室裡的被移出,封禁期間不能進入。封禁管理員時,他同時不再是管理員。
- 移出:只是讓他離開,他可以再次進入;要阻止再次進入請用封禁。
- 三個名單(禁言、封禁、白名單)與使用者是否在聊天室裡無關,可以對此刻不在聊天室裡的使用者操作。
檢視名單(只列出未到期的):
const mutes = await room.manage.mutes({ limit: 20 });
for (const item of mutes.items) {
const entry = item as { username: string; nickname: string; muted_until: string | null; created_by_role: string };
render(entry.nickname || entry.username, entry.muted_until ?? '永久');
}名單項的欄位見服務端文件的禁言名單項、封禁名單項和白名單項。
全員禁言與白名單
const room = await im.chatrooms.enter('100310941534519296');
await room.manage.setMuteAll(true);
// 嘉宾在全员禁言时仍然可以发言
await room.manage.allowlist.add(['guest01']);
await room.manage.allowlist.remove(['guest01']);
await room.manage.setMuteAll(false);全員禁言時,所有者、管理員和白名單中的使用者仍然可以發言;被單獨禁言的使用者即使在白名單中也不能發言。白名單最多 500 人。
修改資料
manage.update() 只修改給出的欄位,返回修改後的聊天室資訊。可以帶上讀取到的 info.info_version(欄位名為 version),防止覆蓋別人同時做的修改,不一致時以 version_conflict 拒絕。
const room = await im.chatrooms.enter('100310941534519296');
const { info } = room.getSnapshot();
await room.manage.update({ name: '周末音乐会(返场)', description: '每周六晚八点', version: info.info_version });修改封面時,先以用途 chatroom_avatar 上傳圖片:
declare const file: File;
const room = await im.chatrooms.enter('100310941534519296');
const uploaded = await im.files.upload(file, { purpose: 'chatroom_avatar', kind: 'image' });
await room.manage.update({ avatar_url: uploaded.url });名稱、簡介和公告會經過內容安全檢查,不透過的以 content_rejected 拒絕(details.field 為不透過的欄位)。
管理員、所有者與解散
const room = await im.chatrooms.enter('100310941534519296');
await room.manage.setAdmin('lisi', true); // 设置管理员(最多 99 个)
await room.manage.setAdmin('lisi', false); // 取消管理员
await room.manage.transferOwner('wangwu'); // 转让后你成为普通用户所有者可以解散聊天室,解散後所有人(包括自己)被移出,removed 事件的原因為 dismissed,不能恢復:
await room.manage.dismiss();在客戶端建立聊天室
預設只能由你的服務端或在控制檯中建立聊天室。應用在執行策略中開啟 client_chatroom_create_enabled 後,使用者可以在客戶端建立,建立者成為所有者。沒有開啟時 create() 以 permission_denied(client_create_disabled)拒絕,請按執行配置決定是否顯示入口:
if (im.config?.client_chatroom_create_enabled) {
const info = await im.chatrooms.create({ name: '我的直播间', description: '欢迎来玩', listed: true });
const room = await im.chatrooms.enter(info.room_id);
}應用中的聊天室數有上限,達到時以 limit_exceeded(chatroom_limit)拒絕。
在 React 和 Vue 中使用
React 繫結提供 useChatroom:元件掛載時進入,解除安裝或聊天室 ID 變化時離開,返回控制代碼和隨變化更新的快照。
import { useChatroom } from '@deeprespond/im-web-react';
function LiveRoom({ roomId }: { roomId: string }) {
const { handle, snapshot, error } = useChatroom(roomId);
if (error) return <p>进入失败</p>;
if (!handle || !snapshot) return <p>正在进入…</p>;
return (
<div>
<h1>{snapshot.info.name}({snapshot.info.member_count} 人在线)</h1>
<ul>
{snapshot.messages.map((m, i) => (
<li key={m.message_id ?? m.client_msg_id ?? i}>
{m.sender_nickname ?? m.sender}:{m.type === 'text' ? String((m.body as { text: string }).text) : '[消息]'}
</li>
))}
</ul>
<button onClick={() => void handle.send({ type: 'text', body: { text: '666' } })}>发送</button>
<button onClick={() => handle.like()}>点赞</button>
</div>
);
}Vue 繫結的 useChatroom 用法相同,引數可以是 ref 或 getter:
<script setup lang="ts">
import { useChatroom } from '@deeprespond/im-web-vue';
const props = defineProps<{ roomId: string }>();
const { handle, snapshot } = useChatroom(() => props.roomId);
function sendText(text: string) {
void handle.value?.send({ type: 'text', body: { text } });
}
</script>
<template>
<div v-if="snapshot">
<h1 v-text="snapshot.info.name" />
<ul>
<li v-for="(m, i) in snapshot.messages" :key="m.message_id ?? i" v-text="m.type === 'text' ? m.body?.text : '[消息]'" />
</ul>
<button @click="sendText('666')">发送</button>
</div>
</template>React 的 StrictMode 中元件會“掛載、解除安裝、再掛載”,由於同一標籤頁多次進入共用一個控制代碼、按次數離開,不會真的離開再進入。
介面參考
im.chatrooms.list()
分頁列出對客戶端公開(listed 為 true)、狀態正常的聊天室,按建立時間從新到舊排列;按名稱字首搜尋時按名稱排列。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
p.name_prefix | string | 否 | 按名稱字首搜尋,1 到 128 個字元 |
p.limit | number | 否 | 每頁條數,預設 20,最多 100 |
p.cursor | string | 否 | 上一頁返回的 next_cursor |
返回:Promise<Page<ChatroomListItem>>,items 為聊天室,next_cursor 為下一頁的遊標,沒有下一頁時為 null。
錯誤:invalid_argument(引數不合法)。
im.chatrooms.get()
查詢一個聊天室的資訊,含當前線上人數和你在其中的身份 self,不需要先進入。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
room_id | string | 是 | 聊天室 ID |
返回:Promise<ChatroomInfo>。
錯誤:not_found(聊天室不存在或已解散)。
im.chatrooms.onlineCounts()
批次查詢線上人數。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
room_ids | string[] | 是 | 聊天室 ID,1 到 100 個 |
返回:Promise<Array<{ room_id: string; member_count: number }>>,按請求的順序;不存在和已解散的聊天室不在結果中,已封禁的為 0。
錯誤:local_validation(room_ids 為空或超過 100 個)。
im.chatrooms.create()
在客戶端建立聊天室,你成為所有者。需要應用開啟 client_chatroom_create_enabled。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
p.name | string | 是 | 名稱,1 到 128 個字元 |
p.description | string | 否 | 簡介,最長 512 個字元 |
p.avatar_url | string | 否 | 封面地址,以用途 chatroom_avatar 上傳後得到 |
p.announcement | string | 否 | 公告,最長 2048 個字元 |
p.max_members | number | 否 | 人數上限,1 到 500000;省略時跟隨執行策略 |
p.listed | boolean | 否 | 是否出現在聊天室列表中,預設 true |
返回:Promise<ChatroomInfo>。建立後需要呼叫 enter() 才進入。
錯誤:permission_denied(client_create_disabled,應用沒有開啟客戶端建立)、limit_exceeded(chatroom_limit)、content_rejected(名稱、簡介或公告沒有透過內容安全檢查)、invalid_argument(如封面地址不被允許 url_not_allowed)、app_unavailable(應用只讀)、local_validation(缺少名稱)。
im.chatrooms.enter()
進入聊天室,成功後兌現。同一標籤頁對同一個聊天室多次呼叫返回同一個控制代碼,進入次數加一。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
room_id | string | 是 | 聊天室 ID |
p.ext | string | 否 | 這次進入的附加資訊,最長 512 位元組,隨進入的通知發給其他成員。只在第一次進入時生效 |
p.leave_others | boolean | 否 | 為 true 時同時離開本標籤頁進入的其他聊天室,用於切換直播間 |
返回:Promise<ChatroomHandle>。
錯誤:not_found(聊天室不存在或已解散)、chatroom_disabled(聊天室已被封禁)、permission_denied(chatroom_banned,你被封禁,details.expires_at 為到期時間,永久為 null)、limit_exceeded(chatroom_member_limit 聊天室已滿;connection_room_limit 同時進入的聊天室已達上限)、rate_limited(進入太頻繁,SDK 等待時間不超過 60 秒的會自動重試)、not_connected(長連線 15 秒內沒有就緒)、local_validation(ext 超長)。
im.chatrooms.entered
只讀屬性,ReadonlyMap<string, ChatroomHandle>:本標籤頁當前進入的聊天室,聊天室 ID 到控制代碼。
handle.getSnapshot()
返回控制代碼當前的快照(只讀,變化時整體替換),見 ChatroomSnapshot。
返回:ChatroomSnapshot。
handle.subscribe()
訂閱快照的變化。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
listener | () => void | 是 | 快照變化時呼叫,在其中呼叫 getSnapshot() 取新的快照 |
返回:() => void,呼叫後取消訂閱。
handle.on()
監聽控制代碼的事件。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
event | string | 是 | 事件名,見下表 |
listener | (payload) => void | 是 | 處理函式 |
返回:() => void,呼叫後取消監聽。
| 事件 | 載荷 | 說明 |
|---|---|---|
message | { message: ChatroomMessageView } | 收到新訊息,或你傳送的訊息被服務端確認 |
recalled | { message_id: string; recalled_by: string | null; recalled_at: string } | 訊息被撤回,recalled_by 為操作人,你的服務端撤回時為 null |
memberJoined | Record<string, unknown> | 有人進入(只在人數不多的聊天室推送),欄位見成員列表 |
memberLeft | Record<string, unknown> | 有人離開(只在人數不多的聊天室推送),欄位見成員列表 |
like | { username: string; count: number } | 有人點贊 |
dropped | { count: number } | 訊息過多,服務端丟棄了 count 條 |
removed | { reason: string; operator: string | null; expires_at: string | null } | 你被移出,見被移出聊天室 |
handle.send()
傳送一條聊天室訊息。在進入完成之前呼叫的,等進入成功後再傳送。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
content | OutgoingContent | 是 | 訊息內容:{ type, body },格式見訊息格式。附件要先上傳,以地址傳送 |
p.priority | 'high' | 'normal' | 'low' | 否 | 優先順序,預設 normal。high 只有所有者和管理員能用 |
p.ext | Record<string, unknown> | 否 | 擴充套件欄位 |
返回:Promise<ChatroomMessageView>,傳送成功的訊息;低優先順序被丟棄時 _local.status 為 dropped、message_id 為 null。
錯誤:chatroom_muted(被禁言或全員禁言,details.reason 為 member 或 all,details.muted_until 為到期時間)、user_muted(被全域性禁言)、permission_denied(priority_denied,普通使用者傳送高優先順序的訊息)、rate_limited(user_send_rate 你傳送太頻繁;room_send_rate 聊天室訊息太多)、message_rejected(被內容安全或你的傳送前回撥拒絕)、payload_too_large、local_validation(內容不合法,如 too_large 超過 max_chatroom_message_bytes)、unsupported(chatroom_attachment,直接傳入了檔案)、not_chatroom_member、chatroom_disabled、not_found、app_unavailable、not_connected、invalid_state(控制代碼已結束)。
handle.like()
點贊。一秒內的多次點贊合併成一條低優先順序的訊息傳送,不返回結果,也不丟擲錯誤。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
count | number | 否 | 這次點讚的次數,正整數,預設 1 |
返回:無。
handle.setAttributes()
設定聊天室屬性。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
attributes | Record<string, string> | 是 | 鍵到值,1 到 20 個,鍵和值合計不超過 16 KB |
p.auto_delete | boolean | 否 | 為 true 時這些鍵在你離開聊天室時自動刪除,預設 false |
p.force | boolean | 否 | 覆蓋別人設定的鍵,只有所有者和管理員能用,預設 false |
返回:Promise<AttributeResult>。部分鍵失敗時不丟擲錯誤,失敗的鍵在 failed 中。
錯誤:chatroom_muted、permission_denied(role_required,普通使用者帶 force)、rate_limited(attribute_rate、room_attribute_rate)、invalid_argument(invalid_attribute_key、invalid_attribute_value)、local_validation(鍵數或大小超出)、not_chatroom_member、chatroom_disabled、app_unavailable、not_connected、invalid_state。
handle.removeAttributes()
刪除聊天室屬性。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
keys | string[] | 是 | 要刪除的鍵,1 到 20 個;不存在的鍵忽略 |
p.force | boolean | 否 | 刪除別人設定的鍵,只有所有者和管理員能用 |
返回:Promise<AttributeResult>。
錯誤:同 setAttributes(),被禁言時也可以刪除。
handle.recall()
撤回一條聊天室訊息。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
message_id | string | 是 | 訊息 ID |
返回:Promise<{ changed: boolean }>,已經撤回過的 changed 為 false。
錯誤:permission_denied(recall_window_expired 超過可撤回的時間;recall_denied 無權撤回這條訊息)、not_found(訊息已不在最近的訊息中)、invalid_state。
handle.members()
分頁返回此刻在聊天室裡的使用者,按進入時間從早到晚排列,已按使用者名稱去重。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
page.limit | number | 否 | 每頁條數,最多 100 |
page.cursor | string | 否 | 上一頁返回的 next_cursor;不帶時從第一頁開始 |
返回:Promise<Page<ChatroomMember>>。
錯誤:not_chatroom_member、invalid_state。
handle.refresh()
重新獲取聊天室資訊(含線上人數)、屬性和最近的訊息,更新快照。
返回:Promise<void>。
錯誤:not_found、invalid_state。
handle.leave()
離開聊天室。進入次數減一,減到 0 時真正離開,之後控制代碼結束。進入還沒完成時呼叫的,等進入完成後再處理。控制代碼已結束時呼叫沒有作用。
返回:Promise<void>,不會失敗。
handle.manage.update()
修改聊天室資料,只修改給出的欄位。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
patch.name | string | 否 | 名稱,不能清空(所有者、管理員) |
patch.description | string | 否 | 簡介,空字串表示清空(所有者、管理員) |
patch.avatar_url | string | 否 | 封面地址,空字串表示清空(所有者、管理員) |
patch.announcement | string | 否 | 公告,空字串表示清空(所有者、管理員) |
patch.max_members | number | null | 否 | 人數上限,null 表示跟隨執行策略(所有者) |
patch.listed | boolean | 否 | 是否出現在聊天室列表中(所有者) |
patch.version | number | 否 | 讀取到的 info.info_version,不一致時不修改 |
返回:Promise<ChatroomInfo>,修改後的資訊。
錯誤:permission_denied(role_required)、version_conflict、content_rejected、invalid_argument、chatroom_disabled、app_unavailable、invalid_state。
handle.manage.setMuteAll()
開啟或關閉全員禁言(所有者、管理員)。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
on | boolean | 是 | true 開啟,false 關閉 |
返回:Promise<void>。
錯誤:permission_denied(role_required)、chatroom_disabled、invalid_state。
handle.manage.setAdmin()
設定或取消管理員(所有者)。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
username | string | 是 | 使用者名稱,不要求他在聊天室裡 |
admin | boolean | 是 | true 設定,false 取消 |
返回:Promise<void>。
錯誤:permission_denied(role_required;target_banned 對方在封禁中)、limit_exceeded(admin_limit,管理員已有 99 個)、not_found(使用者不存在)、chatroom_disabled、invalid_state。
handle.manage.transferOwner()
把所有者轉讓給另一個使用者(所有者),你成為普通使用者。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
username | string | 是 | 新所有者的使用者名稱,不要求他在聊天室裡 |
返回:Promise<void>。
錯誤:permission_denied(role_required)、not_found、chatroom_disabled、invalid_state。
handle.manage.mute()
禁言使用者(所有者、管理員)。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
usernames | string[] | 是 | 使用者名稱,1 到 100 個 |
p.duration_seconds | number | 否 | 時長,1 到 315360000 秒(10 年);省略表示永久 |
p.reason | string | 否 | 原因 |
返回:Promise<ChatroomMemberResult[]>,每個使用者的結果:成功為 muted 或 unchanged,失敗帶 code(如 permission_denied 的 owner_protected、admin_protected,not_found,limit_exceeded 的 mute_limit)。
錯誤:permission_denied(role_required)、chatroom_disabled、invalid_argument、local_validation(usernames 為空)、invalid_state。
handle.manage.unmute()
解除禁言(所有者、管理員)。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
usernames | string[] | 是 | 使用者名稱,1 到 100 個 |
返回:Promise<ChatroomMemberResult[]>,成功為 unmuted 或 unchanged(原來沒有禁言),失敗如 permission_denied(set_by_higher_role)。
錯誤:同 mute()。
handle.manage.ban()
封禁使用者(所有者、管理員),在聊天室裡的同時被移出。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
usernames | string[] | 是 | 使用者名稱,1 到 100 個 |
p.duration_seconds | number | 否 | 時長,1 到 315360000 秒;省略表示永久 |
p.reason | string | 否 | 原因 |
返回:Promise<ChatroomMemberResult[]>,成功為 banned 或 unchanged,失敗如 owner_protected、admin_protected、ban_limit。
錯誤:同 mute()。
handle.manage.unban()
解除封禁(所有者、管理員)。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
usernames | string[] | 是 | 使用者名稱,1 到 100 個 |
返回:Promise<ChatroomMemberResult[]>,成功為 unbanned 或 unchanged,失敗如 set_by_higher_role。
錯誤:同 mute()。
handle.manage.kick()
把使用者移出聊天室(所有者、管理員),他之後可以再次進入。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
usernames | string[] | 是 | 使用者名稱,1 到 100 個 |
返回:Promise<ChatroomMemberResult[]>,成功為 removed 或 not_in_room(他不在聊天室裡),失敗如 owner_protected、admin_protected。
錯誤:同 mute()。
handle.manage.allowlist.list()
分頁查詢白名單(所有者、管理員)。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
page.limit | number | 否 | 每頁條數,預設 20,最多 100 |
page.cursor | string | 否 | 上一頁返回的 next_cursor |
返回:Promise<Page<unknown>>,每項為 username、nickname、avatar_url、created_by、created_at。
錯誤:permission_denied(role_required)、invalid_state。
handle.manage.allowlist.add()
把使用者加入白名單(所有者、管理員)。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
usernames | string[] | 是 | 使用者名稱,1 到 100 個 |
返回:Promise<ChatroomMemberResult[]>,成功為 added 或 unchanged,失敗如 limit_exceeded(allowlist_limit,白名單已有 500 人)。
錯誤:同 mute(),另有 app_unavailable(應用只讀)。
handle.manage.allowlist.remove()
把使用者移出白名單(所有者、管理員)。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
usernames | string[] | 是 | 使用者名稱,1 到 100 個 |
返回:Promise<ChatroomMemberResult[]>,成功為 removed 或 unchanged。
錯誤:同 mute()。
handle.manage.mutes()
分頁查詢未到期的禁言(所有者、管理員)。
| 引數 | 型別 | 必填 | 說明 |
|---|---|---|---|
page.limit | number | 否 | 每頁條數,預設 20,最多 100 |
page.cursor | string | 否 | 上一頁返回的 next_cursor |
返回:Promise<Page<unknown>>,每項為 username、nickname、avatar_url、muted_until(永久為 null)、reason、created_by、created_by_role(owner、admin 或 server)、created_at。
錯誤:permission_denied(role_required)、invalid_state。
handle.manage.bans()
分頁查詢未到期的封禁(所有者、管理員)。引數同 mutes()。
返回:Promise<Page<unknown>>,每項的欄位與禁言相同,只是 muted_until 換為 expires_at。
錯誤:permission_denied(role_required)、invalid_state。
handle.manage.dismiss()
解散聊天室(所有者),不能恢復。全部成員被移出,removed 的原因為 dismissed。
返回:Promise<void>。
錯誤:permission_denied(role_required)、chatroom_disabled(被平臺封禁的聊天室)、invalid_state。
資料結構
ChatroomSnapshot
控制代碼的快照。
| 欄位 | 型別 | 說明 |
|---|---|---|
info | ChatroomInfo | 聊天室資訊,含 self |
attributes | Record<string, ChatroomAttribute> | 全部屬性,鍵到屬性 |
attributes_version | number | 屬性的版本號,每次變化加一 |
messages | ChatroomMessageView[] | 最近的訊息和之後收到、發出的訊息,按到達順序,最多 500 條 |
state | string | entering 正在進入 / in 在聊天室中 / reentering 斷線後正在重新進入 / removed 已被移出 / left 已離開 |
removed | object | 只在 state 為 removed 時有:reason、operator、expires_at,見被移出聊天室 |
ChatroomInfo
| 欄位 | 型別 | 說明 |
|---|---|---|
room_id | string | 聊天室 ID |
name | string | 名稱 |
description | string | 簡介 |
avatar_url | string | 封面地址,沒有時為空字串 |
announcement | string | 公告 |
announcement_updated_at | string | null | 公告的修改時間 |
announcement_updated_by | string | null | 在客戶端修改公告的使用者;你的服務端修改時為 null |
owner | string | null | 所有者的使用者名稱,沒有所有者時為 null |
admins | string[] | 管理員的使用者名稱 |
max_members | number | 實際生效的人數上限 |
mute_all | boolean | 是否開啟了全員禁言 |
listed | boolean | 是否出現在聊天室列表中 |
status | string | active 正常 / disabled 已封禁 / dismissed 已解散 |
disabled_by | string | null | 封禁方,未封禁時為 null |
member_count | number | 線上人數,近似值 |
info_version | number | 資料的版本號,每次變化加一 |
attributes_version | number | 屬性的版本號 |
created_at | string | 建立時間 |
self | object | 你在這個聊天室中的狀態:role(owner / admin / member)、in_room(是否在其中)、muted、muted_until(永久禁言為 null)、allowlisted |
時間都是 ISO 8601 格式的字串,如 2026-10-04T19:19:52.149Z。
ChatroomListItem
im.chatrooms.list() 的一項。
| 欄位 | 型別 | 說明 |
|---|---|---|
room_id | string | 聊天室 ID |
name | string | 名稱 |
description | string | 簡介 |
avatar_url | string | 封面地址 |
owner | string | null | 所有者 |
max_members | number | 人數上限 |
member_count | number | 線上人數 |
ChatroomMessageView
messages 中的一條訊息:服務端的聊天室訊息 ChatroomMessage,加上本地的狀態 _local。
| 欄位 | 型別 | 說明 |
|---|---|---|
room_id | string | 聊天室 ID |
message_id | string | null | 訊息 ID;正在傳送、傳送失敗或被丟棄的為 null |
client_msg_id | string | null | 傳送者生成的去重 ID |
sender | string | null | 傳送者的使用者名稱,系統訊息為 null |
sender_type | string | user 使用者 / system 系統 |
sender_nickname | string | null | 傳送時的暱稱 |
sender_avatar_url | string | null | 傳送時的頭像 |
sender_role | string | null | 傳送時的身份:owner / admin / member |
type | string | 訊息型別:text、image、voice、video、file、location、custom |
body | Record<string, unknown> | null | 訊息內容,見訊息格式 |
ext | Record<string, unknown> | null | 擴充套件欄位 |
priority | string | high / normal / low |
via | string | 傳送途徑:client 客戶端 / openapi 你的服務端 / console 控制檯 / system 系統 |
created_at | string | null | 傳送時間;正在傳送的為 null |
_local.status | string | sending 正在傳送 / sent 已傳送 / failed 傳送失敗 / dropped 低優先順序的訊息被丟棄 |
_local.error | DRError | 傳送失敗的原因,只在 failed 時有 |
_local.trusted | boolean | 為 true 表示由你的服務端、控制檯或系統發出 |
收到的訊息(message 事件、最近的訊息)的 message_id 和 created_at 總是有值。
ChatroomMember
members() 的一項。
| 欄位 | 型別 | 說明 |
|---|---|---|
username | string | 使用者名稱 |
nickname | string | 暱稱,沒有時為空字串 |
avatar_url | string | 頭像地址,沒有時為空字串 |
role | string | owner / admin / member |
joined_at | string | 這一次進入的時間 |
ChatroomAttribute
一個屬性。
| 欄位 | 型別 | 說明 |
|---|---|---|
value | string | 值 |
owner | string | null | 最近一次設定這個鍵的使用者;你的服務端設定的為 null |
auto_delete | boolean | 是否在設定人離開聊天室時自動刪除 |
updated_at | string | 最近一次設定的時間 |
AttributeResult
setAttributes()、removeAttributes() 的結果。
| 欄位 | 型別 | 說明 |
|---|---|---|
changed | boolean | 是否有鍵被寫入或刪除 |
attributes_version | number | 操作之後的屬性版本號 |
failed | Record<string, { code: string; reason?: string }> | 失敗的鍵:permission_denied(attribute_owned,鍵屬於別人)或 limit_exceeded(attribute_limit,個數或總大小超出)。沒有失敗時為空物件 |
ChatroomMemberResult
批次管理操作中一個使用者的結果,二者之一:
| 欄位 | 型別 | 說明 |
|---|---|---|
username | string | 使用者名稱 |
result | string | 成功時的結果:muted、unmuted、banned、unbanned、removed、not_in_room、added、unchanged |
code | string | 失敗時的錯誤碼 |
message | string | 失敗時的說明 |
details | Record<string, unknown> | 失敗的詳細原因,如 { reason: 'owner_protected' } |
ChatroomPatch
manage.update() 的引數,見 handle.manage.update()。
