Table of Contents

消息相关接口

预声明变量

readonly KookSocketClient _socketClient = null;
readonly KookRestClient _restClient = null;
readonly KookPipeClient _pipeClient = null;

SocketTextChannel socketTextChannel = null;

RestTextChannel restTextChannel = null;

ITextChannel textChannel = null;
IUserMessage userMessage = null;

获取频道聊天消息列表

GET /api/v3/message/list

IMessage referenceMessage = null; // 获取消息列表所根据的参考消息位置的
Guid referenceMessageId = default; // 获取消息列表所根据的参考消息位置的 ID
Direction direction = default; // 获取消息列表的方向
int limit = default; // 获取消息列表的数量

// 要缓存文字频道聊天消息,请设置 MessageCacheSize 的值
// 缓存获取文字频道的聊天消息列表
IReadOnlyCollection<SocketMessage> cachedMessages = socketTextChannel.CachedMessages;
IReadOnlyCollection<SocketMessage> conditionalCachedMessages = socketTextChannel.GetCachedMessages(referenceMessage, direction, limit);
IReadOnlyCollection<SocketMessage> conditionalCachedMessagesById = socketTextChannel.GetCachedMessages(referenceMessageId, direction, limit);

// API 请求
IAsyncEnumerable<IReadOnlyCollection<IMessage>> pagedMessages = socketTextChannel.GetMessagesAsync(referenceMessage, direction, limit);
IAsyncEnumerable<IReadOnlyCollection<IMessage>> pagedMessagesById = socketTextChannel.GetMessagesAsync(referenceMessageId, direction, limit);
IAsyncEnumerable<IReadOnlyCollection<RestMessage>> pagedRestMessages = restTextChannel.GetMessagesAsync(referenceMessage, direction, limit);
IAsyncEnumerable<IReadOnlyCollection<RestMessage>> pagedRestMessagesById = restTextChannel.GetMessagesAsync(referenceMessageId, direction, limit);

// 在 ITextChannel 上进行调用
IAsyncEnumerable<IReadOnlyCollection<IMessage>> pagedMessages = textChannel.GetMessagesAsync(referenceMessage, direction, limit);
IAsyncEnumerable<IReadOnlyCollection<IMessage>> pagedMessagesById = textChannel.GetMessagesAsync(referenceMessageId, direction, limit);

获取频道聊天消息详情

GET /api/v3/message/view

Guid messageId = default; // 要获取详情的消息 ID

// 要缓存文字频道聊天消息,请设置 MessageCacheSize 的值
// 缓存获取文字频道的聊天消息详情
SocketMessage cachedMessage = socketTextChannel.GetCachedMessage(messageId);

// 调用异步方法获取消息详情,在缓存中包含指定的消息对象的情况下,直接返回缓存的消息对象,否则会发起 API 请求获取消息对象
IMessage messageAsync = await socketTextChannel.GetMessageAsync(messageId);

// API 请求
IMessage message = await restTextChannel.GetMessageAsync(messageId);

// 在 ITextChannel 上进行调用
IMessage message = await textChannel.GetMessageAsync(messageId);

发送频道聊天消息

POST /api/v3/message/create

string text = null; // 要发送的文字消息
IQuote quote = null; // 被引用的消息
IUser ephemeralUser = null; // 瞬态消息的可见用户
string filePath = null; // 要发送的文件的路径
string fileName = null; // 要发送的文件的名称
AttachmentType fileType = default; // 要发送的文件的类型
Stream stream = null; // 要发送的文件的流
FileAttachment attachment = default; // 要发送的文件的附件
ICard card = null; // 要发送的卡片
IEnumerable<ICard> cards = null; // 要发送的卡片列表
int templateId = default; // 要发送的模板消息的模板 ID
T parameters = default; // 要发送的模板消息的参数
JsonSerializerOptions jsonSerializerOptions = null; // 要发送的模板消息的参数的序列化选项

