From f86e7f83a2134538ddebebfab1322170f1fe862a Mon Sep 17 00:00:00 2001 From: Shigma Date: Sat, 9 Sep 2023 23:52:18 +0800 Subject: [PATCH] feat(satori): implement pagniation api --- adapters/discord/src/bot.ts | 33 ++++++++++--------- adapters/discord/src/types/guild-member.ts | 6 ++-- adapters/discord/src/types/guild.ts | 8 +++-- adapters/discord/src/utils.ts | 4 +++ adapters/kook/src/bot.ts | 10 +++--- adapters/kook/src/utils.ts | 2 ++ adapters/line/src/bot.ts | 38 ++++++++-------------- adapters/matrix/src/bot.ts | 20 +++++------- adapters/onebot/src/bot/base.ts | 2 +- adapters/onebot/src/bot/index.ts | 4 +-- adapters/onebot/src/bot/qqguild.ts | 8 ++--- adapters/onebot/src/utils.ts | 8 +++++ adapters/qqguild/src/bot.ts | 3 +- adapters/qqguild/src/utils.ts | 2 ++ adapters/slack/src/bot.ts | 2 +- adapters/slack/src/utils.ts | 15 +++++---- adapters/telegram/src/bot.ts | 10 ------ 17 files changed, 87 insertions(+), 88 deletions(-) diff --git a/adapters/discord/src/bot.ts b/adapters/discord/src/bot.ts index bc4950ce..d6afa50a 100644 --- a/adapters/discord/src/bot.ts +++ b/adapters/discord/src/bot.ts @@ -92,8 +92,9 @@ export class DiscordBot extends Bot { } async getMessageList(channelId: string, before?: string) { - const data = await this.internal.getChannelMessages(channelId, { before, limit: 100 }) - return { data: await Promise.all(data.reverse().map(data => decodeMessage(this, data, {}, false))) } + const messages = await this.internal.getChannelMessages(channelId, { before, limit: 100 }) + const data = await Promise.all(messages.reverse().map(data => decodeMessage(this, data, {}, false))) + return { data, next: data[0]?.messageId } } async getUser(userId: string) { @@ -101,9 +102,10 @@ export class DiscordBot extends Bot { return decodeUser(data) } - async getGuildMemberList(guildId: string) { - const data = await this.internal.listGuildMembers(guildId) - return { data: data.map(v => decodeUser(v.user)) } + async getGuildMemberList(guildId: string, after?: string) { + const users = await this.internal.listGuildMembers(guildId, { after, limit: 1000 }) + const data = users.map(v => decodeUser(v.user)) + return { data, next: data[data.length - 1]?.userId } } async getChannel(channelId: string) { @@ -128,14 +130,15 @@ export class DiscordBot extends Bot { return decodeGuild(data) } - async getGuildList() { - const data = await this.internal.getCurrentUserGuilds() - return data.map(decodeGuild) + async getGuildList(after?: string) { + const guilds = await this.internal.getCurrentUserGuilds({ after, limit: 200 }) + const data = guilds.map(decodeGuild) + return { data, next: data[data.length - 1]?.id } } async getChannelList(guildId: string) { - const data = await this.internal.getGuildChannels(guildId) - return data.map(decodeChannel) + const channels = await this.internal.getGuildChannels(guildId) + return { data: channels.map(decodeChannel) } } createReaction(channelId: string, messageId: string, emoji: string) { @@ -158,9 +161,9 @@ export class DiscordBot extends Bot { } } - async getReactions(channelId: string, messageId: string, emoji: string) { - const data = await this.internal.getReactions(channelId, messageId, emoji) - return data.map(decodeUser) + async getReactionList(channelId: string, messageId: string, emoji: string, after?: string) { + const data = await this.internal.getReactions(channelId, messageId, emoji, { after, limit: 100 }) + return { data: data.map(decodeUser), next: data[data.length - 1]?.id } } setGuildMemberRole(guildId: string, userId: string, roleId: string) { @@ -171,9 +174,9 @@ export class DiscordBot extends Bot { return this.internal.removeGuildMemberRole(guildId, userId, roleId) } - async getGuildRoles(guildId: string) { + async getGuildRoleList(guildId: string) { const data = await this.internal.getGuildRoles(guildId) - return data.map(decodeRole) + return { data: data.map(decodeRole) } } async createGuildRole(guildId: string, data: Partial) { diff --git a/adapters/discord/src/types/guild-member.ts b/adapters/discord/src/types/guild-member.ts index 841f4165..9ec9f0e1 100644 --- a/adapters/discord/src/types/guild-member.ts +++ b/adapters/discord/src/types/guild-member.ts @@ -31,9 +31,9 @@ export namespace GuildMember { /** https://discord.com/developers/docs/resources/guild#list-guild-members-query-string-params */ export interface List { /** max number of members to return (1-1000) */ - limit: integer + limit?: integer /** the highest user id in the previous page */ - after: snowflake + after?: snowflake } /** https://discord.com/developers/docs/resources/guild#search-guild-members-query-string-params */ @@ -41,7 +41,7 @@ export namespace GuildMember { /** Query string to match username(s) and nickname(s) against. */ query: string /** max number of members to return (1-1000) */ - limit: integer + limit?: integer } /** https://discord.com/developers/docs/resources/guild#add-guild-member-json-params */ diff --git a/adapters/discord/src/types/guild.ts b/adapters/discord/src/types/guild.ts index e0f6a9b3..80e6fd9a 100644 --- a/adapters/discord/src/types/guild.ts +++ b/adapters/discord/src/types/guild.ts @@ -99,11 +99,13 @@ export namespace Guild { /** https://discord.com/developers/docs/resources/user#get-current-user-guilds-query-string-params */ export interface List { /** get guilds before this guild ID */ - before: snowflake + before?: snowflake /** get guilds after this guild ID */ - after: snowflake + after?: snowflake /** max number of guilds to return (1-200) */ - limit: integer + limit?: integer + /** include approximate member and presence counts in response */ + with_counts?: boolean } /** https://discord.com/developers/docs/resources/guild#create-guild-json-params */ diff --git a/adapters/discord/src/utils.ts b/adapters/discord/src/utils.ts index 1b6ac52a..bf1e0300 100644 --- a/adapters/discord/src/utils.ts +++ b/adapters/discord/src/utils.ts @@ -19,11 +19,15 @@ export const decodeUser = (user: Discord.User): Universal.User => ({ }) export const decodeGuild = (data: Discord.Guild): Universal.Guild => ({ + id: data.id, + name: data.name, guildId: data.id, guildName: data.name, }) export const decodeChannel = (data: Discord.Channel): Universal.Channel => ({ + id: data.id, + name: data.name, channelId: data.id, channelName: data.name, }) diff --git a/adapters/kook/src/bot.ts b/adapters/kook/src/bot.ts index a87a9b0e..12ed4adf 100644 --- a/adapters/kook/src/bot.ts +++ b/adapters/kook/src/bot.ts @@ -89,7 +89,7 @@ export class KookBot extends Bot { async getGuildList() { const { items } = await this.request('GET', '/guild/list') - return items.map(adaptGroup) + return { data: items.map(adaptGroup) } } async getGuildMemberList(guild_id: string) { @@ -130,14 +130,14 @@ export class KookBot extends Bot { } } - async getReactions(channelId: string, messageId: string, emoji: string): Promise { + async getReactionList(channelId: string, messageId: string, emoji: string) { let users: Kook.User[] if (isDirectChannel(channelId)) { users = await this.internal.getDirectMessageReactionList({ msg_id: messageId, emoji }) } else { users = await this.internal.getMessageReactionList({ msg_id: messageId, emoji }) } - return users.map(adaptUser) + return { data: users.map(adaptUser) } } async setGuildMemberRole(guildId: string, userId: string, roleId: string) { @@ -148,9 +148,9 @@ export class KookBot extends Bot { await this.internal.revokeGuildRole({ guild_id: guildId, user_id: userId, role_id: +roleId }) } - async getGuildRoles(guildId: string): Promise { + async getGuildRoles(guildId: string) { const { items } = await this.internal.getGuildRoleList({ guild_id: guildId }) - return items.map(decodeRole) + return { data: items.map(decodeRole) } } async createGuildRole(guildId: string, data: Partial) { diff --git a/adapters/kook/src/utils.ts b/adapters/kook/src/utils.ts index fa553838..f7ec95ba 100644 --- a/adapters/kook/src/utils.ts +++ b/adapters/kook/src/utils.ts @@ -4,6 +4,8 @@ import * as Kook from './types' export * from './types' export const adaptGroup = (data: Kook.Guild): Universal.Guild => ({ + id: data.id, + name: data.name, guildId: data.id, guildName: data.name, }) diff --git a/adapters/line/src/bot.ts b/adapters/line/src/bot.ts index e8134ea5..317a6685 100644 --- a/adapters/line/src/bot.ts +++ b/adapters/line/src/bot.ts @@ -52,48 +52,36 @@ export class LineBot extends Bot { } } - async getFriendList() { - let userIds: string[] = [] - let start: string - do { - const res = await this.internal.getFollowers({ - start, - limit: 1000, - }) - userIds = userIds.concat(res.userIds) - start = res.next - } while (start) - - return userIds.map(v => ({ userId: v })) + async getFriendList(start?: string) { + const { userIds, next } = await this.internal.getFollowers({ + start, + limit: 1000, + }) + return { data: userIds.map(v => ({ userId: v })), next } } async getGuild(guildId: string) { const res = await this.internal.getGroupSummary(guildId) return { + id: res.groupId, + name: res.groupName, guildId: res.groupId, guildName: res.groupName, } } - async getGuildMemberList(guildId: string) { - let userIds: string[] = [] - let start: string - do { - const res = await this.internal.getGroupMembersIds(guildId, { start }) - userIds = userIds.concat(res.memberIds) - start = res.next - } while (start) - - return { data: userIds.map(v => ({ userId: v })) } + async getGuildMemberList(guildId: string, start?: string) { + const { memberIds, next } = await this.internal.getGroupMembersIds(guildId, { start }) + return { data: memberIds.map(v => ({ userId: v })), next } } async getGuildMember(guildId: string, userId: string) { const res = await this.internal.getGroupMemberProfile(guildId, userId) - return ({ + return { userId: res.userId, nickname: res.displayName, avatar: res.pictureUrl, - }) + } } } diff --git a/adapters/matrix/src/bot.ts b/adapters/matrix/src/bot.ts index 7f832910..0bc3738b 100644 --- a/adapters/matrix/src/bot.ts +++ b/adapters/matrix/src/bot.ts @@ -82,29 +82,25 @@ export class MatrixBot extends Bot { } } - async getFriendList() { - return [] - } - - async deleteFriend() { } - async getGuild(guildId: string) { - const { channelName } = await this.getChannel(guildId) - return { guildId, guildName: channelName } + const { id, name } = await this.getChannel(guildId) + return { id, name, guildId, guildName: name } } async getChannel(channelId: string) { const events = await this.internal.getState(channelId) - const channelName = (events.find(event => event.type === 'm.room.name')?.content as Matrix.M_ROOM_NAME)?.name - return { channelId, channelName } + const name = (events.find(event => event.type === 'm.room.name')?.content as Matrix.M_ROOM_NAME)?.name + return { id: channelId, name, channelId, channelName: name } } async getGuildList() { - return await Promise.all(this.rooms.map(roomId => this.getGuild(roomId))) + const data = await Promise.all(this.rooms.map(roomId => this.getGuild(roomId))) + return { data } } async getChannelList(guildId: string) { - return await Promise.all(this.rooms.map(roomId => this.getChannel(roomId))) + const data = await Promise.all(this.rooms.map(roomId => this.getChannel(roomId))) + return { data } } async getGuildMemberList(guildId: string) { diff --git a/adapters/onebot/src/bot/base.ts b/adapters/onebot/src/bot/base.ts index 43ab5e53..cc6180c7 100644 --- a/adapters/onebot/src/bot/base.ts +++ b/adapters/onebot/src/bot/base.ts @@ -38,7 +38,7 @@ export class BaseBot extends Bot { async getFriendList() { const data = await this.internal.getFriendList() - return data.map(OneBot.adaptUser) + return { data: data.map(OneBot.adaptUser) } } async handleFriendRequest(messageId: string, approve: boolean, comment?: string) { diff --git a/adapters/onebot/src/bot/index.ts b/adapters/onebot/src/bot/index.ts index 8c44a4f0..ab06fb12 100644 --- a/adapters/onebot/src/bot/index.ts +++ b/adapters/onebot/src/bot/index.ts @@ -67,11 +67,11 @@ export class OneBotBot extends Ba async getGuildList() { const data = await this.internal.getGroupList() - return data.map(OneBot.adaptGuild) + return { data: data.map(OneBot.adaptGuild) } } async getChannelList(guildId: string) { - return [await this.getChannel(guildId)] + return { data: [await this.getChannel(guildId)] } } async getGuildMember(guildId: string, userId: string) { diff --git a/adapters/onebot/src/bot/qqguild.ts b/adapters/onebot/src/bot/qqguild.ts index 2cadc301..7214f3da 100644 --- a/adapters/onebot/src/bot/qqguild.ts +++ b/adapters/onebot/src/bot/qqguild.ts @@ -45,13 +45,13 @@ export class QQGuildBot extends BaseBot { } async getChannel(channelId: string, guildId?: string) { - const channels = await this.getChannelList(guildId) - return channels.find((channel) => channel.channelId === channelId) + const { data } = await this.getChannelList(guildId) + return data.find((channel) => channel.id === channelId) } async getChannelList(guildId: string) { const data = await this.internal.getGuildChannelList(guildId, false) - return (data || []).map(OneBot.adaptChannel) + return { data: (data || []).map(OneBot.adaptChannel) } } async getGuild(guildId: string) { @@ -61,7 +61,7 @@ export class QQGuildBot extends BaseBot { async getGuildList() { const data = await this.internal.getGuildList() - return data.map(OneBot.adaptGuild) + return { data: data.map(OneBot.adaptGuild) } } async getGuildMember(guildId: string, userId: string) { diff --git a/adapters/onebot/src/utils.ts b/adapters/onebot/src/utils.ts index d63b40eb..e68ea9e6 100644 --- a/adapters/onebot/src/utils.ts +++ b/adapters/onebot/src/utils.ts @@ -104,12 +104,16 @@ export const adaptGuild = (info: OneBot.GroupInfo | OneBot.GuildBaseInfo): Unive if ((info as OneBot.GuildBaseInfo).guild_id) { const guild = info as OneBot.GuildBaseInfo return { + id: guild.guild_id, + name: guild.guild_name, guildId: guild.guild_id, guildName: guild.guild_name, } } else { const group = info as OneBot.GroupInfo return { + id: group.group_id.toString(), + name: group.group_name, guildId: group.group_id.toString(), guildName: group.group_name, } @@ -120,12 +124,16 @@ export const adaptChannel = (info: OneBot.GroupInfo | OneBot.ChannelInfo): Unive if ((info as OneBot.ChannelInfo).channel_id) { const channel = info as OneBot.ChannelInfo return { + id: channel.channel_id, + name: channel.channel_name, channelId: channel.channel_id.toString(), channelName: channel.channel_name, } } else { const group = info as OneBot.GroupInfo return { + id: group.group_id.toString(), + name: group.group_name, channelId: group.group_id.toString(), channelName: group.group_name, } diff --git a/adapters/qqguild/src/bot.ts b/adapters/qqguild/src/bot.ts index b8829b2b..e78120c8 100644 --- a/adapters/qqguild/src/bot.ts +++ b/adapters/qqguild/src/bot.ts @@ -24,7 +24,8 @@ export class QQGuildBot extends Bot { } async getGuildList() { - return this.internal.guilds.then(guilds => guilds.map(adaptGuild)) + const guilds = await this.internal.guilds + return { data: guilds.map(adaptGuild) } } adaptMessage(msg: QQGuild.Message) { diff --git a/adapters/qqguild/src/utils.ts b/adapters/qqguild/src/utils.ts index ebb60875..2e5bc917 100644 --- a/adapters/qqguild/src/utils.ts +++ b/adapters/qqguild/src/utils.ts @@ -2,6 +2,8 @@ import { Universal } from '@satorijs/satori' import * as QQGuild from '@qq-guild-sdk/core' export const adaptGuild = (guild: QQGuild.Guild): Universal.Guild => ({ + id: guild.id, + name: guild.name, guildId: guild.id, guildName: guild.name, }) diff --git a/adapters/slack/src/bot.ts b/adapters/slack/src/bot.ts index b613a095..aa0b20be 100644 --- a/adapters/slack/src/bot.ts +++ b/adapters/slack/src/bot.ts @@ -107,7 +107,7 @@ export class SlackBot extends Bot('POST', '/conversations.list', { team_id: guildId, }) - return channels.map(adaptChannel) + return { data: channels.map(adaptChannel) } } async getGuild(guildId: string) { diff --git a/adapters/slack/src/utils.ts b/adapters/slack/src/utils.ts index 68138fb8..02cfebb0 100644 --- a/adapters/slack/src/utils.ts +++ b/adapters/slack/src/utils.ts @@ -1,5 +1,6 @@ import { Element, h, Session, Universal } from '@satorijs/satori' import { SlackBot } from './bot' +// eslint-disable-next-line max-len import { EnvelopedEvent, GenericMessageEvent, MessageChangedEvent, MessageDeletedEvent, ReactionAddedEvent, ReactionRemovedEvent, RichText, RichTextBlock, SlackEvent, SlackUser } from './types/events' import { KnownBlock } from '@slack/types' import { File, SlackChannel, SlackTeam } from './types' @@ -224,14 +225,16 @@ export function adaptUser(data: SlackUser): Universal.User { } } -export function adaptChannel(data: SlackChannel): Universal.Channel { - return { - channelId: data.id, - channelName: data.name, - } -} +export const adaptChannel = (data: SlackChannel): Universal.Channel => ({ + id: data.id, + name: data.name, + channelId: data.id, + channelName: data.name, +}) export const adaptGuild = (data: SlackTeam): Universal.Guild => ({ + id: data.id, + name: data.name, guildId: data.id, guildName: data.name, }) diff --git a/adapters/telegram/src/bot.ts b/adapters/telegram/src/bot.ts index afa4141e..1c85c9e9 100644 --- a/adapters/telegram/src/bot.ts +++ b/adapters/telegram/src/bot.ts @@ -167,10 +167,6 @@ export class TelegramBot exte adaptAuthorMeta(session, message.from) } - async getMessage() { - return null - } - async deleteMessage(chat_id: string, message_id: string | number) { message_id = +message_id await this.internal.deleteMessage({ chat_id, message_id }) @@ -190,8 +186,6 @@ export class TelegramBot exte static adaptGroup(data: Telegram.Chat): Universal.Guild { data['guildId'] = data.id + '' data['guildName'] = data.title - delete data.id - delete data.title return data as any } @@ -200,10 +194,6 @@ export class TelegramBot exte return TelegramBot.adaptGroup(data) } - async getGuildList() { - return [] - } - async getGuildMember(chat_id: string, user_id: string | number) { user_id = +user_id if (Number.isNaN(user_id)) return null