本指南介绍如何使用 Cloudflare RealtimeKit 在会议中发送和接收聊天消息。
可以在聊天中发送三种类型的消息:
- 文本消息
- 图片
- 文件
会议聊天对象存储在 meeting.chat 中,该对象具有发送和接收消息的方法。
console.log("Chat object:", meeting.chat);meeting.chat.messages 数组包含在聊天中发送的所有消息。这是一个对象数组,其中每个对象的类型为 Message。
console.log("All chat messages:", meeting.chat.messages);可以在聊天中发送三种类型的消息:
- 文本消息
- 图片
- 文件
会议聊天对象存储在 meeting.chat 中,该对象具有发送和接收消息的方法。
meeting.chat;meeting.chat.messages 数组包含在聊天中发送的所有消息。这是一个对象数组,其中每个对象的类型为 Message。
meeting.chat.messages;可以在聊天中发送三种类型的消息:
- 文本消息
- 图片
- 文件
会议聊天对象存储在 meeting.chat 中,该对象具有发送和接收消息的方法。
meeting.chatmeeting.chat.messages 数组包含在聊天中发送的所有消息。这是一个对象数组,其中每个对象的类型为 com.cloudflare.realtimekit.chat.ChatMessage。
meeting.chat.messages可以在聊天中发送三种类型的消息:
- 文本消息
- 图片
- 文件
会议聊天对象存储在 meeting.chat 中,该对象具有发送和接收消息的方法。
meeting.chatmeeting.chat.messages 数组包含在聊天中发送的所有消息。这是一个对象数组,其中每个对象的类型为 RealtimeKit.ChatMessage。
meeting.chat.messages可以在聊天中发送三种类型的消息:
- 文本消息
- 图片
- 文件
会议聊天对象存储在 meeting.chat 中,该对象具有发送和接收消息的方法。
meeting.chat;meeting.chat.messages 数组包含在聊天中发送的所有消息。这是一个对象数组,其中每个对象的类型为 ChatMessage。
meeting.chat.messages;可以在聊天中发送三种类型的消息:
- 文本消息
- 图片
- 文件
会议聊天对象存储在 meeting.chat 中,该对象具有发送和接收消息的方法。
meeting.chat;meeting.chat.messages 数组包含在聊天中发送的所有消息。这是一个对象数组,其中每个对象的类型为 Message。
meeting.chat.messages;Message 类型的定义如下:
interface BaseMessage<T extends MessageType> {
type: T;
userId: string;
displayName: string;
time: Date;
id: string;
isEdited?: boolean;
read?: boolean;
pluginId?: string;
pinned?: boolean;
targetUserIds?: string[];
}
interface TextMessage extends BaseMessage<MessageType.text> {
message: string;
}
interface ImageMessage extends BaseMessage<MessageType.image> {
link: string;
}
interface FileMessage extends BaseMessage<MessageType.file> {
name: string;
size: number;
link: string;
}
type Message = TextMessage | ImageMessage | FileMessage;Message 类型的定义如下:
interface BaseMessage<T extends MessageType> {
type: T;
userId: string;
displayName: string;
time: Date;
id: string;
isEdited?: boolean;
read?: boolean;
pluginId?: string;
pinned?: boolean;
targetUserIds?: string[];
}
interface TextMessage extends BaseMessage<MessageType.text> {
message: string;
}
interface ImageMessage extends BaseMessage<MessageType.image> {
link: string;
}
interface FileMessage extends BaseMessage<MessageType.file> {
name: string;
size: number;
link: string;
}
type Message = TextMessage | ImageMessage | FileMessage;ChatMessage 类的定义如下:
enum class ChatMessageType {
TEXT,
IMAGE,
FILE
}
open class ChatMessage(
val userId: String,
val displayName: String,
val read: Boolean,
val pluginId: String?,
val type: ChatMessageType,
val time: String,
val createdAtMillis: Long,
val targetUserIds: List<String>?,
)
class TextMessage(val message: String): ChatMessage(...)
class ImageMessage(val link: String): ChatMessage(...)
class FileMessage(
val name: String,
val link: String,
val size: Long,
): ChatMessage(...)ChatMessage 类的定义如下:
public enum ChatMessageType {
case text
case image
case file
}
open class ChatMessage {
public let userId: String
public let displayName: String
public let read: Bool
public let pluginId: String?
public let type: ChatMessageType
public let time: String
public let createdAtMillis: Int64
public let targetUserIds: [String]?
}
public final class TextMessage: ChatMessage {
public let message: String
}
public final class ImageMessage: ChatMessage {
public let link: String
}
public final class FileMessage: ChatMessage {
public let name: String
public let link: String
public let size: Int64
}ChatMessage 类的定义如下:
enum MessageType { text, image, file }
class ChatMessage {
final String displayName;
final MessageType type;
final bool read;
final String userId;
final String? pluginId;
final String time;
}
class TextMessage extends ChatMessage {
final String message;
}
class ImageMessage extends ChatMessage {
final String link;
}
class FileMessage extends ChatMessage {
final String name;
final String link;
final int size;
}Message 类型的定义如下:
interface BaseMessage<T extends MessageType> {
type: T;
userId: string;
displayName: string;
time: Date;
id: string;
isEdited?: boolean;
read?: boolean;
pluginId?: string;
pinned?: boolean;
targetUserIds?: string[];
}
interface TextMessage extends BaseMessage<MessageType.text> {
message: string;
}
interface ImageMessage extends BaseMessage<MessageType.image> {
link: string;
}
interface FileMessage extends BaseMessage<MessageType.file> {
name: string;
size: number;
link: string;
}
type Message = TextMessage | ImageMessage | FileMessage;meeting.chat 中有一个用于发送每种类型消息的方法。
要发送文本消息,请使用 meeting.chat.sendTextMessage() 方法。该方法接受字符串消息并将其发送到房间。
const message = "Is this the real life?";
await meeting.chat.sendTextMessage(message);meeting.chat 中有一个用于发送每种类型消息的方法。
要发送文本消息,请使用 meeting.chat.sendTextMessage() 方法。该方法接受字符串消息并将其发送到房间。
const message = "Is this the real life?";
await meeting.chat.sendTextMessage(message);meeting.chat 中有一个用于发送每种类型消息的方法。
要发送文本消息,请使用 meeting.chat.sendTextMessage() 方法。该方法接受字符串消息并将其发送到房间。
val message = "Is this the real life?"
meeting.chat.sendTextMessage(message)meeting.chat 中有一个用于发送每种类型消息的方法。
要发送文本消息,请使用 meeting.chat.sendTextMessage() 方法。该方法接受字符串消息并将其发送到房间。
var message = "Is this the real life?"
meeting.chat.sendTextMessage(message)meeting.chat 中有一个用于发送每种类型消息的方法。
要发送文本消息,请使用 meeting.chat.sendTextMessage() 方法。该方法接受字符串消息并将其发送到房间。
final message = "Is this the real life?";
meeting.chat.sendTextMessage(message);meeting.chat 中有一个用于发送每种类型消息的方法。
要发送文本消息,请使用 meeting.chat.sendTextMessage() 方法。该方法接受字符串消息并将其发送到房间。
const message = "Is this the real life?";
await meeting.chat.sendTextMessage(message);您可以使用 meeting.chat.sendImageMessage() 发送图片。该方法接受 File 类型的图片,并将其发送给会议中的参与者。
<label for="img">Select image:</label>
<input type="file" id="img" name="img" accept="image/*" />
<button onclick="onSendImage()">Send Image</button>async function onSendImage() {
const image = document.getElementById("img");
await meeting.chat.sendImageMessage(image.files[0]);
}您可以使用 meeting.chat.sendImageMessage() 发送图片。该方法接受 File 类型的图片,并将其发送给会议中的参与者。
import { useRef } from "react";
function ChatComponent() {
const imageInputRef = useRef(null);
const onSendImage = async () => {
const image = imageInputRef.current;
if (image && image.files[0]) {
await meeting.chat.sendImageMessage(image.files[0]);
}
};
return (
<>
<label htmlFor="img">Select image:</label>
<input
type="file"
id="img"
name="img"
accept="image/*"
ref={imageInputRef}
/>
<button onClick={onSendImage}>Send Image</button>
</>
);
}您可以使用 meeting.chat.sendImageMessage() 将图片发送给会议中的参与者。
meeting.chat.sendImageMessage(imageUri) { err ->
// Handle error if any
}您可以使用 meeting.chat.sendImageMessage() 将图片发送给会议中的参与者。
meeting.chat.sendImageMessage(imageURL: url) { err in
// Handle error if any
}您可以使用 meeting.chat.sendImageMessage() 将图片发送给会议中的参与者。它接受一个字符串 filePath 作为参数。
final filePath = "file_path_of_image";
meeting.chat.sendImageMessage(filePath, (error) {
// Handle error if any
});您可以使用 meeting.chat.sendImageMessage() 发送图片。该方法接受 File 类型的图片,并将其发送给会议中的参与者。
import DocumentPicker from "@react-native-documents/picker";
async function onSendImage() {
// 获取图片 URI 并创建一个包含以下字段的对象
const res = await DocumentPicker.pickSingle({
type: [DocumentPicker.types.images],
});
const image = {
uri: res.uri,
name: res.name,
size: res.size,
type: res.type,
};
await meeting.chat.sendImageMessage(image);
}发送文件与发送图片类似。唯一的区别是,当您发送图片时,会议聊天中会显示预览,而发送文件则不会。话虽如此,图片也可以使用 meeting.chat.sendFileMessage() 作为文件发送。
<label for="file">Select file:</label>
<input type="file" id="file" name="file" />
<button onclick="onSendFile()">Send File</button>async function onSendFile() {
const file = document.getElementById("file");
await meeting.chat.sendFileMessage(file.files[0]);
}发送文件与发送图片类似。唯一的区别是,当您发送图片时,会议聊天中会显示预览,而发送文件则不会。话虽如此,图片也可以使用 meeting.chat.sendFileMessage() 作为文件发送。
import { useRef } from "react";
function ChatComponent() {
const fileInputRef = useRef(null);
const onSendFile = async () => {
const file = fileInputRef.current;
if (file && file.files[0]) {
await meeting.chat.sendFileMessage(file.files[0]);
}
};
return (
<>
<label htmlFor="file">Select file:</label>
<input type="file" id="file" name="file" ref={fileInputRef} />
<button onClick={onSendFile}>Send File</button>
</>
);
}发送文件与发送图片类似。唯一的区别是,当您发送图片时,会议聊天中会显示预览,而发送文件则不会。话虽如此,图片也可以使用 meeting.chat.sendFileMessage() 作为文件发送。
meeting.chat.sendFileMessage(fileUri) { err ->
// Handle error if any
}发送文件与发送图片类似。唯一的区别是,当您发送图片时,会议聊天中会显示预览,而发送文件则不会。话虽如此,图片也可以使用 meeting.chat.sendFileMessage() 作为文件发送。
meeting.chat.sendFileMessage(fileURL: url) { err in
// Handle error if any
}您可以使用 meeting.chat.sendFileMessage() 将文件发送给会议中的参与者。它接受一个字符串 filePath 作为参数。
final filePath = "file_path_of_pdf";
meeting.chat.sendFileMessage(filePath, (error) {
// Handle error if any
});发送文件与发送图片类似。唯一的区别是,当您发送图片时,会议聊天中会显示预览,而发送文件则不会。话虽如此,图片也可以使用 meeting.chat.sendFileMessage() 作为文件发送。
import DocumentPicker from "@react-native-documents/picker";
async function onSendFile() {
// 获取文件 URI 并创建一个包含以下字段的对象
const res = await DocumentPicker.pickSingle({
type: [DocumentPicker.types.allFiles],
});
const file = {
uri: res.uri,
name: res.name,
size: res.size,
type: res.type,
};
await meeting.chat.sendFileMessage(file);
}还有一个名为 meeting.chat.sendMessage() 的通用方法,可用于发送上述三种类型的任何消息。它实际上根据您发送给该方法的有效负载类型来调用上述方法之一。sendMessage() 方法接受以下类型的参数 message:
async function sendMessage(
message:
| { type: "text"; message: string }
| { type: "image"; image: File }
| { type: "file"; file: File },
) {
// ...
}以下是您使用 sendMessage() 方法发送文本消息的方式:
const message = "Is this just fantasy?";
await meeting.chat.sendMessage({ type: "text", message });还有一个名为 meeting.chat.sendMessage() 的通用方法,可用于发送上述三种类型的任何消息。它实际上根据您发送给该方法的有效负载类型来调用上述方法之一。sendMessage() 方法接受以下类型的参数 message:
async function sendMessage(
message:
| { type: "text"; message: string }
| { type: "image"; image: File }
| { type: "file"; file: File },
) {
// ...
}以下是您使用 sendMessage() 方法发送文本消息的方式:
const message = "Is this just fantasy?";
await meeting.chat.sendMessage({ type: "text", message });还有一个名为 meeting.chat.sendMessage() 的通用方法,可用于发送上述三种类型的任何消息。它实际上根据您发送给该方法的有效负载类型来调用上述方法之一。sendMessage() 方法接受以下类型的参数 message:
async function sendMessage(
message:
| { type: "text"; message: string }
| { type: "image"; image: File }
| { type: "file"; file: File },
) {
// ...
}以下是您使用 sendMessage() 方法发送文本消息的方式:
const message = "Is this just fantasy?";
await meeting.chat.sendMessage({ type: "text", message });meeting.chat 对象在收到新的聊天消息时会触发事件。您可以监听 chatUpdate 事件,以便在收到新的聊天消息时进行记录。
meeting.chat.on("chatUpdate", ({ message, messages }) => {
console.log(`Received message ${message}`);
console.log(`All messages in chat: ${messages.join(", ")}`);
});此处,message 的类型为 Message(如介绍中所定义)。messages 是会议中所有聊天消息的列表,与 meeting.chat.messages 相同。
当收到聊天消息时,meeting.chat.messages 列表也会随之更新。
console.log(JSON.stringify(meeting.chat.messages));
meeting.chat.on("chatUpdate", () => {
console.log(JSON.stringify(meeting.chat.messages));
});meeting.chat 对象在收到新的聊天消息时会触发事件。您可以监听 chatUpdate 事件,以便在收到新的聊天消息时进行记录。
import { useRealtimeKitSelector } from "@cloudflare/realtimekit-react";
// useRealtimeKitSelector hooks only works when `RealtimeKitProvider` is used.
const messages = useRealtimeKitSelector((m) => m.chat.messages);或者:
meeting.chat.on("chatUpdate", ({ message, messages }) => {
console.log(`Received message ${message}`);
console.log(`All messages in chat: ${messages.join(", ")}`);
});此处,message 的类型为 Message(如介绍中所定义)。messages 是会议中所有聊天消息的列表,与 meeting.chat.messages 相同。
当收到聊天消息时,meeting.chat.messages 列表也会随之更新。
console.log(JSON.stringify(meeting.chat.messages));
meeting.chat.on("chatUpdate", () => {
console.log(JSON.stringify(meeting.chat.messages));
});为了能够接收聊天消息,您需要实现来自回调 RtkChatEventListener 的 onChatUpdates() 方法。您可以通过调用 meeting.addChatEventListener(rtkChatEventListener) 来订阅这些事件。
meeting.addChatEventListener(object : RtkChatEventListener {
override fun onChatUpdates(messages: List<ChatMessage>) {
// to load chat messages
}
override fun onNewChatMessage(message: ChatMessage) {
// when a new chat message is shared in the meeting
}
override fun onMessageRateLimitReset() {
// when the rate limit for sending messages of self is reset
}
})每当聊天消息发生变化时,都会调用 onChatUpdates() 方法。messages 参数是在聊天中发送的 ChatMessage 对象列表。
每当在会议中分享新的聊天消息时,都会调用 onNewChatMessage() 方法。message 参数是在聊天中发送的 ChatMessage 对象。
当重置自身发送消息的速率限制且您可以再次发送消息时,将调用 onMessageRateLimitReset() 方法。默认速率限制为 60 秒内 180 条消息。
为了能够接收聊天消息,您需要实现来自回调 RtkChatEventListener 的 onChatUpdates() 方法。您可以通过调用 meeting.addChatEventListener(rtkChatEventListener) 来订阅这些事件。
extension MainChatListener: RtkChatEventListener {
func onChatUpdates(messages: [ChatMessage]) {
// to load chat messages
}
func onNewChatMessage(message: ChatMessage) {
// when a new chat message is shared in the meeting
}
func onMessageRateLimitReset() {
// when the rate limit for sending messages of self is reset
}
}每当聊天消息发生变化时,都会调用 onChatUpdates() 方法。messages 参数是在聊天中发送的 ChatMessage 对象列表。
每当在会议中分享新的聊天消息时,都会调用 onNewChatMessage() 方法。message 参数是在聊天中发送的 ChatMessage 对象。
当重置自身发送消息的速率限制且您可以再次发送消息时,将调用 onMessageRateLimitReset() 方法。默认速率限制为 60 秒内 180 条消息。
为了能够接收聊天消息,您需要实现来自回调 RtkChatEventListener 的 onChatUpdates() 方法。您可以通过调用 meeting.addChatEventListener(rtkChatEventListener) 来订阅这些事件。
class ChatEventListener extends RtkChatEventListener {
@override
void onChatUpdates(List<ChatMessage> messages) {
messages.map((msg) {
switch (msg.type) {
case MessageType.text:
print((msg as TextMessage).displayName);
print((msg).message);
// Show message/return state to show text message UI.
break;
case MessageType.image:
print((msg as ImageMessage).displayName);
print((msg).link);
// Show message/return state to show image message UI.
break;
case MessageType.file:
print((msg as FileMessage).name);
print((msg).link);
print((msg).size);
// Show message/return state to show file message UI.
break;
}
});
}
void onNewChatMessage(ChatMessage message) {
// your code to handle new chat message
}
}在此上下文中,messages 指的是会议中所有聊天消息的列表。所使用的消息类型是 ChatMessage,已在前面的“聊天”主题介绍中引入。
每当收到聊天消息时,meeting.chat.messages 列表就会自动更新。
meeting.chat 对象在收到新的聊天消息时会触发事件。您可以监听 chatUpdate 事件,以便在收到新的聊天消息时进行记录。
meeting.chat.on("chatUpdate", ({ message, messages }) => {
console.log(`Received message ${message}`);
console.log(`All messages in chat: ${messages.join(", ")}`);
});此处,message 的类型为 Message(如介绍中所定义)。messages 是会议中所有聊天消息的列表,与 meeting.chat.messages 相同。
当收到聊天消息时,meeting.chat.messages 列表也会随之更新。
console.log(JSON.stringify(meeting.chat.messages));
meeting.chat.on("chatUpdate", () => {
console.log(JSON.stringify(meeting.chat.messages));
});meeting.chat 中有一个用于编辑每种类型消息的方法。
要编辑文本消息,请使用 meeting.chat.editTextMessage() 方法。该方法接受 messageId(类型为 string)和 message(类型为 string)。
const message = meeting.chat.messages[0];
const messageId = message?.id;
const newMessage = "Is this the real life?";
await meeting.chat.editTextMessage(messageId, newMessage);meeting.chat 中有一个用于编辑每种类型消息的方法。
要编辑文本消息,请使用 meeting.chat.editTextMessage() 方法。该方法接受 messageId(类型为 string)和 message(类型为 string)。
const message = meeting.chat.messages[0];
const messageId = message?.id;
const newMessage = "Is this the real life?";
await meeting.chat.editTextMessage(messageId, newMessage);meeting.chat 中有一个用于编辑每种类型消息的方法。
要编辑文本消息,请使用 meeting.chat.editTextMessage() 方法。该方法接受 messageId(类型为 string)和 message(类型为 string)。
const message = meeting.chat.messages[0];
const messageId = message?.id;
const newMessage = "Is this the real life?";
await meeting.chat.editTextMessage(messageId, newMessage);您可以使用 meeting.chat.editImageMessage() 编辑图片。该方法接受类型为 string 的 messageId 和类型为 File 的图片。
<label for="img">Edit image:</label>
<input type="file" id="img" name="img" accept="image/*" />
<button onclick="onEditImage()">Edit Image</button>async function onEditImage() {
const messageId = "...";
const image = document.getElementById("img");
await meeting.chat.editImageMessage(messageId, image.files[0]);
}您可以使用 meeting.chat.editImageMessage() 编辑图片。该方法接受类型为 string 的 messageId 和类型为 File 的图片。
import { useRef } from "react";
function ChatComponent() {
const imageInputRef = useRef(null);
const onEditImage = async () => {
const messageId = "...";
const image = imageInputRef.current;
if (image && image.files[0]) {
await meeting.chat.editImageMessage(messageId, image.files[0]);
}
};
return (
<>
<label htmlFor="img">Edit image:</label>
<input
type="file"
id="img"
name="img"
accept="image/*"
ref={imageInputRef}
/>
<button onClick={onEditImage}>Edit Image</button>
</>
);
}您可以使用 meeting.chat.editImageMessage() 编辑图片。该方法接受类型为 string 的 messageId 和类型为 File 的图片。
import DocumentPicker from "@react-native-documents/picker";
async function onEditImage() {
const messageId = "...";
// 获取图片 URI 并创建一个包含以下字段的对象
const res = await DocumentPicker.pickSingle({
type: [DocumentPicker.types.images],
});
const image = {
uri: res.uri,
name: res.name,
size: res.size,
type: res.type,
};
await meeting.chat.editImageMessage(messageId, image);
}编辑文件与编辑图片类似。要编辑文件,请使用 meeting.chat.editFileMessage()。
<label for="file">Edit file:</label>
<input type="file" id="file" name="file" />
<button onclick="onEditFile()">Edit File</button>async function onEditFile() {
const messageId = "...";
const file = document.getElementById("file");
await meeting.chat.editFileMessage(messageId, file.files[0]);
}编辑文件与编辑图片类似。要编辑文件,请使用 meeting.chat.editFileMessage()。
import { useRef } from "react";
function ChatComponent() {
const fileInputRef = useRef(null);
const onEditFile = async () => {
const messageId = "...";
const file = fileInputRef.current;
if (file && file.files[0]) {
await meeting.chat.editFileMessage(messageId, file.files[0]);
}
};
return (
<>
<label htmlFor="file">Edit file:</label>
<input type="file" id="file" name="file" ref={fileInputRef} />
<button onClick={onEditFile}>Edit File</button>
</>
);
}编辑文件与编辑图片类似。要编辑文件,请使用 meeting.chat.editFileMessage()。
import DocumentPicker from "@react-native-documents/picker";
async function onEditFile() {
const messageId = "...";
// 获取文件 URI 并创建一个包含以下字段的对象
const res = await DocumentPicker.pickSingle({
type: [DocumentPicker.types.allFiles],
});
const file = {
uri: res.uri,
name: res.name,
size: res.size,
type: res.type,
};
await meeting.chat.editFileMessage(messageId, file);
}还有一个名为 meeting.chat.editMessage() 的通用方法,可用于编辑上述三种类型的任何消息。它实际上根据您发送给该方法的有效负载类型来调用上述方法之一。editMessage() 方法接受以下类型的参数 messageId 和 message:
async function editMessage(
messageId: string,
message:
| { type: "text"; message: string }
| { type: "image"; image: File }
| { type: "file"; file: File },
) {
// ...
}以下是您使用 editMessage() 方法编辑文本消息的方式:
const messageId = "...";
const message = "Is this just fantasy?";
await meeting.chat.editMessage(messageId, { type: "text", message });还有一个名为 meeting.chat.editMessage() 的通用方法,可用于编辑上述三种类型的任何消息。它实际上根据您发送给该方法的有效负载类型来调用上述方法之一。editMessage() 方法接受以下类型的参数 messageId 和 message:
async function editMessage(
messageId: string,
message:
| { type: "text"; message: string }
| { type: "image"; image: File }
| { type: "file"; file: File },
) {
// ...
}以下是您使用 editMessage() 方法编辑文本消息的方式:
const messageId = "...";
const message = "Is this just fantasy?";
await meeting.chat.editMessage(messageId, { type: "text", message });还有一个名为 meeting.chat.editMessage() 的通用方法,可用于编辑上述三种类型的任何消息。它实际上根据您发送给该方法的有效负载类型来调用上述方法之一。editMessage() 方法接受以下类型的参数 messageId 和 message:
async function editMessage(
messageId: string,
message:
| { type: "text"; message: string }
| { type: "image"; image: File }
| { type: "file"; file: File },
) {
// ...
}以下是您使用 editMessage() 方法编辑文本消息的方式:
const messageId = "...";
const message = "Is this just fantasy?";
await meeting.chat.editMessage(messageId, { type: "text", message });meeting.chat 对象公开了其他一些方法,以便在处理聊天时提供便利。
您可以通过将用户的 ID 传递给 meeting.chat.getMessagesByUser() 方法来获取特定用户发送的消息。
// 查找名为 "Freddie" 的用户的 userId。
const { userId } = meeting.participants.joined
.toArray()
.find((p) => p.name === "Freddie");
const messages = meeting.chat.getMessagesByUser(userId);meeting.chat 对象公开了其他一些方法,以便在处理聊天时提供便利。
您可以通过将用户的 ID 传递给 meeting.chat.getMessagesByUser() 方法来获取特定用户发送的消息。
// 查找名为 "Freddie" 的用户的 userId。
const { userId } = meeting.participants.joined
.toArray()
.find((p) => p.name === "Freddie");
const messages = meeting.chat.getMessagesByUser(userId);meeting.chat 对象公开了其他一些方法,以便在处理聊天时提供便利。
您可以通过将用户的 ID 传递给 meeting.chat.getMessagesByUser() 方法来获取特定用户发送的消息。
// 查找名为 "Freddie" 的用户的 userId。
const { userId } = meeting.participants.joined
.toArray()
.find((p) => p.name === "Freddie");
const messages = meeting.chat.getMessagesByUser(userId);您还可以使用 meeting.chat.getMessagesByType() 方法获取特定类型的消息。例如,您可以使用以下代码片段获取聊天中存在的所有图片消息:
const imageMessages = meeting.chat.getMessagesByType("image");您还可以使用 meeting.chat.getMessagesByType() 方法获取特定类型的消息。例如,您可以使用以下代码片段获取聊天中存在的所有图片消息:
const imageMessages = meeting.chat.getMessagesByType("image");您还可以使用 meeting.chat.getMessagesByType() 方法获取特定类型的消息。例如,您可以使用以下代码片段获取聊天中存在的所有图片消息:
const imageMessages = meeting.chat.getMessagesByType("image");您可以将多条消息置顶到聊天中。置顶消息时,消息对象将具有属性 pinned: true,您可以通过该属性识别消息是否已被置顶。
要置顶消息:
// 置顶聊天中的第一条消息(可以是文本、图片或文件)。
const { id } = meeting.chat.messages[0];
await meeting.chat.pin(id);置顶消息后,它将被添加到 meeting.chat.pinned 中。
const { id } = meeting.chat.messages[0];
await meeting.chat.pin(id);
console.log(meeting.chat.pinned);
console.log(meeting.chat.pinned.length > 0); // 应为 true您还可以使用 meeting.chat.unpin() 方法取消置顶已置顶的消息。
// 取消置顶第一条已置顶的消息。
const { id } = meeting.chat.pinned[0];
await meeting.chat.unpin(id);您可以监听事件以了解消息何时被置顶或取消置顶。
meeting.chat.on("pinMessage", ({ message }) => {
console.log("A message was pinned", JSON.stringify(message));
});
meeting.chat.on("unpinMessage", ({ message }) => {
console.log("A message was unpinned", JSON.stringify(message));
});您可以将多条消息置顶到聊天中。置顶消息时,消息对象将具有属性 pinned: true,您可以通过该属性识别消息是否已被置顶。
要置顶消息:
// 置顶聊天中的第一条消息(可以是文本、图片或文件)。
const { id } = meeting.chat.messages[0];
await meeting.chat.pin(id);置顶消息后,它将被添加到 meeting.chat.pinned 中。
const { id } = meeting.chat.messages[0];
await meeting.chat.pin(id);
console.log(meeting.chat.pinned);
console.log(meeting.chat.pinned.length > 0); // 应为 true您还可以使用 meeting.chat.unpin() 方法取消置顶已置顶的消息。
// 取消置顶第一条已置顶的消息。
const { id } = meeting.chat.pinned[0];
await meeting.chat.unpin(id);您可以监听事件以了解消息何时被置顶或取消置顶。
meeting.chat.on("pinMessage", ({ message }) => {
console.log("A message was pinned", JSON.stringify(message));
});
meeting.chat.on("unpinMessage", ({ message }) => {
console.log("A message was unpinned", JSON.stringify(message));
});您可以将多条消息置顶到聊天中。置顶消息时,消息对象将具有属性 pinned: true,您可以通过该属性识别消息是否已被置顶。
要置顶消息:
// 置顶聊天中的第一条消息(可以是文本、图片或文件)。
const { id } = meeting.chat.messages[0];
await meeting.chat.pin(id);置顶消息后,它将被添加到 meeting.chat.pinned 中。
const { id } = meeting.chat.messages[0];
await meeting.chat.pin(id);
console.log(meeting.chat.pinned);
console.log(meeting.chat.pinned.length > 0); // 应为 true您还可以使用 meeting.chat.unpin() 方法取消置顶已置顶的消息。
// 取消置顶第一条已置顶的消息。
const { id } = meeting.chat.pinned[0];
await meeting.chat.unpin(id);您可以监听事件以了解消息何时被置顶或取消置顶。
meeting.chat.on("pinMessage", ({ message }) => {
console.log("A message was pinned", JSON.stringify(message));
});
meeting.chat.on("unpinMessage", ({ message }) => {
console.log("A message was unpinned", JSON.stringify(message));
});meeting.chat 命名空间公开了一个名为 deleteMessage() 的方法。它接受类型为 string 的参数 messageId。
const messageId = "...";
await meeting.chat.deleteMessage(messageId);meeting.chat 命名空间公开了一个名为 deleteMessage() 的方法。它接受类型为 string 的参数 messageId。
const messageId = "...";
await meeting.chat.deleteMessage(messageId);meeting.chat 命名空间公开了一个名为 deleteMessage() 的方法。它接受类型为 string 的参数 messageId。
const messageId = "...";
await meeting.chat.deleteMessage(messageId);您可以通过以下方式以编程方式检索 RealtimeKit 会话的所有聊天消息:
- 使用 Chat Replay API
- 为
meeting.chatSynced事件设置 Webhook
要获取聊天下载 URL,请向 Chat Replay API 端点 发起 HTTP GET 请求。该 API 返回:
{
"success": true,
"data": {
"chat_download_url": "string",
"chat_download_url_expiry": "string"
}
}chat_download_url- 允许您从 AWS S3 下载 CSV 格式的会话完整聊天转储的 URLchat_download_url_expiry-chat_download_url的过期时间戳。如果该 URL 过期,请再次调用此端点以获取新的下载 URL
有关 Chat Replay API 端点的详细信息,请参阅 Realtime Kit API 文档。
您可以通过向在上一步中获取的 chat_download_url 发起 HTTP GET 请求,来下载 CSV 格式的聊天转储文件。
从 HTTP URL 下载文件的过程因您是在客户端还是在服务端下载而有所不同。
要在客户端下载:
- 向
chat_download_url发起GET请求 - 将响应转换为 Blob
- 创建一个带有
download属性的隐式<a>HTML元素,并将 Blob 添加到其href中 - 以编程方式点击
<a>元素,以便浏览器自动开始下载,然后移除该<a>元素
要在服务器端使用 Node.js 流进行下载:
- 为本地文件创建可写流
- 向
chat_download_url发起GET请求 - 使用
res.body获取可读流,并将其管道传输到第一步中创建的可写流
CSV 文件包含所有聊天消息以及参与者信息和元数据。它包含以下列标题:
id- 唯一的聊天消息 IDparticipantId- 发送消息的参与者的 IDsessionId- 发送聊天消息的会话 IDmeetingId- 此会话所属会议的 IDdisplayName- 发送此消息的参与者的显示名称pinned- 指示当前消息是否被置顶的布尔值isEdited- 指示当前消息是否被编辑的布尔值payloadType- 一个指示聊天消息中发送的有效负载类型的枚举(ENUM)。它可以是TEXT_MESSAGE、IMAGE_MESSAGE、FILE_MESSAGE之一payload- 聊天消息中发送的实际有效负载createdAt- 发送此聊天消息的时间戳