// API 请求,发送文本消息
Cacheable<IUserMessage, Guid> textMessage = await textChannel.SendTextAsync(text, quote, ephemeralUser);
Cacheable<IUserMessage, Guid> textMessageFromTemplate = await textChannel.SendTextAsync(templateId, parameters, quote, ephemeralUser, jsonSerializerOptions);
// API 请求,发送文件消息
Cacheable<IUserMessage, Guid> fileMessageFromPath = await textChannel.SendFileAsync(filePath, fileName, fileType, quote, ephemeralUser);
Cacheable<IUserMessage, Guid> fileMessageFromStream = await textChannel.SendFileAsync(stream, fileName, fileType, quote, ephemeralUser);
Cacheable<IUserMessage, Guid> fileMessageFromAttachment = await textChannel.SendFileAsync(attachment, quote, ephemeralUser);
// API 请求,发送单卡片消息
Cacheable<IUserMessage, Guid> cardMessage = await textChannel.SendCardAsync(card, quote, ephemeralUser);
// API 请求,发送多卡片消息
Cacheable<IUserMessage, Guid> cardsMessage = await textChannel.SendCardsAsync(cards, quote, ephemeralUser);
Cacheable<IUserMessage, Guid> cardsMessageFromTemplate = await textChannel.SendCardsAsync(templateId, parameters, quote, ephemeralUser, jsonSerializerOptions);

更新频道聊天消息

POST /api/v3/message/update

string content = null; // 要更新的消息的文本
IEnumerable<ICard> cards = null; // 要更新的消息的卡片
IQuote quote = null; // 要更新的消息的引用
IUser ephemeralUser = null; // 要更新的瞬态消息的可见用户
int templateId = default; // 要发送的模板消息的模板 ID
T parameters = default; // 要发送的模板消息的参数
JsonSerializerOptions jsonSerializerOptions = null; // 要发送的模板消息的参数的序列化选项

// API 请求
// 在更新模板消息时,指定泛型参数 T 可以提高序列化性能,省略泛型参数 T 时,序列化器将以序列化 object 的方式进行序列化
await userMessage.ModifyAsync<T>(x =>
{
    x.Content = content;
    x.Cards = cards;
    x.Quote = quote; // 要清除引用,请设置为 Quote.Empty
    x.EphemeralUser = ephemeralUser;
    x.TemplateId = templateId;
    x.Parameters = parameters;
    x.JsonSerializerOptions = jsonSerializerOptions;
});

删除频道聊天消息

POST /api/v3/message/delete

// API 请求
await userMessage.DeleteAsync();

获取频道消息某回应的用户列表

GET /api/v3/message/reaction-list

IEmote emoji = null; // 要获取用户列表的回应的表情

// 缓存获取消息的回应概要,但不包含用户列表
IReadOnlyDictionary<IEmote,ReactionMetadata> cachedReactions = socketUserMessage.Reactions;

// API 请求
IReadOnlyCollection<IUser> reactionUsers = await userMessage.GetReactionUsersAsync(emoji);

给某个消息添加回应

POST /api/v3/message/add-reaction

有关如何构造 Emoji,请参考 表情符号

IEmote emoji = null; // 要添加的回应的表情
IEnumerable<IEmote> emojis = null; // 要添加的回应的表情列表

// API 请求
await userMessage.AddReactionAsync(emoji);
await userMessage.AddReactionsAsync(emojis);

删除消息的某个回应

POST /api/v3/message/delete-reaction

IEmote emoji = null;
IEnumerable<IEmote> emojis = null;
IUser user = null;

// API 请求
await userMessage.RemoveReactionAsync(emoji, user);
await userMessage.RemoveReactionsAsync(user, emojis);

发送管道消息

POST /api/v3/message/send-pipemsg

string content = null; // 要发送到管道的消息文本
T parameters = default; // 要发送到管道的模板消息的参数
JsonSerializerOptions jsonSerializerOptions = null; // 要发送到管道的模板消息的参数的序列化选项

// API 请求,发送文本内容
await _pipeClient.SendContentAsync(content);
// API 请求,发送模板消息的参数
await _pipeClient.SendTemplateAsync(parameters, jsonSerializerOptions);