From b6294d783575ac80e2d45313a6290ce776bdba62 Mon Sep 17 00:00:00 2001 From: lts20050703 <87189679+lts20050703@users.noreply.github.com> Date: Fri, 26 Nov 2021 15:29:11 +0700 Subject: [PATCH 001/104] UNIT TEST editBotNickname --- tests/members/editBotNickname.ts | 8 ++++++++ tests/mod.ts | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 tests/members/editBotNickname.ts diff --git a/tests/members/editBotNickname.ts b/tests/members/editBotNickname.ts new file mode 100644 index 000000000..e0b7de41f --- /dev/null +++ b/tests/members/editBotNickname.ts @@ -0,0 +1,8 @@ +import { assertEquals } from "../deps.ts"; +import { bot, guild } from "../mod.ts"; + +Deno.test("editBotNickname", function () { + const nick = "lts20050703"; + const nickname = bot.helpers.editBotNickname(guild.id, { nick }); + assertEquals(nickname, nick); +}); diff --git a/tests/mod.ts b/tests/mod.ts index 843443b94..1a699dc35 100644 --- a/tests/mod.ts +++ b/tests/mod.ts @@ -564,11 +564,14 @@ Deno.test({ ...sanitizeMode, }); +//channels import "./channels/connectToVoice.ts"; import "./channels/getChannel.ts"; import "./channels/getChannels.ts"; import "./channels/stageInstances.ts"; import "./channels/threads.ts"; + +//emoji import "./emoji/createEmoji.ts"; import "./emoji/deleteEmojiWithReason.ts"; import "./emoji/deleteEmojiWithoutReason.ts"; @@ -576,15 +579,22 @@ import "./emoji/editEmoji.ts"; import "./emoji/emojiUrl.ts"; import "./emoji/getEmoji.ts"; import "./emoji/getMultipleEmojis.ts"; + +//invite import "./invite/createInvite.ts"; import "./invite/deleteInvite.ts"; import "./invite/getChannelInvites.ts"; import "./invite/getInvite.ts"; import "./invite/getInvites.ts"; + +//members import "./members/avatarlUrl.ts"; import "./members/ban.ts"; +import "./members/editBotNickname.ts"; import "./members/getDmChannel.ts"; import "./members/getMember.ts"; + +//misc import "./misc/getApplicationInfo.ts"; import "./misc/getDiscoveryCategories.ts"; import "./misc/getUser.ts"; @@ -592,6 +602,8 @@ import "./misc/getVoiceRegions.ts"; import "./misc/snowflake.ts"; import "./misc/typing.ts"; import "./misc/validateDiscovery.ts"; + +//role import "./role/addRole.ts"; import "./role/createRoleWithoutReason.ts"; import "./role/createRoleWithReason.ts"; @@ -600,6 +612,8 @@ import "./role/deleteRoleWithReason.ts"; import "./role/editRole.ts"; import "./role/getAllRoles.ts"; import "./role/removeRole.ts"; + +//scheduledEvents import "./scheduledEvents/createExternalEventWithEndtime.ts"; import "./scheduledEvents/createExternalEventWithoutEndtime.ts"; import "./scheduledEvents/createStageEventWithEndtime.ts"; @@ -608,6 +622,8 @@ import "./scheduledEvents/createVoiceEventWithEndtime.ts"; import "./scheduledEvents/createVoiceEventWithoutEndtime.ts"; import "./scheduledEvents/deleteEvent.ts"; import "./scheduledEvents/editEvent.ts"; + +//webhooks import "./webhooks/deleteWebhook.ts"; import "./webhooks/deleteWebhookWithToken.ts"; import "./webhooks/sendWebhook.ts"; From df8e16dac15eecdbac064eab6f3169e66bed17ef Mon Sep 17 00:00:00 2001 From: lts20050703 <87189679+lts20050703@users.noreply.github.com> Date: Fri, 26 Nov 2021 15:37:23 +0700 Subject: [PATCH 002/104] await editBotNickname --- tests/members/editBotNickname.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/members/editBotNickname.ts b/tests/members/editBotNickname.ts index e0b7de41f..dded03378 100644 --- a/tests/members/editBotNickname.ts +++ b/tests/members/editBotNickname.ts @@ -1,8 +1,8 @@ import { assertEquals } from "../deps.ts"; import { bot, guild } from "../mod.ts"; -Deno.test("editBotNickname", function () { +Deno.test("editBotNickname", async function () { const nick = "lts20050703"; - const nickname = bot.helpers.editBotNickname(guild.id, { nick }); + const nickname = await bot.helpers.editBotNickname(guild.id, { nick }); assertEquals(nickname, nick); }); From 0b7fc2e7d22073fae38d549d547874ce2510c1bd Mon Sep 17 00:00:00 2001 From: lts20050703 <87189679+lts20050703@users.noreply.github.com> Date: Sat, 27 Nov 2021 22:21:57 +0700 Subject: [PATCH 003/104] UNIT TEST editBotStatus --- tests/misc/editBotStatus.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 tests/misc/editBotStatus.ts diff --git a/tests/misc/editBotStatus.ts b/tests/misc/editBotStatus.ts new file mode 100644 index 000000000..1b7236951 --- /dev/null +++ b/tests/misc/editBotStatus.ts @@ -0,0 +1,12 @@ +import { assertExists } from "../deps.ts"; +import { bot } from "../mod.ts"; +import { ActivityTypes } from "../../src/types/activity/activityTypes.ts"; +Deno.test("editBotStatus", function () { + bot.helpers.editBotStatus({ + status: "dnd", + activities: [{ name: "lts20050703", type: ActivityTypes.Game, createdAt: Date.now() }], + }); + bot.events.presenceUpdate = function (_bot, presense, _oldPresense) { + assertExists(presense); + }; +}); From 85057395cd7eeb619058d964db33b46a3a9b0a0d Mon Sep 17 00:00:00 2001 From: lts20050703 <87189679+lts20050703@users.noreply.github.com> Date: Sun, 28 Nov 2021 00:58:03 +0000 Subject: [PATCH 004/104] Update mod.ts --- tests/mod.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/mod.ts b/tests/mod.ts index 1a699dc35..51d9751c6 100644 --- a/tests/mod.ts +++ b/tests/mod.ts @@ -602,6 +602,7 @@ import "./misc/getVoiceRegions.ts"; import "./misc/snowflake.ts"; import "./misc/typing.ts"; import "./misc/validateDiscovery.ts"; +import "./misc/editBotStatus.ts" //role import "./role/addRole.ts"; From a62208335d4c16a0d66813443567a4c5d3f4c0f3 Mon Sep 17 00:00:00 2001 From: lts20050703 <87189679+lts20050703@users.noreply.github.com> Date: Sun, 28 Nov 2021 08:57:01 +0700 Subject: [PATCH 005/104] Close #1823 --- .github/workflows/pr_tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/pr_tests.yml b/.github/workflows/pr_tests.yml index bccd47892..e3fc55aef 100644 --- a/.github/workflows/pr_tests.yml +++ b/.github/workflows/pr_tests.yml @@ -13,6 +13,8 @@ jobs: deno-version: ${{ matrix.deno }} - name: Cache dependencies run: deno cache mod.ts + - name: Prepare configs file + run: cp configs.example.ts configs.ts - name: Run tests if requested by maintainers if: ${{ github.event.issue.pull_request && github.event.comment.body == 'run-tests' && (github.actor == 'Skillz4Killz' || github.actor == 'itohatweb') }} run: DISCORD_TOKEN=${{ env.DISCORD_TOKEN }} deno test --unstable --coverage=coverage -A tests/mod.ts From 1259bda5e0c514e709c062b7aa346bcd6ee68163 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Mon, 29 Nov 2021 14:19:12 +0000 Subject: [PATCH 006/104] fix: edit bot nickname name --- tests/members/editBotNickname.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/members/editBotNickname.ts b/tests/members/editBotNickname.ts index dded03378..7efd93edd 100644 --- a/tests/members/editBotNickname.ts +++ b/tests/members/editBotNickname.ts @@ -1,7 +1,7 @@ import { assertEquals } from "../deps.ts"; import { bot, guild } from "../mod.ts"; -Deno.test("editBotNickname", async function () { +Deno.test("[misc] edit a bot's nickname", async function () { const nick = "lts20050703"; const nickname = await bot.helpers.editBotNickname(guild.id, { nick }); assertEquals(nickname, nick); From 5907e4b4bca9b0007b0aeb6c5e2e1a22986b2925 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Mon, 29 Nov 2021 14:19:36 +0000 Subject: [PATCH 007/104] fix: add presence intent --- tests/mod.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/mod.ts b/tests/mod.ts index 51d9751c6..d4caa6778 100644 --- a/tests/mod.ts +++ b/tests/mod.ts @@ -59,6 +59,7 @@ export const bot = createBot({ "GuildMembers", "GuildScheduledEvents", "GuildVoiceStates", + "GuildPresences" ], cache: { isAsync: false, From 2440dc7872df6fcbe62f27e17efd3d76ad1754c1 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Mon, 29 Nov 2021 14:19:56 +0000 Subject: [PATCH 008/104] idk add logs it wont work --- tests/misc/editBotStatus.ts | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/tests/misc/editBotStatus.ts b/tests/misc/editBotStatus.ts index 1b7236951..c066fc033 100644 --- a/tests/misc/editBotStatus.ts +++ b/tests/misc/editBotStatus.ts @@ -1,12 +1,24 @@ import { assertExists } from "../deps.ts"; import { bot } from "../mod.ts"; import { ActivityTypes } from "../../src/types/activity/activityTypes.ts"; -Deno.test("editBotStatus", function () { +import { delayUntil } from "../utils.ts"; + +Deno.test("[misc] edit the bot's status", async function () { + bot.events.presenceUpdate = function (_bot, presense, _oldPresense) { + console.log('in pu') + console.log('in pu') + assertExists(presense); + }; + + bot.events.botUpdate = function (bot, user) { + console.log('in bu') + console.log('in bu') + } + bot.helpers.editBotStatus({ status: "dnd", activities: [{ name: "lts20050703", type: ActivityTypes.Game, createdAt: Date.now() }], }); - bot.events.presenceUpdate = function (_bot, presense, _oldPresense) { - assertExists(presense); - }; + + await delayUntil(10000, () => false) }); From fb18dfe5d10f5601d1ec30d9fb941784c163084f Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Mon, 29 Nov 2021 14:20:09 +0000 Subject: [PATCH 009/104] fix: camelize response to discord --- src/helpers/misc/editBotStatus.ts | 41 ++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/helpers/misc/editBotStatus.ts b/src/helpers/misc/editBotStatus.ts index c45edfc38..cd2bcb9f5 100644 --- a/src/helpers/misc/editBotStatus.ts +++ b/src/helpers/misc/editBotStatus.ts @@ -11,7 +11,46 @@ export function editBotStatus(bot: Bot, data: Omit ({ + name: activity.name, + type: activity.type, + url: activity.url, + created_at: activity.createdAt, + timestamps: activity.timestamps + ? { + start: activity.timestamps.start, + end: activity.timestamps.end, + } + : undefined, + applicationId: activity.applicationId?.toString(), + details: activity.details, + state: activity.state, + emoji: activity.emoji + ? { + name: activity.emoji.name, + id: activity.emoji.id?.toString(), + animated: activity.emoji.animated, + } + : undefined, + party: activity.party + ? { + id: activity.party.id?.toString(), + size: activity.party.size, + } + : undefined, + assets: activity.assets + ? { + large_image: activity.assets.largeImage, + large_text: activity.assets.largeText, + small_image: activity.assets.smallImage, + small_text: activity.assets.smallText, + } + : undefined, + secrets: activity.secrets, + instance: activity.instance, + flags: activity.flags, + buttons: activity.buttons, + })), status: data.status, }, }); From 7fce3b57a7052a24debfa0cdf9c7769281558c22 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Mon, 29 Nov 2021 09:26:27 -0500 Subject: [PATCH 010/104] Update pr_tests.yml --- .github/workflows/pr_tests.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/pr_tests.yml b/.github/workflows/pr_tests.yml index e3fc55aef..505b8050d 100644 --- a/.github/workflows/pr_tests.yml +++ b/.github/workflows/pr_tests.yml @@ -8,6 +8,7 @@ jobs: deno: ["v1.x"] steps: - uses: actions/checkout@v2 + - run: git submodule update --init --recursive - uses: denoland/setup-deno@main with: deno-version: ${{ matrix.deno }} @@ -20,12 +21,13 @@ jobs: run: DISCORD_TOKEN=${{ env.DISCORD_TOKEN }} deno test --unstable --coverage=coverage -A tests/mod.ts env: DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }} - # TODO: add coverage back when it is stable - # - name: Create coverage report - # run: deno --unstable --exclude=test coverage ./coverage --lcov > coverage.lcov - # - name: Collect and upload the coverage report - # uses: codecov/codecov-action@v1.0.10 - # with: - # file: ./coverage.lcov + - name: Create coverage report + if: github.ref == 'refs/heads/main' + run: deno coverage --exclude=tests ./coverage --lcov > coverage.lcov + - name: Collect and upload the coverage report + if: github.ref == 'refs/heads/main' + uses: codecov/codecov-action@v1.0.10 + with: + file: ./coverage.lcov env: DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }} From 9868aef700c5daae7572a51dfa4e46755a0946ac Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Mon, 29 Nov 2021 16:54:48 +0000 Subject: [PATCH 011/104] fix: reqction --- src/types/codes/jsonErrorCodes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/codes/jsonErrorCodes.ts b/src/types/codes/jsonErrorCodes.ts index a797642a5..bbd8f5b56 100644 --- a/src/types/codes/jsonErrorCodes.ts +++ b/src/types/codes/jsonErrorCodes.ts @@ -122,7 +122,7 @@ export enum JsonErrorCodes { ThisServerNeedsMoreBoostsToPerformThisAction = 50101, TwoFactorIsRequiredForThisOperation = 60003, NoUsersWithDiscordTagExist = 80004, - ReqctionWasBlocked = 90001, + ReactionWasBlocked = 90001, ApiResourceIsCurrentlyOverloadedTryAgainALittleLater = 130000, TheStageIsAlreadyOpen = 150006, CannotReplyWithoutPermissionToReadMessageHistory = 160002, From 16852744f4896d07e07dd25dc8b3bcd518166553 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Mon, 29 Nov 2021 17:05:13 +0000 Subject: [PATCH 012/104] fix: remove deleteThread --- src/bot.ts | 2 -- src/helpers/channels/deleteChannel.ts | 17 ++++++++++++++--- src/helpers/channels/threads/deleteThread.ts | 8 -------- src/helpers/channels/threads/mod.ts | 1 - src/helpers/mod.ts | 1 - tests/channels/threads.ts | 2 +- 6 files changed, 15 insertions(+), 16 deletions(-) delete mode 100644 src/helpers/channels/threads/deleteThread.ts diff --git a/src/bot.ts b/src/bot.ts index abe2482a9..48662637c 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -586,7 +586,6 @@ export interface Helpers { upsertApplicationCommands: typeof helpers.upsertApplicationCommands; validDiscoveryTerm: typeof helpers.validDiscoveryTerm; addToThread: typeof helpers.addToThread; - deleteThread: typeof helpers.deleteThread; editThread: typeof helpers.editThread; getActiveThreads: typeof helpers.getActiveThreads; getArchivedThreads: typeof helpers.getArchivedThreads; @@ -755,7 +754,6 @@ export function createBaseHelpers(options: Partial) { upsertApplicationCommands: options.upsertApplicationCommands || helpers.upsertApplicationCommands, validDiscoveryTerm: options.validDiscoveryTerm || helpers.validDiscoveryTerm, addToThread: options.addToThread || helpers.addToThread, - deleteThread: options.deleteThread || helpers.deleteThread, editThread: options.editThread || helpers.editThread, getActiveThreads: options.getActiveThreads || helpers.getActiveThreads, getArchivedThreads: options.getArchivedThreads || helpers.getArchivedThreads, diff --git a/src/helpers/channels/deleteChannel.ts b/src/helpers/channels/deleteChannel.ts index 3766d4e80..2fa9eee12 100644 --- a/src/helpers/channels/deleteChannel.ts +++ b/src/helpers/channels/deleteChannel.ts @@ -1,8 +1,19 @@ import type { Bot } from "../../bot.ts"; +import { Channel } from "../../types/channels/channel.ts"; -/** Delete a channel in your server. Bot needs MANAGE_CHANNEL permissions in the server. */ +/** Delete a channel in your server. Bot needs MANAGE_CHANNEL permissions in the server. Bot needs MANAGE_THREADS permissions in the server if deleting thread. */ export async function deleteChannel(bot: Bot, channelId: bigint, reason?: string) { - return await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.CHANNEL_BASE(channelId), { - reason, + const result = await bot.rest.runMethod( + bot.rest, + "delete", + bot.constants.endpoints.CHANNEL_BASE(channelId), + { + reason, + } + ); + + return bot.transformers.channel(bot, { + channel: result, + guildId: result.guild_id ? bot.transformers.snowflake(result.guild_id) : undefined, }); } diff --git a/src/helpers/channels/threads/deleteThread.ts b/src/helpers/channels/threads/deleteThread.ts deleted file mode 100644 index d1876251f..000000000 --- a/src/helpers/channels/threads/deleteThread.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { Bot } from "../../../bot.ts"; - -/** Delete a thread in your server. Bot needs MANAGE_THREADS permissions in the server. */ -export async function deleteThread(bot: Bot, threadId: bigint, reason?: string) { - return await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.CHANNEL_BASE(threadId), { - reason, - }); -} diff --git a/src/helpers/channels/threads/mod.ts b/src/helpers/channels/threads/mod.ts index 741b603d6..5b957b1d1 100644 --- a/src/helpers/channels/threads/mod.ts +++ b/src/helpers/channels/threads/mod.ts @@ -1,5 +1,4 @@ export * from "./addToThread.ts"; -export * from "./deleteThread.ts"; export * from "./editThread.ts"; export * from "./getActiveThreads.ts"; export * from "./getArchivedThreads.ts"; diff --git a/src/helpers/mod.ts b/src/helpers/mod.ts index 523aa4b60..bddb7a8dc 100644 --- a/src/helpers/mod.ts +++ b/src/helpers/mod.ts @@ -159,7 +159,6 @@ export * from "./channels/getStageInstance.ts"; export * from "./channels/deleteStageInstance.ts"; export * from "./voice/connectToVoiceChannel.ts"; export * from "./channels/threads/addToThread.ts"; -export * from "./channels/threads/deleteThread.ts"; export * from "./channels/threads/editThread.ts"; export * from "./channels/threads/getActiveThreads.ts"; export * from "./channels/threads/getArchivedThreads.ts"; diff --git a/tests/channels/threads.ts b/tests/channels/threads.ts index 9173d524a..c2ff39cb5 100644 --- a/tests/channels/threads.ts +++ b/tests/channels/threads.ts @@ -54,6 +54,6 @@ Deno.test("[thread] Start a thread", async (t) => { }); await t.step("[thread] Delete a thread", async () => { - await bot.helpers.deleteThread(thread.id); + await bot.helpers.deleteChannel(thread.id); }); }); From 8dad2f019cfac08078662e2d18ff4fa2c32ec81a Mon Sep 17 00:00:00 2001 From: Norio Nomura Date: Tue, 30 Nov 2021 09:30:45 +0900 Subject: [PATCH 013/104] Make it possible to add new members through `CreateBotOptions.helpers`. --- src/bot.ts | 309 ++--------------------------------------------------- 1 file changed, 6 insertions(+), 303 deletions(-) diff --git a/src/bot.ts b/src/bot.ts index 48662637c..ea1d4697f 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -446,157 +446,10 @@ export interface Bot { handleDiscordPayload?: GatewayManager["handleDiscordPayload"]; } -export interface Helpers { - addDiscoverySubcategory: typeof helpers.addDiscoverySubcategory; - addReaction: typeof helpers.addReaction; - addReactions: typeof helpers.addReactions; - addRole: typeof helpers.addRole; - avatarURL: typeof helpers.avatarURL; - banMember: typeof helpers.banMember; - batchEditApplicationCommandPermissions: typeof helpers.batchEditApplicationCommandPermissions; - channelOverwriteHasPermission: typeof helpers.channelOverwriteHasPermission; - cloneChannel: typeof helpers.cloneChannel; - connectToVoiceChannel: typeof helpers.connectToVoiceChannel; - createChannel: typeof helpers.createChannel; - createEmoji: typeof helpers.createEmoji; - createGuild: typeof helpers.createGuild; - createGuildFromTemplate: typeof helpers.createGuildFromTemplate; - createGuildTemplate: typeof helpers.createGuildTemplate; - createInvite: typeof helpers.createInvite; - createRole: typeof helpers.createRole; - createScheduledEvent: typeof helpers.createScheduledEvent; - createApplicationCommand: typeof helpers.createApplicationCommand; - createStageInstance: typeof helpers.createStageInstance; - createWebhook: typeof helpers.createWebhook; - deleteChannel: typeof helpers.deleteChannel; - deleteChannelOverwrite: typeof helpers.deleteChannelOverwrite; - deleteEmoji: typeof helpers.deleteEmoji; - deleteGuild: typeof helpers.deleteGuild; - deleteGuildTemplate: typeof helpers.deleteGuildTemplate; - deleteIntegration: typeof helpers.deleteIntegration; - deleteInvite: typeof helpers.deleteInvite; - deleteMessage: typeof helpers.deleteMessage; - deleteMessages: typeof helpers.deleteMessages; - deleteRole: typeof helpers.deleteRole; - deleteScheduledEvent: typeof helpers.deleteScheduledEvent; - deleteApplicationCommand: typeof helpers.deleteApplicationCommand; - deleteInteractionResponse: typeof helpers.deleteInteractionResponse; - deleteStageInstance: typeof helpers.deleteStageInstance; - deleteWebhook: typeof helpers.deleteWebhook; - deleteWebhookMessage: typeof helpers.deleteWebhookMessage; - deleteWebhookWithToken: typeof helpers.deleteWebhookWithToken; - disconnectMember: typeof helpers.disconnectMember; - editBotNickname: typeof helpers.editBotNickname; - editBotProfile: typeof helpers.editBotProfile; - editBotStatus: typeof helpers.editBotStatus; - editChannel: typeof helpers.editChannel; - editChannelOverwrite: typeof helpers.editChannelOverwrite; - editDiscovery: typeof helpers.editDiscovery; - editEmoji: typeof helpers.editEmoji; - editGuild: typeof helpers.editGuild; - editGuildTemplate: typeof helpers.editGuildTemplate; - editMember: typeof helpers.editMember; - editMessage: typeof helpers.editMessage; - editRole: typeof helpers.editRole; - editScheduledEvent: typeof helpers.editScheduledEvent; - editInteractionResponse: typeof helpers.editInteractionResponse; - editApplicationCommandPermissions: typeof helpers.editApplicationCommandPermissions; - editWebhook: typeof helpers.editWebhook; - editWebhookMessage: typeof helpers.editWebhookMessage; - editWebhookWithToken: typeof helpers.editWebhookWithToken; - editWelcomeScreen: typeof helpers.editWelcomeScreen; - editWidget: typeof helpers.editWidget; - emojiUrl: typeof helpers.emojiUrl; - fetchMembers: typeof helpers.fetchMembers; - followChannel: typeof helpers.followChannel; - getAuditLogs: typeof helpers.getAuditLogs; - getAvailableVoiceRegions: typeof helpers.getAvailableVoiceRegions; - getBan: typeof helpers.getBan; - getBans: typeof helpers.getBans; - getChannel: typeof helpers.getChannel; - getChannelInvites: typeof helpers.getChannelInvites; - getChannels: typeof helpers.getChannels; - getChannelWebhooks: typeof helpers.getChannelWebhooks; - getDiscoveryCategories: typeof helpers.getDiscoveryCategories; - getEmoji: typeof helpers.getEmoji; - getEmojis: typeof helpers.getEmojis; - getGatewayBot: typeof helpers.getGatewayBot; - getGuild: typeof helpers.getGuild; - getGuildPreview: typeof helpers.getGuildPreview; - getGuildTemplates: typeof helpers.getGuildTemplates; - getIntegrations: typeof helpers.getIntegrations; - getInvite: typeof helpers.getInvite; - getInvites: typeof helpers.getInvites; - getMember: typeof helpers.getMember; - getMembers: typeof helpers.getMembers; - getMessage: typeof helpers.getMessage; - getMessages: typeof helpers.getMessages; - getOriginalInteractionResponse: typeof helpers.getOriginalInteractionResponse; - getPins: typeof helpers.getPins; - getPruneCount: typeof helpers.getPruneCount; - getReactions: typeof helpers.getReactions; - getRoles: typeof helpers.getRoles; - getScheduledEvent: typeof helpers.getScheduledEvent; - getScheduledEvents: typeof helpers.getScheduledEvents; - getScheduledEventUsers: typeof helpers.getScheduledEventUsers; - getApplicationCommand: typeof helpers.getApplicationCommand; - getApplicationCommandPermission: typeof helpers.getApplicationCommandPermission; - getApplicationCommandPermissions: typeof helpers.getApplicationCommandPermissions; - getApplicationCommands: typeof helpers.getApplicationCommands; - getStageInstance: typeof helpers.getStageInstance; - getTemplate: typeof helpers.getTemplate; - getUser: typeof helpers.getUser; - getApplicationInfo: typeof helpers.getApplicationInfo; - getVanityURL: typeof helpers.getVanityURL; - getVoiceRegions: typeof helpers.getVoiceRegions; - getWebhook: typeof helpers.getWebhook; - getWebhookMessage: typeof helpers.getWebhookMessage; - getWebhooks: typeof helpers.getWebhooks; - getWebhookWithToken: typeof helpers.getWebhookWithToken; - getWelcomeScreen: typeof helpers.getWelcomeScreen; - getWidget: typeof helpers.getWidget; - getWidgetImageURL: typeof helpers.getWidgetImageURL; - getWidgetSettings: typeof helpers.getWidgetSettings; - guildBannerURL: typeof helpers.guildBannerURL; - guildIconURL: typeof helpers.guildIconURL; - guildSplashURL: typeof helpers.guildSplashURL; - kickMember: typeof helpers.kickMember; - leaveGuild: typeof helpers.leaveGuild; - moveMember: typeof helpers.moveMember; - pinMessage: typeof helpers.pinMessage; - pruneMembers: typeof helpers.pruneMembers; - publishMessage: typeof helpers.publishMessage; - removeAllReactions: typeof helpers.removeAllReactions; - removeDiscoverySubcategory: typeof helpers.removeDiscoverySubcategory; - removeReaction: typeof helpers.removeReaction; - removeReactionEmoji: typeof helpers.removeReactionEmoji; - removeRole: typeof helpers.removeRole; - getDmChannel: typeof helpers.getDmChannel; - sendInteractionResponse: typeof helpers.sendInteractionResponse; - sendMessage: typeof helpers.sendMessage; - sendWebhook: typeof helpers.sendWebhook; - startTyping: typeof helpers.startTyping; - swapChannels: typeof helpers.swapChannels; - syncGuildTemplate: typeof helpers.syncGuildTemplate; - unbanMember: typeof helpers.unbanMember; - unpinMessage: typeof helpers.unpinMessage; - updateBotVoiceState: typeof helpers.updateBotVoiceState; - updateStageInstance: typeof helpers.updateStageInstance; - upsertApplicationCommand: typeof helpers.upsertApplicationCommand; - upsertApplicationCommands: typeof helpers.upsertApplicationCommands; - validDiscoveryTerm: typeof helpers.validDiscoveryTerm; - addToThread: typeof helpers.addToThread; - editThread: typeof helpers.editThread; - getActiveThreads: typeof helpers.getActiveThreads; - getArchivedThreads: typeof helpers.getArchivedThreads; - getThreadMember: typeof helpers.getThreadMember; - getThreadMembers: typeof helpers.getThreadMembers; - joinThread: typeof helpers.joinThread; - leaveThread: typeof helpers.leaveThread; - removeThreadMember: typeof helpers.removeThreadMember; - startThreadWithoutMessage: typeof helpers.startThreadWithoutMessage; - startThreadWithMessage: typeof helpers.startThreadWithMessage; -} +export const defaultHelpers = { ...helpers }; +export type DefaultHelpers = typeof defaultHelpers; +// deno-lint-ignore no-empty-interface +export interface Helpers extends DefaultHelpers { } // Use interface for declaration merging export function createHelpers(bot: Bot, customHelpers?: Partial): FinalHelpers { const converted = {} as FinalHelpers; @@ -612,158 +465,8 @@ export function createHelpers(bot: Bot, customHelpers?: Partial): Final export function createBaseHelpers(options: Partial) { return { - addDiscoverySubcategory: options.addDiscoverySubcategory || helpers.addDiscoverySubcategory, - addReaction: options.addReaction || helpers.addReaction, - addReactions: options.addReactions || helpers.addReactions, - addRole: options.addRole || helpers.addRole, - avatarURL: options.avatarURL || helpers.avatarURL, - banMember: options.banMember || helpers.banMember, - batchEditApplicationCommandPermissions: - options.batchEditApplicationCommandPermissions || helpers.batchEditApplicationCommandPermissions, - channelOverwriteHasPermission: options.channelOverwriteHasPermission || helpers.channelOverwriteHasPermission, - cloneChannel: options.cloneChannel || helpers.cloneChannel, - connectToVoiceChannel: options.connectToVoiceChannel || helpers.connectToVoiceChannel, - createChannel: options.createChannel || helpers.createChannel, - createEmoji: options.createEmoji || helpers.createEmoji, - createGuild: options.createGuild || helpers.createGuild, - createGuildFromTemplate: options.createGuildFromTemplate || helpers.createGuildFromTemplate, - createGuildTemplate: options.createGuildTemplate || helpers.createGuildTemplate, - createInvite: options.createInvite || helpers.createInvite, - createRole: options.createRole || helpers.createRole, - createScheduledEvent: options.createScheduledEvent || helpers.createScheduledEvent, - createApplicationCommand: options.createApplicationCommand || helpers.createApplicationCommand, - createStageInstance: options.createStageInstance || helpers.createStageInstance, - createWebhook: options.createWebhook || helpers.createWebhook, - deleteChannel: options.deleteChannel || helpers.deleteChannel, - deleteChannelOverwrite: options.deleteChannelOverwrite || helpers.deleteChannelOverwrite, - deleteEmoji: options.deleteEmoji || helpers.deleteEmoji, - deleteGuild: options.deleteGuild || helpers.deleteGuild, - deleteGuildTemplate: options.deleteGuildTemplate || helpers.deleteGuildTemplate, - deleteIntegration: options.deleteIntegration || helpers.deleteIntegration, - deleteInvite: options.deleteInvite || helpers.deleteInvite, - deleteMessage: options.deleteMessage || helpers.deleteMessage, - deleteMessages: options.deleteMessages || helpers.deleteMessages, - deleteRole: options.deleteRole || helpers.deleteRole, - deleteScheduledEvent: options.deleteScheduledEvent || helpers.deleteScheduledEvent, - deleteApplicationCommand: options.deleteApplicationCommand || helpers.deleteApplicationCommand, - deleteInteractionResponse: options.deleteInteractionResponse || helpers.deleteInteractionResponse, - deleteStageInstance: options.deleteStageInstance || helpers.deleteStageInstance, - deleteWebhook: options.deleteWebhook || helpers.deleteWebhook, - deleteWebhookMessage: options.deleteWebhookMessage || helpers.deleteWebhookMessage, - deleteWebhookWithToken: options.deleteWebhookWithToken || helpers.deleteWebhookWithToken, - disconnectMember: options.disconnectMember || helpers.disconnectMember, - editBotNickname: options.editBotNickname || helpers.editBotNickname, - editBotProfile: options.editBotProfile || helpers.editBotProfile, - editBotStatus: options.editBotStatus || helpers.editBotStatus, - editChannel: options.editChannel || helpers.editChannel, - editChannelOverwrite: options.editChannelOverwrite || helpers.editChannelOverwrite, - editDiscovery: options.editDiscovery || helpers.editDiscovery, - editEmoji: options.editEmoji || helpers.editEmoji, - editGuild: options.editGuild || helpers.editGuild, - editGuildTemplate: options.editGuildTemplate || helpers.editGuildTemplate, - editMember: options.editMember || helpers.editMember, - editMessage: options.editMessage || helpers.editMessage, - editRole: options.editRole || helpers.editRole, - editScheduledEvent: options.editScheduledEvent || helpers.editScheduledEvent, - editInteractionResponse: options.editInteractionResponse || helpers.editInteractionResponse, - editApplicationCommandPermissions: - options.editApplicationCommandPermissions || helpers.editApplicationCommandPermissions, - editWebhook: options.editWebhook || helpers.editWebhook, - editWebhookMessage: options.editWebhookMessage || helpers.editWebhookMessage, - editWebhookWithToken: options.editWebhookWithToken || helpers.editWebhookWithToken, - editWelcomeScreen: options.editWelcomeScreen || helpers.editWelcomeScreen, - editWidget: options.editWidget || helpers.editWidget, - emojiUrl: options.emojiUrl || helpers.emojiUrl, - fetchMembers: options.fetchMembers || helpers.fetchMembers, - followChannel: options.followChannel || helpers.followChannel, - getAuditLogs: options.getAuditLogs || helpers.getAuditLogs, - getAvailableVoiceRegions: options.getAvailableVoiceRegions || helpers.getAvailableVoiceRegions, - getBan: options.getBan || helpers.getBan, - getBans: options.getBans || helpers.getBans, - getChannel: options.getChannel || helpers.getChannel, - getChannelInvites: options.getChannelInvites || helpers.getChannelInvites, - getChannels: options.getChannels || helpers.getChannels, - getChannelWebhooks: options.getChannelWebhooks || helpers.getChannelWebhooks, - getDiscoveryCategories: options.getDiscoveryCategories || helpers.getDiscoveryCategories, - getEmoji: options.getEmoji || helpers.getEmoji, - getEmojis: options.getEmojis || helpers.getEmojis, - getGatewayBot: options.getGatewayBot || helpers.getGatewayBot, - getGuild: options.getGuild || helpers.getGuild, - getGuildPreview: options.getGuildPreview || helpers.getGuildPreview, - getGuildTemplates: options.getGuildTemplates || helpers.getGuildTemplates, - getIntegrations: options.getIntegrations || helpers.getIntegrations, - getInvite: options.getInvite || helpers.getInvite, - getInvites: options.getInvites || helpers.getInvites, - getMember: options.getMember || helpers.getMember, - getMembers: options.getMembers || helpers.getMembers, - getMessage: options.getMessage || helpers.getMessage, - getMessages: options.getMessages || helpers.getMessages, - getOriginalInteractionResponse: options.getOriginalInteractionResponse || helpers.getOriginalInteractionResponse, - getPins: options.getPins || helpers.getPins, - getPruneCount: options.getPruneCount || helpers.getPruneCount, - getReactions: options.getReactions || helpers.getReactions, - getRoles: options.getRoles || helpers.getRoles, - getScheduledEvent: options.getScheduledEvent || helpers.getScheduledEvent, - getScheduledEventUsers: options.getScheduledEventUsers || helpers.getScheduledEventUsers, - getScheduledEvents: options.getScheduledEvents || helpers.getScheduledEvents, - getApplicationCommand: options.getApplicationCommand || helpers.getApplicationCommand, - getApplicationCommandPermission: options.getApplicationCommandPermission || helpers.getApplicationCommandPermission, - getApplicationCommandPermissions: - options.getApplicationCommandPermissions || helpers.getApplicationCommandPermissions, - getApplicationCommands: options.getApplicationCommands || helpers.getApplicationCommands, - getStageInstance: options.getStageInstance || helpers.getStageInstance, - getTemplate: options.getTemplate || helpers.getTemplate, - getUser: options.getUser || helpers.getUser, - getApplicationInfo: options.getApplicationInfo || helpers.getApplicationInfo, - getVanityURL: options.getVanityURL || helpers.getVanityURL, - getVoiceRegions: options.getVoiceRegions || helpers.getVoiceRegions, - getWebhook: options.getWebhook || helpers.getWebhook, - getWebhookMessage: options.getWebhookMessage || helpers.getWebhookMessage, - getWebhooks: options.getWebhooks || helpers.getWebhooks, - getWebhookWithToken: options.getWebhookWithToken || helpers.getWebhookWithToken, - getWelcomeScreen: options.getWelcomeScreen || helpers.getWelcomeScreen, - getWidget: options.getWidget || helpers.getWidget, - getWidgetImageURL: options.getWidgetImageURL || helpers.getWidgetImageURL, - getWidgetSettings: options.getWidgetSettings || helpers.getWidgetSettings, - guildBannerURL: options.guildBannerURL || helpers.guildBannerURL, - guildIconURL: options.guildIconURL || helpers.guildIconURL, - guildSplashURL: options.guildSplashURL || helpers.guildSplashURL, - kickMember: options.kickMember || helpers.kickMember, - leaveGuild: options.leaveGuild || helpers.leaveGuild, - moveMember: options.moveMember || helpers.moveMember, - pinMessage: options.pinMessage || helpers.pinMessage, - pruneMembers: options.pruneMembers || helpers.pruneMembers, - publishMessage: options.publishMessage || helpers.publishMessage, - removeAllReactions: options.removeAllReactions || helpers.removeAllReactions, - removeDiscoverySubcategory: options.removeDiscoverySubcategory || helpers.removeDiscoverySubcategory, - removeReaction: options.removeReaction || helpers.removeReaction, - removeReactionEmoji: options.removeReactionEmoji || helpers.removeReactionEmoji, - removeRole: options.removeRole || helpers.removeRole, - getDmChannel: options.getDmChannel || helpers.getDmChannel, - sendInteractionResponse: options.sendInteractionResponse || helpers.sendInteractionResponse, - sendMessage: options.sendMessage || helpers.sendMessage, - sendWebhook: options.sendWebhook || helpers.sendWebhook, - startTyping: options.startTyping || helpers.startTyping, - swapChannels: options.swapChannels || helpers.swapChannels, - syncGuildTemplate: options.syncGuildTemplate || helpers.syncGuildTemplate, - unbanMember: options.unbanMember || helpers.unbanMember, - unpinMessage: options.unpinMessage || helpers.unpinMessage, - updateBotVoiceState: options.updateBotVoiceState || helpers.updateBotVoiceState, - updateStageInstance: options.updateStageInstance || helpers.updateStageInstance, - upsertApplicationCommand: options.upsertApplicationCommand || helpers.upsertApplicationCommand, - upsertApplicationCommands: options.upsertApplicationCommands || helpers.upsertApplicationCommands, - validDiscoveryTerm: options.validDiscoveryTerm || helpers.validDiscoveryTerm, - addToThread: options.addToThread || helpers.addToThread, - editThread: options.editThread || helpers.editThread, - getActiveThreads: options.getActiveThreads || helpers.getActiveThreads, - getArchivedThreads: options.getArchivedThreads || helpers.getArchivedThreads, - getThreadMember: options.getThreadMember || helpers.getThreadMember, - getThreadMembers: options.getThreadMembers || helpers.getThreadMembers, - joinThread: options.joinThread || helpers.joinThread, - leaveThread: options.leaveThread || helpers.leaveThread, - removeThreadMember: options.removeThreadMember || helpers.removeThreadMember, - startThreadWithoutMessage: options.startThreadWithoutMessage || helpers.startThreadWithoutMessage, - startThreadWithMessage: options.startThreadWithMessage || helpers.startThreadWithMessage, + ...defaultHelpers, + ...options, }; } From 5059601a28bb335c919c3fcef473f63bcc70f3a0 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Tue, 30 Nov 2021 09:25:46 -0500 Subject: [PATCH 014/104] Update README.md --- README.md | 55 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 408771c38..307bdc350 100644 --- a/README.md +++ b/README.md @@ -33,36 +33,37 @@ TODO: add coverage back when it is stable ### REST -- [x] Freedom from Invalid Request 1 Hour Downtimes - - [x] Discordeno will protect your bot from going down for an hour and will instead decrease the maximum downtime to 10 minutes. -- [x] Freedom from global rate limit errors - - [x] As your bot grows, you want to handle global rate limits better. Shards don't communicate fast enough to truly handle it properly so this allows 1 rest handler across the entire bot. - - [x] In fact, you can host multiple instances of your bot and all connect to the same rest server. -- [x] REST does not rest! - - [x] Separate rest means if your bot for whatever reason crashes, your requests that are queued will still keep going and will not be lost. - - [x] Seamless updates! When you want to update and reboot the bot, you could potentially lose tons of messages or responses that are in queue. Using this you could restart your bot without ever worrying about losing any responses. -- [x] Single source of contact to Discord API - - [x] This will allow you to make requests to discord from anywhere including a bot dashboard. You no longer need to have to communicate to your bot processes just to make a request or anything. Free up your bot process for processing bot events. -- [x] Scalability! Scalability! Scalability! +- ✅ Freedom from Invalid Request 1 Hour Downtimes + - ✅ Discordeno will protect your bot from going down for an hour and will instead decrease the maximum downtime to 10 minutes. +- ✅ Freedom from global rate limit errors + - ✅ As your bot grows, you want to handle global rate limits better. Shards don't communicate fast enough to truly handle it properly so this allows 1 rest handler across the entire bot. + - ✅ In fact, you can host multiple instances of your bot and all connect to the same rest server. +- ✅ REST does not rest! + - ✅ Separate rest means if your bot for whatever reason crashes, your requests that are queued will still keep going and will not be lost. + - ✅ Seamless updates! When you want to update and reboot the bot, you could potentially lose tons of messages or responses that are in queue. Using this you could restart your bot without ever worrying about losing any responses. +- ✅ Single source of contact to Discord API + - ✅ This will allow you to make requests to discord from anywhere including a bot dashboard. You no longer need to have to communicate to your bot processes just to make a request or anything. Free up your bot process for processing bot events. +- ✅ Scalability! Scalability! Scalability! ### Gateway -- [x] **Zero Downtime Updates:** - - [x] Your bot can be updated in a matter of seconds. With normal sharding, you have to restart which also has to process identifying all your shards with a 1/~5s rate limit. With WS handling moved to a proxy process, this allows you to instantly get the bot code restarted without any concerns of delays. If you have a bot on 200,000 servers normally this would mean a 20 minute delay to restart your bot if you made a small change and restarted. -- [x] **Zero Downtime Resharding:** - - [x] Discord stops letting your bot get added to new servers at certain points in time. For example, suppose you had 150,000 servers running 150 shards. The maximum amount of servers your shards could hold is 150 \* 2500 = 375,000. If your bot reaches this, it can no longer join new servers until it re-shards. - - [x] DD proxy provides 2 types of re-sharding. Automated and manual. You can also have both. - - [x] Automated: This system will automatically begin a Zero-downtime resharding process behind the scenes when you reach 80% of your maximum servers allowed by your shards. For example, since 375,000 was the max, at 300,000 we would begin re-sharding behind the scenes with ZERO DOWNTIME. - - [x] 80% of maximum servers reached (The % of 80% is customizable.) - - [x] Identify limits have room to allow re-sharding. (Also customizable) - - [x] Manual: You can also trigger this manually should you choose. -- [x] **Horizontal Scaling:** - - [x] The proxy system allows you to scale the bot horizontally. When you reach a huge size, you can either keep spending more money to keep beefing up your server or you can buy several cheaper servers and scale horizontally. The proxy means you can have WS handling on a completely separate system. -- [x] **No Loss Restarts:** -[x] When you restart a bot without the proxy system, normally you would lose many events. Users may be using commands or messages are sent that will not be filtered. As your bot's grow this number rises dramatically. Users may join who wont get the auto-roles or any other actions your bot should take. With the proxy system, you can keep restarting your bot and never lose any events. Events will be put into a queue while your bot is down(max size of queue is customizable), once the bot is available the queue will begin processing all events. -- [x] **Controllers:** - - [x] The controller aspect gives you full control over everything inside the proxy. You can provide a function to simply override the handler. For example, if you would like a certain function to do something different, instead of having to fork and maintain your fork, you can just provide a function to override. -- [x] **Clustering With Workers:** - - [x] Take full advantage of all your CPU cores by using workers to spread the load. Control how many shards per worker and how many workers to maximize efficiency! +- ✅ **Zero Downtime Updates:** + - ✅ Your bot can be updated in a matter of seconds. With normal sharding, you have to restart which also has to process identifying all your shards with a 1/~5s rate limit. With WS handling moved to a proxy process, this allows you to instantly get the bot code restarted without any concerns of delays. If you have a bot on 200,000 servers normally this would mean a 20 minute delay to restart your bot if you made a small change and restarted. +- ✅ **Zero Downtime Resharding:** + - ✅ Discord stops letting your bot get added to new servers at certain points in time. For example, suppose you had 150,000 servers running 150 shards. The maximum amount of servers your shards could hold is 150 \* 2500 = 375,000. If your bot reaches this, it can no longer join new servers until it re-shards. + - ✅ DD proxy provides 2 types of re-sharding. Automated and manual. You can also have both. + - ✅ Automated: This system will automatically begin a Zero-downtime resharding process behind the scenes when you reach 80% of your maximum servers allowed by your shards. For example, since 375,000 was the max, at 300,000 we would begin re-sharding behind the scenes with ZERO DOWNTIME. + - ✅ 80% of maximum servers reached (The % of 80% is customizable.) + - ✅ Identify limits have room to allow re-sharding. (Also customizable) + - ✅ Manual: You can also trigger this manually should you choose. +- ✅ **Horizontal Scaling:** + - ✅ The proxy system allows you to scale the bot horizontally. When you reach a huge size, you can either keep spending more money to keep beefing up your server or you can buy several cheaper servers and scale horizontally. The proxy means you can have WS handling on a completely separate system. +- ✅ **No Loss Restarts:** + - ✅ When you restart a bot without the proxy system, normally you would lose many events. Users may be using commands or messages are sent that will not be filtered. As your bot's grow this number rises dramatically. Users may join who wont get the auto-roles or any other actions your bot should take. With the proxy system, you can keep restarting your bot and never lose any events. Events will be put into a queue while your bot is down(max size of queue is customizable), once the bot is available the queue will begin processing all events. +- ✅ **Controllers:** + - ✅ The controller aspect gives you full control over everything inside the proxy. You can provide a function to simply override the handler. For example, if you would like a certain function to do something different, instead of having to fork and maintain your fork, you can just provide a function to override. +- ✅ **Clustering With Workers:** + - ✅ Take full advantage of all your CPU cores by using workers to spread the load. Control how many shards per worker and how many workers to maximize efficiency! ### Custom Cache From c1a9ee33eb625c91aeb537cf366513368eb62440 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Wed, 1 Dec 2021 17:53:04 +0000 Subject: [PATCH 015/104] feat: application command transformer --- src/bot.ts | 6 +++ .../commands/createApplicationCommand.ts | 4 +- src/transformers/applicationCommand.ts | 44 +++++++++++++++++ src/transformers/applicationCommandOption.ts | 48 +++++++++++++++++++ src/transformers/channel.ts | 2 +- src/transformers/mod.ts | 4 ++ 6 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 src/transformers/applicationCommand.ts create mode 100644 src/transformers/applicationCommandOption.ts diff --git a/src/bot.ts b/src/bot.ts index ea1d4697f..e89262411 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -86,6 +86,8 @@ import { calculateBits, calculatePermissions } from "./util/permissions.ts"; import { transformScheduledEvent } from "./transformers/scheduledEvent.ts"; import { DiscordenoScheduledEvent } from "./transformers/scheduledEvent.ts"; import { transformThreadMember } from "./transformers/threadMember.ts"; +import { transformApplicationCommandOption } from "./transformers/applicationCommandOption.ts"; +import { transformApplicationCommand } from "./transformers/applicationCommand.ts"; type CacheOptions = | { @@ -492,6 +494,8 @@ export interface Transformers { component: typeof transformComponent; webhook: typeof transformWebhook; auditlogEntry: typeof transformAuditlogEntry; + applicationCommand: typeof transformApplicationCommand; + applicationCommandOption: typeof transformApplicationCommandOption; applicationCommandPermission: typeof transformApplicationCommandPermission; scheduledEvent: typeof transformScheduledEvent; threadMember: typeof transformThreadMember; @@ -520,6 +524,8 @@ export function createTransformers(options: Partial) { snowflake: options.snowflake || snowflakeToBigint, webhook: options.webhook || transformWebhook, auditlogEntry: options.auditlogEntry || transformAuditlogEntry, + applicationCommand: options.applicationCommand || transformApplicationCommand, + applicationCommandOption: options.applicationCommandOption || transformApplicationCommandOption, applicationCommandPermission: options.applicationCommandPermission || transformApplicationCommandPermission, scheduledEvent: options.scheduledEvent || transformScheduledEvent, threadMember: options.threadMember || transformThreadMember, diff --git a/src/helpers/interactions/commands/createApplicationCommand.ts b/src/helpers/interactions/commands/createApplicationCommand.ts index 7697739ca..cdc163fe7 100644 --- a/src/helpers/interactions/commands/createApplicationCommand.ts +++ b/src/helpers/interactions/commands/createApplicationCommand.ts @@ -15,7 +15,7 @@ import { ApplicationCommandOption } from "../../../types/interactions/commands/a * Guild commands update **instantly**. We recommend you use guild commands for quick testing, and global commands when they're ready for public use. */ export async function createApplicationCommand(bot: Bot, options: CreateGlobalApplicationCommand, guildId?: bigint) { - return await bot.rest.runMethod( + const result = await bot.rest.runMethod( bot.rest, "post", guildId @@ -28,6 +28,8 @@ export async function createApplicationCommand(bot: Bot, options: CreateGlobalAp options: options.options ? makeOptionsForCommand(options.options) : undefined, } ); + + return bot.transformers.applicationCommand(bot, result); } // @ts-ignore TODO: see if we can make this not circular diff --git a/src/transformers/applicationCommand.ts b/src/transformers/applicationCommand.ts new file mode 100644 index 000000000..96c59b67a --- /dev/null +++ b/src/transformers/applicationCommand.ts @@ -0,0 +1,44 @@ +import { Bot } from "../bot.ts"; +import { ApplicationCommand } from "../types/interactions/commands/applicationCommand.ts"; +import { ApplicationCommandTypes } from "../types/interactions/commands/applicationCommandTypes.ts"; +import { SnakeCasedPropertiesDeep } from "../types/util.ts"; +import { DiscordenoApplicationCommandOption } from "./applicationCommandOption.ts"; + +export function transformApplicationCommand( + bot: Bot, + payload: SnakeCasedPropertiesDeep +): DiscordenoApplicationCommand { + return { + id: bot.transformers.snowflake(payload.id), + applicationId: bot.transformers.snowflake(payload.application_id), + guildId: payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined, + name: payload.name, + description: payload.description, + defaultPermission: payload.default_permission ?? false, + type: payload.type, + version: payload.version, + + options: payload.options?.map(option => bot.transformers.applicationCommandOption(bot, option)) + }; +} + +export interface DiscordenoApplicationCommand { + /** Unique id of the command */ + id: bigint; + /** Unique id of the parent application */ + applicationId: bigint; + /** Guild id of the command, if not global */ + guildId?: bigint; + /** 1-32 character name matching */ + name: string; + /** 1-100 character description */ + description?: string; + /** The parameters for the command */ + options?: DiscordenoApplicationCommandOption[]; + /** Whether the command is enbaled by default when the app is added to a guild */ + defaultPermission?: boolean; + /** The type of command. By default this is a slash command(ChatInput). */ + type?: ApplicationCommandTypes; + /** Autoincrementing version identifier updated during substantial record changes */ + version: string; +} diff --git a/src/transformers/applicationCommandOption.ts b/src/transformers/applicationCommandOption.ts new file mode 100644 index 000000000..f32072afd --- /dev/null +++ b/src/transformers/applicationCommandOption.ts @@ -0,0 +1,48 @@ +import { Bot } from "../bot.ts"; +import { ChannelTypes } from "../types/channels/channelTypes.ts"; +import { ApplicationCommandOption } from "../types/interactions/commands/applicationCommandOption.ts"; +import { ApplicationCommandOptionChoice } from "../types/interactions/commands/applicationCommandOptionChoice.ts"; +import { ApplicationCommandOptionTypes } from "../types/interactions/commands/applicationCommandOptionTypes.ts"; +import { SnakeCasedPropertiesDeep } from "../types/util.ts"; + +export function transformApplicationCommandOption( + bot: Bot, + payload: SnakeCasedPropertiesDeep +): DiscordenoApplicationCommandOption { + return { + type: payload.type, + name: payload.name, + description: payload.description, + required: payload.required ?? false, + choices: payload.choices, + autocomplete: payload.autocomplete, + channelTypes: payload.channel_types, + minValue: payload.min_value, + maxValue: payload.max_value, + + options: payload.options?.map((option) => bot.transformers.applicationCommandOption(bot, option)), + }; +} + +export interface DiscordenoApplicationCommandOption { + /** Value of Application Command Option Type */ + type: ApplicationCommandOptionTypes; + /** 1-32 character name matching lowercase `^[\w-]{1,32}$` */ + name: string; + /** 1-100 character description */ + description: string; + /** If the parameter is required or optional--default `false` */ + required?: boolean; + /** Choices for `string` and `int` types for the user to pick from */ + choices?: ApplicationCommandOptionChoice[]; + /** If the option is a subcommand or subcommand group type, this nested options will be the parameters */ + options?: ApplicationCommandOption[]; + /** Whether this option should make autocomplete interactions. */ + autocomplete?: boolean; + /** If the option is a channel type, the channels shown will be restricted to these types */ + channelTypes?: ChannelTypes[]; + /** Minimum number desired. */ + minValue?: number; + /** Maximum number desired. */ + maxValue?: number; +} diff --git a/src/transformers/channel.ts b/src/transformers/channel.ts index a74edcb88..3c566c43d 100644 --- a/src/transformers/channel.ts +++ b/src/transformers/channel.ts @@ -135,7 +135,7 @@ export interface DiscordenoChannel { guildId: bigint; /** The id of the last message sent in this channel (may not point to an existing or valid message) */ lastMessageId?: bigint; - /** id of the DM creator */ + /** id of the DM creator or thread */ ownerId?: bigint; /** Application id of the group DM creator if it is bot-created */ applicationId?: bigint; diff --git a/src/transformers/mod.ts b/src/transformers/mod.ts index fb2e55756..9ea7fecb0 100644 --- a/src/transformers/mod.ts +++ b/src/transformers/mod.ts @@ -1,5 +1,7 @@ export * from "./activity.ts"; export * from "./application.ts"; +export * from "./applicationCommand.ts"; +export * from "./applicationCommandOption.ts"; export * from "./applicationCommandPermission.ts"; export * from "./attachment.ts"; export * from "./auditlogEntry.ts"; @@ -15,6 +17,8 @@ export * from "./member.ts"; export * from "./message.ts"; export * from "./presence.ts"; export * from "./role.ts"; +export * from "./scheduledEvent.ts"; export * from "./team.ts"; +export * from "./threadMember.ts"; export * from "./voiceState.ts"; export * from "./webhook.ts"; From 1df92b415c61949cd80f1426d5d801180fb85aa6 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Wed, 1 Dec 2021 18:43:07 +0000 Subject: [PATCH 016/104] fix: remove cache from bot --- mod.ts | 3 +- src/bot.ts | 56 ++-- src/cache.ts | 296 ------------------ src/handlers/channels/THREAD_DELETE.ts | 2 - src/handlers/channels/THREAD_LIST_SYNC.ts | 4 - .../channels/THREAD_MEMBERS_UPDATE.ts | 3 - src/handlers/channels/THREAD_MEMBER_UPDATE.ts | 2 - src/handlers/channels/THREAD_UPDATE.ts | 3 - src/handlers/members/GUILD_MEMBER_ADD.ts | 7 - src/handlers/members/GUILD_MEMBER_REMOVE.ts | 6 - src/helpers/emojis/getEmoji.ts | 2 - src/helpers/emojis/getEmojis.ts | 1 - src/helpers/guilds/getGuild.ts | 3 - src/helpers/members/fetchMembers.ts | 3 - src/helpers/members/getMembers.ts | 3 - src/helpers/members/searchMembers.ts | 6 +- src/helpers/messages/deleteMessage.ts | 1 - 17 files changed, 21 insertions(+), 380 deletions(-) delete mode 100644 src/cache.ts diff --git a/mod.ts b/mod.ts index 2c0531975..d2938537f 100644 --- a/mod.ts +++ b/mod.ts @@ -5,5 +5,4 @@ export * from "./src/rest/mod.ts"; export * from "./src/transformers/mod.ts"; export * from "./src/types/mod.ts"; export * from "./src/util/mod.ts"; -export * from "./src/ws/mod.ts"; -export * from "./src/cache.ts"; \ No newline at end of file +export * from "./src/ws/mod.ts"; \ No newline at end of file diff --git a/src/bot.ts b/src/bot.ts index e89262411..68bd967a8 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -77,7 +77,6 @@ import { urlToBase64 } from "./util/urlToBase64.ts"; import { transformAttachment } from "./transformers/attachment.ts"; import { transformEmbed } from "./transformers/embed.ts"; import { transformComponent } from "./transformers/component.ts"; -import { AsyncCache, AsyncCacheHandler, Cache, CacheHandler, createCache, TableNames } from "./cache.ts"; import { transformWebhook } from "./transformers/webhook.ts"; import { transformAuditlogEntry } from "./transformers/auditlogEntry.ts"; import { transformApplicationCommandPermission } from "./transformers/applicationCommandPermission.ts"; @@ -89,21 +88,7 @@ import { transformThreadMember } from "./transformers/threadMember.ts"; import { transformApplicationCommandOption } from "./transformers/applicationCommandOption.ts"; import { transformApplicationCommand } from "./transformers/applicationCommand.ts"; -type CacheOptions = - | { - isAsync: true; - // deno-lint-ignore no-explicit-any - tableCreator: (tableName: TableNames) => AsyncCacheHandler; - } - | { - isAsync: false; - // deno-lint-ignore no-explicit-any - tableCreator?: (tableName: TableNames) => CacheHandler; - }; - -export function createBot( - options: CreateBotOptions -): Bot { +export function createBot(options: CreateBotOptions): Bot { const bot = { id: options.botId, applicationId: options.applicationId || options.botId, @@ -118,13 +103,15 @@ export function createBot( transformers: createTransformers(options.transformers ?? {}), enabledPlugins: new Set(), handleDiscordPayload: options.handleDiscordPayload, - } as unknown as Bot; + cache: { + unrepliedInteractions: new Set(), + fetchAllMembersProcessingRequests: new Map(), + }, + } as Bot; - // @ts-ignore itoh cache types plz - bot.cache = createCache(bot as Bot, options.cache); - bot.helpers = createHelpers(bot as Bot, options.helpers ?? {}); + bot.helpers = createHelpers(bot, options.helpers ?? {}); - return bot as unknown as Bot; + return bot as Bot; } export function createEventHandlers(events: Partial): EventHandlers { @@ -399,7 +386,7 @@ export async function stopBot(bot: Bot) { return bot; } -export interface CreateBotOptions { +export interface CreateBotOptions { token: string; botId: bigint; applicationId?: bigint; @@ -408,7 +395,10 @@ export interface CreateBotOptions { botGatewayData?: GetGatewayBot; rest?: Omit; handleDiscordPayload?: GatewayManager["handleDiscordPayload"]; - cache: C; + cache: { + unrepliedInteractions: Set; + fetchAllMembersProcessingRequests: Map; + }; utils?: Partial>; transformers?: Partial>; helpers?: Partial; @@ -416,20 +406,9 @@ export interface CreateBotOptions { export type UnPromise> = T extends Promise ? K : never; -// export type CreatedBot = ReturnType; - -// export type Bot = CreatedBot & { -// utils: HelperUtils; -// rest: RestManager; -// gateway: GatewayManager; -// transformers: Transformers; -// helpers: Helpers; -// }; - -export interface Bot { +export interface Bot { id: bigint; applicationId: bigint; - token: string; intents: GatewayIntents; urlWSS: string; @@ -443,7 +422,10 @@ export interface Bot { handlers: ReturnType; activeGuildIds: Set; constants: ReturnType; - cache: C; + cache: { + unrepliedInteractions: Set; + fetchAllMembersProcessingRequests: Map; + }; enabledPlugins: Set; handleDiscordPayload?: GatewayManager["handleDiscordPayload"]; } @@ -451,7 +433,7 @@ export interface Bot { export const defaultHelpers = { ...helpers }; export type DefaultHelpers = typeof defaultHelpers; // deno-lint-ignore no-empty-interface -export interface Helpers extends DefaultHelpers { } // Use interface for declaration merging +export interface Helpers extends DefaultHelpers {} // Use interface for declaration merging export function createHelpers(bot: Bot, customHelpers?: Partial): FinalHelpers { const converted = {} as FinalHelpers; diff --git a/src/cache.ts b/src/cache.ts deleted file mode 100644 index a7b1b834b..000000000 --- a/src/cache.ts +++ /dev/null @@ -1,296 +0,0 @@ -import type { Bot } from "./bot.ts"; -import type { DiscordenoChannel } from "./transformers/channel.ts"; -import type { DiscordenoGuild } from "./transformers/guild.ts"; -import type { DiscordenoMember, DiscordenoUser } from "./transformers/member.ts"; -import type { DiscordenoMessage } from "./transformers/message.ts"; -import { DiscordenoPresence } from "./transformers/presence.ts"; -import { GuildMember } from "./types/members/guildMember.ts"; -import { Collection } from "./util/collection.ts"; - -function messageSweeper(bot: Bot, message: DiscordenoMessage) { - // DM messages aren't needed - if (!message.guildId) return true; - - // Only delete messages older than 10 minutes - return Date.now() - message.timestamp > 600000; -} - -function memberSweeper(bot: Bot, member: DiscordenoMember) { - // Don't sweep the bot else strange things will happen - if (member.id === bot.id) return false; - - // Only sweep members who were not active the last 30 minutes - return Date.now() - member.cachedAt > 1800000; -} - -function guildSweeper(bot: Bot, guild: DiscordenoGuild) { - // Reset activity for next interval - if (bot.cache.activeGuildIds.delete(guild.id)) return false; - - // This is inactive guild. Not a single thing has happened for atleast 30 minutes. - // Not a reaction, not a message, not any event! - bot.cache.dispatchedGuildIds.add(guild.id); - - return true; -} - -function channelSweeper(bot: Bot, channel: DiscordenoChannel, key: bigint) { - // If this is in a guild and the guild was dispatched, then we can dispatch the channel - if (channel.guildId && bot.cache.dispatchedGuildIds.has(channel.guildId)) { - bot.cache.dispatchedChannelIds.add(channel.id); - return true; - } - - // THE KEY DM CHANNELS ARE STORED BY IS THE USER ID. If the user is not cached, we dont need to cache their dm channel. - if (!channel.guildId && !bot.cache.members.has(key)) return true; - - return false; -} - -export function createCache( - bot: Bot, - options: { - isAsync: true; - tableCreator: (bot: Bot, tableName: TableNames) => AsyncCacheHandler; - } -): AsyncCache; -export function createCache( - bot: Bot, - options: { - isAsync: false; - tableCreator?: (bot: Bot, tableName: TableNames) => CacheHandler; - } -): Cache; -export function createCache( - bot: Bot, - options: { - isAsync: boolean; - tableCreator?: (bot: Bot, tableName: TableNames) => CacheHandler | AsyncCacheHandler; - } -): Omit | Omit { - let cache: Cache | AsyncCache; - - if (options.isAsync) { - if (!options.tableCreator) { - throw new Error("Async cache requires a tableCreator to be passed."); - } - - cache = { - guilds: options.tableCreator(bot, "guilds"), - users: options.tableCreator(bot, "users"), - members: options.tableCreator(bot, "members"), - channels: options.tableCreator(bot, "channels"), - messages: options.tableCreator(bot, "messages"), - presences: options.tableCreator(bot, "presences"), - // threads: options.tableCreator(bot, "threads"), - unavailableGuilds: options.tableCreator(bot, "unavailableGuilds"), - dispatchedGuildIds: options.tableCreator(bot, "dispatchedGuildIds"), - dispatchedChannelIds: options.tableCreator(bot, "dispatchedChannelIds"), - activeGuildIds: options.tableCreator(bot, "activeGuildIds"), - unrepliedInteractions: new Set(), - fetchAllMembersProcessingRequests: new Map(), - execute: async function () { - throw new Error("Async Cache requires a custom execute function to be implemented."); - }, - } as AsyncCache; - } else { - if (!options.tableCreator) options.tableCreator = createTable; - - cache = { - guilds: options.tableCreator(bot, "guilds"), - users: options.tableCreator(bot, "users"), - members: options.tableCreator(bot, "members"), - channels: options.tableCreator(bot, "channels"), - messages: options.tableCreator(bot, "messages"), - presences: options.tableCreator(bot, "presences"), - // threads: options.tableCreator(bot, "threads"), - unavailableGuilds: options.tableCreator(bot, "unavailableGuilds"), - dispatchedGuildIds: new Set(), - dispatchedChannelIds: new Set(), - activeGuildIds: new Set(), - unrepliedInteractions: new Set(), - fetchAllMembersProcessingRequests: new Map(), - } as Cache; - - cache.execute = createExecute(cache); - } - - // Interaction sweeper in case users don't reply do slash commands - // PS: always reply .-. its good practise - // setInterval(() => { - // const values = cache.unrepliedInteractions.values(); - // const now = Date.now(); - // for (let val; (val = values.next().value); ) { - // // Interaction is older than 15 minutes - // // and a reply has never been send - // // so remove it from cache - // // PS: DON'T USE THIS CODE TO CONVERT DC SNOWFLAKES TO UNIX - // // SINCE U WILL GET AN INVALID RESULT - // if ((val >> 22n) + 1420071300000n < now) { - // cache.unrepliedInteractions.delete(val); - // } - // } - // }, 300000); - - return cache; -} - -export type CachedDiscordenoUser = DiscordenoUser & { guilds: Map }; - -export interface Cache { - guilds: CacheHandler; - users: CacheHandler; - members: CacheHandler; - channels: CacheHandler; - messages: CacheHandler; - presences: CacheHandler; - // threads: CacheHandler; - unavailableGuilds: CacheHandler; - dispatchedGuildIds: Set; - dispatchedChannelIds: Set; - activeGuildIds: Set; - unrepliedInteractions: Set; - fetchAllMembersProcessingRequests: Map; - execute: CacheExecutor; -} - -export interface CachedUnavailableGuild { - shardId: number; - since: number; - dispatched?: true; -} - -export interface AsyncCache { - guilds: AsyncCacheHandler; - users: AsyncCacheHandler; - members: CacheHandler; - channels: AsyncCacheHandler; - messages: AsyncCacheHandler; - presences: AsyncCacheHandler; - // threads: AsyncCacheHandler; - unavailableGuilds: AsyncCacheHandler; - dispatchedGuildIds: AsyncCacheHandler; - dispatchedChannelIds: AsyncCacheHandler; - activeGuildIds: AsyncCacheHandler; - unrepliedInteractions: Set; - fetchAllMembersProcessingRequests: Map; - execute: CacheExecutor; -} - -function createTable(bot: Bot, _table: TableNames): CacheHandler { - const table = new Collection(); - - // @ts-ignore TODO: fix type error itoh pwease - if (_table === "guilds") table.startSweeper({ filter: guildSweeper, interval: 3660000, bot }); - // @ts-ignore TODO: fix type error itoh pwease - if (_table === "channels") table.startSweeper({ filter: channelSweeper, interval: 3660000, bot }); - // @ts-ignore TODO: fix type error itoh pwease - if (_table === "messages") table.startSweeper({ filter: messageSweeper, interval: 300000, bot }); - // @ts-ignore TODO: fix type error itoh pwease - if (_table === "members") table.startSweeper({ filter: memberSweeper, interval: 300000, bot }); - if (_table === "presences") table.startSweeper({ filter: () => true, interval: 300000, bot }); - - return { - clear: () => table.clear(), - delete: (key) => table.delete(key), - has: (key) => table.has(key), - size: () => table.size, - set: (key, data) => !!table.set(key, data), - get: (key) => table.get(key), - forEach: (callback) => table.forEach(callback), - filter: (callback) => table.filter(callback), - }; -} - -export interface CacheHandler { - /** Completely empty this table. */ - clear(): void; - /** Delete the data related to this key from table. */ - delete(key: bigint): boolean; - /** Check if there is data assigned to this key. */ - has(key: bigint): boolean; - /** Check how many items are stored in this table. */ - size(): number; - /** Store new data to this table. */ - set(key: bigint, data: T): boolean; - /** Get a stored item from the table. */ - get(key: bigint): T | undefined; - // TODO: maybe its possible to stringify the function and send it to the custom cache handler :thinking: - /** - * Loop over each entry and execute callback function. - * @important This function NOT optimised and will force load everything when using custom cache. - */ - forEach(callback: (value: T, key: bigint) => unknown): void; - // TODO: maybe its possible to stringify the function and send it to the custom cache handler :thinking: - /** - * Loop over each entry and execute callback function. - * @important This function NOT optimised and will force load everything when using custom cache. - */ - filter(callback: (value: T, key: bigint) => boolean): Collection; -} - -export type AsyncCacheHandler = { - [K in keyof CacheHandler]: (...args: Parameters[K]>) => Promise[K]>>; -}; - -export type CacheExecutor = ( - type: - | "GET_ALL_MEMBERS" - | "DELETE_MESSAGES_FROM_CHANNEL" - | "DELETE_ROLE_FROM_MEMBER" - | "BULK_DELETE_MESSAGES" - | "GUILD_MEMBER_CHUNK" - | "GUILD_MEMBER_COUNT_DECREMENT" - | "GUILD_MEMBER_COUNT_INCREMENT" - | "DELETE_MESSAGES_FROM_GUILD" - | "DELETE_CHANNELS_FROM_GUILD" - | "DELETE_GUILD_FROM_MEMBER", - options: Record -) => Promise; - -export function createExecute(cache: Cache): CacheExecutor { - return function (type, options) { - switch (type) { - case "DELETE_MESSAGES_FROM_CHANNEL": - cache.messages.forEach((message) => { - if (message.channelId === options.channelId) { - cache.messages.delete(message.id); - } - }); - return; - case "BULK_DELETE_MESSAGES": - return options.messageIds - .map((id: bigint) => { - const cached = cache.messages.get(id); - if (!cached) return; - - cache.messages.delete(id); - - return cached; - }) - .filter((m: DiscordenoMessage) => m); - case "GUILD_MEMBER_CHUNK": - options.users.forEach((user: DiscordenoUser) => { - cache.users.set(user.id, user); - }); - // TODO: FIND A GOOD WAY FOR MEMBERS CACHE (GUILD ID) - // options.members.forEach((member) => { - // cache.members.set(member.id, member); - // }); - return; - } - }; -} - -export type TableNames = - | "channels" - | "users" - | "guilds" - | "messages" - | "presences" - | "threads" - | "unavailableGuilds" - | "members" - | "dispatchedGuildIds" - | "dispatchedChannelIds" - | "activeGuildIds"; diff --git a/src/handlers/channels/THREAD_DELETE.ts b/src/handlers/channels/THREAD_DELETE.ts index 82e41d922..763b52218 100644 --- a/src/handlers/channels/THREAD_DELETE.ts +++ b/src/handlers/channels/THREAD_DELETE.ts @@ -1,5 +1,3 @@ -// import { eventHandlers } from "../../bot.ts"; -// import { cacheHandlers } from "../../cache.ts"; import { Channel } from "../../types/channels/channel.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gatewayPayload.ts"; import { snowflakeToBigint } from "../../util/bigint.ts"; diff --git a/src/handlers/channels/THREAD_LIST_SYNC.ts b/src/handlers/channels/THREAD_LIST_SYNC.ts index 407b2e4b5..7ef76ed53 100644 --- a/src/handlers/channels/THREAD_LIST_SYNC.ts +++ b/src/handlers/channels/THREAD_LIST_SYNC.ts @@ -1,11 +1,7 @@ -// import { eventHandlers } from "../../bot.ts"; -// import { cacheHandlers } from "../../cache.ts"; import { ThreadListSync } from "../../types/channels/threads/threadListSync.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gatewayPayload.ts"; import { snowflakeToBigint } from "../../util/bigint.ts"; -// import { channelToThread } from "../../util/transformers/channel_to_thread.ts"; import { Collection } from "../../util/collection.ts"; -// import { threadMemberModified } from "../../util/transformers/thread_member_modified.ts"; export async function handleThreadListSync(data: DiscordGatewayPayload) { // const payload = data.d as ThreadListSync; diff --git a/src/handlers/channels/THREAD_MEMBERS_UPDATE.ts b/src/handlers/channels/THREAD_MEMBERS_UPDATE.ts index ef2a7a139..bb6649510 100644 --- a/src/handlers/channels/THREAD_MEMBERS_UPDATE.ts +++ b/src/handlers/channels/THREAD_MEMBERS_UPDATE.ts @@ -1,9 +1,6 @@ -// import { eventHandlers } from "../../bot.ts"; -// import { cacheHandlers } from "../../cache.ts"; import { ThreadMembersUpdate } from "../../types/channels/threads/threadMembersUpdate.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gatewayPayload.ts"; import { snowflakeToBigint } from "../../util/bigint.ts"; -// import { threadMembersUpdateModified } from "../../util/transformers/thread_members_update_modified.ts"; export async function handleThreadMembersUpdate(data: DiscordGatewayPayload) { // const payload = data.d as ThreadMembersUpdate; diff --git a/src/handlers/channels/THREAD_MEMBER_UPDATE.ts b/src/handlers/channels/THREAD_MEMBER_UPDATE.ts index be696bb7e..52dd7877c 100644 --- a/src/handlers/channels/THREAD_MEMBER_UPDATE.ts +++ b/src/handlers/channels/THREAD_MEMBER_UPDATE.ts @@ -1,5 +1,3 @@ -// import { eventHandlers } from "../../bot.ts"; -// import { cacheHandlers } from "../../cache.ts"; import { ThreadMember } from "../../types/channels/threads/threadMember.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gatewayPayload.ts"; import { snowflakeToBigint } from "../../util/bigint.ts"; diff --git a/src/handlers/channels/THREAD_UPDATE.ts b/src/handlers/channels/THREAD_UPDATE.ts index 41a61727a..d46e98153 100644 --- a/src/handlers/channels/THREAD_UPDATE.ts +++ b/src/handlers/channels/THREAD_UPDATE.ts @@ -1,9 +1,6 @@ -// import { eventHandlers } from "../../bot.ts"; -// import { cacheHandlers } from "../../cache.ts"; import { Channel } from "../../types/channels/channel.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gatewayPayload.ts"; import { snowflakeToBigint } from "../../util/bigint.ts"; -// import { channelToThread } from "../../util/transformers/channel_to_thread.ts"; export async function handleThreadUpdate(data: DiscordGatewayPayload) { // const payload = data.d as Channel; diff --git a/src/handlers/members/GUILD_MEMBER_ADD.ts b/src/handlers/members/GUILD_MEMBER_ADD.ts index 68e5aa38d..7ef44c978 100644 --- a/src/handlers/members/GUILD_MEMBER_ADD.ts +++ b/src/handlers/members/GUILD_MEMBER_ADD.ts @@ -8,12 +8,5 @@ export async function handleGuildMemberAdd(bot: Bot, data: DiscordGatewayPayload const guildId = bot.transformers.snowflake(payload.guild_id); const user = bot.transformers.user(bot, payload.user); const member = bot.transformers.member(bot, payload, guildId, user.id); - - await Promise.all([ - bot.cache.members.set(member.id, member), - bot.cache.users.set(user.id, user), - bot.cache.execute("GUILD_MEMBER_COUNT_INCREMENT", { guildId }), - ]); - bot.events.guildMemberAdd(bot, member, user); } diff --git a/src/handlers/members/GUILD_MEMBER_REMOVE.ts b/src/handlers/members/GUILD_MEMBER_REMOVE.ts index 3d1b6e39d..9d1eab357 100644 --- a/src/handlers/members/GUILD_MEMBER_REMOVE.ts +++ b/src/handlers/members/GUILD_MEMBER_REMOVE.ts @@ -2,17 +2,11 @@ import { Bot } from "../../bot.ts"; import type { DiscordGatewayPayload } from "../../types/gateway/gatewayPayload.ts"; import type { GuildMemberRemove } from "../../types/members/guildMemberRemove.ts"; import { SnakeCasedPropertiesDeep } from "../../types/util.ts"; -import { snowflakeToBigint } from "../../util/bigint.ts"; export async function handleGuildMemberRemove(bot: Bot, data: DiscordGatewayPayload) { const payload = data.d as SnakeCasedPropertiesDeep; const guildId = bot.transformers.snowflake(payload.guild_id); const user = bot.transformers.user(bot, payload.user); - await Promise.all([ - bot.cache.members.delete(user.id), - bot.cache.execute("GUILD_MEMBER_COUNT_DECREMENT", { guildId }), - ]); - bot.events.guildMemberRemove(bot, user, guildId); } diff --git a/src/helpers/emojis/getEmoji.ts b/src/helpers/emojis/getEmoji.ts index 4b7b66e64..ad65f0642 100644 --- a/src/helpers/emojis/getEmoji.ts +++ b/src/helpers/emojis/getEmoji.ts @@ -4,8 +4,6 @@ import type { Bot } from "../../bot.ts"; /** * Returns an emoji for the given guild and emoji Id. - * - * ⚠️ **If you need this, you are probably doing something wrong. Always use cache.guilds.get()?.emojis */ export async function getEmoji(bot: Bot, guildId: bigint, emojiId: bigint, addToCache = true) { return await bot.rest.runMethod(bot.rest, "get", bot.constants.endpoints.GUILD_EMOJI(guildId, emojiId)); diff --git a/src/helpers/emojis/getEmojis.ts b/src/helpers/emojis/getEmojis.ts index 6e229869e..8d7e6c17e 100644 --- a/src/helpers/emojis/getEmojis.ts +++ b/src/helpers/emojis/getEmojis.ts @@ -6,7 +6,6 @@ import { Collection } from "../../util/collection.ts"; /** * Returns a list of emojis for the given guild. * - * ⚠️ **If you need this, you are probably doing something wrong. Always use cache.guilds.get()?.emojis */ export async function getEmojis(bot: Bot, guildId: bigint, addToCache = true) { const result = await bot.rest.runMethod(bot.rest, "get", bot.constants.endpoints.GUILD_EMOJIS(guildId)); diff --git a/src/helpers/guilds/getGuild.ts b/src/helpers/guilds/getGuild.ts index 2ab3ac409..bce016944 100644 --- a/src/helpers/guilds/getGuild.ts +++ b/src/helpers/guilds/getGuild.ts @@ -2,9 +2,6 @@ import type { Guild } from "../../types/guilds/guild.ts"; import type { Bot } from "../../bot.ts"; /** - * ⚠️ **If you need this, you are probably doing something wrong. Always use cache.guilds.get() - * - * Advanced Devs: * This function fetches a guild's data. This is not the same data as a GUILD_CREATE. * So it does not cache the guild, you must do it manually. * */ diff --git a/src/helpers/members/fetchMembers.ts b/src/helpers/members/fetchMembers.ts index eaa38ef08..f941bdcdd 100644 --- a/src/helpers/members/fetchMembers.ts +++ b/src/helpers/members/fetchMembers.ts @@ -6,9 +6,6 @@ import { GatewayOpcodes } from "../../types/codes/gatewayOpcodes.ts"; import type { DiscordenoMember } from "../../transformers/member.ts"; /** - * ⚠️ BEGINNER DEVS!! YOU SHOULD ALMOST NEVER NEED THIS AND YOU CAN GET FROM cache.members.get() - * - * ADVANCED: * Highly recommended to use this function to fetch members instead of getMember from REST. * REST: 50/s global(across all shards) rate limit with ALL requests this included * GW(this function): 120/m(PER shard) rate limit. Meaning if you have 8 shards your limit is now 960/m. diff --git a/src/helpers/members/getMembers.ts b/src/helpers/members/getMembers.ts index 0da8fc150..da97f8acf 100644 --- a/src/helpers/members/getMembers.ts +++ b/src/helpers/members/getMembers.ts @@ -5,9 +5,6 @@ import { Collection } from "../../util/collection.ts"; import type { DiscordenoMember } from "../../transformers/member.ts"; /** - * ⚠️ BEGINNER DEVS!! YOU SHOULD ALMOST NEVER NEED THIS AND YOU CAN GET FROM cache.members.get() - * - * ADVANCED: * Highly recommended to **NOT** use this function to get members instead use fetchMembers(). * REST(this function): 50/s global(across all shards) rate limit with ALL requests this included * GW(fetchMembers): 120/m(PER shard) rate limit. Meaning if you have 8 shards your limit is 960/m. diff --git a/src/helpers/members/searchMembers.ts b/src/helpers/members/searchMembers.ts index 96d83bd1c..02d31dd71 100644 --- a/src/helpers/members/searchMembers.ts +++ b/src/helpers/members/searchMembers.ts @@ -4,11 +4,7 @@ import { Collection } from "../../util/collection.ts"; import { Bot } from "../../bot.ts"; /** - * ⚠️ BEGINNER DEVS!! YOU SHOULD ALMOST NEVER NEED THIS AND YOU CAN GET FROM cache.members.filter() - * @param bot - * @param guildId - * @param query Query string to match username(s) and nickname(s) against - * @param options + * Query string to match username(s) and nickname(s) against */ export async function searchMembers( bot: Bot, diff --git a/src/helpers/messages/deleteMessage.ts b/src/helpers/messages/deleteMessage.ts index 043361767..a828b8698 100644 --- a/src/helpers/messages/deleteMessage.ts +++ b/src/helpers/messages/deleteMessage.ts @@ -1,4 +1,3 @@ -// import { cacheHandlers } from "../../cache.ts"; import type { Bot } from "../../bot.ts"; /** Delete a message with the channel id and message id only. */ From 4de1e60dc61ff22611e988e9ebc1226a5f71d6c4 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Wed, 1 Dec 2021 18:43:38 +0000 Subject: [PATCH 017/104] chore: rc7 --- src/util/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/constants.ts b/src/util/constants.ts index 8d979b6b5..47bad9bc6 100644 --- a/src/util/constants.ts +++ b/src/util/constants.ts @@ -9,7 +9,7 @@ export const GATEWAY_VERSION = 9; // TODO: update this version /** https://github.com/discordeno/discordeno/releases */ -export const DISCORDENO_VERSION = "13.0.0-rc6"; +export const DISCORDENO_VERSION = "13.0.0-rc7"; /** https://discord.com/developers/docs/reference#user-agent */ export const USER_AGENT = `DiscordBot (https://github.com/discordeno/discordeno, v${DISCORDENO_VERSION})`; From 204c6b03f613b0c79db234e799575f7a6783c27d Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Wed, 1 Dec 2021 19:00:58 +0000 Subject: [PATCH 018/104] fix: guild emoji type & rc8 --- src/transformers/guild.ts | 8 ++++++-- src/util/constants.ts | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/transformers/guild.ts b/src/transformers/guild.ts index 5cf9c208e..4860948d5 100644 --- a/src/transformers/guild.ts +++ b/src/transformers/guild.ts @@ -5,6 +5,7 @@ import { Collection } from "../util/collection.ts"; import { DiscordenoRole } from "./role.ts"; import { DiscordenoVoiceState } from "./voiceState.ts"; import { SnakeCasedPropertiesDeep } from "../types/util.ts"; +import { DiscordenoEmoji } from "./emoji.ts"; export function transformGuild( bot: Bot, @@ -77,7 +78,10 @@ export function transformGuild( return [result.id, result]; }) ), - emojis: new Collection((payload.guild.emojis || []).map((emoji) => [bot.transformers.snowflake(emoji.id!), emoji])), + emojis: new Collection((payload.guild.emojis || []).map((emoji) => { + const em = bot.transformers.emoji(bot, emoji); + return [em.id!, em] + })), voiceStates: new Collection( (payload.guild.voice_states || []) .map((vs) => bot.transformers.voiceState(bot, { voiceState: vs, guildId })) @@ -162,7 +166,7 @@ export interface DiscordenoGuild /** The Voice State data for each user in a voice channel in this server. */ voiceStates: Collection; /** Custom guild emojis */ - emojis: Collection; + emojis: Collection; /** Holds all the boolean toggles. */ bitfield: bigint; /** When this guild was joined at */ diff --git a/src/util/constants.ts b/src/util/constants.ts index 47bad9bc6..9d1dc5d0e 100644 --- a/src/util/constants.ts +++ b/src/util/constants.ts @@ -9,7 +9,7 @@ export const GATEWAY_VERSION = 9; // TODO: update this version /** https://github.com/discordeno/discordeno/releases */ -export const DISCORDENO_VERSION = "13.0.0-rc7"; +export const DISCORDENO_VERSION = "13.0.0-rc8"; /** https://discord.com/developers/docs/reference#user-agent */ export const USER_AGENT = `DiscordBot (https://github.com/discordeno/discordeno, v${DISCORDENO_VERSION})`; From 5d0aa6f014d20470e9033d1b8f99e83941705782 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Wed, 1 Dec 2021 20:25:20 +0000 Subject: [PATCH 019/104] fix: collection filters & rc9 --- src/util/collection.ts | 8 ++++---- src/util/constants.ts | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/util/collection.ts b/src/util/collection.ts index daad789cc..d9bf68ce9 100644 --- a/src/util/collection.ts +++ b/src/util/collection.ts @@ -18,8 +18,8 @@ export class Collection extends Map { this.sweeper = options; this.sweeper.intervalId = setInterval(() => { - this.map(async (value, key) => { - if (!(await this.sweeper?.filter(options.bot!, value, key))) return; + this.forEach((value, key) => { + if (!this.sweeper?.filter(value, key, options.bot)) return; this.delete(key); return key; @@ -39,7 +39,7 @@ export class Collection extends Map { this.startSweeper({ filter: this.sweeper.filter, interval: newInterval }); } - changeSweeperFilter(newFilter: (bot: Bot, value: V, key: K) => boolean | Promise) { + changeSweeperFilter(newFilter: (value: V, key: K, bot: Bot) => boolean) { if (!this.sweeper) return; this.startSweeper({ filter: newFilter, interval: this.sweeper.interval }); @@ -136,7 +136,7 @@ interface CollectionOptions { interface CollectionSweeper { /** The filter to determine whether an element should be deleted or not */ - filter: (bot: Bot, value: V, key: K) => boolean | Promise; + filter: (value: V, key: K, ...args: any[]) => boolean; /** The interval in which the sweeper should run */ interval: number; /** The bot object itself */ diff --git a/src/util/constants.ts b/src/util/constants.ts index 9d1dc5d0e..7e5905d59 100644 --- a/src/util/constants.ts +++ b/src/util/constants.ts @@ -9,7 +9,8 @@ export const GATEWAY_VERSION = 9; // TODO: update this version /** https://github.com/discordeno/discordeno/releases */ -export const DISCORDENO_VERSION = "13.0.0-rc8"; +export const DISCORDENO_VERSION = "13.0.0-rc9"; + /** https://discord.com/developers/docs/reference#user-agent */ export const USER_AGENT = `DiscordBot (https://github.com/discordeno/discordeno, v${DISCORDENO_VERSION})`; From 0b3f149e90c13aa65addae222ece5503d28885ca Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Wed, 1 Dec 2021 22:24:01 +0000 Subject: [PATCH 020/104] fix: bot type and tests bot.cache.x --- mod.ts | 2 +- src/bot.ts | 4 ---- tests/deps.ts | 2 +- tests/emoji/createEmoji.ts | 12 +++++----- tests/emoji/deleteEmojiWithReason.ts | 8 +++---- tests/emoji/deleteEmojiWithoutReason.ts | 20 ++++++++--------- tests/emoji/editEmoji.ts | 11 ++++------ tests/emoji/getEmoji.ts | 6 ++--- tests/emoji/getMultipleEmojis.ts | 4 ++-- tests/helpers/channels/categoryChannels.ts | 10 ++++----- .../channels/channelOverwriteHasPermission.ts | 16 +++++--------- tests/helpers/channels/cloneChannel.ts | 4 ++-- tests/helpers/channels/createChannel.ts | 12 +++++++--- tests/helpers/channels/deleteChannel.ts | 10 ++++----- .../channels/deleteChannelOverwrite.ts | 22 ++++++++----------- tests/helpers/channels/editChannel.ts | 16 +++++--------- tests/helpers/emojis/createEmoji.ts | 4 ++-- tests/helpers/emojis/deleteEmoji.ts | 8 +++---- tests/helpers/emojis/getEmoji.ts | 10 ++++----- tests/helpers/emojis/getEmojis.ts | 4 ++-- tests/helpers/guilds/createGuild.ts | 4 ++-- tests/helpers/guilds/deleteGuild.ts | 8 +++---- tests/helpers/guilds/editGuild.ts | 4 ++-- tests/helpers/messages/deleteMessage.ts | 8 +++---- tests/helpers/messages/deleteMessages.ts | 8 +++---- tests/helpers/messages/editMessage.ts | 8 +++---- tests/helpers/messages/getMessage.ts | 4 ++-- tests/helpers/messages/getMessages.ts | 11 ++-------- tests/helpers/messages/reactions.ts | 18 +++++++-------- tests/helpers/messages/sendMessage.ts | 4 ++-- tests/helpers/roles/createRole.ts | 12 +++------- tests/helpers/roles/deleteRole.ts | 16 +++++--------- tests/helpers/roles/editRole.ts | 11 +++++----- tests/helpers/roles/getRoles.ts | 5 ++--- tests/helpers/roles/roleChanges.ts | 16 ++++---------- tests/members/ban.ts | 2 +- tests/mod.ts | 20 +++++++---------- tests/role/addRole.ts | 5 ++--- tests/role/createRoleWithReason.ts | 4 ++-- tests/role/createRoleWithoutReason.ts | 4 ++-- tests/role/deleteRoleWithReason.ts | 8 +++---- tests/role/deleteRoleWithoutReason.ts | 8 +++---- tests/role/editRole.ts | 10 ++++----- tests/role/getAllRoles.ts | 2 +- tests/role/removeRole.ts | 4 ++-- 45 files changed, 170 insertions(+), 219 deletions(-) diff --git a/mod.ts b/mod.ts index d2938537f..df3b4248f 100644 --- a/mod.ts +++ b/mod.ts @@ -5,4 +5,4 @@ export * from "./src/rest/mod.ts"; export * from "./src/transformers/mod.ts"; export * from "./src/types/mod.ts"; export * from "./src/util/mod.ts"; -export * from "./src/ws/mod.ts"; \ No newline at end of file +export * from "./src/ws/mod.ts"; diff --git a/src/bot.ts b/src/bot.ts index 68bd967a8..ea22ed72a 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -395,10 +395,6 @@ export interface CreateBotOptions { botGatewayData?: GetGatewayBot; rest?: Omit; handleDiscordPayload?: GatewayManager["handleDiscordPayload"]; - cache: { - unrepliedInteractions: Set; - fetchAllMembersProcessingRequests: Map; - }; utils?: Partial>; transformers?: Partial>; helpers?: Partial; diff --git a/tests/deps.ts b/tests/deps.ts index c9506d36d..d913a2991 100644 --- a/tests/deps.ts +++ b/tests/deps.ts @@ -6,4 +6,4 @@ export { assertThrows, assertThrowsAsync } from "https://deno.land/std@0.115.1/testing/asserts.ts"; -export * from "https://deno.land/x/discordeno_cache_plugin@0.0.9/mod.ts"; +export * from "https://deno.land/x/discordeno_cache_plugin@0.0.11/mod.ts"; diff --git a/tests/emoji/createEmoji.ts b/tests/emoji/createEmoji.ts index da7f8ca32..595fb4140 100644 --- a/tests/emoji/createEmoji.ts +++ b/tests/emoji/createEmoji.ts @@ -1,5 +1,5 @@ import { assertExists } from "../deps.ts"; -import { bot,guild } from "../mod.ts"; +import { bot, guild } from "../mod.ts"; import { delayUntil } from "../utils.ts"; Deno.test({ @@ -10,14 +10,14 @@ Deno.test({ image: "https://cdn.discordapp.com/emojis/814955268123000832.png", roles: [], }); - + // Assertions assertExists(emoji); - + // Delay the execution to allow event to be processed - await delayUntil(10000, async () => bot.cache.guilds.get(guild.id)?.emojis?.has(emoji.id)); - - if (!bot.cache.guilds.get(guild.id)?.emojis?.has(emoji.id)) { + await delayUntil(10000, async () => bot.guilds.get(guild.id)?.emojis?.has(emoji.id)); + + if (!bot.guilds.get(guild.id)?.emojis?.has(emoji.id)) { throw new Error("The emoji seemed to be created but it was not cached."); } }, diff --git a/tests/emoji/deleteEmojiWithReason.ts b/tests/emoji/deleteEmojiWithReason.ts index c95bb1ba4..b54549541 100644 --- a/tests/emoji/deleteEmojiWithReason.ts +++ b/tests/emoji/deleteEmojiWithReason.ts @@ -15,17 +15,17 @@ Deno.test({ assertExists(emoji); // Delay the execution to allow event to be processed - await delayUntil(10000, async () => bot.cache.guilds.get(guild.id)?.emojis?.has(emoji.id)); + await delayUntil(10000, async () => bot.guilds.get(guild.id)?.emojis?.has(emoji.id)); - if (!bot.cache.guilds.get(guild.id)?.emojis?.has(emoji.id)) { + if (!bot.guilds.get(guild.id)?.emojis?.has(emoji.id)) { throw new Error("The emoji seemed to be created but it was not cached."); } await bot.helpers.deleteEmoji(guild.id, emoji.id, "with a reason"); - await delayUntil(10000, async () => !bot.cache.guilds.get(guild.id)?.emojis?.has(emoji.id)); + await delayUntil(10000, async () => !bot.guilds.get(guild.id)?.emojis?.has(emoji.id)); - if (bot.cache.guilds.get(guild.id)?.emojis?.has(emoji.id)) { + if (bot.guilds.get(guild.id)?.emojis?.has(emoji.id)) { throw new Error("The emoji seemed to be deleted but it's still cached."); } }, diff --git a/tests/emoji/deleteEmojiWithoutReason.ts b/tests/emoji/deleteEmojiWithoutReason.ts index 75c91c10a..341ff180a 100644 --- a/tests/emoji/deleteEmojiWithoutReason.ts +++ b/tests/emoji/deleteEmojiWithoutReason.ts @@ -10,22 +10,22 @@ Deno.test({ image: "https://cdn.discordapp.com/emojis/814955268123000832.png", roles: [], }); - + // Assertions assertExists(emoji); - + // Delay the execution to allow event to be processed - await delayUntil(10000, async () => bot.cache.guilds.get(guild.id)?.emojis?.has(emoji.id)); - - if (!bot.cache.guilds.get(guild.id)?.emojis?.has(emoji.id)) { + await delayUntil(10000, async () => bot.guilds.get(guild.id)?.emojis?.has(emoji.id)); + + if (!bot.guilds.get(guild.id)?.emojis?.has(emoji.id)) { throw new Error("The emoji seemed to be created but it was not cached."); } - + await bot.helpers.deleteEmoji(guild.id, emoji.id); - - await delayUntil(10000, async () => !bot.cache.guilds.get(guild.id)?.emojis?.has(emoji.id)); - - if (bot.cache.guilds.get(guild.id)?.emojis?.has(emoji.id)) { + + await delayUntil(10000, async () => !bot.guilds.get(guild.id)?.emojis?.has(emoji.id)); + + if (bot.guilds.get(guild.id)?.emojis?.has(emoji.id)) { throw new Error("The emoji seemed to be deleted but it's still cached."); } }, diff --git a/tests/emoji/editEmoji.ts b/tests/emoji/editEmoji.ts index fd226138d..0351e5dad 100644 --- a/tests/emoji/editEmoji.ts +++ b/tests/emoji/editEmoji.ts @@ -15,9 +15,9 @@ Deno.test({ assertExists(emoji); // Delay the execution to allow event to be processed - await delayUntil(10000, async () => bot.cache.guilds.get(guild.id)?.emojis?.has(emoji.id)); + await delayUntil(10000, async () => bot.guilds.get(guild.id)?.emojis?.has(emoji.id)); - if (!bot.cache.guilds.get(guild.id)?.emojis?.has(emoji.id)) { + if (!bot.guilds.get(guild.id)?.emojis?.has(emoji.id)) { throw new Error("The emoji seemed to be created but it was not cached."); } @@ -25,12 +25,9 @@ Deno.test({ name: "blamewolf_infinite", }); - await delayUntil( - 10000, - async () => bot.cache.guilds.get(guild.id)?.emojis?.get(emoji.id)?.name === "blamewolf_infinite" - ); + await delayUntil(10000, async () => bot.guilds.get(guild.id)?.emojis?.get(emoji.id)?.name === "blamewolf_infinite"); - if (bot.cache.guilds.get(guild.id)?.emojis?.get(emoji.id)?.name !== "blamewolf_infinite") { + if (bot.guilds.get(guild.id)?.emojis?.get(emoji.id)?.name !== "blamewolf_infinite") { throw new Error("The emoji seemed to be edited but the cache was not updated."); } }, diff --git a/tests/emoji/getEmoji.ts b/tests/emoji/getEmoji.ts index 2f93849a1..cf3c1fd5e 100644 --- a/tests/emoji/getEmoji.ts +++ b/tests/emoji/getEmoji.ts @@ -15,13 +15,13 @@ Deno.test({ assertExists(emoji); // Delay the execution to allow event to be processed - await delayUntil(10000, async () => bot.cache.guilds.get(guild.id)?.emojis?.has(emoji.id)); + await delayUntil(10000, async () => bot.guilds.get(guild.id)?.emojis?.has(emoji.id)); - if (!bot.cache.guilds.get(guild.id)?.emojis?.has(emoji.id)) { + if (!bot.guilds.get(guild.id)?.emojis?.has(emoji.id)) { throw new Error("The emoji seemed to be created but it was not cached."); } - bot.cache.guilds.get(guild.id)?.emojis?.delete(emoji.id); + bot.guilds.get(guild.id)?.emojis?.delete(emoji.id); const getEmoji = await bot.helpers.getEmoji(guild.id, emoji.id, true); diff --git a/tests/emoji/getMultipleEmojis.ts b/tests/emoji/getMultipleEmojis.ts index abdf01131..14d8baefd 100644 --- a/tests/emoji/getMultipleEmojis.ts +++ b/tests/emoji/getMultipleEmojis.ts @@ -15,9 +15,9 @@ Deno.test({ assertExists(emoji); // Delay the execution to allow event to be processed - await delayUntil(10000, async () => bot.cache.guilds.get(guild.id)?.emojis?.has(emoji.id)); + await delayUntil(10000, async () => bot.guilds.get(guild.id)?.emojis?.has(emoji.id)); - if (!bot.cache.guilds.get(guild.id)?.emojis?.has(emoji.id)) { + if (!bot.guilds.get(guild.id)?.emojis?.has(emoji.id)) { throw new Error("The emoji seemed to be created but it was not cached."); } diff --git a/tests/helpers/channels/categoryChannels.ts b/tests/helpers/channels/categoryChannels.ts index d6d3c4bb4..a73f6f1c8 100644 --- a/tests/helpers/channels/categoryChannels.ts +++ b/tests/helpers/channels/categoryChannels.ts @@ -12,9 +12,9 @@ export async function categoryChildrenTest(bot: Bot, guildId: bigint, t: Deno.Te // Assertions assertExists(category); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.channels.has(category.id)); + await delayUntil(10000, () => bot.channels.has(category.id)); - assertExists(bot.cache.channels.has(category.id)); + assertExists(bot.channels.has(category.id)); const channelsToCreate = [1, 2, 3, 4, 5]; const channels = await Promise.all( @@ -26,14 +26,14 @@ export async function categoryChildrenTest(bot: Bot, guildId: bigint, t: Deno.Te ) ); // Delay the execution to allow event to be processed - await delayUntil(10000, () => channels.every((c) => bot.cache.channels.has(c.id))); + await delayUntil(10000, () => channels.every((c) => bot.channels.has(c.id))); // If every channel is not present in the cache, error out - if (!channels.every((c) => bot.cache.channels.has(c.id))) { + if (!channels.every((c) => bot.channels.has(c.id))) { throw new Error("The channels seemed to be created but it was not cached."); } - // const ids = bot.cache.channels.filter((c) => c.parentId === category.id); + // const ids = bot.channels.filter((c) => c.parentId === category.id); // if (ids.size !== channels.length || !channels.every((c) => ids.has(c.id))) { // console.log("cccc 1", ids.size, channels.length); // console.log( diff --git a/tests/helpers/channels/channelOverwriteHasPermission.ts b/tests/helpers/channels/channelOverwriteHasPermission.ts index d7d2b3f64..6749e14d5 100644 --- a/tests/helpers/channels/channelOverwriteHasPermission.ts +++ b/tests/helpers/channels/channelOverwriteHasPermission.ts @@ -1,9 +1,8 @@ import { Bot, createChannel, ChannelTypes, channelOverwriteHasPermission, OverwriteTypes } from "../../../mod.ts"; -import { Cache } from "../../../src/cache.ts"; import { assertExists, assertEquals } from "../../deps.ts"; import { delayUntil } from "../../utils.ts"; -export async function channelOverwriteHasPermissionTest(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function channelOverwriteHasPermissionTest(bot: Bot, guildId: bigint, t: Deno.TestContext) { const channel = await bot.helpers.createChannel(guildId, { name: "Discordeno-test", permissionOverwrites: [ @@ -21,21 +20,18 @@ export async function channelOverwriteHasPermissionTest(bot: Bot, guildId assertEquals(channel.type, ChannelTypes.GuildText); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.channels.has(channel.id)); + await delayUntil(10000, () => bot.channels.has(channel.id)); - if (!bot.cache.channels.has(channel.id)) { + if (!bot.channels.has(channel.id)) { throw new Error("The channel seemed to be created but it was not cached."); } assertEquals(channel.permissionOverwrites.length, 1); assertEquals( - channelOverwriteHasPermission( - channel.guildId, - bot.id, - bot.cache.channels.get(channel.id)?.permissionOverwrites || [], - ["VIEW_CHANNEL"] - ), + channelOverwriteHasPermission(channel.guildId, bot.id, bot.channels.get(channel.id)?.permissionOverwrites || [], [ + "VIEW_CHANNEL", + ]), true ); } diff --git a/tests/helpers/channels/cloneChannel.ts b/tests/helpers/channels/cloneChannel.ts index 4958d183e..56e146df2 100644 --- a/tests/helpers/channels/cloneChannel.ts +++ b/tests/helpers/channels/cloneChannel.ts @@ -17,9 +17,9 @@ export async function cloneChannelTests( assertEquals(cloned.type, channel.type); // Delay the execution to allow CHANNEL_CREATE event to be processed - await delayUntil(10000, () => bot.cache.channels.has(cloned.id)); + await delayUntil(10000, () => bot.channels.has(cloned.id)); - assertExists(bot.cache.channels.has(cloned.id)); + assertExists(bot.channels.has(cloned.id)); assertEquals(channel.topic, cloned.topic); assertEquals(channel.bitrate, cloned.bitrate); assertEquals(channel.permissionOverwrites.length, cloned.permissionOverwrites.length); diff --git a/tests/helpers/channels/createChannel.ts b/tests/helpers/channels/createChannel.ts index 5c89244a1..4165c21fc 100644 --- a/tests/helpers/channels/createChannel.ts +++ b/tests/helpers/channels/createChannel.ts @@ -4,7 +4,13 @@ import { ChannelTypes } from "../../../src/types/mod.ts"; import { assertExists, assertEquals } from "../../deps.ts"; import { delayUntil } from "../../utils.ts"; -export async function createChannelTests(bot: Bot, guildId: bigint, options: CreateGuildChannel, autoDelete: boolean, t: Deno.TestContext) { +export async function createChannelTests( + bot: Bot, + guildId: bigint, + options: CreateGuildChannel, + autoDelete: boolean, + t: Deno.TestContext +) { const channel = await bot.helpers.createChannel(guildId, options); // Assertions @@ -12,9 +18,9 @@ export async function createChannelTests(bot: Bot, guildId: bigint, options: Cre assertEquals(channel.type, options.type || ChannelTypes.GuildText); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.channels.has(channel.id)); + await delayUntil(10000, () => bot.channels.has(channel.id)); - if (!bot.cache.channels.has(channel.id)) { + if (!bot.channels.has(channel.id)) { throw new Error("The channel seemed to be created but it was not cached."); } diff --git a/tests/helpers/channels/deleteChannel.ts b/tests/helpers/channels/deleteChannel.ts index 6ea30597b..2d8b0dde8 100644 --- a/tests/helpers/channels/deleteChannel.ts +++ b/tests/helpers/channels/deleteChannel.ts @@ -9,20 +9,20 @@ export async function deleteChannelTests(bot: Bot, guildId: bigint, options: { r name: "delete-channel", }); - await delayUntil(10000, () => bot.cache.channels.has(channel.id)); + await delayUntil(10000, () => bot.channels.has(channel.id)); // Make sure the channel was created. - if (!bot.cache.channels.has(channel.id)) { + if (!bot.channels.has(channel.id)) { throw new Error("The channel should have been created but it is not in the cache."); } const CHANNEL_DELETE = bot.handlers.CHANNEL_DELETE; - + // Delete the channel now without a reason await bot.helpers.deleteChannel(channel.id, options.reason); // wait to give it time for event - await delayUntil(10000, () => !bot.cache.channels.has(channel.id)); + await delayUntil(10000, () => !bot.channels.has(channel.id)); // Make sure it is gone from cache - if (bot.cache.channels.has(channel.id)) { + if (bot.channels.has(channel.id)) { throw new Error("The channel should have been deleted but it is still in cache."); } } diff --git a/tests/helpers/channels/deleteChannelOverwrite.ts b/tests/helpers/channels/deleteChannelOverwrite.ts index c4ce441b4..5e3ec0fcc 100644 --- a/tests/helpers/channels/deleteChannelOverwrite.ts +++ b/tests/helpers/channels/deleteChannelOverwrite.ts @@ -1,9 +1,8 @@ -import { Bot, createChannel, ChannelTypes, channelOverwriteHasPermission, OverwriteTypes } from "../../../mod.ts"; -import { Cache } from "../../../src/cache.ts"; +import { Bot, ChannelTypes, channelOverwriteHasPermission, OverwriteTypes } from "../../../mod.ts"; import { assertExists, assertEquals } from "../../deps.ts"; import { delayUntil } from "../../utils.ts"; -export async function deleteChannelOverwriteTests(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function deleteChannelOverwriteTests(bot: Bot, guildId: bigint, t: Deno.TestContext) { const channel = await bot.helpers.createChannel(guildId, { name: "Discordeno-test", permissionOverwrites: [ @@ -21,29 +20,26 @@ export async function deleteChannelOverwriteTests(bot: Bot, guildId: bigi assertEquals(channel.type, ChannelTypes.GuildText); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.channels.has(channel.id)); + await delayUntil(10000, () => bot.channels.has(channel.id)); - if (!bot.cache.channels.has(channel.id)) { + if (!bot.channels.has(channel.id)) { throw new Error("The channel seemed to be created but it was not cached."); } assertEquals(channel.permissionOverwrites.length, 1); assertEquals( - channelOverwriteHasPermission( - channel.guildId, - bot.id, - bot.cache.channels.get(channel.id)?.permissionOverwrites || [], - ["VIEW_CHANNEL"] - ), + channelOverwriteHasPermission(channel.guildId, bot.id, bot.channels.get(channel.id)?.permissionOverwrites || [], [ + "VIEW_CHANNEL", + ]), true ); await bot.helpers.deleteChannelOverwrite(channel.id, bot.id); - await delayUntil(10000, () => bot.cache.channels.get(channel.id)?.permissionOverwrites?.length === 0); + await delayUntil(10000, () => bot.channels.get(channel.id)?.permissionOverwrites?.length === 0); - if (bot.cache.channels.get(channel.id)?.permissionOverwrites?.length !== 0) { + if (bot.channels.get(channel.id)?.permissionOverwrites?.length !== 0) { throw new Error("The channel permission overwrite was supposed to be deleted but it does not appear to be."); } } diff --git a/tests/helpers/channels/editChannel.ts b/tests/helpers/channels/editChannel.ts index 4f9008712..906d935d0 100644 --- a/tests/helpers/channels/editChannel.ts +++ b/tests/helpers/channels/editChannel.ts @@ -1,22 +1,16 @@ import { Bot } from "../../../src/bot.ts"; -import { Cache } from "../../../src/cache.ts"; import { assertEquals } from "../../deps.ts"; import { delayUntil } from "../../utils.ts"; -export async function editChannelTests( - bot: Bot, - guildId: bigint, - options: { reason?: string }, - t: Deno.TestContext -) { +export async function editChannelTests(bot: Bot, guildId: bigint, options: { reason?: string }, t: Deno.TestContext) { // Create the necessary channels const channel = await bot.helpers.createChannel(guildId, { name: "edit-channel", }); // wait to give it time for events to process - await delayUntil(3000, () => bot.cache.channels.has(channel.id)); + await delayUntil(3000, () => bot.channels.has(channel.id)); // Make sure the channel was created. - if (!bot.cache.channels.has(channel.id)) { + if (!bot.channels.has(channel.id)) { throw new Error("The channel should have been created but it is not in the cache."); } @@ -31,6 +25,6 @@ export async function editChannelTests( ); // wait to give it time for events to process - await delayUntil(3000, () => bot.cache.channels.get(channel.id)?.name === "new-name"); - assertEquals(bot.cache.channels.get(channel.id)?.name, "new-name"); + await delayUntil(3000, () => bot.channels.get(channel.id)?.name === "new-name"); + assertEquals(bot.channels.get(channel.id)?.name, "new-name"); } diff --git a/tests/helpers/emojis/createEmoji.ts b/tests/helpers/emojis/createEmoji.ts index 438693988..b37381215 100644 --- a/tests/helpers/emojis/createEmoji.ts +++ b/tests/helpers/emojis/createEmoji.ts @@ -13,9 +13,9 @@ export async function createEmojiTest(bot: Bot, guildId: bigint, t: Deno.TestCon assertExists(emoji); // // Delay the execution to allow event to be processed - // await delayUntil(10000, async () => bot.cache.guilds.get(guildId)?.emojis?.has(emoji.id)); + // await delayUntil(10000, async () => bot.guilds.get(guildId)?.emojis?.has(emoji.id)); - // if (!bot.cache.guilds.get(guildId)?.emojis?.has(emoji.id)) { + // if (!bot.guilds.get(guildId)?.emojis?.has(emoji.id)) { // throw new Error("The emoji seemed to be created but it was not cached."); // } } diff --git a/tests/helpers/emojis/deleteEmoji.ts b/tests/helpers/emojis/deleteEmoji.ts index 02d148ef4..9ffacd639 100644 --- a/tests/helpers/emojis/deleteEmoji.ts +++ b/tests/helpers/emojis/deleteEmoji.ts @@ -13,17 +13,17 @@ export async function ifItFailsBlameWolf(bot: Bot, guildId: bigint, reason?: str assertExists(emoji); // Delay the execution to allow event to be processed - // await delayUntil(10000, async () => bot.cache.guilds.get(guildId)?.emojis?.has(emoji.id)); + // await delayUntil(10000, async () => bot.guilds.get(guildId)?.emojis?.has(emoji.id)); - // if (!bot.cache.guilds.get(guildId)?.emojis?.has(emoji.id)) { + // if (!bot.guilds.get(guildId)?.emojis?.has(emoji.id)) { // throw new Error("The emoji seemed to be created but it was not cached."); // } await bot.helpers.deleteEmoji(guildId, emoji.id, reason); - // await delayUntil(10000, async () => !bot.cache.guilds.get(guildId)?.emojis?.has(emoji.id)); + // await delayUntil(10000, async () => !bot.guilds.get(guildId)?.emojis?.has(emoji.id)); - // if (bot.cache.guilds.get(guildId)?.emojis?.has(emoji.id)) { + // if (bot.guilds.get(guildId)?.emojis?.has(emoji.id)) { // throw new Error("The emoji seemed to be deleted but it's still cached."); // } } diff --git a/tests/helpers/emojis/getEmoji.ts b/tests/helpers/emojis/getEmoji.ts index 2bf498239..7e86e0938 100644 --- a/tests/helpers/emojis/getEmoji.ts +++ b/tests/helpers/emojis/getEmoji.ts @@ -13,13 +13,13 @@ export async function getEmojiTest(bot: Bot, guildId: bigint, t: Deno.TestContex assertExists(emoji); // // Delay the execution to allow event to be processed - // await delayUntil(10000, async () => bot.cache.guilds.get(guildId)?.emojis?.has(emoji.id)); + // await delayUntil(10000, async () => bot.guilds.get(guildId)?.emojis?.has(emoji.id)); - // if (!bot.cache.guilds.get(guildId)?.emojis?.has(emoji.id)) { + // if (!bot.guilds.get(guildId)?.emojis?.has(emoji.id)) { // throw new Error("The emoji seemed to be created but it was not cached."); // } - // bot.cache.guilds.get(guildId)?.emojis?.delete(emoji.id); + // bot.guilds.get(guildId)?.emojis?.delete(emoji.id); // const getEmoji = await bot.helpers.getEmoji(guildId, emoji.id, true); @@ -27,9 +27,9 @@ export async function getEmojiTest(bot: Bot, guildId: bigint, t: Deno.TestContex // assertExists(getEmoji); // // Delay the execution to allow event to be processed - // await delayUntil(10000, async () => bot.cache.guilds.get(guildId)?.emojis?.has(emoji.id)); + // await delayUntil(10000, async () => bot.guilds.get(guildId)?.emojis?.has(emoji.id)); - // if (!bot.cache.guilds.get(guildId)?.emojis?.has(emoji.id)) { + // if (!bot.guilds.get(guildId)?.emojis?.has(emoji.id)) { // throw new Error("The emoji didn't got added to cache after using the getEmoji function."); // } } diff --git a/tests/helpers/emojis/getEmojis.ts b/tests/helpers/emojis/getEmojis.ts index 6affd6184..e95d47c80 100644 --- a/tests/helpers/emojis/getEmojis.ts +++ b/tests/helpers/emojis/getEmojis.ts @@ -13,9 +13,9 @@ export async function getEmojisTest(bot: Bot, guildId: bigint, t: Deno.TestConte assertExists(emoji); // // Delay the execution to allow event to be processed - // await delayUntil(10000, async () => bot.cache.guilds.get(guildId)?.emojis?.has(emoji.id)); + // await delayUntil(10000, async () => bot.guilds.get(guildId)?.emojis?.has(emoji.id)); - // if (!bot.cache.guilds.get(guildId)?.emojis?.has(emoji.id)) { + // if (!bot.guilds.get(guildId)?.emojis?.has(emoji.id)) { // throw new Error("The emoji seemed to be created but it was not cached."); // } diff --git a/tests/helpers/guilds/createGuild.ts b/tests/helpers/guilds/createGuild.ts index f9f31dd8b..4f397f486 100644 --- a/tests/helpers/guilds/createGuild.ts +++ b/tests/helpers/guilds/createGuild.ts @@ -13,9 +13,9 @@ export async function createGuildTests(bot: Bot, t: Deno.TestContext) { assertExists(guild); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.guilds.has(guild.id)); + await delayUntil(10000, () => bot.guilds.has(guild.id)); - if (!bot.cache.guilds.has(guild.id)) { + if (!bot.guilds.has(guild.id)) { throw new Error(`The guild seemed to be created but it was not cached.`); } } diff --git a/tests/helpers/guilds/deleteGuild.ts b/tests/helpers/guilds/deleteGuild.ts index 3ef7383e7..37af9a269 100644 --- a/tests/helpers/guilds/deleteGuild.ts +++ b/tests/helpers/guilds/deleteGuild.ts @@ -11,18 +11,18 @@ export async function deleteGuildTests(bot: Bot, t: Deno.TestContext) { assertExists(guild); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.guilds.has(guild.id)); + await delayUntil(10000, () => bot.guilds.has(guild.id)); - if (!bot.cache.guilds.has(guild.id)) { + if (!bot.guilds.has(guild.id)) { throw new Error(`The guild seemed to be created but it was not cached.`); } await bot.helpers.deleteGuild(guild.id); // Delay the execution to allow event to be processed - await delayUntil(10000, () => !bot.cache.guilds.has(guild.id)); + await delayUntil(10000, () => !bot.guilds.has(guild.id)); - if (bot.cache.guilds.has(guild.id)) { + if (bot.guilds.has(guild.id)) { throw new Error(`The guild seemed to be deleted but it's still cached.`); } } diff --git a/tests/helpers/guilds/editGuild.ts b/tests/helpers/guilds/editGuild.ts index 6eb562d95..25b5c9a1c 100644 --- a/tests/helpers/guilds/editGuild.ts +++ b/tests/helpers/guilds/editGuild.ts @@ -15,9 +15,9 @@ export async function editGuildTests(bot: Bot, guildId: bigint, t: Deno.TestCont assertExists(guild); // Delay the execution to allow event to be processed - // await delayUntil(10000, async () => bot.cache.guilds.get(guild.id)?.name === "Discordeno Test 1.0"); + // await delayUntil(10000, async () => bot.guilds.get(guild.id)?.name === "Discordeno Test 1.0"); - // if (!bot.cache.guilds.has(guild.id)) { + // if (!bot.guilds.has(guild.id)) { // throw new Error(`The guild seemed to be edited but the cache didn't got updated.`); // } } diff --git a/tests/helpers/messages/deleteMessage.ts b/tests/helpers/messages/deleteMessage.ts index cfd7a617d..e0ad6ae76 100644 --- a/tests/helpers/messages/deleteMessage.ts +++ b/tests/helpers/messages/deleteMessage.ts @@ -8,9 +8,9 @@ async function ifItFailsBlameWolf(bot: Bot, channelId: bigint, reason?: string) // Assertions assertExists(message); // Delay the execution by to allow MESSAGE_CREATE event to be processed - await delayUntil(10000, () => bot.cache.messages.has(message.id)); + await delayUntil(10000, () => bot.messages.has(message.id)); // Make sure the message was created. - if (!bot.cache.messages.has(message.id)) { + if (!bot.messages.has(message.id)) { throw new Error("The message seemed to be sent but it was not cached. Reason: ${reason}"); } @@ -18,9 +18,9 @@ async function ifItFailsBlameWolf(bot: Bot, channelId: bigint, reason?: string) await bot.helpers.deleteMessage(channelId, message.id, reason); // Wait to give it time for MESSAGE_DELETE event - await delayUntil(10000, () => !bot.cache.messages.has(message.id)); + await delayUntil(10000, () => !bot.messages.has(message.id)); // Make sure it is gone from cache - if (bot.cache.messages.has(message.id)) { + if (bot.messages.has(message.id)) { throw new Error("The message should have been deleted but it is still in cache."); } } diff --git a/tests/helpers/messages/deleteMessages.ts b/tests/helpers/messages/deleteMessages.ts index 592417057..3a6235b9a 100644 --- a/tests/helpers/messages/deleteMessages.ts +++ b/tests/helpers/messages/deleteMessages.ts @@ -10,9 +10,9 @@ async function ifItFailsBlameWolf(bot: Bot, channelId: bigint, reason?: string) assertExists(message); assertExists(secondMessage); // Delay the execution by to allow MESSAGE_CREATE event to be processed - await delayUntil(10000, () => bot.cache.messages.has(message.id) && bot.cache.messages.has(secondMessage.id)); + await delayUntil(10000, () => bot.messages.has(message.id) && bot.messages.has(secondMessage.id)); // Make sure the message was created. - if (!bot.cache.messages.has(message.id) || !bot.cache.messages.has(secondMessage.id)) { + if (!bot.messages.has(message.id) || !bot.messages.has(secondMessage.id)) { throw new Error(`The message seemed to be sent but it was not cached. Reason: ${reason}`); } @@ -20,9 +20,9 @@ async function ifItFailsBlameWolf(bot: Bot, channelId: bigint, reason?: string) await bot.helpers.deleteMessages(channelId, [message.id, secondMessage.id], reason); // Wait to give it time for MESSAGE_DELETE event - await delayUntil(10000, () => !bot.cache.messages.has(message.id) && !bot.cache.messages.has(secondMessage.id)); + await delayUntil(10000, () => !bot.messages.has(message.id) && !bot.messages.has(secondMessage.id)); // Make sure they are gone from cache - if (bot.cache.messages.has(message.id) || bot.cache.messages.has(secondMessage.id)) { + if (bot.messages.has(message.id) || bot.messages.has(secondMessage.id)) { throw new Error("The messages should have been deleted but they are still in cache."); } } diff --git a/tests/helpers/messages/editMessage.ts b/tests/helpers/messages/editMessage.ts index 137b79c44..d6659273d 100644 --- a/tests/helpers/messages/editMessage.ts +++ b/tests/helpers/messages/editMessage.ts @@ -8,9 +8,9 @@ export async function editMessageTest(bot: Bot, channelId: bigint, t: Deno.TestC // Assertions assertExists(message); // Delay the execution by to allow MESSAGE_CREATE event to be processed - await delayUntil(10000, () => bot.cache.messages.has(message.id)); + await delayUntil(10000, () => bot.messages.has(message.id)); // Make sure the message was created. - if (!bot.cache.messages.has(message.id)) { + if (!bot.messages.has(message.id)) { throw new Error("The message seemed to be sent but it was not cached. Reason: ${reason}"); } @@ -18,9 +18,9 @@ export async function editMessageTest(bot: Bot, channelId: bigint, t: Deno.TestC await bot.helpers.editMessage(channelId, message.id, "Goodbye World!"); // Wait to give it time for MESSAGE_UPDATE event - // await delayUntil(10000, async () => bot.cache.messages.get(message.id)?.content === "Goodbye World!"); + // await delayUntil(10000, async () => bot.messages.get(message.id)?.content === "Goodbye World!"); // Make sure it was edited - // if (bot.cache.messages.get(message.id)?.content !== "Goodbye World!") { + // if (bot.messages.get(message.id)?.content !== "Goodbye World!") { // throw new Error("The message should have been edited but it was not."); // } } diff --git a/tests/helpers/messages/getMessage.ts b/tests/helpers/messages/getMessage.ts index 58c037322..5059788d5 100644 --- a/tests/helpers/messages/getMessage.ts +++ b/tests/helpers/messages/getMessage.ts @@ -8,9 +8,9 @@ export async function getMessageTest(bot: Bot, channelId: bigint, t: Deno.TestCo // Assertions assertExists(message); // Delay the execution by to allow MESSAGE_CREATE event to be processed - await delayUntil(10000, () => bot.cache.messages.has(message.id)); + await delayUntil(10000, () => bot.messages.has(message.id)); // Make sure the message was created. - if (!bot.cache.messages.has(message.id)) { + if (!bot.messages.has(message.id)) { throw new Error("The message seemed to be sent but it was not cached. Reason: ${reason}"); } diff --git a/tests/helpers/messages/getMessages.ts b/tests/helpers/messages/getMessages.ts index 187a044a3..708af6e8f 100644 --- a/tests/helpers/messages/getMessages.ts +++ b/tests/helpers/messages/getMessages.ts @@ -14,17 +14,10 @@ export async function getMessagesTest(bot: Bot, channelId: bigint, t: Deno.TestC // Delay the execution by to allow MESSAGE_CREATE event to be processed await delayUntil( 10000, - () => - bot.cache.messages.has(message.id) && - bot.cache.messages.has(secondMessage.id) && - bot.cache.messages.has(thirdMessage.id) + () => bot.messages.has(message.id) && bot.messages.has(secondMessage.id) && bot.messages.has(thirdMessage.id) ); // Make sure the messages was created. - if ( - !bot.cache.messages.has(message.id) || - !bot.cache.messages.has(secondMessage.id) || - !bot.cache.messages.has(thirdMessage.id) - ) { + if (!bot.messages.has(message.id) || !bot.messages.has(secondMessage.id) || !bot.messages.has(thirdMessage.id)) { throw new Error("The message seemed to be sent but it was not cached."); } diff --git a/tests/helpers/messages/reactions.ts b/tests/helpers/messages/reactions.ts index 16e0585d0..cba6a1087 100644 --- a/tests/helpers/messages/reactions.ts +++ b/tests/helpers/messages/reactions.ts @@ -17,9 +17,9 @@ export async function addReactionTest( assertExists(message); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.messages.has(message.id)); + await delayUntil(10000, () => bot.messages.has(message.id)); - if (!bot.cache.messages.has(message.id)) { + if (!bot.messages.has(message.id)) { throw new Error("The message seemed to be sent but it was not cached."); } @@ -83,9 +83,9 @@ export async function removeAllReactionTests(bot: Bot, channelId: bigint, t: Den assertExists(message); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.messages.has(message.id)); + await delayUntil(10000, () => bot.messages.has(message.id)); - if (!bot.cache.messages.has(message.id)) { + if (!bot.messages.has(message.id)) { throw new Error("The message seemed to be sent but it was not cached."); } @@ -124,9 +124,9 @@ export async function removeReactionTest(bot: Bot, channelId: bigint, t: Deno.Te assertExists(message); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.messages.has(message.id)); + await delayUntil(10000, () => bot.messages.has(message.id)); - if (!bot.cache.messages.has(message.id)) { + if (!bot.messages.has(message.id)) { throw new Error("The message seemed to be sent but it was not cached."); } @@ -166,15 +166,15 @@ export async function removeReactionEmojiTest(bot: Bot, channelId: bigint, t: De assertExists(message); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.messages.has(message.id)); + await delayUntil(10000, () => bot.messages.has(message.id)); - if (!bot.cache.messages.has(message.id)) { + if (!bot.messages.has(message.id)) { throw new Error("The message seemed to be sent but it was not cached."); } reactionCounters.set(message.id, 0); - bot.events.reactionAdd + bot.events.reactionAdd; bot.events.reactionRemoveEmoji = function (bot, payload) { reactionCounters.set(payload.messageId, 0); diff --git a/tests/helpers/messages/sendMessage.ts b/tests/helpers/messages/sendMessage.ts index 8035aeff6..d0c63287b 100644 --- a/tests/helpers/messages/sendMessage.ts +++ b/tests/helpers/messages/sendMessage.ts @@ -10,9 +10,9 @@ async function ifItFailsBlameWolf(bot: Bot, channelId: bigint, content: string | // Assertions assertExists(message); // Delay the execution by to allow MESSAGE_CREATE event to be processed - await delayUntil(10000, () => bot.cache.messages.has(message.id)); + await delayUntil(10000, () => bot.messages.has(message.id)); // Make sure the message was created. - if (!bot.cache.messages.has(message.id)) { + if (!bot.messages.has(message.id)) { throw new Error("The message seemed to be sent but it was not cached."); } } diff --git a/tests/helpers/roles/createRole.ts b/tests/helpers/roles/createRole.ts index 297da9370..05dae1692 100644 --- a/tests/helpers/roles/createRole.ts +++ b/tests/helpers/roles/createRole.ts @@ -1,20 +1,14 @@ import { Bot } from "../../../src/bot.ts"; -import { Cache } from "../../../src/cache.ts"; import { assertExists } from "../../deps.ts"; import { delayUntil } from "../../utils.ts"; -export async function createRoleTests( - bot: Bot, - guildId: bigint, - options: { reason?: string }, - t: Deno.TestContext -) { +export async function createRoleTests(bot: Bot, guildId: bigint, options: { reason?: string }, t: Deno.TestContext) { const role = await bot.helpers.createRole(guildId, { name: "hoti" }, options.reason); assertExists(role); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.guilds.get(guildId)?.roles.has(role.id)); + await delayUntil(10000, () => bot.guilds.get(guildId)?.roles.has(role.id)); - assertExists(bot.cache.guilds.get(guildId)?.roles.has(role.id)); + assertExists(bot.guilds.get(guildId)?.roles.has(role.id)); } diff --git a/tests/helpers/roles/deleteRole.ts b/tests/helpers/roles/deleteRole.ts index fb47054cc..dc8b92c37 100644 --- a/tests/helpers/roles/deleteRole.ts +++ b/tests/helpers/roles/deleteRole.ts @@ -1,29 +1,23 @@ import { Bot } from "../../../src/bot.ts"; -import { Cache } from "../../../src/cache.ts"; import { assertExists } from "../../deps.ts"; import { delayUntil } from "../../utils.ts"; -export async function deleteRoleTests( - bot: Bot, - guildId: bigint, - options: { reason?: string }, - t: Deno.TestContext -) { +export async function deleteRoleTests(bot: Bot, guildId: bigint, options: { reason?: string }, t: Deno.TestContext) { const role = await bot.helpers.createRole(guildId, { name: "hoti" }, options.reason); assertExists(role); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.guilds.get(guildId)?.roles.has(role.id)); + await delayUntil(10000, () => bot.guilds.get(guildId)?.roles.has(role.id)); - assertExists(bot.cache.guilds.get(guildId)?.roles.has(role.id)); + assertExists(bot.guilds.get(guildId)?.roles.has(role.id)); await bot.helpers.deleteRole(guildId, role.id); // Delay the execution to allow event to be processed - await delayUntil(10000, () => !bot.cache.guilds.get(guildId)?.roles.has(role.id)); + await delayUntil(10000, () => !bot.guilds.get(guildId)?.roles.has(role.id)); - if (bot.cache.guilds.get(guildId)?.roles.has(role.id)) { + if (bot.guilds.get(guildId)?.roles.has(role.id)) { throw new Error(`The role should have been deleted but it is still in cache.`); } } diff --git a/tests/helpers/roles/editRole.ts b/tests/helpers/roles/editRole.ts index d0f3c5d6c..1a82361af 100644 --- a/tests/helpers/roles/editRole.ts +++ b/tests/helpers/roles/editRole.ts @@ -1,9 +1,8 @@ import { Bot } from "../../../src/bot.ts"; -import { Cache } from "../../../src/cache.ts"; import { assertEquals, assertExists } from "../../deps.ts"; import { delayUntil } from "../../utils.ts"; -export async function editRoleTests(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function editRoleTests(bot: Bot, guildId: bigint, t: Deno.TestContext) { const role = await bot.helpers.createRole(guildId, { name: "hoti", }); @@ -11,9 +10,9 @@ export async function editRoleTests(bot: Bot, guildId: bigint, t: Deno.Te assertExists(role); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.guilds.get(guildId)?.roles.has(role.id)); + await delayUntil(10000, () => bot.guilds.get(guildId)?.roles.has(role.id)); - if (!bot.cache.guilds.get(guildId)?.roles.has(role.id)) { + if (!bot.guilds.get(guildId)?.roles.has(role.id)) { throw new Error(`The role seemed to be created but it was not cached.`); } @@ -22,7 +21,7 @@ export async function editRoleTests(bot: Bot, guildId: bigint, t: Deno.Te }); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.guilds.get(guildId)?.roles.get(role.id)?.name === "#rememberAyntee"); + await delayUntil(10000, () => bot.guilds.get(guildId)?.roles.get(role.id)?.name === "#rememberAyntee"); - assertEquals(bot.cache.guilds.get(guildId)?.roles.get(role.id)?.name === "#rememberAyntee", true); + assertEquals(bot.guilds.get(guildId)?.roles.get(role.id)?.name === "#rememberAyntee", true); } diff --git a/tests/helpers/roles/getRoles.ts b/tests/helpers/roles/getRoles.ts index abe1d77fd..bf0f30761 100644 --- a/tests/helpers/roles/getRoles.ts +++ b/tests/helpers/roles/getRoles.ts @@ -1,9 +1,8 @@ import { Bot } from "../../../src/bot.ts"; -import { Cache } from "../../../src/cache.ts"; import { assertEquals } from "../../deps.ts"; -export async function getRolesTest(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function getRolesTest(bot: Bot, guildId: bigint, t: Deno.TestContext) { const roles = await bot.helpers.getRoles(guildId); - assertEquals(bot.cache.guilds.get(guildId)?.roles.size, roles.size); + assertEquals(bot.guilds.get(guildId)?.roles.size, roles.size); } diff --git a/tests/helpers/roles/roleChanges.ts b/tests/helpers/roles/roleChanges.ts index 85111936b..affa2e511 100644 --- a/tests/helpers/roles/roleChanges.ts +++ b/tests/helpers/roles/roleChanges.ts @@ -1,11 +1,10 @@ import { Bot } from "../../../src/bot.ts"; -import { Cache } from "../../../src/cache.ts"; import { assertEquals, assertExists } from "../../deps.ts"; import { delayUntil } from "../../utils.ts"; const roleChanges = new Map(); -export async function addRoleTest(bot: Bot, guildId: bigint, options: { reason?: string }, t: Deno.TestContext) { +export async function addRoleTest(bot: Bot, guildId: bigint, options: { reason?: string }, t: Deno.TestContext) { const role = await bot.helpers.createRole(guildId, { name: "hoti", }); @@ -13,9 +12,9 @@ export async function addRoleTest(bot: Bot, guildId: bigint, options: { r assertExists(role); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.guilds.get(guildId)?.roles.has(role.id)); + await delayUntil(10000, () => bot.guilds.get(guildId)?.roles.has(role.id)); - assertExists(bot.cache.guilds.get(guildId)?.roles.has(role.id)); + assertExists(bot.guilds.get(guildId)?.roles.has(role.id)); bot.events.guildMemberUpdate = function (bot, member, user) { roleChanges.set(user.id, member.roles); @@ -29,11 +28,4 @@ export async function addRoleTest(bot: Bot, guildId: bigint, options: { r assertEquals(roleChanges.get(bot.id)?.includes(role.id), true); } -export async function removeRoleTest( - bot: Bot, - guildId: bigint, - options: { reason?: string }, - t: Deno.TestContext -) { - -} +export async function removeRoleTest(bot: Bot, guildId: bigint, options: { reason?: string }, t: Deno.TestContext) {} diff --git a/tests/members/ban.ts b/tests/members/ban.ts index 59deb143d..6f1d93848 100644 --- a/tests/members/ban.ts +++ b/tests/members/ban.ts @@ -66,7 +66,7 @@ Deno.test({ }); // Assertions - assertExists(bot.cache.members.get(BigInt(`${bot.id}${guild.id}`))); + assertExists(bot.members..get(BigInt(`${bot.id}${guild.id}`))); }, }); diff --git a/tests/mod.ts b/tests/mod.ts index d4caa6778..965a0bfb5 100644 --- a/tests/mod.ts +++ b/tests/mod.ts @@ -41,7 +41,7 @@ if (!UNITTEST_TOKEN) throw new Error("Token was not provided."); const botId = BigInt(atob(UNITTEST_TOKEN.split(".")[0])); let startedAt = 0; -export const bot = createBot({ +const baseBot = createBot({ token: UNITTEST_TOKEN, botId, events: createEventHandlers({ @@ -59,15 +59,11 @@ export const bot = createBot({ "GuildMembers", "GuildScheduledEvents", "GuildVoiceStates", - "GuildPresences" + "GuildPresences", ], - cache: { - isAsync: false, - }, }); -// @ts-ignore -enableCachePlugin(bot); +const bot = enableCachePlugin(baseBot); await startBot(bot); // Delay the execution to allow READY events to be processed @@ -75,8 +71,8 @@ await delayUntil(10000, () => Boolean(startedAt)); console.log("Bot online"); // DELETE GUILDS IF LESS THAN 10 SERVERS AS SAFETY MEASURE -if (bot.cache.guilds.size() <= 10) { - bot.cache.guilds.forEach(async (guild) => { +if (bot.guilds.size() <= 10) { + bot.guilds.forEach(async (guild) => { // DO NOT DELETE OUR CACHED TEST SERVER FOR COMMUNITY FEATURES if (guild.id === CACHED_COMMUNITY_GUILD_ID) return; if (guild.ownerId === bot.id) await bot.helpers.deleteGuild(guild.id); @@ -94,10 +90,10 @@ assertExists(guild); assertExists(guild.id); // Delay the execution to allow GUILD_CREATE event to be processed -await delayUntil(10000, () => bot.cache.guilds.has(guild.id)); +await delayUntil(10000, () => bot.guilds.has(guild.id)); // FINAL CHECK TO THROW IF MISSING STILL -if (!bot.cache.guilds.has(guild.id)) { +if (!bot.guilds.has(guild.id)) { throw new Error(`The guild seemed to be created but it was not cached. ${guild.id.toString()}`); } @@ -603,7 +599,7 @@ import "./misc/getVoiceRegions.ts"; import "./misc/snowflake.ts"; import "./misc/typing.ts"; import "./misc/validateDiscovery.ts"; -import "./misc/editBotStatus.ts" +import "./misc/editBotStatus.ts"; //role import "./role/addRole.ts"; diff --git a/tests/role/addRole.ts b/tests/role/addRole.ts index 678aae02a..0ed7128bb 100644 --- a/tests/role/addRole.ts +++ b/tests/role/addRole.ts @@ -3,7 +3,6 @@ import { assertExists, assertEquals } from "../deps.ts"; import { bot, guild } from "../mod.ts"; import { delayUntil } from "../utils.ts"; - Deno.test({ name: "[Role] add a role to a member", fn: async (t) => { @@ -14,9 +13,9 @@ Deno.test({ assertExists(role); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.guilds.get(guild.id)?.roles.has(role.id)); + await delayUntil(10000, () => bot.guilds.get(guild.id)?.roles.has(role.id)); - assertExists(bot.cache.guilds.get(guild.id)?.roles.has(role.id)); + assertExists(bot.guilds.get(guild.id)?.roles.has(role.id)); bot.events.guildMemberUpdate = function (bot, member, user) { roleChanges.set(user.id, member.roles); diff --git a/tests/role/createRoleWithReason.ts b/tests/role/createRoleWithReason.ts index 0f6ffee79..1b73c0de7 100644 --- a/tests/role/createRoleWithReason.ts +++ b/tests/role/createRoleWithReason.ts @@ -13,8 +13,8 @@ Deno.test({ assertExists(role); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.guilds.get(guild.id)?.roles.has(role.id)); + await delayUntil(10000, () => bot.guilds.get(guild.id)?.roles.has(role.id)); - assertExists(bot.cache.guilds.get(guild.id)?.roles.has(role.id)); + assertExists(bot.guilds.get(guild.id)?.roles.has(role.id)); }, }); diff --git a/tests/role/createRoleWithoutReason.ts b/tests/role/createRoleWithoutReason.ts index 5ea9b7483..58f51562a 100644 --- a/tests/role/createRoleWithoutReason.ts +++ b/tests/role/createRoleWithoutReason.ts @@ -13,8 +13,8 @@ Deno.test({ assertExists(role); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.guilds.get(guild.id)?.roles.has(role.id)); + await delayUntil(10000, () => bot.guilds.get(guild.id)?.roles.has(role.id)); - assertExists(bot.cache.guilds.get(guild.id)?.roles.has(role.id)); + assertExists(bot.guilds.get(guild.id)?.roles.has(role.id)); }, }); diff --git a/tests/role/deleteRoleWithReason.ts b/tests/role/deleteRoleWithReason.ts index b61c56590..1d974e008 100644 --- a/tests/role/deleteRoleWithReason.ts +++ b/tests/role/deleteRoleWithReason.ts @@ -10,16 +10,16 @@ Deno.test({ assertExists(role); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.guilds.get(guild.id)?.roles.has(role.id)); + await delayUntil(10000, () => bot.guilds.get(guild.id)?.roles.has(role.id)); - assertExists(bot.cache.guilds.get(guild.id)?.roles.has(role.id)); + assertExists(bot.guilds.get(guild.id)?.roles.has(role.id)); await bot.helpers.deleteRole(guild.id, role.id); // Delay the execution to allow event to be processed - await delayUntil(10000, () => !bot.cache.guilds.get(guild.id)?.roles.has(role.id)); + await delayUntil(10000, () => !bot.guilds.get(guild.id)?.roles.has(role.id)); - if (bot.cache.guilds.get(guild.id)?.roles.has(role.id)) { + if (bot.guilds.get(guild.id)?.roles.has(role.id)) { throw new Error(`The role should have been deleted but it is still in cache.`); } }, diff --git a/tests/role/deleteRoleWithoutReason.ts b/tests/role/deleteRoleWithoutReason.ts index 82017215a..3bad61389 100644 --- a/tests/role/deleteRoleWithoutReason.ts +++ b/tests/role/deleteRoleWithoutReason.ts @@ -10,16 +10,16 @@ Deno.test({ assertExists(role); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.guilds.get(guild.id)?.roles.has(role.id)); + await delayUntil(10000, () => bot.guilds.get(guild.id)?.roles.has(role.id)); - assertExists(bot.cache.guilds.get(guild.id)?.roles.has(role.id)); + assertExists(bot.guilds.get(guild.id)?.roles.has(role.id)); await bot.helpers.deleteRole(guild.id, role.id); // Delay the execution to allow event to be processed - await delayUntil(10000, () => !bot.cache.guilds.get(guild.id)?.roles.has(role.id)); + await delayUntil(10000, () => !bot.guilds.get(guild.id)?.roles.has(role.id)); - if (bot.cache.guilds.get(guild.id)?.roles.has(role.id)) { + if (bot.guilds.get(guild.id)?.roles.has(role.id)) { throw new Error(`The role should have been deleted but it is still in cache.`); } }, diff --git a/tests/role/editRole.ts b/tests/role/editRole.ts index a4aa83455..c89c2eceb 100644 --- a/tests/role/editRole.ts +++ b/tests/role/editRole.ts @@ -1,4 +1,4 @@ -import { assertExists,assertEquals } from "../deps.ts"; +import { assertExists, assertEquals } from "../deps.ts"; import { bot, guild } from "../mod.ts"; import { delayUntil } from "../utils.ts"; @@ -12,9 +12,9 @@ Deno.test({ assertExists(role); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.guilds.get(guild.id)?.roles.has(role.id)); + await delayUntil(10000, () => bot.guilds.get(guild.id)?.roles.has(role.id)); - if (!bot.cache.guilds.get(guild.id)?.roles.has(role.id)) { + if (!bot.guilds.get(guild.id)?.roles.has(role.id)) { throw new Error(`The role seemed to be created but it was not cached.`); } @@ -23,8 +23,8 @@ Deno.test({ }); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.guilds.get(guild.id)?.roles.get(role.id)?.name === "#rememberAyntee"); + await delayUntil(10000, () => bot.guilds.get(guild.id)?.roles.get(role.id)?.name === "#rememberAyntee"); - assertEquals(bot.cache.guilds.get(guild.id)?.roles.get(role.id)?.name === "#rememberAyntee", true); + assertEquals(bot.guilds.get(guild.id)?.roles.get(role.id)?.name === "#rememberAyntee", true); }, }); diff --git a/tests/role/getAllRoles.ts b/tests/role/getAllRoles.ts index 876a2bc42..7a893df3d 100644 --- a/tests/role/getAllRoles.ts +++ b/tests/role/getAllRoles.ts @@ -6,6 +6,6 @@ Deno.test({ fn: async (t) => { const roles = await bot.helpers.getRoles(guild.id); - assertEquals(bot.cache.guilds.get(guild.id)?.roles.size, roles.size); + assertEquals(bot.guilds.get(guild.id)?.roles.size, roles.size); }, }); diff --git a/tests/role/removeRole.ts b/tests/role/removeRole.ts index f2f38073a..c03de7524 100644 --- a/tests/role/removeRole.ts +++ b/tests/role/removeRole.ts @@ -13,9 +13,9 @@ Deno.test({ assertExists(role); // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.cache.guilds.get(guild.id)?.roles.has(role.id)); + await delayUntil(10000, () => bot.guilds.get(guild.id)?.roles.has(role.id)); - assertExists(bot.cache.guilds.get(guild.id)?.roles.has(role.id)); + assertExists(bot.guilds.get(guild.id)?.roles.has(role.id)); bot.events.guildMemberUpdate = function (bot, member, user) { roleChanges.set(user.id, member.roles); From 5c1a94fa5de84c08577d090fb1cf2d923f2eeb73 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Wed, 1 Dec 2021 22:24:32 +0000 Subject: [PATCH 021/104] chore: bump rc10 --- src/util/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/constants.ts b/src/util/constants.ts index 7e5905d59..79ba68acc 100644 --- a/src/util/constants.ts +++ b/src/util/constants.ts @@ -9,7 +9,7 @@ export const GATEWAY_VERSION = 9; // TODO: update this version /** https://github.com/discordeno/discordeno/releases */ -export const DISCORDENO_VERSION = "13.0.0-rc9"; +export const DISCORDENO_VERSION = "13.0.0-rc10"; /** https://discord.com/developers/docs/reference#user-agent */ From 01ae584ce0430ebbf632298a8050e904ec74c36e Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Wed, 1 Dec 2021 23:41:35 +0000 Subject: [PATCH 022/104] fix: sweeper is public, rc11 --- src/util/collection.ts | 2 +- src/util/constants.ts | 2 +- tests/members/ban.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/util/collection.ts b/src/util/collection.ts index d9bf68ce9..79af9ef80 100644 --- a/src/util/collection.ts +++ b/src/util/collection.ts @@ -2,7 +2,7 @@ import { Bot } from "../bot.ts"; export class Collection extends Map { maxSize?: number; - private sweeper?: CollectionSweeper & { intervalId?: number }; + sweeper?: CollectionSweeper & { intervalId?: number }; constructor(entries?: (readonly (readonly [K, V])[] | null) | Map, options?: CollectionOptions) { super(entries ?? []); diff --git a/src/util/constants.ts b/src/util/constants.ts index 79ba68acc..b4bdb196b 100644 --- a/src/util/constants.ts +++ b/src/util/constants.ts @@ -9,7 +9,7 @@ export const GATEWAY_VERSION = 9; // TODO: update this version /** https://github.com/discordeno/discordeno/releases */ -export const DISCORDENO_VERSION = "13.0.0-rc10"; +export const DISCORDENO_VERSION = "13.0.0-rc11"; /** https://discord.com/developers/docs/reference#user-agent */ diff --git a/tests/members/ban.ts b/tests/members/ban.ts index 6f1d93848..c745a8850 100644 --- a/tests/members/ban.ts +++ b/tests/members/ban.ts @@ -66,7 +66,7 @@ Deno.test({ }); // Assertions - assertExists(bot.members..get(BigInt(`${bot.id}${guild.id}`))); + assertExists(bot.members.get(BigInt(`${bot.id}${guild.id}`))); }, }); From 69230ae78e8c72509c24f445dc3f2211a213b541 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Thu, 2 Dec 2021 16:24:41 +0000 Subject: [PATCH 023/104] fix: tests with latest cache --- src/helpers/channels/deleteChannel.ts | 7 +- tests/channels/createChannel.ts | 148 ++++++++ tests/channels/deleteChannel.ts | 40 ++ tests/constants.ts | 2 +- tests/deps.ts | 2 +- tests/guilds/urls.ts | 41 +++ tests/helpers/channels/categoryChannels.ts | 4 +- .../channels/channelOverwriteHasPermission.ts | 5 +- tests/helpers/channels/cloneChannel.ts | 7 +- tests/helpers/channels/createChannel.ts | 4 +- tests/helpers/channels/deleteChannel.ts | 9 +- .../channels/deleteChannelOverwrite.ts | 5 +- tests/helpers/channels/editChannel.ts | 4 +- tests/helpers/emojis/createEmoji.ts | 2 +- tests/helpers/emojis/deleteEmoji.ts | 4 +- tests/helpers/emojis/editEmoji.ts | 4 +- tests/helpers/emojis/getEmoji.ts | 2 +- tests/helpers/emojis/getEmojis.ts | 2 +- tests/helpers/guilds/createGuild.ts | 6 +- tests/helpers/guilds/deleteGuild.ts | 6 +- tests/helpers/guilds/editGuild.ts | 7 +- tests/helpers/guilds/getAuditLogs.ts | 4 +- .../guilds/getAvailableVoiceRegions.ts | 6 +- tests/helpers/guilds/getBan.ts | 5 +- tests/helpers/guilds/getBans.ts | 10 +- tests/helpers/guilds/getGuild.ts | 5 +- tests/helpers/guilds/getVanityUrl.ts | 2 +- .../scheduledEvents/deleteScheduledEvent.ts | 4 +- .../scheduledEvents/editScheduledEvent.ts | 9 +- tests/helpers/invites/createInvite.ts | 2 +- tests/helpers/invites/deleteInvite.ts | 2 +- tests/helpers/invites/getChannelInvites.ts | 2 +- tests/helpers/invites/getInvite.ts | 2 +- tests/helpers/members/fetchMembers.ts | 4 +- tests/helpers/messages/deleteMessage.ts | 12 +- tests/helpers/messages/deleteMessages.ts | 12 +- tests/helpers/messages/editMessage.ts | 4 +- tests/helpers/messages/getMessage.ts | 3 +- tests/helpers/messages/getMessages.ts | 4 +- tests/helpers/messages/pin.ts | 6 +- tests/helpers/messages/reactions.ts | 11 +- tests/helpers/messages/sendMessage.ts | 16 +- tests/helpers/misc/user.ts | 2 +- tests/helpers/roles/createRole.ts | 4 +- tests/helpers/roles/editRole.ts | 2 +- tests/helpers/roles/getRoles.ts | 2 +- tests/members/getDmChannel.ts | 4 +- tests/messages/reactions.ts | 262 +++++++++++++ tests/mod.ts | 346 +++--------------- tests/role/createRoleWithReason.ts | 2 +- tests/role/createRoleWithoutReason.ts | 2 +- 51 files changed, 643 insertions(+), 419 deletions(-) create mode 100644 tests/channels/createChannel.ts create mode 100644 tests/channels/deleteChannel.ts create mode 100644 tests/guilds/urls.ts create mode 100644 tests/messages/reactions.ts diff --git a/src/helpers/channels/deleteChannel.ts b/src/helpers/channels/deleteChannel.ts index 2fa9eee12..d047582f4 100644 --- a/src/helpers/channels/deleteChannel.ts +++ b/src/helpers/channels/deleteChannel.ts @@ -3,7 +3,7 @@ import { Channel } from "../../types/channels/channel.ts"; /** Delete a channel in your server. Bot needs MANAGE_CHANNEL permissions in the server. Bot needs MANAGE_THREADS permissions in the server if deleting thread. */ export async function deleteChannel(bot: Bot, channelId: bigint, reason?: string) { - const result = await bot.rest.runMethod( + await bot.rest.runMethod( bot.rest, "delete", bot.constants.endpoints.CHANNEL_BASE(channelId), @@ -11,9 +11,4 @@ export async function deleteChannel(bot: Bot, channelId: bigint, reason?: string reason, } ); - - return bot.transformers.channel(bot, { - channel: result, - guildId: result.guild_id ? bot.transformers.snowflake(result.guild_id) : undefined, - }); } diff --git a/tests/channels/createChannel.ts b/tests/channels/createChannel.ts new file mode 100644 index 000000000..c6f48f90b --- /dev/null +++ b/tests/channels/createChannel.ts @@ -0,0 +1,148 @@ +import { ChannelTypes, CreateGuildChannel, OverwriteTypes } from "../../mod.ts"; +import { CACHED_COMMUNITY_GUILD_ID } from "../constants.ts"; +import { assertExists, assertEquals } from "../deps.ts"; +import { bot, guild } from "../mod.ts"; +import { delayUntil } from "../utils.ts"; + +async function createChannelTests(guildId: bigint, options: CreateGuildChannel, autoDelete: boolean) { + const channel = await bot.helpers.createChannel(guildId, options); + + // Assertions + assertExists(channel); + assertEquals(channel.type, options.type || ChannelTypes.GuildText); + + // Delay the execution to allow event to be processed + await delayUntil(10000, () => bot.channels.has(channel.id)); + + if (!bot.channels.has(channel.id)) { + throw new Error("The channel seemed to be created but it was not cached."); + } + + if (options.topic && channel.topic !== options.topic) { + throw new Error("The channel was supposed to have a topic but it does not appear to be the same topic."); + } + + if (options.bitrate && channel.bitrate !== options.bitrate) { + throw new Error("The channel was supposed to have a bitrate but it does not appear to be the same bitrate."); + } + + if (options.permissionOverwrites && channel.permissionOverwrites?.length !== options.permissionOverwrites.length) { + throw new Error( + "The channel was supposed to have a permissionOverwrites but it does not appear to be the same permissionOverwrites." + ); + } + + if (autoDelete) { + await bot.helpers.deleteChannel(channel.id); + } +} + +Deno.test({ + name: "[channel] create a new text channel", + async fn(t) { + await createChannelTests(guild.id, { name: "Discordeno-test" }, false); + }, +}); +Deno.test({ + name: "[channel] create a new category channel", + async fn(t) { + await createChannelTests( + guild.id, + { + name: "Discordeno-test", + type: ChannelTypes.GuildCategory, + }, + false + ); + }, +}); +Deno.test({ + name: "[channel] create a new news channel", + async fn(t) { + await createChannelTests( + CACHED_COMMUNITY_GUILD_ID, + { name: "Discordeno-test", type: ChannelTypes.GuildNews }, + true + ); + }, +}); +Deno.test({ + name: "[channel] create a new voice channel", + async fn(t) { + await createChannelTests( + guild.id, + { + name: "Discordeno-test", + type: ChannelTypes.GuildVoice, + }, + false + ); + }, +}); +Deno.test({ + name: "[channel] create a new voice channel with a bitrate", + async fn(t) { + await createChannelTests( + guild.id, + { + name: "discordeno-test", + type: ChannelTypes.GuildVoice, + bitrate: 32000, + }, + false + ); + }, +}); +Deno.test({ + name: "[channel] create a new voice channel with a user limit", + async fn(t) { + await createChannelTests( + guild.id, + { + name: "Discordeno-test", + type: ChannelTypes.GuildVoice, + userLimit: 32, + }, + false + ); + }, +}); +Deno.test({ + name: "[channel] create a new text channel with a rate limit per user", + async fn(t) { + await createChannelTests( + guild.id, + { + name: "Discordeno-test", + rateLimitPerUser: 2423, + }, + false + ); + }, +}); +Deno.test({ + name: "[channel] create a new text channel with NSFW", + async fn(t) { + await createChannelTests(guild.id, { name: "Discordeno-test", nsfw: true }, false); + }, +}); +Deno.test({ + name: "[channel] create a new text channel with permission overwrites", + async fn(t) { + await createChannelTests( + guild.id, + { + name: "Discordeno-test", + permissionOverwrites: [ + { + id: bot.id, + type: OverwriteTypes.Member, + allow: ["VIEW_CHANNEL"], + deny: [], + }, + ], + }, + false + ); + }, +}); diff --git a/tests/channels/deleteChannel.ts b/tests/channels/deleteChannel.ts new file mode 100644 index 000000000..a297aa358 --- /dev/null +++ b/tests/channels/deleteChannel.ts @@ -0,0 +1,40 @@ +import { bot, guild } from "../mod.ts"; +import { delayUntil } from "../utils.ts"; + +async function deleteChannelTests(guildId: bigint, options: { reason?: string }) { + // Create the necessary channels + const channel = await bot.helpers.createChannel(guildId, { + name: "delete-channel", + }); + + await delayUntil(10000, () => bot.channels.has(channel.id)); + // Make sure the channel was created. + if (!bot.channels.has(channel.id)) { + throw new Error("The channel should have been created but it is not in the cache."); + } + + // Delete the channel now without a reason + await bot.helpers.deleteChannel(channel.id, options.reason); + // wait to give it time for event + await delayUntil(10000, () => !bot.channels.has(channel.id)); + + // Make sure it is gone from cache + if (bot.channels.has(channel.id)) { + throw new Error("The channel should have been deleted but it is still in cache."); + } +} + +Deno.test({ + name: "[channel] delete a channel with a reason", + async fn(t) { + await deleteChannelTests(guild.id, { + reason: "with a reason", + }); + }, +}); +Deno.test({ + name: "[channel] delete a channel without a reason", + async fn(t) { + await deleteChannelTests(guild.id, {}); + }, +}); diff --git a/tests/constants.ts b/tests/constants.ts index 1a26d2f5a..8759a3bef 100644 --- a/tests/constants.ts +++ b/tests/constants.ts @@ -9,5 +9,5 @@ export const sanitizeMode = { // USED FOR ROLE CHANGE EVENTS export const roleChanges = new Map(); - export const banCounters = new Map(); +export const reactionCounters = new Map(); diff --git a/tests/deps.ts b/tests/deps.ts index d913a2991..f2a4ebdda 100644 --- a/tests/deps.ts +++ b/tests/deps.ts @@ -6,4 +6,4 @@ export { assertThrows, assertThrowsAsync } from "https://deno.land/std@0.115.1/testing/asserts.ts"; -export * from "https://deno.land/x/discordeno_cache_plugin@0.0.11/mod.ts"; +export * from "https://deno.land/x/discordeno_cache_plugin@0.0.13/mod.ts"; diff --git a/tests/guilds/urls.ts b/tests/guilds/urls.ts new file mode 100644 index 000000000..b37d3aa6c --- /dev/null +++ b/tests/guilds/urls.ts @@ -0,0 +1,41 @@ +import { assertEquals } from "../deps.ts"; +import { bot, guild } from "../mod.ts"; + +Deno.test({ + name: "[guild] format a guild's icon url", + fn: () => { + assertEquals(bot.helpers.guildIconURL(guild.id, { icon: guild.icon }), undefined); + assertEquals( + bot.helpers.guildIconURL(785384884197392384n, { + icon: 3837424427068676005442449262648382018748n, + }), + "https://cdn.discordapp.com/icons/785384884197392384/46f50fb412eab14ec455d5cf777154bc.jpg?size=128" + ); + }, +}); + +Deno.test({ + name: "[guild] format a guild's banner url", + fn: () => { + assertEquals(bot.helpers.guildBannerURL(guild.id, { banner: guild.banner }), undefined); + assertEquals( + bot.helpers.guildBannerURL(613425648685547541n, { + banner: 3919584870146358272366452115178209474142n, + }), + "https://cdn.discordapp.com/banners/613425648685547541/84c4964c115c128fb9100952c3b4f65e.jpg?size=128" + ); + }, +}); + +Deno.test({ + name: "[guild] format a guild's splash url", + fn: () => { + assertEquals(bot.helpers.guildSplashURL(guild.id, { splash: guild.splash }), undefined); + assertEquals( + bot.helpers.guildSplashURL(785384884197392384n, { + splash: 3837424427068676005442449262648382018748n, + }), + "https://cdn.discordapp.com/splashes/785384884197392384/46f50fb412eab14ec455d5cf777154bc.jpg?size=128" + ); + }, +}); diff --git a/tests/helpers/channels/categoryChannels.ts b/tests/helpers/channels/categoryChannels.ts index a73f6f1c8..ff2272ab6 100644 --- a/tests/helpers/channels/categoryChannels.ts +++ b/tests/helpers/channels/categoryChannels.ts @@ -1,9 +1,9 @@ -import { Bot } from "../../../src/bot.ts"; import { ChannelTypes } from "../../../src/types/channels/channelTypes.ts"; import { assertExists } from "../../deps.ts"; +import { bot } from "../../mod.ts"; import { delayUntil } from "../../utils.ts"; -export async function categoryChildrenTest(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function categoryChildrenTest(guildId: bigint) { const category = await bot.helpers.createChannel(guildId, { name: "Discordeno-test", type: ChannelTypes.GuildCategory, diff --git a/tests/helpers/channels/channelOverwriteHasPermission.ts b/tests/helpers/channels/channelOverwriteHasPermission.ts index 6749e14d5..3510a900f 100644 --- a/tests/helpers/channels/channelOverwriteHasPermission.ts +++ b/tests/helpers/channels/channelOverwriteHasPermission.ts @@ -1,8 +1,9 @@ -import { Bot, createChannel, ChannelTypes, channelOverwriteHasPermission, OverwriteTypes } from "../../../mod.ts"; +import { ChannelTypes, channelOverwriteHasPermission, OverwriteTypes } from "../../../mod.ts"; import { assertExists, assertEquals } from "../../deps.ts"; +import { bot } from "../../mod.ts"; import { delayUntil } from "../../utils.ts"; -export async function channelOverwriteHasPermissionTest(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function channelOverwriteHasPermissionTest(guildId: bigint) { const channel = await bot.helpers.createChannel(guildId, { name: "Discordeno-test", permissionOverwrites: [ diff --git a/tests/helpers/channels/cloneChannel.ts b/tests/helpers/channels/cloneChannel.ts index 56e146df2..9ecaff3d0 100644 --- a/tests/helpers/channels/cloneChannel.ts +++ b/tests/helpers/channels/cloneChannel.ts @@ -1,15 +1,12 @@ -import { Bot } from "../../../src/bot.ts"; import { DiscordenoChannel } from "../../../src/transformers/channel.ts"; import { assertExists, assertEquals } from "../../deps.ts"; +import { bot, channel } from "../../mod.ts"; import { delayUntil } from "../../utils.ts"; export async function cloneChannelTests( - bot: Bot, - guildId: bigint, - channel: DiscordenoChannel, options: { reason?: string }, - t: Deno.TestContext ) { + // @ts-ignore for itoh const cloned = await bot.helpers.cloneChannel(channel, options.reason); //Assertations diff --git a/tests/helpers/channels/createChannel.ts b/tests/helpers/channels/createChannel.ts index 4165c21fc..4e94ee5be 100644 --- a/tests/helpers/channels/createChannel.ts +++ b/tests/helpers/channels/createChannel.ts @@ -1,15 +1,13 @@ -import { Bot } from "../../../src/bot.ts"; import { CreateGuildChannel } from "../../../src/types/guilds/createGuildChannel.ts"; import { ChannelTypes } from "../../../src/types/mod.ts"; import { assertExists, assertEquals } from "../../deps.ts"; +import { bot } from "../../mod.ts"; import { delayUntil } from "../../utils.ts"; export async function createChannelTests( - bot: Bot, guildId: bigint, options: CreateGuildChannel, autoDelete: boolean, - t: Deno.TestContext ) { const channel = await bot.helpers.createChannel(guildId, options); diff --git a/tests/helpers/channels/deleteChannel.ts b/tests/helpers/channels/deleteChannel.ts index 2d8b0dde8..40edb4bb3 100644 --- a/tests/helpers/channels/deleteChannel.ts +++ b/tests/helpers/channels/deleteChannel.ts @@ -1,9 +1,7 @@ -import { Bot } from "../../../src/bot.ts"; -import { Channel } from "../../../src/types/channels/channel.ts"; -import { SnakeCasedPropertiesDeep } from "../../../src/types/util.ts"; +import { bot } from "../../mod.ts"; import { delayUntil } from "../../utils.ts"; -export async function deleteChannelTests(bot: Bot, guildId: bigint, options: { reason?: string }, t: Deno.TestContext) { +export async function deleteChannelTests(guildId: bigint, options: { reason?: string }) { // Create the necessary channels const channel = await bot.helpers.createChannel(guildId, { name: "delete-channel", @@ -15,12 +13,11 @@ export async function deleteChannelTests(bot: Bot, guildId: bigint, options: { r throw new Error("The channel should have been created but it is not in the cache."); } - const CHANNEL_DELETE = bot.handlers.CHANNEL_DELETE; - // Delete the channel now without a reason await bot.helpers.deleteChannel(channel.id, options.reason); // wait to give it time for event await delayUntil(10000, () => !bot.channels.has(channel.id)); + // Make sure it is gone from cache if (bot.channels.has(channel.id)) { throw new Error("The channel should have been deleted but it is still in cache."); diff --git a/tests/helpers/channels/deleteChannelOverwrite.ts b/tests/helpers/channels/deleteChannelOverwrite.ts index 5e3ec0fcc..b7baa9a1e 100644 --- a/tests/helpers/channels/deleteChannelOverwrite.ts +++ b/tests/helpers/channels/deleteChannelOverwrite.ts @@ -1,8 +1,9 @@ -import { Bot, ChannelTypes, channelOverwriteHasPermission, OverwriteTypes } from "../../../mod.ts"; +import { ChannelTypes, channelOverwriteHasPermission, OverwriteTypes } from "../../../mod.ts"; import { assertExists, assertEquals } from "../../deps.ts"; +import { bot } from "../../mod.ts"; import { delayUntil } from "../../utils.ts"; -export async function deleteChannelOverwriteTests(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function deleteChannelOverwriteTests(guildId: bigint) { const channel = await bot.helpers.createChannel(guildId, { name: "Discordeno-test", permissionOverwrites: [ diff --git a/tests/helpers/channels/editChannel.ts b/tests/helpers/channels/editChannel.ts index 906d935d0..2aac35c7c 100644 --- a/tests/helpers/channels/editChannel.ts +++ b/tests/helpers/channels/editChannel.ts @@ -1,8 +1,8 @@ -import { Bot } from "../../../src/bot.ts"; import { assertEquals } from "../../deps.ts"; +import { bot } from "../../mod.ts"; import { delayUntil } from "../../utils.ts"; -export async function editChannelTests(bot: Bot, guildId: bigint, options: { reason?: string }, t: Deno.TestContext) { +export async function editChannelTests(guildId: bigint, options: { reason?: string }) { // Create the necessary channels const channel = await bot.helpers.createChannel(guildId, { name: "edit-channel", diff --git a/tests/helpers/emojis/createEmoji.ts b/tests/helpers/emojis/createEmoji.ts index b37381215..ffa9cc99e 100644 --- a/tests/helpers/emojis/createEmoji.ts +++ b/tests/helpers/emojis/createEmoji.ts @@ -2,7 +2,7 @@ import { Bot } from "../../../src/bot.ts"; import { assertExists } from "../../deps.ts"; import { delayUntil } from "../../utils.ts"; -export async function createEmojiTest(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function createEmojiTest(guildId: bigint) { const emoji = await bot.helpers.createEmoji(guildId, { name: "blamewolf", image: "https://cdn.discordapp.com/emojis/814955268123000832.png", diff --git a/tests/helpers/emojis/deleteEmoji.ts b/tests/helpers/emojis/deleteEmoji.ts index 9ffacd639..dcdea4c26 100644 --- a/tests/helpers/emojis/deleteEmoji.ts +++ b/tests/helpers/emojis/deleteEmoji.ts @@ -28,10 +28,10 @@ export async function ifItFailsBlameWolf(bot: Bot, guildId: bigint, reason?: str // } } -export async function deleteEmojiWithReasonTest(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function deleteEmojiWithReasonTest(guildId: bigint) { await ifItFailsBlameWolf(bot, guildId); } -export async function deleteEmojiWithoutReasonTest(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function deleteEmojiWithoutReasonTest(guildId: bigint) { await ifItFailsBlameWolf(bot, guildId, "with a reason"); } diff --git a/tests/helpers/emojis/editEmoji.ts b/tests/helpers/emojis/editEmoji.ts index 95b0a7491..38b99c4de 100644 --- a/tests/helpers/emojis/editEmoji.ts +++ b/tests/helpers/emojis/editEmoji.ts @@ -2,6 +2,4 @@ import { Bot } from "../../../src/bot.ts"; import { assertExists } from "../../deps.ts"; import { delayUntil } from "../../utils.ts"; -export async function editEmojiTest(bot: Bot, guildId: bigint, t: Deno.TestContext) { - -} +export async function editEmojiTest(guildId: bigint) {} diff --git a/tests/helpers/emojis/getEmoji.ts b/tests/helpers/emojis/getEmoji.ts index 7e86e0938..58fa842ce 100644 --- a/tests/helpers/emojis/getEmoji.ts +++ b/tests/helpers/emojis/getEmoji.ts @@ -2,7 +2,7 @@ import { Bot } from "../../../src/bot.ts"; import { assertExists } from "../../deps.ts"; import { delayUntil } from "../../utils.ts"; -export async function getEmojiTest(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function getEmojiTest(guildId: bigint) { const emoji = await bot.helpers.createEmoji(guildId, { name: "blamewolf", image: "https://cdn.discordapp.com/emojis/814955268123000832.png", diff --git a/tests/helpers/emojis/getEmojis.ts b/tests/helpers/emojis/getEmojis.ts index e95d47c80..062e0ce4e 100644 --- a/tests/helpers/emojis/getEmojis.ts +++ b/tests/helpers/emojis/getEmojis.ts @@ -2,7 +2,7 @@ import { Bot } from "../../../src/bot.ts"; import { assertExists } from "../../deps.ts"; import { delayUntil } from "../../utils.ts"; -export async function getEmojisTest(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function getEmojisTest(guildId: bigint) { const emoji = await bot.helpers.createEmoji(guildId, { name: "blamewolf", image: "https://cdn.discordapp.com/emojis/814955268123000832.png", diff --git a/tests/helpers/guilds/createGuild.ts b/tests/helpers/guilds/createGuild.ts index 4f397f486..f38e55679 100644 --- a/tests/helpers/guilds/createGuild.ts +++ b/tests/helpers/guilds/createGuild.ts @@ -1,10 +1,8 @@ -import { Bot } from "../../../src/bot.ts"; -import { CreateGuildChannel } from "../../../src/types/guilds/createGuildChannel.ts"; -import { ChannelTypes } from "../../../src/types/mod.ts"; import { assertExists, assertEquals } from "../../deps.ts"; +import { bot } from "../../mod.ts"; import { delayUntil } from "../../utils.ts"; -export async function createGuildTests(bot: Bot, t: Deno.TestContext) { +export async function createGuildTests() { const guild = await bot.helpers.createGuild({ name: "Isekai Maid Fake Server", }); diff --git a/tests/helpers/guilds/deleteGuild.ts b/tests/helpers/guilds/deleteGuild.ts index 37af9a269..ab5ac70af 100644 --- a/tests/helpers/guilds/deleteGuild.ts +++ b/tests/helpers/guilds/deleteGuild.ts @@ -1,8 +1,8 @@ -import { Bot } from "../../../src/bot.ts"; -import { assertExists, assertEquals } from "../../deps.ts"; +import { assertExists } from "../../deps.ts"; +import { bot } from "../../mod.ts"; import { delayUntil } from "../../utils.ts"; -export async function deleteGuildTests(bot: Bot, t: Deno.TestContext) { +export async function deleteGuildTests() { const guild = await bot.helpers.createGuild({ name: "Isekai Maid Fake Server", }); diff --git a/tests/helpers/guilds/editGuild.ts b/tests/helpers/guilds/editGuild.ts index 25b5c9a1c..10abc63da 100644 --- a/tests/helpers/guilds/editGuild.ts +++ b/tests/helpers/guilds/editGuild.ts @@ -1,8 +1,7 @@ -import { Bot } from "../../../src/bot.ts"; -import { assertExists, assertEquals } from "../../deps.ts"; -import { delayUntil } from "../../utils.ts"; +import { assertExists } from "../../deps.ts"; +import { bot } from "../../mod.ts"; -export async function editGuildTests(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function editGuildTests(guildId: bigint) { const guild = await bot.helpers.editGuild( guildId, { diff --git a/tests/helpers/guilds/getAuditLogs.ts b/tests/helpers/guilds/getAuditLogs.ts index 4c5b3c942..c238ec818 100644 --- a/tests/helpers/guilds/getAuditLogs.ts +++ b/tests/helpers/guilds/getAuditLogs.ts @@ -1,7 +1,7 @@ -import { Bot } from "../../../src/bot.ts"; import { assertExists } from "../../deps.ts"; +import { bot } from "../../mod.ts"; -export async function getAuditLogsTests(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function getAuditLogsTests(guildId: bigint) { const logs = await bot.helpers.getAuditLogs(guildId); // Assertions diff --git a/tests/helpers/guilds/getAvailableVoiceRegions.ts b/tests/helpers/guilds/getAvailableVoiceRegions.ts index d63fa61c1..84f00a8e3 100644 --- a/tests/helpers/guilds/getAvailableVoiceRegions.ts +++ b/tests/helpers/guilds/getAvailableVoiceRegions.ts @@ -1,7 +1,7 @@ -import { Bot } from "../../../src/bot.ts"; -import { assertExists, assertEquals } from "../../deps.ts"; +import { assertExists } from "../../deps.ts"; +import { bot } from "../../mod.ts"; -export async function getAvailableVoiceRegionsTests(bot: Bot, t: Deno.TestContext) { +export async function getAvailableVoiceRegionsTests() { const regions = await bot.helpers.getAvailableVoiceRegions(); // Assertions diff --git a/tests/helpers/guilds/getBan.ts b/tests/helpers/guilds/getBan.ts index c8f31f5f0..222035b55 100644 --- a/tests/helpers/guilds/getBan.ts +++ b/tests/helpers/guilds/getBan.ts @@ -1,8 +1,7 @@ -import { Bot } from "../../../src/bot.ts"; import { assertExists, assertEquals } from "../../deps.ts"; -import { delayUntil } from "../../utils.ts"; +import { bot } from "../../mod.ts"; -export async function getBanTests(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function getBanTests(guildId: bigint) { await bot.helpers.banMember(guildId, 379643682984296448n); const fetchedBan = await bot.helpers.getBan(guildId, 379643682984296448n); diff --git a/tests/helpers/guilds/getBans.ts b/tests/helpers/guilds/getBans.ts index ac1ca7061..672a9e5f4 100644 --- a/tests/helpers/guilds/getBans.ts +++ b/tests/helpers/guilds/getBans.ts @@ -1,11 +1,7 @@ -import { Bot } from "../../../src/bot.ts"; -import { CreateGuildChannel } from "../../../src/types/guilds/createGuildChannel.ts"; -import { ChannelTypes } from "../../../src/types/mod.ts"; -import { assertExists, assertEquals } from "../../deps.ts"; -import { delayUntil } from "../../utils.ts"; -import { getAvailableVoiceRegions } from "../../../src/helpers/guilds/getAvailableVoiceRegions.ts"; +import { assertExists } from "../../deps.ts"; +import { bot } from "../../mod.ts"; -export async function getBansTests(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function getBansTests(guildId: bigint) { await bot.helpers.banMember(guildId, 416477607966670869n); await bot.helpers.banMember(guildId, 635383782576357407n); diff --git a/tests/helpers/guilds/getGuild.ts b/tests/helpers/guilds/getGuild.ts index e604ccb95..daa4acc83 100644 --- a/tests/helpers/guilds/getGuild.ts +++ b/tests/helpers/guilds/getGuild.ts @@ -1,8 +1,7 @@ -import { Bot } from "../../../src/bot.ts"; import { assertExists, assertEquals } from "../../deps.ts"; -import { delayUntil } from "../../utils.ts"; +import { bot } from "../../mod.ts"; -export async function getGuildTests(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function getGuildTests(guildId: bigint) { const fetchedGuild = await bot.helpers.getGuild(guildId); // Assertions diff --git a/tests/helpers/guilds/getVanityUrl.ts b/tests/helpers/guilds/getVanityUrl.ts index ee80a5dab..dfd4cbabc 100644 --- a/tests/helpers/guilds/getVanityUrl.ts +++ b/tests/helpers/guilds/getVanityUrl.ts @@ -1,7 +1,7 @@ import { Bot } from "../../../src/bot.ts"; import { assertExists, assertEquals } from "../../deps.ts"; -export async function getVanityURLTests(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function getVanityURLTests(guildId: bigint) { // TODO: VANITY IS BROKEN ATM FROM DISCORDS SIDE return; // const fetchedVanityURL = await bot.helpers.getVanityURL(guildId); diff --git a/tests/helpers/guilds/scheduledEvents/deleteScheduledEvent.ts b/tests/helpers/guilds/scheduledEvents/deleteScheduledEvent.ts index 2d29f35b7..40ba5d230 100644 --- a/tests/helpers/guilds/scheduledEvents/deleteScheduledEvent.ts +++ b/tests/helpers/guilds/scheduledEvents/deleteScheduledEvent.ts @@ -1,6 +1,4 @@ import { Bot } from "../../../../src/bot.ts"; import { ScheduledEventEntityType, ScheduledEventPrivacyLevel } from "../../../../src/types/guilds/scheduledEvents.ts"; -export async function deleteScheduledEventTests(bot: Bot, guildId: bigint, t: Deno.TestContext) { - -} +export async function deleteScheduledEventTests(guildId: bigint) {} diff --git a/tests/helpers/guilds/scheduledEvents/editScheduledEvent.ts b/tests/helpers/guilds/scheduledEvents/editScheduledEvent.ts index 1530caf40..416af9591 100644 --- a/tests/helpers/guilds/scheduledEvents/editScheduledEvent.ts +++ b/tests/helpers/guilds/scheduledEvents/editScheduledEvent.ts @@ -1,9 +1,12 @@ -import { Bot } from "../../../../src/bot.ts"; import { ChannelTypes } from "../../../../src/types/channels/channelTypes.ts"; -import { CreateScheduledEvent, ScheduledEventEntityType, ScheduledEventPrivacyLevel } from "../../../../src/types/guilds/scheduledEvents.ts"; +import { + ScheduledEventEntityType, + ScheduledEventPrivacyLevel, +} from "../../../../src/types/guilds/scheduledEvents.ts"; import { assertEquals } from "../../../deps.ts"; +import { bot } from "../../../mod.ts"; -export async function editScheduledEventTests(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function editScheduledEventTests(guildId: bigint) { const channel = await bot.helpers.createChannel(guildId, { name: "entity", type: ChannelTypes.GuildStageVoice, diff --git a/tests/helpers/invites/createInvite.ts b/tests/helpers/invites/createInvite.ts index f8864779e..b5f444e2a 100644 --- a/tests/helpers/invites/createInvite.ts +++ b/tests/helpers/invites/createInvite.ts @@ -1,7 +1,7 @@ import { Bot } from "../../../src/bot.ts"; import { assertExists } from "../../deps.ts"; -export async function createInviteTest(bot: Bot, channelId: bigint, t: Deno.TestContext) { +export async function createInviteTest(channelId: bigint) { const invite = await bot.helpers.createInvite(channelId, { maxAge: 86400, maxUses: 0, diff --git a/tests/helpers/invites/deleteInvite.ts b/tests/helpers/invites/deleteInvite.ts index 8f0db9724..9c6a51746 100644 --- a/tests/helpers/invites/deleteInvite.ts +++ b/tests/helpers/invites/deleteInvite.ts @@ -1,7 +1,7 @@ import { Bot } from "../../../src/bot.ts"; import { assertExists } from "../../deps.ts"; -export async function deleteInviteTest(bot: Bot, channelId: bigint, t: Deno.TestContext) { +export async function deleteInviteTest(channelId: bigint) { const invite = await bot.helpers.createInvite(channelId, { maxAge: 86400, maxUses: 0, diff --git a/tests/helpers/invites/getChannelInvites.ts b/tests/helpers/invites/getChannelInvites.ts index cb7f97db2..59dc44484 100644 --- a/tests/helpers/invites/getChannelInvites.ts +++ b/tests/helpers/invites/getChannelInvites.ts @@ -1,7 +1,7 @@ import { Bot } from "../../../src/bot.ts"; import { assertExists } from "../../deps.ts"; -export async function getChannelInvitesTest(bot: Bot, channelId: bigint, t: Deno.TestContext) { +export async function getChannelInvitesTest(channelId: bigint) { const invite = await bot.helpers.createInvite(channelId, { maxAge: 86400, maxUses: 0, diff --git a/tests/helpers/invites/getInvite.ts b/tests/helpers/invites/getInvite.ts index b78854093..2242e5af2 100644 --- a/tests/helpers/invites/getInvite.ts +++ b/tests/helpers/invites/getInvite.ts @@ -1,7 +1,7 @@ import { Bot } from "../../../src/bot.ts"; import { assertEquals, assertExists } from "../../deps.ts"; -export async function getInviteTest(bot: Bot, channelId: bigint, t: Deno.TestContext) { +export async function getInviteTest(channelId: bigint) { const invite = await bot.helpers.createInvite(channelId, { maxAge: 86400, maxUses: 0, diff --git a/tests/helpers/members/fetchMembers.ts b/tests/helpers/members/fetchMembers.ts index 1bf018a87..9900fd272 100644 --- a/tests/helpers/members/fetchMembers.ts +++ b/tests/helpers/members/fetchMembers.ts @@ -1,6 +1,4 @@ import { Bot } from "../../../src/bot.ts"; import { assertExists } from "../../deps.ts"; -export async function fetchSingleMemberTest(bot: Bot, guildId: bigint, t: Deno.TestContext) { - -} +export async function fetchSingleMemberTest(guildId: bigint) {} diff --git a/tests/helpers/messages/deleteMessage.ts b/tests/helpers/messages/deleteMessage.ts index e0ad6ae76..a6a718e55 100644 --- a/tests/helpers/messages/deleteMessage.ts +++ b/tests/helpers/messages/deleteMessage.ts @@ -1,8 +1,8 @@ -import { Bot } from "../../../src/bot.ts"; import { assertExists } from "../../deps.ts"; +import { bot } from "../../mod.ts"; import { delayUntil } from "../../utils.ts"; -async function ifItFailsBlameWolf(bot: Bot, channelId: bigint, reason?: string) { +async function ifItFailsBlameWolf(channelId: bigint, reason?: string) { const message = await bot.helpers.sendMessage(channelId, "Hello World!"); // Assertions @@ -25,10 +25,10 @@ async function ifItFailsBlameWolf(bot: Bot, channelId: bigint, reason?: string) } } -export async function deleteMessageWithoutReasonTest(bot: Bot, channelId: bigint, t: Deno.TestContext) { - await ifItFailsBlameWolf(bot, channelId); +export async function deleteMessageWithoutReasonTest(channelId: bigint) { + await ifItFailsBlameWolf(channelId); } -export async function deleteMessageWithReasonTest(bot: Bot, channelId: bigint, t: Deno.TestContext) { - await ifItFailsBlameWolf(bot, channelId, "with a reason"); +export async function deleteMessageWithReasonTest(channelId: bigint) { + await ifItFailsBlameWolf(channelId, "with a reason"); } diff --git a/tests/helpers/messages/deleteMessages.ts b/tests/helpers/messages/deleteMessages.ts index 3a6235b9a..a285c6b5f 100644 --- a/tests/helpers/messages/deleteMessages.ts +++ b/tests/helpers/messages/deleteMessages.ts @@ -1,8 +1,8 @@ -import { Bot } from "../../../src/bot.ts"; import { assertExists } from "../../deps.ts"; +import { bot } from "../../mod.ts"; import { delayUntil } from "../../utils.ts"; -async function ifItFailsBlameWolf(bot: Bot, channelId: bigint, reason?: string) { +async function ifItFailsBlameWolf(channelId: bigint, reason?: string) { const message = await bot.helpers.sendMessage(channelId, "Hello World!"); const secondMessage = await bot.helpers.sendMessage(channelId, "Hello World 2!"); @@ -27,10 +27,10 @@ async function ifItFailsBlameWolf(bot: Bot, channelId: bigint, reason?: string) } } -export async function deleteMessagesWithoutReasonTest(bot: Bot, channelId: bigint, t: Deno.TestContext) { - await ifItFailsBlameWolf(bot, channelId); +export async function deleteMessagesWithoutReasonTest(channelId: bigint) { + await ifItFailsBlameWolf(channelId); } -export async function deleteMessagesWithReasonTest(bot: Bot, channelId: bigint, t: Deno.TestContext) { - await ifItFailsBlameWolf(bot, channelId, "with a reason"); +export async function deleteMessagesWithReasonTest(channelId: bigint) { + await ifItFailsBlameWolf(channelId, "with a reason"); } diff --git a/tests/helpers/messages/editMessage.ts b/tests/helpers/messages/editMessage.ts index d6659273d..91100fb8e 100644 --- a/tests/helpers/messages/editMessage.ts +++ b/tests/helpers/messages/editMessage.ts @@ -1,8 +1,8 @@ -import { Bot } from "../../../src/bot.ts"; import { assertExists } from "../../deps.ts"; +import { bot } from "../../mod.ts"; import { delayUntil } from "../../utils.ts"; -export async function editMessageTest(bot: Bot, channelId: bigint, t: Deno.TestContext) { +export async function editMessageTest(channelId: bigint) { const message = await bot.helpers.sendMessage(channelId, "Hello World!"); // Assertions diff --git a/tests/helpers/messages/getMessage.ts b/tests/helpers/messages/getMessage.ts index 5059788d5..578cc3982 100644 --- a/tests/helpers/messages/getMessage.ts +++ b/tests/helpers/messages/getMessage.ts @@ -1,8 +1,9 @@ import { Bot } from "../../../src/bot.ts"; import { assertEquals, assertExists } from "../../deps.ts"; +import { bot } from "../../mod.ts"; import { delayUntil } from "../../utils.ts"; -export async function getMessageTest(bot: Bot, channelId: bigint, t: Deno.TestContext) { +export async function getMessageTest(channelId: bigint) { const message = await bot.helpers.sendMessage(channelId, "Hello World!"); // Assertions diff --git a/tests/helpers/messages/getMessages.ts b/tests/helpers/messages/getMessages.ts index 708af6e8f..c719eb271 100644 --- a/tests/helpers/messages/getMessages.ts +++ b/tests/helpers/messages/getMessages.ts @@ -1,8 +1,8 @@ -import { Bot } from "../../../src/bot.ts"; import { assertEquals, assertExists } from "../../deps.ts"; +import { bot } from "../../mod.ts"; import { delayUntil } from "../../utils.ts"; -export async function getMessagesTest(bot: Bot, channelId: bigint, t: Deno.TestContext) { +export async function getMessagesTest(channelId: bigint) { const message = await bot.helpers.sendMessage(channelId, "Hello World!"); const secondMessage = await bot.helpers.sendMessage(channelId, "Hello World 2!"); const thirdMessage = await bot.helpers.sendMessage(channelId, "Hello World 3!"); diff --git a/tests/helpers/messages/pin.ts b/tests/helpers/messages/pin.ts index a3bdec9de..dfafc6db5 100644 --- a/tests/helpers/messages/pin.ts +++ b/tests/helpers/messages/pin.ts @@ -1,11 +1,11 @@ -import { Bot } from "../../../src/bot.ts"; import { assertEquals } from "../../deps.ts"; +import { bot } from "../../mod.ts"; import { delayUntil } from "../../utils.ts"; -export async function pinMessageTests(bot: Bot, channelId: bigint, messageId: bigint, t: Deno.TestContext) { +export async function pinMessageTests(channelId: bigint, messageId: bigint) { let pinned = false; - bot.events.channelPinsUpdate = function (bot, payload) { + bot.events.channelPinsUpdate = function (_, payload) { if (payload.channelId === channelId) pinned = !pinned; }; diff --git a/tests/helpers/messages/reactions.ts b/tests/helpers/messages/reactions.ts index cba6a1087..c891f96cd 100644 --- a/tests/helpers/messages/reactions.ts +++ b/tests/helpers/messages/reactions.ts @@ -1,15 +1,14 @@ import { Bot } from "../../../src/bot.ts"; import { assertEquals, assertExists } from "../../deps.ts"; +import { bot } from "../../mod.ts"; import { delayUntil } from "../../utils.ts"; const reactionCounters = new Map(); export async function addReactionTest( - bot: Bot, guildId: bigint, channelId: bigint, - options: { custom: boolean; single: boolean; ordered: boolean }, - t: Deno.TestContext + options: { custom: boolean; single: boolean; ordered: boolean } ) { const message = await bot.helpers.sendMessage(channelId, "Hello World!"); @@ -76,7 +75,7 @@ export async function addReactionTest( assertEquals(reactionCounters.get(message.id), options.single ? 1 : emojiIds.length); } -export async function removeAllReactionTests(bot: Bot, channelId: bigint, t: Deno.TestContext) { +export async function removeAllReactionTests(channelId: bigint) { const message = await bot.helpers.sendMessage(channelId, "Hello World!"); // Assertions @@ -117,7 +116,7 @@ export async function removeAllReactionTests(bot: Bot, channelId: bigint, t: Den assertEquals(reactionCounters.get(message.id), 0); } -export async function removeReactionTest(bot: Bot, channelId: bigint, t: Deno.TestContext) { +export async function removeReactionTest(channelId: bigint) { const message = await bot.helpers.sendMessage(channelId, "Hello World!"); // Assertions @@ -159,7 +158,7 @@ export async function removeReactionTest(bot: Bot, channelId: bigint, t: Deno.Te assertEquals(reactionCounters.get(message.id), 2); } -export async function removeReactionEmojiTest(bot: Bot, channelId: bigint, t: Deno.TestContext) { +export async function removeReactionEmojiTest(channelId: bigint) { const message = await bot.helpers.sendMessage(channelId, "Hello World!"); // Assertions diff --git a/tests/helpers/messages/sendMessage.ts b/tests/helpers/messages/sendMessage.ts index d0c63287b..05792e0c4 100644 --- a/tests/helpers/messages/sendMessage.ts +++ b/tests/helpers/messages/sendMessage.ts @@ -1,11 +1,11 @@ -import { Bot } from "../../../src/bot.ts"; import { assertExists } from "../../deps.ts"; import { delayUntil } from "../../utils.ts"; import { CreateMessage } from "../../../src/types/messages/createMessage.ts"; import { MessageComponentTypes } from "../../../src/types/messages/components/messageComponentTypes.ts"; import { ButtonStyles } from "../../../src/types/messages/components/buttonStyles.ts"; +import { bot } from "../../mod.ts"; -async function ifItFailsBlameWolf(bot: Bot, channelId: bigint, content: string | CreateMessage) { +async function ifItFailsBlameWolf(channelId: bigint, content: string | CreateMessage) { const message = await bot.helpers.sendMessage(channelId, content); // Assertions assertExists(message); @@ -17,12 +17,12 @@ async function ifItFailsBlameWolf(bot: Bot, channelId: bigint, content: string | } } -export async function sendMessageWithTextTest(bot: Bot, channelId: bigint, t: Deno.TestContext) { - await ifItFailsBlameWolf(bot, channelId, "Hello World!"); +export async function sendMessageWithTextTest(channelId: bigint) { + await ifItFailsBlameWolf(channelId, "Hello World!"); } -export async function sendMessageWithComponents(bot: Bot, channelId: bigint, t: Deno.TestContext) { - await ifItFailsBlameWolf(bot, channelId, { +export async function sendMessageWithComponents(channelId: bigint) { + await ifItFailsBlameWolf(channelId, { content: "Hello World!", components: [ { @@ -57,8 +57,8 @@ export async function sendMessageWithComponents(bot: Bot, channelId: bigint, t: }); } -export async function sendMessageWithEmbedsTest(bot: Bot, channelId: bigint, t: Deno.TestContext) { - await ifItFailsBlameWolf(bot, channelId, { +export async function sendMessageWithEmbedsTest(channelId: bigint) { + await ifItFailsBlameWolf(channelId, { embeds: [ { title: "Hello World", diff --git a/tests/helpers/misc/user.ts b/tests/helpers/misc/user.ts index 1937bd024..f66dc2c3a 100644 --- a/tests/helpers/misc/user.ts +++ b/tests/helpers/misc/user.ts @@ -1,6 +1,6 @@ import { Bot } from "../../../src/bot.ts"; import { assertExists } from "../../deps.ts"; -export async function getUserTests(bot: Bot, t: Deno.TestContext) { +export async function getUserTests() { } diff --git a/tests/helpers/roles/createRole.ts b/tests/helpers/roles/createRole.ts index 05dae1692..f38ab2600 100644 --- a/tests/helpers/roles/createRole.ts +++ b/tests/helpers/roles/createRole.ts @@ -1,8 +1,8 @@ -import { Bot } from "../../../src/bot.ts"; import { assertExists } from "../../deps.ts"; +import { bot } from "../../mod.ts"; import { delayUntil } from "../../utils.ts"; -export async function createRoleTests(bot: Bot, guildId: bigint, options: { reason?: string }, t: Deno.TestContext) { +export async function createRoleTests(guildId: bigint, options: { reason?: string }) { const role = await bot.helpers.createRole(guildId, { name: "hoti" }, options.reason); assertExists(role); diff --git a/tests/helpers/roles/editRole.ts b/tests/helpers/roles/editRole.ts index 1a82361af..85044631d 100644 --- a/tests/helpers/roles/editRole.ts +++ b/tests/helpers/roles/editRole.ts @@ -2,7 +2,7 @@ import { Bot } from "../../../src/bot.ts"; import { assertEquals, assertExists } from "../../deps.ts"; import { delayUntil } from "../../utils.ts"; -export async function editRoleTests(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function editRoleTests(guildId: bigint) { const role = await bot.helpers.createRole(guildId, { name: "hoti", }); diff --git a/tests/helpers/roles/getRoles.ts b/tests/helpers/roles/getRoles.ts index bf0f30761..edb381500 100644 --- a/tests/helpers/roles/getRoles.ts +++ b/tests/helpers/roles/getRoles.ts @@ -1,7 +1,7 @@ import { Bot } from "../../../src/bot.ts"; import { assertEquals } from "../../deps.ts"; -export async function getRolesTest(bot: Bot, guildId: bigint, t: Deno.TestContext) { +export async function getRolesTest(guildId: bigint) { const roles = await bot.helpers.getRoles(guildId); assertEquals(bot.guilds.get(guildId)?.roles.size, roles.size); diff --git a/tests/members/getDmChannel.ts b/tests/members/getDmChannel.ts index f1809db14..fd6e4b232 100644 --- a/tests/members/getDmChannel.ts +++ b/tests/members/getDmChannel.ts @@ -1,7 +1,7 @@ import { bot } from "../mod.ts"; Deno.test("[member] get dm channel and send a message", async () => { - // Skillz ID - const channel = await bot.helpers.getDmChannel(130136895395987456n); + // Itoh Alt ID + const channel = await bot.helpers.getDmChannel(750661528360845322n); await bot.helpers.sendMessage(channel.id, "https://i.imgur.com/doG55NR.png"); }); diff --git a/tests/messages/reactions.ts b/tests/messages/reactions.ts new file mode 100644 index 000000000..7bd762fdd --- /dev/null +++ b/tests/messages/reactions.ts @@ -0,0 +1,262 @@ +import { Bot } from "../../mod.ts"; +import { reactionCounters } from "../constants.ts"; +import { assertExists, assertEquals } from "../deps.ts"; +// import { +// addReactionTest, +// removeReactionTest, +// removeAllReactionTests, +// removeReactionEmojiTest, +// } from "../helpers/messages/reactions.ts"; +import { bot, guild, channel } from "../mod.ts"; +import { delayUntil } from "../utils.ts"; + +export async function addReactionTest( + guildId: bigint, + channelId: bigint, + options: { custom: boolean; single: boolean; ordered: boolean }, +) { + const message = await bot.helpers.sendMessage(channelId, "Hello World!"); + + // Assertions + assertExists(message); + + // Delay the execution to allow event to be processed + await delayUntil(10000, () => bot.messages.has(message.id)); + + if (!bot.messages.has(message.id)) { + throw new Error("The message seemed to be sent but it was not cached."); + } + + let emojiId = "❤"; + let emojiIds = ["❤", "😃"]; + + if (options.custom) { + if (options.single) { + emojiId = `<:blamewolf:${ + ( + await bot.helpers.createEmoji(guildId, { + name: "blamewolf", + image: "https://cdn.discordapp.com/emojis/814955268123000832.png", + // roles: [], + }) + ).id + }>`; + } else { + emojiIds = [ + `<:blamewolf:${ + ( + await bot.helpers.createEmoji(guildId, { + name: "blamewolf", + image: "https://cdn.discordapp.com/emojis/814955268123000832.png", + // roles: [], + }) + ).id + }>`, + `<:blamewolf2:${ + ( + await bot.helpers.createEmoji(guildId, { + name: "blamewolf2", + image: "https://cdn.discordapp.com/emojis/814955268123000832.png", + // roles: [], + }) + ).id + }>`, + ]; + } + } + + reactionCounters.set(message.id, 0); + + bot.events.reactionAdd = function (bot, payload) { + const current = reactionCounters.get(payload.messageId) || 0; + reactionCounters.set(payload.messageId, current + 1); + }; + + if (options.single) await bot.helpers.addReaction(message.channelId, message.id, emojiId); + else await bot.helpers.addReactions(message.channelId, message.id, emojiIds, options.ordered); + + await delayUntil(10000, () => reactionCounters.get(message.id) === (options.single ? 1 : emojiIds.length)); + + assertEquals(reactionCounters.get(message.id), options.single ? 1 : emojiIds.length); +} + +export async function removeAllReactionTests(channelId: bigint) { + const message = await bot.helpers.sendMessage(channelId, "Hello World!"); + + // Assertions + assertExists(message); + + // Delay the execution to allow event to be processed + await delayUntil(10000, () => bot.messages.has(message.id)); + + if (!bot.messages.has(message.id)) { + throw new Error("The message seemed to be sent but it was not cached."); + } + + reactionCounters.set(message.id, 0); + + bot.events.reactionRemoveAll = function (_, payload) { + reactionCounters.set(payload.messageId, 0); + }; + + bot.events.reactionAdd = function (_, payload) { + const current = reactionCounters.get(payload.messageId) || 0; + reactionCounters.set(payload.messageId, current + 1); + }; + + // Add reactions to the message + await bot.helpers.addReactions(message.channelId, message.id, ["❤", "😃", "🤫"]); + // Delay the execution to allow event to be processed + await delayUntil(10000, () => reactionCounters.get(message.id) === 3); + + // Be sure that the message has the reactions + assertEquals(reactionCounters.get(message.id), 3); + + await bot.helpers.removeAllReactions(message.channelId, message.id); + + // Delay the execution to allow event to be processed + await delayUntil(10000, () => reactionCounters.get(message.id) === 0); + + // Check if the reactions has been deleted + assertEquals(reactionCounters.get(message.id), 0); +} + +export async function removeReactionTest(channelId: bigint) { + const message = await bot.helpers.sendMessage(channelId, "Hello World!"); + + // Assertions + assertExists(message); + + // Delay the execution to allow event to be processed + await delayUntil(10000, () => bot.messages.has(message.id)); + + if (!bot.messages.has(message.id)) { + throw new Error("The message seemed to be sent but it was not cached."); + } + + reactionCounters.set(message.id, 0); + + bot.events.reactionRemove = function (bot, payload) { + const current = reactionCounters.get(message.id); + reactionCounters.set(payload.messageId, (current || 0) - 1); + }; + + bot.events.reactionAdd = function (bot, payload) { + const current = reactionCounters.get(payload.messageId) || 0; + reactionCounters.set(payload.messageId, current + 1); + }; + + // Add reactions to the message + await bot.helpers.addReactions(message.channelId, message.id, ["❤", "😃", "🤫"]); + // Delay the execution to allow event to be processed + await delayUntil(10000, () => reactionCounters.get(message.id) === 3); + + // Be sure that the message has the reactions + assertEquals(reactionCounters.get(message.id), 3); + + await bot.helpers.removeReaction(message.channelId, message.id, "😃"); + + // Delay the execution to allow event to be processed + await delayUntil(10000, () => reactionCounters.get(message.id) === 2); + + // Check if the reactions has been deleted + assertEquals(reactionCounters.get(message.id), 2); +} + +export async function removeReactionEmojiTest(channelId: bigint) { + const message = await bot.helpers.sendMessage(channelId, "Hello World!"); + + // Assertions + assertExists(message); + + // Delay the execution to allow event to be processed + await delayUntil(10000, () => bot.messages.has(message.id)); + + if (!bot.messages.has(message.id)) { + throw new Error("The message seemed to be sent but it was not cached."); + } + + reactionCounters.set(message.id, 0); + + bot.events.reactionAdd; + + bot.events.reactionRemoveEmoji = function (bot, payload) { + reactionCounters.set(payload.messageId, 0); + }; + + bot.events.reactionAdd = function (bot, payload) { + const current = reactionCounters.get(payload.messageId) || 0; + reactionCounters.set(payload.messageId, current + 1); + }; + + // Add reactions to the message + await bot.helpers.addReactions(message.channelId, message.id, ["❤", "😃"]); + // Delay the execution to allow event to be processed + await delayUntil(10000, () => reactionCounters.get(message.id) === 2); + + // Be sure that the message has the reactions + assertEquals(reactionCounters.get(message.id), 2); + + await bot.helpers.removeReactionEmoji(message.channelId, message.id, "😃"); + + // Delay the execution to allow event to be processed + await delayUntil(10000, () => reactionCounters.get(message.id) === 0); + + // Check if the reactions has been deleted + assertEquals(reactionCounters.get(message.id), 0); +} + +Deno.test({ + name: "[message] add a reaction", + fn: async (t) => { + await addReactionTest(guild.id, channel.id, { custom: false, single: true, ordered: false }); + }, +}); +Deno.test({ + name: "[message] add a custom reaction", + fn: async (t) => { + await addReactionTest(guild.id, channel.id, { custom: true, single: true, ordered: false }); + }, +}); +Deno.test({ + name: "[message] add multiple reactions", + fn: async (t) => { + await addReactionTest(guild.id, channel.id, { custom: false, single: false, ordered: false }); + }, +}); +Deno.test({ + name: "[message] add multiple custom reactions", + fn: async (t) => { + await addReactionTest(guild.id, channel.id, { custom: true, single: false, ordered: false }); + }, +}); +Deno.test({ + name: "[message] add multiple reactions in order", + fn: async (t) => { + await addReactionTest(guild.id, channel.id, { custom: false, single: false, ordered: true }); + }, +}); +Deno.test({ + name: "[message] add multiple custom reactions in order", + fn: async (t) => { + await addReactionTest(guild.id, channel.id, { custom: true, single: false, ordered: true }); + }, +}); +Deno.test({ + name: "[message] remove a reaction.", + fn: async (t) => { + await removeReactionTest(channel.id); + }, +}); +Deno.test({ + name: "[message] remove all reactions.", + fn: async (t) => { + await removeAllReactionTests(channel.id); + }, +}); +Deno.test({ + name: "[message] remove emoji reactions.", + fn: async (t) => { + await removeReactionEmojiTest(channel.id); + }, +}); diff --git a/tests/mod.ts b/tests/mod.ts index 965a0bfb5..8c4ba289a 100644 --- a/tests/mod.ts +++ b/tests/mod.ts @@ -63,7 +63,9 @@ const baseBot = createBot({ ], }); -const bot = enableCachePlugin(baseBot); +// @ts-ignore +export const bot = enableCachePlugin(baseBot); +// @ts-ignore await startBot(bot); // Delay the execution to allow READY events to be processed @@ -71,7 +73,7 @@ await delayUntil(10000, () => Boolean(startedAt)); console.log("Bot online"); // DELETE GUILDS IF LESS THAN 10 SERVERS AS SAFETY MEASURE -if (bot.guilds.size() <= 10) { +if (bot.guilds.size <= 10) { bot.guilds.forEach(async (guild) => { // DO NOT DELETE OUR CACHED TEST SERVER FOR COMMUNITY FEATURES if (guild.id === CACHED_COMMUNITY_GUILD_ID) return; @@ -107,105 +109,66 @@ export const message = await bot.helpers.sendMessage(channel.id, "Hello Skillz") import "./benchmark.ts"; -Deno.test({ - name: "[guild] format a guild's icon url", - fn: async (t) => { - assertEquals(bot.helpers.guildIconURL(guild.id, { icon: guild.icon }), undefined); - assertEquals( - bot.helpers.guildIconURL(785384884197392384n, { - icon: 3837424427068676005442449262648382018748n, - }), - "https://cdn.discordapp.com/icons/785384884197392384/46f50fb412eab14ec455d5cf777154bc.jpg?size=128" - ); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[guild] format a guild's banner url", - fn: async (t) => { - assertEquals(bot.helpers.guildBannerURL(guild.id, { banner: guild.banner }), undefined); - assertEquals( - bot.helpers.guildBannerURL(613425648685547541n, { - banner: 3919584870146358272366452115178209474142n, - }), - "https://cdn.discordapp.com/banners/613425648685547541/84c4964c115c128fb9100952c3b4f65e.jpg?size=128" - ); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[guild] format a guild's splash url", - fn: async (t) => { - assertEquals(bot.helpers.guildSplashURL(guild.id, { splash: guild.splash }), undefined); - assertEquals( - bot.helpers.guildSplashURL(785384884197392384n, { - splash: 3837424427068676005442449262648382018748n, - }), - "https://cdn.discordapp.com/splashes/785384884197392384/46f50fb412eab14ec455d5cf777154bc.jpg?size=128" - ); - }, - ...sanitizeMode, -}); Deno.test({ name: "[guild] create a guild", fn: async (t) => { - await createGuildTests(bot, t); + await createGuildTests(); }, ...sanitizeMode, }); Deno.test({ name: "[guild] delete a guild", fn: async (t) => { - await deleteGuildTests(bot, t); + await deleteGuildTests(); }, ...sanitizeMode, }); Deno.test({ name: "[guild] edit a guild", fn: async (t) => { - await editGuildTests(bot, guild.id, t); + await editGuildTests(guild.id); }, ...sanitizeMode, }); Deno.test({ name: "[guild] get audit logs", fn: async (t) => { - await getAuditLogsTests(bot, guild.id, t); + await getAuditLogsTests(guild.id); }, ...sanitizeMode, }); Deno.test({ name: "[guild] get available voice regions", fn: async (t) => { - await getAvailableVoiceRegionsTests(bot, t); + await getAvailableVoiceRegionsTests(); }, ...sanitizeMode, }); Deno.test({ name: "[guild] get a ban", fn: async (t) => { - await getBanTests(bot, guild.id, t); + await getBanTests(guild.id); }, ...sanitizeMode, }); Deno.test({ name: "[guild] get bans", fn: async (t) => { - await getBansTests(bot, guild.id, t); + await getBansTests(guild.id); }, ...sanitizeMode, }); Deno.test({ name: "[guild] get guilds", fn: async (t) => { - await getGuildTests(bot, guild.id, t); + await getGuildTests(guild.id); }, ...sanitizeMode, }); Deno.test({ name: "[guild] get vanity url", fn: async (t) => { - await getVanityURLTests(bot, guild.id, t); + await getVanityURLTests(guild.id); }, ...sanitizeMode, }); @@ -213,140 +176,78 @@ Deno.test({ Deno.test({ name: "[message] send message with text", fn: async (t) => { - await sendMessageWithTextTest(bot, channel.id, t); + await sendMessageWithTextTest(channel.id); }, ...sanitizeMode, }); Deno.test({ name: "[message] send message with embeds", fn: async (t) => { - await sendMessageWithEmbedsTest(bot, channel.id, t); + await sendMessageWithEmbedsTest(channel.id); }, ...sanitizeMode, }); Deno.test({ name: "[message] send message with components", fn: async (t) => { - await sendMessageWithComponents(bot, channel.id, t); + await sendMessageWithComponents(channel.id); }, ...sanitizeMode, }); Deno.test({ name: "[message] edit message", fn: async (t) => { - await editMessageTest(bot, channel.id, t); + await editMessageTest(channel.id); }, ...sanitizeMode, }); Deno.test({ name: "[message] delete message without a reason", fn: async (t) => { - await deleteMessageWithoutReasonTest(bot, channel.id, t); + await deleteMessageWithoutReasonTest(channel.id); }, ...sanitizeMode, }); Deno.test({ name: "[message] delete message with a reason", fn: async (t) => { - await deleteMessageWithReasonTest(bot, channel.id, t); + await deleteMessageWithReasonTest(channel.id); }, ...sanitizeMode, }); Deno.test({ name: "[message] delete messages without a reason", fn: async (t) => { - await deleteMessagesWithoutReasonTest(bot, channel.id, t); + await deleteMessagesWithoutReasonTest(channel.id); }, ...sanitizeMode, }); Deno.test({ name: "[message] delete messages with a reason", fn: async (t) => { - await deleteMessagesWithReasonTest(bot, channel.id, t); + await deleteMessagesWithReasonTest(channel.id); }, ...sanitizeMode, }); Deno.test({ name: "[message] fetch a message", fn: async (t) => { - await getMessageTest(bot, channel.id, t); + await getMessageTest(channel.id); }, ...sanitizeMode, }); Deno.test({ name: "[message] fetch messages", fn: async (t) => { - await getMessagesTest(bot, channel.id, t); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[message] add a reaction", - fn: async (t) => { - await addReactionTest(bot, guild.id, channel.id, { custom: false, single: true, ordered: false }, t); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[message] add a custom reaction", - fn: async (t) => { - await addReactionTest(bot, guild.id, channel.id, { custom: true, single: true, ordered: false }, t); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[message] add multiple reactions", - fn: async (t) => { - await addReactionTest(bot, guild.id, channel.id, { custom: false, single: false, ordered: false }, t); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[message] add multiple custom reactions", - fn: async (t) => { - await addReactionTest(bot, guild.id, channel.id, { custom: true, single: false, ordered: false }, t); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[message] add multiple reactions in order", - fn: async (t) => { - await addReactionTest(bot, guild.id, channel.id, { custom: false, single: false, ordered: true }, t); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[message] add multiple custom reactions in order", - fn: async (t) => { - await addReactionTest(bot, guild.id, channel.id, { custom: true, single: false, ordered: true }, t); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[message] remove a reaction.", - fn: async (t) => { - await removeReactionTest(bot, channel.id, t); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[message] remove all reactions.", - fn: async (t) => { - await removeAllReactionTests(bot, channel.id, t); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[message] remove emoji reactions.", - fn: async (t) => { - await removeReactionEmojiTest(bot, channel.id, t); + await getMessagesTest(channel.id); }, ...sanitizeMode, }); + Deno.test({ name: "[message] pin a message", fn: async (t) => { - await pinMessageTests(bot, channel.id, message.id, t); + await pinMessageTests(channel.id, message.id); }, ...sanitizeMode, }); @@ -354,221 +255,72 @@ Deno.test({ Deno.test({ name: "[channel] send message with text", fn: async (t) => { - await sendMessageWithTextTest(bot, channel.id, t); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[channel] create a new text channel", - async fn(t) { - await createChannelTests(bot, guild.id, { name: "Discordeno-test" }, false, t); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[channel] create a new category channel", - async fn(t) { - await createChannelTests( - bot, - guild.id, - { - name: "Discordeno-test", - type: ChannelTypes.GuildCategory, - }, - false, - t - ); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[channel] create a new news channel", - async fn(t) { - await createChannelTests( - bot, - CACHED_COMMUNITY_GUILD_ID, - { name: "Discordeno-test", type: ChannelTypes.GuildNews }, - true, - t - ); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[channel] create a new voice channel", - async fn(t) { - await createChannelTests( - bot, - guild.id, - { - name: "Discordeno-test", - type: ChannelTypes.GuildVoice, - }, - false, - t - ); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[channel] create a new voice channel with a bitrate", - async fn(t) { - await createChannelTests( - bot, - guild.id, - { - name: "discordeno-test", - type: ChannelTypes.GuildVoice, - bitrate: 32000, - }, - false, - t - ); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[channel] create a new voice channel with a user limit", - async fn(t) { - await createChannelTests( - bot, - guild.id, - { - name: "Discordeno-test", - type: ChannelTypes.GuildVoice, - userLimit: 32, - }, - false, - t - ); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[channel] create a new text channel with a rate limit per user", - async fn(t) { - await createChannelTests( - bot, - guild.id, - { - name: "Discordeno-test", - rateLimitPerUser: 2423, - }, - false, - t - ); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[channel] create a new text channel with NSFW", - async fn(t) { - await createChannelTests(bot, guild.id, { name: "Discordeno-test", nsfw: true }, false, t); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[channel] create a new text channel with permission overwrites", - async fn(t) { - await createChannelTests( - bot, - guild.id, - { - name: "Discordeno-test", - permissionOverwrites: [ - { - id: bot.id, - type: OverwriteTypes.Member, - allow: ["VIEW_CHANNEL"], - deny: [], - }, - ], - }, - false, - t - ); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[channel] delete a channel with a reason", - async fn(t) { - await deleteChannelTests( - bot, - guild.id, - { - reason: "with a reason", - }, - t - ); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[channel] delete a channel without a reason", - async fn(t) { - await deleteChannelTests(bot, guild.id, {}, t); + await sendMessageWithTextTest(channel.id); }, ...sanitizeMode, }); + + Deno.test({ name: "[channel] filter all category channels", async fn(t) { - await categoryChildrenTest(bot, guild.id, t); + await categoryChildrenTest(guild.id); }, ...sanitizeMode, }); Deno.test({ name: "[channel] edit a channel permission overwrite", async fn(t) { - await channelOverwriteHasPermissionTest(bot, guild.id, t); + await channelOverwriteHasPermissionTest(guild.id); }, ...sanitizeMode, }); Deno.test({ name: "[channel] clone a channel w/o a reason", async fn(t) { - await cloneChannelTests(bot, guild.id, channel, {}, t); + await cloneChannelTests({}); }, ...sanitizeMode, }); Deno.test({ name: "[channel] clone a channel w/ a reason", async fn(t) { - await cloneChannelTests(bot, guild.id, channel, { reason: "Blame wolf" }, t); + await cloneChannelTests({ reason: "Blame wolf" }); }, ...sanitizeMode, }); Deno.test({ name: "[channel] delete a channel overwrite", async fn(t) { - await deleteChannelOverwriteTests(bot, guild.id, t); + await deleteChannelOverwriteTests(guild.id); }, ...sanitizeMode, }); Deno.test({ name: "[channel] edit a channel w/o a reason", async fn(t) { - await editChannelTests(bot, guild.id, {}, t); + await editChannelTests(guild.id, {}); }, ...sanitizeMode, }); Deno.test({ name: "[channel] edit a channel w/ a reason", async fn(t) { - await editChannelTests(bot, guild.id, { reason: "Blame wolf" }, t); + await editChannelTests(guild.id, { reason: "Blame wolf" }); }, ...sanitizeMode, }); -//channels +// channels import "./channels/connectToVoice.ts"; +import "./channels/createChannel.ts"; +import "./channels/deleteChannel.ts"; import "./channels/getChannel.ts"; import "./channels/getChannels.ts"; import "./channels/stageInstances.ts"; import "./channels/threads.ts"; -//emoji +// emoji import "./emoji/createEmoji.ts"; import "./emoji/deleteEmojiWithReason.ts"; import "./emoji/deleteEmojiWithoutReason.ts"; @@ -577,21 +329,27 @@ import "./emoji/emojiUrl.ts"; import "./emoji/getEmoji.ts"; import "./emoji/getMultipleEmojis.ts"; -//invite +// guilds +import "./guilds/urls.ts"; + +// invite import "./invite/createInvite.ts"; import "./invite/deleteInvite.ts"; import "./invite/getChannelInvites.ts"; import "./invite/getInvite.ts"; import "./invite/getInvites.ts"; -//members +// members import "./members/avatarlUrl.ts"; import "./members/ban.ts"; import "./members/editBotNickname.ts"; import "./members/getDmChannel.ts"; import "./members/getMember.ts"; -//misc +// messages +import "./messages/reactions.ts"; + +// misc import "./misc/getApplicationInfo.ts"; import "./misc/getDiscoveryCategories.ts"; import "./misc/getUser.ts"; @@ -601,7 +359,7 @@ import "./misc/typing.ts"; import "./misc/validateDiscovery.ts"; import "./misc/editBotStatus.ts"; -//role +// role import "./role/addRole.ts"; import "./role/createRoleWithoutReason.ts"; import "./role/createRoleWithReason.ts"; @@ -611,7 +369,7 @@ import "./role/editRole.ts"; import "./role/getAllRoles.ts"; import "./role/removeRole.ts"; -//scheduledEvents +// scheduledEvents import "./scheduledEvents/createExternalEventWithEndtime.ts"; import "./scheduledEvents/createExternalEventWithoutEndtime.ts"; import "./scheduledEvents/createStageEventWithEndtime.ts"; @@ -621,11 +379,9 @@ import "./scheduledEvents/createVoiceEventWithoutEndtime.ts"; import "./scheduledEvents/deleteEvent.ts"; import "./scheduledEvents/editEvent.ts"; -//webhooks +// webhooks import "./webhooks/deleteWebhook.ts"; import "./webhooks/deleteWebhookWithToken.ts"; import "./webhooks/sendWebhook.ts"; import "./webhooks/webhooks.ts"; -// await bot.helpers.deleteGuild(guild.id); -// await stopBot(bot); diff --git a/tests/role/createRoleWithReason.ts b/tests/role/createRoleWithReason.ts index 1b73c0de7..34066d80d 100644 --- a/tests/role/createRoleWithReason.ts +++ b/tests/role/createRoleWithReason.ts @@ -6,7 +6,7 @@ import { delayUntil } from "../utils.ts"; Deno.test({ name: "[Role] create a role with a reason", fn: async (t) => { - await createRoleTests(bot, guild.id, { reason: "Blame wolfy" }, t); + await createRoleTests(guild.id, { reason: "Blame wolfy" }); const role = await bot.helpers.createRole(guild.id, { name: "hoti" }, "Blame wolfy"); diff --git a/tests/role/createRoleWithoutReason.ts b/tests/role/createRoleWithoutReason.ts index 58f51562a..079831ab2 100644 --- a/tests/role/createRoleWithoutReason.ts +++ b/tests/role/createRoleWithoutReason.ts @@ -6,7 +6,7 @@ import { delayUntil } from "../utils.ts"; Deno.test({ name: "[Role] create a role without a reason", fn: async (t) => { - await createRoleTests(bot, guild.id, {}, t); + await createRoleTests(guild.id, {}); const role = await bot.helpers.createRole(guild.id, { name: "hoti" }); From 7c171faf3c25ea21d51f005e5563365278bd1a8c Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Fri, 3 Dec 2021 14:11:43 +0000 Subject: [PATCH 024/104] fix: remove cloneChannel helper --- src/helpers/channels/cloneChannel.ts | 33 -------------------------- src/helpers/mod.ts | 1 - tests/helpers/channels/cloneChannel.ts | 23 ------------------ tests/mod.ts | 15 ------------ 4 files changed, 72 deletions(-) delete mode 100644 src/helpers/channels/cloneChannel.ts delete mode 100644 tests/helpers/channels/cloneChannel.ts diff --git a/src/helpers/channels/cloneChannel.ts b/src/helpers/channels/cloneChannel.ts deleted file mode 100644 index 5eb14825a..000000000 --- a/src/helpers/channels/cloneChannel.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { Bot } from "../../bot.ts"; -import { DiscordenoChannel, separateOverwrites } from "../../transformers/channel.ts"; -import type { CreateGuildChannel } from "../../types/guilds/createGuildChannel.ts"; - -/** Create a copy of a channel */ -export async function cloneChannel(bot: Bot, channel: DiscordenoChannel, reason?: string) { - if (!channel.guildId) throw new Error(`Cannot clone a channel outside a guild`); - - const createChannelOptions: CreateGuildChannel = { - type: channel.type, - bitrate: channel.bitrate, - userLimit: channel.userLimit, - rateLimitPerUser: channel.rateLimitPerUser, - position: channel.position, - parentId: channel.parentId, - nsfw: channel.nsfw, - name: channel.name!, - topic: channel.topic || undefined, - permissionOverwrites: channel.permissionOverwrites.map((overwrite) => { - const [type, id, allow, deny] = separateOverwrites(overwrite); - - return { - id, - type, - allow: bot.utils.calculatePermissions(BigInt(allow)), - deny: bot.utils.calculatePermissions(BigInt(deny)), - }; - }), - }; - - //Create the channel (also handles permissions) - return await bot.helpers.createChannel(channel.guildId!, createChannelOptions, reason); -} diff --git a/src/helpers/mod.ts b/src/helpers/mod.ts index bddb7a8dc..0b9dd2b0e 100644 --- a/src/helpers/mod.ts +++ b/src/helpers/mod.ts @@ -169,7 +169,6 @@ export * from "./channels/threads/leaveThread.ts"; export * from "./channels/threads/removeThreadMember.ts"; export * from "./channels/threads/startThreadWithMessage.ts"; export * from "./channels/threads/startThreadWithoutMessage.ts"; -export * from "./channels/cloneChannel.ts"; //guilds export * from "./guilds/scheduledEvents/createScheduledEvent.ts"; diff --git a/tests/helpers/channels/cloneChannel.ts b/tests/helpers/channels/cloneChannel.ts deleted file mode 100644 index 9ecaff3d0..000000000 --- a/tests/helpers/channels/cloneChannel.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { DiscordenoChannel } from "../../../src/transformers/channel.ts"; -import { assertExists, assertEquals } from "../../deps.ts"; -import { bot, channel } from "../../mod.ts"; -import { delayUntil } from "../../utils.ts"; - -export async function cloneChannelTests( - options: { reason?: string }, -) { - // @ts-ignore for itoh - const cloned = await bot.helpers.cloneChannel(channel, options.reason); - - //Assertations - assertExists(cloned); - assertEquals(cloned.type, channel.type); - - // Delay the execution to allow CHANNEL_CREATE event to be processed - await delayUntil(10000, () => bot.channels.has(cloned.id)); - - assertExists(bot.channels.has(cloned.id)); - assertEquals(channel.topic, cloned.topic); - assertEquals(channel.bitrate, cloned.bitrate); - assertEquals(channel.permissionOverwrites.length, cloned.permissionOverwrites.length); -} diff --git a/tests/mod.ts b/tests/mod.ts index 8c4ba289a..8aeda3cc7 100644 --- a/tests/mod.ts +++ b/tests/mod.ts @@ -31,7 +31,6 @@ import { getGuildTests } from "./helpers/guilds/getGuild.ts"; import { getVanityURLTests } from "./helpers/guilds/getVanityUrl.ts"; import { categoryChildrenTest } from "./helpers/channels/categoryChannels.ts"; import { channelOverwriteHasPermissionTest } from "./helpers/channels/channelOverwriteHasPermission.ts"; -import { cloneChannelTests } from "./helpers/channels/cloneChannel.ts"; import { deleteChannelOverwriteTests } from "./helpers/channels/deleteChannelOverwrite.ts"; import { editChannelTests } from "./helpers/channels/editChannel.ts"; import { CACHED_COMMUNITY_GUILD_ID, sanitizeMode } from "./constants.ts"; @@ -275,20 +274,6 @@ Deno.test({ }, ...sanitizeMode, }); -Deno.test({ - name: "[channel] clone a channel w/o a reason", - async fn(t) { - await cloneChannelTests({}); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[channel] clone a channel w/ a reason", - async fn(t) { - await cloneChannelTests({ reason: "Blame wolf" }); - }, - ...sanitizeMode, -}); Deno.test({ name: "[channel] delete a channel overwrite", async fn(t) { From 1464eb0c75dcf8542fab2d2b497b4ac5dd5f6b4d Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Fri, 3 Dec 2021 16:17:39 +0000 Subject: [PATCH 025/104] fix: move editThread to helpers plugin --- src/helpers/channels/threads/editThread.ts | 21 --------------------- src/helpers/channels/threads/mod.ts | 1 - src/helpers/mod.ts | 1 - src/types/channels/modifyChannel.ts | 17 +++++++++-------- tests/channels/threads.ts | 4 ++-- 5 files changed, 11 insertions(+), 33 deletions(-) delete mode 100644 src/helpers/channels/threads/editThread.ts diff --git a/src/helpers/channels/threads/editThread.ts b/src/helpers/channels/threads/editThread.ts deleted file mode 100644 index 72c93811c..000000000 --- a/src/helpers/channels/threads/editThread.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { ModifyThread } from "../../../types/channels/threads/modifyThread.ts"; -import type { Bot } from "../../../bot.ts"; -import { Channel } from "../../../types/channels/channel.ts"; -// import { channelToThread } from "../../../util/transformers/channel_to_thread.ts"; - -/** Update a thread's settings. Requires the `MANAGE_CHANNELS` permission for the guild. */ -export async function editThread(bot: Bot, threadId: bigint, options: ModifyThread, reason?: string) { - const result = await bot.rest.runMethod(bot.rest, "patch", bot.constants.endpoints.CHANNEL_BASE(threadId), { - name: options.name, - archived: options.archived, - auto_archive_duration: options.autoArchiveDuration, - locked: options.locked, - rate_limit_per_user: options.rateLimitPerUser, - reason, - }); - - return bot.transformers.channel(bot, { - channel: result, - guildId: result.guild_id ? bot.transformers.snowflake(result.guild_id) : undefined, - }); -} diff --git a/src/helpers/channels/threads/mod.ts b/src/helpers/channels/threads/mod.ts index 5b957b1d1..e348276f4 100644 --- a/src/helpers/channels/threads/mod.ts +++ b/src/helpers/channels/threads/mod.ts @@ -1,5 +1,4 @@ export * from "./addToThread.ts"; -export * from "./editThread.ts"; export * from "./getActiveThreads.ts"; export * from "./getArchivedThreads.ts"; export * from "./getThreadMembers.ts"; diff --git a/src/helpers/mod.ts b/src/helpers/mod.ts index 0b9dd2b0e..cc5880078 100644 --- a/src/helpers/mod.ts +++ b/src/helpers/mod.ts @@ -159,7 +159,6 @@ export * from "./channels/getStageInstance.ts"; export * from "./channels/deleteStageInstance.ts"; export * from "./voice/connectToVoiceChannel.ts"; export * from "./channels/threads/addToThread.ts"; -export * from "./channels/threads/editThread.ts"; export * from "./channels/threads/getActiveThreads.ts"; export * from "./channels/threads/getArchivedThreads.ts"; export * from "./channels/threads/getThreadMember.ts"; diff --git a/src/types/channels/modifyChannel.ts b/src/types/channels/modifyChannel.ts index 82d3f0b11..ca922380d 100644 --- a/src/types/channels/modifyChannel.ts +++ b/src/types/channels/modifyChannel.ts @@ -1,6 +1,5 @@ -import { SnakeCasedPropertiesDeep } from "../util.ts"; import { ChannelTypes } from "./channelTypes.ts"; -import { DiscordOverwrite, Overwrite } from "./overwrite.ts"; +import { Overwrite } from "./overwrite.ts"; import { VideoQualityModes } from "./videoQualityModes.ts"; export interface ModifyChannel { @@ -28,10 +27,12 @@ export interface ModifyChannel { rtcRegion?: string | null; /** The camera video quality mode of the voice channel */ videoQualityMode?: VideoQualityModes; -} - -/** https://discord.com/developers/docs/resources/channel#modify-channel */ -export interface DiscordModifyChannel extends SnakeCasedPropertiesDeep> { - // deno-lint-ignore camelcase - permission_overwrites?: DiscordOverwrite[]; + /** Whether the thread is archived */ + archived?: boolean; + /** Duration in minutes to automatically archive the thread after recent activity */ + autoArchiveDuration?: 60 | 1440 | 4320 | 10080; + /** When a thread is locked, only users with `MANAGE_THREADS` can unarchive it */ + locked?: boolean; + /** whether non-moderators can add other non-moderators to a thread; only available on private threads */ + invitable?: boolean; } diff --git a/tests/channels/threads.ts b/tests/channels/threads.ts index c2ff39cb5..cee559cdb 100644 --- a/tests/channels/threads.ts +++ b/tests/channels/threads.ts @@ -1,4 +1,4 @@ -import { assertEquals, assertExists, assertNotEquals, assertThrows } from "../deps.ts"; +import { assertEquals, assertExists, assertNotEquals } from "../deps.ts"; import { bot, guild } from "../mod.ts"; Deno.test("[thread] Start a thread", async (t) => { @@ -34,7 +34,7 @@ Deno.test("[thread] Start a thread", async (t) => { assertEquals(archived.members.size, 0); await t.step("[thread] Edit and archive a thread", async () => { - const edited = await bot.helpers.editThread(thread.id, { + const edited = await bot.helpers.editChannel(thread.id, { archived: true, name: "new name", autoArchiveDuration: 1440, From 40dc7125c829eb841166265fc3d9f664f09b270e Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Fri, 3 Dec 2021 16:18:08 +0000 Subject: [PATCH 026/104] fix: bot starting bug fix thanks to Reboot <3 --- src/bot.ts | 53 ++++++++++++++++++++++++++--------------------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/src/bot.ts b/src/bot.ts index ea22ed72a..b84f43c6e 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -107,9 +107,27 @@ export function createBot(options: CreateBotOptions): Bot { unrepliedInteractions: new Set(), fetchAllMembersProcessingRequests: new Map(), }, + rest: createRestManager({ token: options.token, debug: options.events.debug }), } as Bot; bot.helpers = createHelpers(bot, options.helpers ?? {}); + bot.gateway = createGatewayManager({ + token: bot.token, + intents: bot.intents, + debug: bot.events.debug, + handleDiscordPayload: + bot.handleDiscordPayload ?? + async function (_, data: DiscordGatewayPayload, shardId: number) { + // TRIGGER RAW EVENT + bot.events.raw(bot as Bot, data, shardId); + + if (!data.t) return; + + // RUN DISPATCH CHECK + await bot.events.dispatchRequirements(bot as Bot, data, shardId); + bot.handlers[data.t as GatewayDispatchEventNames]?.(bot as Bot, data, shardId); + }, + }); return bot as Bot; } @@ -251,36 +269,17 @@ export function createRestManager(options: CreateRestManagerOptions) { } export async function startBot(bot: Bot) { - // START REST - bot.rest = createRestManager({ token: bot.token, debug: bot.events.debug }); if (!bot.botGatewayData) bot.botGatewayData = await bot.helpers.getGatewayBot(); // START WS - bot.gateway = createGatewayManager({ - token: bot.token, - intents: bot.intents, - urlWSS: bot.botGatewayData.url, - shardsRecommended: bot.botGatewayData.shards, - sessionStartLimitTotal: bot.botGatewayData.sessionStartLimit.total, - sessionStartLimitRemaining: bot.botGatewayData.sessionStartLimit.remaining, - sessionStartLimitResetAfter: bot.botGatewayData.sessionStartLimit.resetAfter, - maxConcurrency: bot.botGatewayData.sessionStartLimit.maxConcurrency, - lastShardId: bot.botGatewayData.shards, - maxShards: bot.botGatewayData.shards, - debug: bot.events.debug, - handleDiscordPayload: - bot.handleDiscordPayload ?? - async function (_, data: DiscordGatewayPayload, shardId: number) { - // TRIGGER RAW EVENT - bot.events.raw(bot as Bot, data, shardId); - - if (!data.t) return; - - // RUN DISPATCH CHECK - await bot.events.dispatchRequirements(bot as Bot, data, shardId); - bot.handlers[data.t as GatewayDispatchEventNames]?.(bot as Bot, data, shardId); - }, - }); + bot.gateway.urlWSS = bot.botGatewayData.url; + bot.gateway.shardsRecommended = bot.botGatewayData.shards; + bot.gateway.sessionStartLimitTotal = bot.botGatewayData.sessionStartLimit.total; + bot.gateway.sessionStartLimitRemaining = bot.botGatewayData.sessionStartLimit.remaining; + bot.gateway.sessionStartLimitResetAfter = bot.botGatewayData.sessionStartLimit.resetAfter; + bot.gateway.maxConcurrency = bot.botGatewayData.sessionStartLimit.maxConcurrency; + bot.gateway.lastShardId = bot.botGatewayData.shards; + bot.gateway.maxShards = bot.botGatewayData.shards; bot.gateway.spawnShards(bot.gateway); } From 8076426f384af2eaa3010aa113ab4b90cc678e8b Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Fri, 3 Dec 2021 16:20:09 +0000 Subject: [PATCH 027/104] chore: cleaner comment --- src/bot.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bot.ts b/src/bot.ts index b84f43c6e..e5cdffeeb 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -271,7 +271,7 @@ export function createRestManager(options: CreateRestManagerOptions) { export async function startBot(bot: Bot) { if (!bot.botGatewayData) bot.botGatewayData = await bot.helpers.getGatewayBot(); - // START WS + // SETUP GATEWAY LOGIN INFO bot.gateway.urlWSS = bot.botGatewayData.url; bot.gateway.shardsRecommended = bot.botGatewayData.shards; bot.gateway.sessionStartLimitTotal = bot.botGatewayData.sessionStartLimit.total; From 74710c27c7ebb7de078d83004ecfe8a875547c00 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Fri, 3 Dec 2021 16:27:39 +0000 Subject: [PATCH 028/104] fix: move channelOverwriteHasPermission to perm plugin --- .../channels/channelOverwriteHasPermission.ts | 34 ----------------- src/helpers/mod.ts | 1 - tests/deps.ts | 1 + .../channels/channelOverwriteHasPermission.ts | 38 ------------------- .../channels/deleteChannelOverwrite.ts | 4 +- tests/mod.ts | 8 ---- 6 files changed, 3 insertions(+), 83 deletions(-) delete mode 100644 src/helpers/channels/channelOverwriteHasPermission.ts delete mode 100644 tests/helpers/channels/channelOverwriteHasPermission.ts diff --git a/src/helpers/channels/channelOverwriteHasPermission.ts b/src/helpers/channels/channelOverwriteHasPermission.ts deleted file mode 100644 index 429d6aeb0..000000000 --- a/src/helpers/channels/channelOverwriteHasPermission.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { separateOverwrites } from "../../transformers/channel.ts"; -import type { DiscordOverwrite } from "../../types/channels/overwrite.ts"; -import { BitwisePermissionFlags } from "../../types/permissions/bitwisePermissionFlags.ts"; -import type { PermissionStrings } from "../../types/permissions/permissionStrings.ts"; - -/** Checks if a channel overwrite for a user id or a role id has permission in this channel */ -export function channelOverwriteHasPermission( - guildId: bigint, - id: bigint, - overwrites: bigint[], - permissions: PermissionStrings[] -) { - const overwrite = - overwrites.find((perm) => { - const [_, bitID] = separateOverwrites(perm); - return id === bitID; - }) || - overwrites.find((perm) => { - const [_, bitID] = separateOverwrites(perm); - return bitID === guildId; - }); - - if (!overwrite) return false; - - return permissions.every((perm) => { - const [type, id, allowBits, denyBits] = separateOverwrites(overwrite); - if (BigInt(denyBits) & BigInt(BitwisePermissionFlags[perm])) { - return false; - } - if (BigInt(allowBits) & BigInt(BitwisePermissionFlags[perm])) { - return true; - } - }); -} diff --git a/src/helpers/mod.ts b/src/helpers/mod.ts index cc5880078..5ac3942f9 100644 --- a/src/helpers/mod.ts +++ b/src/helpers/mod.ts @@ -1,5 +1,4 @@ //channels -export * from "./channels/channelOverwriteHasPermission.ts"; export * from "./channels/createChannel.ts"; export * from "./channels/deleteChannel.ts"; export * from "./channels/deleteChannelOverwrite.ts"; diff --git a/tests/deps.ts b/tests/deps.ts index f2a4ebdda..8e9b98d7a 100644 --- a/tests/deps.ts +++ b/tests/deps.ts @@ -7,3 +7,4 @@ export { assertThrowsAsync } from "https://deno.land/std@0.115.1/testing/asserts.ts"; export * from "https://deno.land/x/discordeno_cache_plugin@0.0.13/mod.ts"; +export * from "https://deno.land/x/discordeno_permissions_plugin@0.0.7/mod.ts"; diff --git a/tests/helpers/channels/channelOverwriteHasPermission.ts b/tests/helpers/channels/channelOverwriteHasPermission.ts deleted file mode 100644 index 3510a900f..000000000 --- a/tests/helpers/channels/channelOverwriteHasPermission.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { ChannelTypes, channelOverwriteHasPermission, OverwriteTypes } from "../../../mod.ts"; -import { assertExists, assertEquals } from "../../deps.ts"; -import { bot } from "../../mod.ts"; -import { delayUntil } from "../../utils.ts"; - -export async function channelOverwriteHasPermissionTest(guildId: bigint) { - const channel = await bot.helpers.createChannel(guildId, { - name: "Discordeno-test", - permissionOverwrites: [ - { - id: bot.id, - type: OverwriteTypes.Member, - allow: ["VIEW_CHANNEL"], - deny: [], - }, - ], - }); - - // Assertions - assertExists(channel); - assertEquals(channel.type, ChannelTypes.GuildText); - - // Delay the execution to allow event to be processed - await delayUntil(10000, () => bot.channels.has(channel.id)); - - if (!bot.channels.has(channel.id)) { - throw new Error("The channel seemed to be created but it was not cached."); - } - - assertEquals(channel.permissionOverwrites.length, 1); - - assertEquals( - channelOverwriteHasPermission(channel.guildId, bot.id, bot.channels.get(channel.id)?.permissionOverwrites || [], [ - "VIEW_CHANNEL", - ]), - true - ); -} diff --git a/tests/helpers/channels/deleteChannelOverwrite.ts b/tests/helpers/channels/deleteChannelOverwrite.ts index b7baa9a1e..4faa4ef25 100644 --- a/tests/helpers/channels/deleteChannelOverwrite.ts +++ b/tests/helpers/channels/deleteChannelOverwrite.ts @@ -1,5 +1,5 @@ -import { ChannelTypes, channelOverwriteHasPermission, OverwriteTypes } from "../../../mod.ts"; -import { assertExists, assertEquals } from "../../deps.ts"; +import { ChannelTypes, OverwriteTypes } from "../../../mod.ts"; +import { assertExists, assertEquals, channelOverwriteHasPermission } from "../../deps.ts"; import { bot } from "../../mod.ts"; import { delayUntil } from "../../utils.ts"; diff --git a/tests/mod.ts b/tests/mod.ts index 8aeda3cc7..c22c7c893 100644 --- a/tests/mod.ts +++ b/tests/mod.ts @@ -30,7 +30,6 @@ import { getBansTests } from "./helpers/guilds/getBans.ts"; import { getGuildTests } from "./helpers/guilds/getGuild.ts"; import { getVanityURLTests } from "./helpers/guilds/getVanityUrl.ts"; import { categoryChildrenTest } from "./helpers/channels/categoryChannels.ts"; -import { channelOverwriteHasPermissionTest } from "./helpers/channels/channelOverwriteHasPermission.ts"; import { deleteChannelOverwriteTests } from "./helpers/channels/deleteChannelOverwrite.ts"; import { editChannelTests } from "./helpers/channels/editChannel.ts"; import { CACHED_COMMUNITY_GUILD_ID, sanitizeMode } from "./constants.ts"; @@ -267,13 +266,6 @@ Deno.test({ }, ...sanitizeMode, }); -Deno.test({ - name: "[channel] edit a channel permission overwrite", - async fn(t) { - await channelOverwriteHasPermissionTest(guild.id); - }, - ...sanitizeMode, -}); Deno.test({ name: "[channel] delete a channel overwrite", async fn(t) { From f54b30deb3e5db598d0186bfd73ab6d277f32502 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Fri, 3 Dec 2021 18:04:08 +0000 Subject: [PATCH 029/104] fix: update benchmarks --- benchmarks | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks b/benchmarks index 7944b87a6..27a2c5ca0 160000 --- a/benchmarks +++ b/benchmarks @@ -1 +1 @@ -Subproject commit 7944b87a6a37ed610c00033c075a4f0361bf629c +Subproject commit 27a2c5ca041e3eee2e0fb1c27100091813d9c681 From 59721b3d6857411de45fc276507795b925a11729 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Fri, 3 Dec 2021 18:28:25 +0000 Subject: [PATCH 030/104] fix: editchannel and benchmarks --- src/helpers/channels/editChannel.ts | 12 ++++++++---- src/types/channels/modifyChannel.ts | 2 +- tests/benchmark.ts | 5 ++++- tests/channels/threads.ts | 1 + 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/helpers/channels/editChannel.ts b/src/helpers/channels/editChannel.ts index 68b3fc494..063d8ae94 100644 --- a/src/helpers/channels/editChannel.ts +++ b/src/helpers/channels/editChannel.ts @@ -35,13 +35,17 @@ export async function editChannel(bot: Bot, channelId: bigint, options: ModifyCh name: options.name, topic: options.topic, bitrate: options.bitrate, - userLimit: options.userLimit, - rateLimitPerUser: options.rateLimitPerUser, + user_limit: options.userLimit, + rate_limit_per_user: options.rateLimitPerUser, position: options.position, - parentId: options.parentId, + parent_id: options.parentId === null ? null : options.parentId?.toString(), nsfw: options.nsfw, type: options.type, - permissionOverwrites: options.permissionOverwrites + archived: options.archived, + auto_archive_duration: options.autoArchiveDuration, + locked: options.locked, + invitable: options.invitable, + permission_overwrites: options.permissionOverwrites ? options.permissionOverwrites?.map((overwrite) => { return { ...overwrite, diff --git a/src/types/channels/modifyChannel.ts b/src/types/channels/modifyChannel.ts index ca922380d..72658ae4a 100644 --- a/src/types/channels/modifyChannel.ts +++ b/src/types/channels/modifyChannel.ts @@ -22,7 +22,7 @@ export interface ModifyChannel { /** Channel or category-specific permissions */ permissionOverwrites?: Overwrite[] | null; /** Id of the new parent category for a channel */ - parentId?: string | null; + parentId?: bigint | null; /** Voice region id for the voice channel, automatic when set to null */ rtcRegion?: string | null; /** The camera video quality mode of the voice channel */ diff --git a/tests/benchmark.ts b/tests/benchmark.ts index 5b9be3850..090122742 100644 --- a/tests/benchmark.ts +++ b/tests/benchmark.ts @@ -5,7 +5,10 @@ import { sanitizeMode } from "./constants.ts"; Deno.test({ name: "[Memory] Benchmark memory tests", fn: async (t) => { - await memoryBenchmarks(bot, true); + await memoryBenchmarks(bot, { + log: true, + table: true, + }); }, ...sanitizeMode, }); diff --git a/tests/channels/threads.ts b/tests/channels/threads.ts index cee559cdb..7faffad8f 100644 --- a/tests/channels/threads.ts +++ b/tests/channels/threads.ts @@ -35,6 +35,7 @@ Deno.test("[thread] Start a thread", async (t) => { await t.step("[thread] Edit and archive a thread", async () => { const edited = await bot.helpers.editChannel(thread.id, { + // @ts-ignore archived: true, name: "new name", autoArchiveDuration: 1440, From 95c5c6bc9d6bdead72258f730d12055da3ba0f24 Mon Sep 17 00:00:00 2001 From: ITOH Date: Fri, 3 Dec 2021 23:07:51 +0100 Subject: [PATCH 031/104] feat modals --- .../interactions/sendInteractionResponse.ts | 2 ++ src/transformers/interaction.ts | 4 +++ .../applicationCommandCallbackData.ts | 27 ++++++++++++++++++- .../applicationCommandInteractionData.ts | 4 ++- .../interactions/interactionResponseTypes.ts | 8 +++--- src/types/interactions/interactionTypes.ts | 7 ++--- src/types/messages/components/actionRow.ts | 3 ++- .../messages/components/inputTextComponent.ts | 20 ++++++++++++++ .../components/messageComponentTypes.ts | 6 +++-- src/types/messages/components/textStyles.ts | 6 +++++ 10 files changed, 76 insertions(+), 11 deletions(-) create mode 100644 src/types/messages/components/inputTextComponent.ts create mode 100644 src/types/messages/components/textStyles.ts diff --git a/src/helpers/interactions/sendInteractionResponse.ts b/src/helpers/interactions/sendInteractionResponse.ts index af99c741a..a3f549495 100644 --- a/src/helpers/interactions/sendInteractionResponse.ts +++ b/src/helpers/interactions/sendInteractionResponse.ts @@ -85,6 +85,8 @@ export async function sendInteractionResponse( roles: options.data.allowedMentions!.roles?.map((id) => id.toString()), }, file: options.data.file, + custom_id: options.data.customId, + title: options.data.title, components: options.data.components?.map((component) => ({ type: component.type, components: component.components.map((subcomponent) => { diff --git a/src/transformers/interaction.ts b/src/transformers/interaction.ts index 3ca707f9d..402fbdee0 100644 --- a/src/transformers/interaction.ts +++ b/src/transformers/interaction.ts @@ -9,6 +9,7 @@ import { InteractionDataResolved, MessageComponentTypes, InteractionDataOption, + MessageComponents, } from "../types/mod.ts"; import { SnakeCasedPropertiesDeep } from "../types/util.ts"; import { Collection } from "../util/collection.ts"; @@ -41,6 +42,7 @@ export function transformInteraction(bot: Bot, payload: SnakeCasedPropertiesDeep ? { componentType: payload.data.component_type, customId: payload.data.custom_id, + components: payload.data.components, values: payload.data.values, id: payload.data.id ? bot.transformers.snowflake(payload.data.id) : undefined, name: payload.data.name, @@ -152,6 +154,8 @@ export interface DiscordenoInteraction { componentType?: MessageComponentTypes; /** The custom id provided for this component. */ customId?: string; + /** The components if its a Modal Submit interaction. */ + components?: MessageComponents; /** The values chosen by the user. */ values?: string[]; /** The Id of the invoked command */ diff --git a/src/types/interactions/commands/applicationCommandCallbackData.ts b/src/types/interactions/commands/applicationCommandCallbackData.ts index caa741d9a..b604376e1 100644 --- a/src/types/interactions/commands/applicationCommandCallbackData.ts +++ b/src/types/interactions/commands/applicationCommandCallbackData.ts @@ -1,7 +1,32 @@ +import { FileContent } from "../../discordeno/fileContent.ts"; +import { Embed } from "../../embeds/embed.ts"; +import { AllowedMentions } from "../../messages/allowedMentions.ts"; +import { MessageComponents } from "../../messages/components/messageComponents.ts"; import { CreateMessage } from "../../messages/createMessage.ts"; /** https://discord.com/developers/docs/interactions/slash-commands#interaction-response-interactionapplicationcommandcallbackdata */ -export interface InteractionApplicationCommandCallbackData extends Omit { +export interface InteractionApplicationCommandCallbackData { + /** The message contents (up to 2000 characters) */ + content?: string; + /** true if this is a TTS message */ + tts?: boolean; + /** Embedded `rich` content (up to 6000 characters) */ + embeds?: Embed[]; + /** Allowed mentions for the message */ + allowedMentions?: Omit & { + /** Array of role_ids to mention (Max size of 100) */ + roles?: bigint[]; + /** Array of user_ids to mention (Max size of 100) */ + users?: bigint[]; + }; + /** The contents of the file being sent */ + file?: FileContent | FileContent[]; + /** The customId you want to use for this modal response. */ + customId?: string; + /** The title you want to use for this modal response. */ + title?: string; + /** The components you would like to have sent in this message */ + components?: MessageComponents; /** Set to `64` to make your response ephemeral */ flags?: number; } diff --git a/src/types/interactions/commands/applicationCommandInteractionData.ts b/src/types/interactions/commands/applicationCommandInteractionData.ts index 42dae700a..9f91ce1db 100644 --- a/src/types/interactions/commands/applicationCommandInteractionData.ts +++ b/src/types/interactions/commands/applicationCommandInteractionData.ts @@ -1,4 +1,4 @@ -import { Message, User, Role, Channel, MessageComponentTypes } from "../../mod.ts"; +import { Message, User, Role, Channel, MessageComponentTypes, MessageComponents } from "../../mod.ts"; import { InteractionGuildMember } from "../interactionGuildMember.ts"; import { InteractionDataOption } from "./applicationCommandInteractionDataOption.ts"; @@ -7,6 +7,8 @@ export interface InteractionData { componentType?: MessageComponentTypes; /** The custom id provided for this component. */ customId?: string; + /** The components if its a Modal Submit interaction. */ + components?: MessageComponents; /** The values chosen by the user. */ values?: string[]; /** The Id of the invoked command */ diff --git a/src/types/interactions/interactionResponseTypes.ts b/src/types/interactions/interactionResponseTypes.ts index f1db5aacc..c7484ad70 100644 --- a/src/types/interactions/interactionResponseTypes.ts +++ b/src/types/interactions/interactionResponseTypes.ts @@ -7,9 +7,11 @@ export enum InteractionResponseTypes { /** ACK an interaction and edit a response later, the user sees a loading state */ DeferredChannelMessageWithSource = 5, /** For components, ACK an interaction and edit the original message later; the user does not see a loading state */ - DeferredUpdateMessage, + DeferredUpdateMessage = 6, /** For components, edit the message the component was attached to */ - UpdateMessage, + UpdateMessage = 7, /** For Application Command Options, send an autocomplete result */ - ApplicationCommandAutocompleteResult, + ApplicationCommandAutocompleteResult = 8, + /** For Command or Component interactions, send a Modal response */ + Modal = 9, } diff --git a/src/types/interactions/interactionTypes.ts b/src/types/interactions/interactionTypes.ts index 6ebf2b674..6148d35fc 100644 --- a/src/types/interactions/interactionTypes.ts +++ b/src/types/interactions/interactionTypes.ts @@ -1,7 +1,8 @@ /** https://discord.com/developers/docs/interactions/slash-commands#interaction-interactiontype */ export enum InteractionTypes { Ping = 1, - ApplicationCommand, - MessageComponent, - ApplicationCommandAutocomplete, + ApplicationCommand = 2, + MessageComponent = 3, + ApplicationCommandAutocomplete = 4, + ModalSubmit = 5, } diff --git a/src/types/messages/components/actionRow.ts b/src/types/messages/components/actionRow.ts index 5b592d2e2..5196050fc 100644 --- a/src/types/messages/components/actionRow.ts +++ b/src/types/messages/components/actionRow.ts @@ -1,4 +1,5 @@ import { ButtonComponent } from "./buttonComponent.ts"; +import { InputTextComponent } from "./inputTextComponent.ts"; import { SelectMenuComponent } from "./selectMenu.ts"; /** https://discord.com/developers/docs/interactions/message-components#actionrow */ @@ -7,7 +8,7 @@ export interface ActionRow { type: 1; /** The components in this row */ components: - | [SelectMenuComponent | ButtonComponent] + | [SelectMenuComponent | ButtonComponent | InputTextComponent] | [ButtonComponent, ButtonComponent] | [ButtonComponent, ButtonComponent, ButtonComponent] | [ButtonComponent, ButtonComponent, ButtonComponent, ButtonComponent] diff --git a/src/types/messages/components/inputTextComponent.ts b/src/types/messages/components/inputTextComponent.ts new file mode 100644 index 000000000..1e3520e18 --- /dev/null +++ b/src/types/messages/components/inputTextComponent.ts @@ -0,0 +1,20 @@ +import { MessageComponentTypes } from "./messageComponentTypes.ts"; +import { TextStyles } from "./textStyles.ts"; + +// TODO: docs link +export interface InputTextComponent { + /** InputText Component is of type 3 */ + type: MessageComponentTypes.InputText; + /** The style of the InputText */ + style: TextStyles; + /** The customId of the InputText */ + customId: string; + /** The label of the InputText */ + label: string; + /** The placeholder of the InputText */ + placeholder?: string; + /** The minimum length of the text the user has to provide */ + minLength?: number; + /** The maximum length of the text the user has to provide */ + maxLength?: number; +} diff --git a/src/types/messages/components/messageComponentTypes.ts b/src/types/messages/components/messageComponentTypes.ts index 0f329c631..d1f04df1b 100644 --- a/src/types/messages/components/messageComponentTypes.ts +++ b/src/types/messages/components/messageComponentTypes.ts @@ -3,7 +3,9 @@ export enum MessageComponentTypes { /** A row of components at the bottom of a message */ ActionRow = 1, /** A button! */ - Button, + Button = 2, /** A select menu. */ - SelectMenu, + SelectMenu = 3, + /** An Input Text. */ + InputText = 4, } diff --git a/src/types/messages/components/textStyles.ts b/src/types/messages/components/textStyles.ts new file mode 100644 index 000000000..54ab43c7b --- /dev/null +++ b/src/types/messages/components/textStyles.ts @@ -0,0 +1,6 @@ +export enum TextStyles { + /** Intended for short single-line text */ + Short = 1, + /** Intended for much longer inputs */ + Paragraph = 2, +} From c697f2fd6a46de90f79872e6830417033f326deb Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Sat, 4 Dec 2021 16:22:33 +0000 Subject: [PATCH 032/104] fix: remove check on stage create --- src/helpers/channels/createStageInstance.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/helpers/channels/createStageInstance.ts b/src/helpers/channels/createStageInstance.ts index abbedc881..685d6249b 100644 --- a/src/helpers/channels/createStageInstance.ts +++ b/src/helpers/channels/createStageInstance.ts @@ -4,10 +4,6 @@ import { PrivacyLevel } from "../../types/channels/privacyLevel.ts"; /** Creates a new Stage instance associated to a Stage channel. Requires the user to be a moderator of the Stage channel. */ export async function createStageInstance(bot: Bot, channelId: bigint, topic: string, privacyLevel?: PrivacyLevel) { - if (!bot.utils.validateLength(topic, { max: 120, min: 1 })) { - throw new Error(bot.constants.Errors.INVALID_TOPIC_LENGTH); - } - const result = await bot.rest.runMethod(bot.rest, "post", bot.constants.endpoints.STAGE_INSTANCES, { channel_id: channelId.toString(), topic, From ca45385f19bf415a7b328e4a842a4a786e2c6f04 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Sat, 4 Dec 2021 16:25:22 +0000 Subject: [PATCH 033/104] chore: rc12 --- src/util/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/constants.ts b/src/util/constants.ts index b4bdb196b..19f13abc7 100644 --- a/src/util/constants.ts +++ b/src/util/constants.ts @@ -9,7 +9,7 @@ export const GATEWAY_VERSION = 9; // TODO: update this version /** https://github.com/discordeno/discordeno/releases */ -export const DISCORDENO_VERSION = "13.0.0-rc11"; +export const DISCORDENO_VERSION = "13.0.0-rc12"; /** https://discord.com/developers/docs/reference#user-agent */ From 416156d2da7d035127fd59220a68c0f420e56680 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Sat, 4 Dec 2021 18:36:09 +0000 Subject: [PATCH 034/104] fix: refactoring channel helpers --- src/helpers/channels/getChannel.ts | 5 +-- src/helpers/channels/getChannels.ts | 5 +-- src/helpers/channels/swapChannels.ts | 2 +- src/helpers/channels/updateBotVoiceState.ts | 37 ---------------- src/helpers/channels/updateStageInstance.ts | 10 ----- src/helpers/channels/updateVoiceState.ts | 47 +++++++++++++++++++++ src/helpers/mod.ts | 2 +- src/types/guilds/updateOthersVoiceState.ts | 4 +- src/types/guilds/updateSelfVoiceState.ts | 4 +- 9 files changed, 56 insertions(+), 60 deletions(-) delete mode 100644 src/helpers/channels/updateBotVoiceState.ts create mode 100644 src/helpers/channels/updateVoiceState.ts diff --git a/src/helpers/channels/getChannel.ts b/src/helpers/channels/getChannel.ts index ea671e630..23f025acb 100644 --- a/src/helpers/channels/getChannel.ts +++ b/src/helpers/channels/getChannel.ts @@ -1,10 +1,7 @@ import type { Bot } from "../../bot.ts"; import type { Channel } from "../../types/channels/channel.ts"; -/** Fetches a single channel object from the api. - * - * ⚠️ **If you need this, you are probably doing something wrong. This is not intended for use. Your channels will be cached in your guild.** - */ +/** Fetches a single channel object from the api. */ export async function getChannel(bot: Bot, channelId: bigint) { const result = await bot.rest.runMethod(bot.rest, "get", bot.constants.endpoints.CHANNEL_BASE(channelId)); diff --git a/src/helpers/channels/getChannels.ts b/src/helpers/channels/getChannels.ts index 518ef6eb9..d196083c7 100644 --- a/src/helpers/channels/getChannels.ts +++ b/src/helpers/channels/getChannels.ts @@ -2,10 +2,7 @@ import type { Channel } from "../../types/channels/channel.ts"; import { Collection } from "../../util/collection.ts"; import type { Bot } from "../../bot.ts"; -/** Returns a list of guild channel objects. - * - * ⚠️ **If you need this, you are probably doing something wrong. This is not intended for use. Your channels will be cached in your guild.** - */ +/** Returns a list of guild channel objects. */ export async function getChannels(bot: Bot, guildId: bigint) { const result = await bot.rest.runMethod(bot.rest, "get", bot.constants.endpoints.GUILD_CHANNELS(guildId)); diff --git a/src/helpers/channels/swapChannels.ts b/src/helpers/channels/swapChannels.ts index d6725d39d..5cb8e5cd0 100644 --- a/src/helpers/channels/swapChannels.ts +++ b/src/helpers/channels/swapChannels.ts @@ -1,7 +1,7 @@ import type { ModifyGuildChannelPositions } from "../../types/guilds/modifyGuildChannelPosition.ts"; import type { Bot } from "../../bot.ts"; -/** Modify the positions of channels on the guild. Requires MANAGE_CHANNELS permission. */ +/** Modify the positions of channels on the guild. Requires MANAGE_CHANNELS permission. Only channels to be modified are required. */ export async function swapChannels(bot: Bot, guildId: bigint, channelPositions: ModifyGuildChannelPositions[]) { if (!channelPositions.length) { throw "You must provide at least one channels to be moved."; diff --git a/src/helpers/channels/updateBotVoiceState.ts b/src/helpers/channels/updateBotVoiceState.ts deleted file mode 100644 index c03756206..000000000 --- a/src/helpers/channels/updateBotVoiceState.ts +++ /dev/null @@ -1,37 +0,0 @@ -import type { UpdateOthersVoiceState } from "../../types/guilds/updateOthersVoiceState.ts"; -import type { UpdateSelfVoiceState } from "../../types/guilds/updateSelfVoiceState.ts"; -import type { Bot } from "../../bot.ts"; - -/** - * Updates the a user's voice state, defaults to the current user - * Caveats: - * - `channel_id` must currently point to a stage channel. - * - User must already have joined `channel_id`. - * - You must have the `MUTE_MEMBERS` permission. But can always suppress yourself. - * - When unsuppressed, non-bot users will have their `request_to_speak_timestamp` set to the current time. Bot users will not. - * - You must have the `REQUEST_TO_SPEAK` permission to request to speak. You can always clear your own request to speak. - * - You are able to set `request_to_speak_timestamp` to any present or future time. - * - When suppressed, the user will have their `request_to_speak_timestamp` removed. - */ -export async function updateBotVoiceState( - bot: Bot, - guildId: bigint, - options: UpdateSelfVoiceState | ({ userId: bigint } & UpdateOthersVoiceState) -) { - return await bot.rest.runMethod( - bot.rest, - "patch", - bot.constants.endpoints.UPDATE_VOICE_STATE( - guildId, - bot.utils.hasProperty(options, "userId") ? options.userId : undefined - ), - { - channel_id: options.channelId, - suppress: options.suppress, - request_to_speak_timestamp: bot.utils.hasProperty(options, "requestToSpeakTimestamp") - ? options.requestToSpeakTimestamp - : undefined, - user_id: bot.utils.hasProperty(options, "userId") ? options.userId : undefined, - } - ); -} diff --git a/src/helpers/channels/updateStageInstance.ts b/src/helpers/channels/updateStageInstance.ts index ecd330794..9559840c9 100644 --- a/src/helpers/channels/updateStageInstance.ts +++ b/src/helpers/channels/updateStageInstance.ts @@ -4,16 +4,6 @@ import { AtLeastOne } from "../../types/util.ts"; /** Updates fields of an existing Stage instance. Requires the user to be a moderator of the Stage channel. */ export async function updateStageInstance(bot: Bot, channelId: bigint, data: AtLeastOne>) { - if ( - data.topic && - !bot.utils.validateLength(data.topic, { - min: 1, - max: 120, - }) - ) { - throw new Error(bot.constants.Errors.INVALID_TOPIC_LENGTH); - } - const result = await bot.rest.runMethod( bot.rest, "patch", diff --git a/src/helpers/channels/updateVoiceState.ts b/src/helpers/channels/updateVoiceState.ts new file mode 100644 index 000000000..0884111ec --- /dev/null +++ b/src/helpers/channels/updateVoiceState.ts @@ -0,0 +1,47 @@ +import type { UpdateOthersVoiceState } from "../../types/guilds/updateOthersVoiceState.ts"; +import type { UpdateSelfVoiceState } from "../../types/guilds/updateSelfVoiceState.ts"; +import type { Bot } from "../../bot.ts"; + +/** + * Updates the bot's voice state + * Caveats: + * - `channel_id` must currently point to a stage channel. + * - Bot must already have joined `channel_id`. + * - You must have the `MUTE_MEMBERS` permission. But can always suppress yourself. + * - You must have the `REQUEST_TO_SPEAK` permission to request to speak. You can always clear your own request to speak. + * - You are able to set `request_to_speak_timestamp` to any present or future time. + * - When suppressed, the user will have their `request_to_speak_timestamp` removed. + */ +export async function updateBotVoiceState(bot: Bot, guildId: bigint, options: UpdateSelfVoiceState) { + return await bot.rest.runMethod(bot.rest, "patch", bot.constants.endpoints.UPDATE_VOICE_STATE(guildId), { + channel_id: options.channelId, + suppress: options.suppress, + request_to_speak_timestamp: options.requestToSpeakTimestamp + ? new Date(options.requestToSpeakTimestamp).toISOString() + : options.requestToSpeakTimestamp, + }); +} + +/** + * Updates the a user's voice state + * Caveats: + * - `channel_id` must currently point to a stage channel. + * - User must already have joined `channel_id`. + * - You must have the `MUTE_MEMBERS` permission. But can always suppress yourself. + * - When unsuppressed, non-bot users will have their `request_to_speak_timestamp` set to the current time. Bot users will not. + * - You must have the `REQUEST_TO_SPEAK` permission to request to speak. You can always clear your own request to speak. + * - You are able to set `request_to_speak_timestamp` to any present or future time. + * - When suppressed, the user will have their `request_to_speak_timestamp` removed. + */ +export async function updateUserVoiceState(bot: Bot, guildId: bigint, options: UpdateOthersVoiceState) { + return await bot.rest.runMethod( + bot.rest, + "patch", + bot.constants.endpoints.UPDATE_VOICE_STATE(guildId, options.userId), + { + channel_id: options.channelId, + suppress: options.suppress, + user_id: options.userId, + } + ); +} diff --git a/src/helpers/mod.ts b/src/helpers/mod.ts index 5ac3942f9..81b0f8e0e 100644 --- a/src/helpers/mod.ts +++ b/src/helpers/mod.ts @@ -11,7 +11,7 @@ export * from "./channels/getChannelWebhooks.ts"; export * from "./channels/getPins.ts"; export * from "./channels/startTyping.ts"; export * from "./channels/swapChannels.ts"; -export * from "./channels/updateBotVoiceState.ts"; +export * from "./channels/updateVoiceState.ts"; //discovery export * from "./discovery/addDiscoverySubcategory.ts"; diff --git a/src/types/guilds/updateOthersVoiceState.ts b/src/types/guilds/updateOthersVoiceState.ts index 87f524582..f4ac66227 100644 --- a/src/types/guilds/updateOthersVoiceState.ts +++ b/src/types/guilds/updateOthersVoiceState.ts @@ -1,7 +1,9 @@ /** https://discord.com/developers/docs/resources/guild#update-user-voice-state */ export interface UpdateOthersVoiceState { /** The id of the channel the user is currently in */ - channelId: string; + channelId: bigint; /** Toggles the user's suppress state */ suppress?: boolean; + /** The user id to target */ + userId: bigint; } diff --git a/src/types/guilds/updateSelfVoiceState.ts b/src/types/guilds/updateSelfVoiceState.ts index 475a55a75..11ae4696c 100644 --- a/src/types/guilds/updateSelfVoiceState.ts +++ b/src/types/guilds/updateSelfVoiceState.ts @@ -1,9 +1,9 @@ /** https://discord.com/developers/docs/resources/guild#update-current-user-voice-state */ export interface UpdateSelfVoiceState { /** The id of the channel the user is currently in */ - channelId: string; + channelId: bigint; /** Toggles the user's suppress state */ suppress?: boolean; /** Sets the user's request to speak */ - requestToSpeakTimestamp?: string | null; + requestToSpeakTimestamp?: number | null; } From 42457a4db9f5b86f360d6610fcf4a91c346d165e Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Sat, 4 Dec 2021 22:43:22 +0000 Subject: [PATCH 035/104] fix get discovery --- src/helpers/discovery/{get_discovery.ts => getDiscovery.ts} | 0 src/helpers/mod.ts | 1 + 2 files changed, 1 insertion(+) rename src/helpers/discovery/{get_discovery.ts => getDiscovery.ts} (100%) diff --git a/src/helpers/discovery/get_discovery.ts b/src/helpers/discovery/getDiscovery.ts similarity index 100% rename from src/helpers/discovery/get_discovery.ts rename to src/helpers/discovery/getDiscovery.ts diff --git a/src/helpers/mod.ts b/src/helpers/mod.ts index 81b0f8e0e..f9cbd55ba 100644 --- a/src/helpers/mod.ts +++ b/src/helpers/mod.ts @@ -16,6 +16,7 @@ export * from "./channels/updateVoiceState.ts"; //discovery export * from "./discovery/addDiscoverySubcategory.ts"; export * from "./discovery/editDiscovery.ts"; +export * from "./discovery/getDiscovery.ts"; export * from "./discovery/getDiscoveryCategories.ts"; export * from "./discovery/removeDiscoverySubcategory.ts"; export * from "./discovery/validDiscoveryTerm.ts"; From 4cae6da1a4dff054618c43d838a0bb00b58171ed Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Sun, 5 Dec 2021 14:27:16 +0000 Subject: [PATCH 036/104] fix: missing types --- src/helpers/emojis/getEmoji.ts | 2 +- src/helpers/emojis/getEmojis.ts | 3 +-- src/types/guilds/mod.ts | 1 + 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/helpers/emojis/getEmoji.ts b/src/helpers/emojis/getEmoji.ts index ad65f0642..84a897f40 100644 --- a/src/helpers/emojis/getEmoji.ts +++ b/src/helpers/emojis/getEmoji.ts @@ -5,6 +5,6 @@ import type { Bot } from "../../bot.ts"; /** * Returns an emoji for the given guild and emoji Id. */ -export async function getEmoji(bot: Bot, guildId: bigint, emojiId: bigint, addToCache = true) { +export async function getEmoji(bot: Bot, guildId: bigint, emojiId: bigint) { return await bot.rest.runMethod(bot.rest, "get", bot.constants.endpoints.GUILD_EMOJI(guildId, emojiId)); } diff --git a/src/helpers/emojis/getEmojis.ts b/src/helpers/emojis/getEmojis.ts index 8d7e6c17e..2e0274476 100644 --- a/src/helpers/emojis/getEmojis.ts +++ b/src/helpers/emojis/getEmojis.ts @@ -5,9 +5,8 @@ import { Collection } from "../../util/collection.ts"; /** * Returns a list of emojis for the given guild. - * */ -export async function getEmojis(bot: Bot, guildId: bigint, addToCache = true) { +export async function getEmojis(bot: Bot, guildId: bigint) { const result = await bot.rest.runMethod(bot.rest, "get", bot.constants.endpoints.GUILD_EMOJIS(guildId)); return new Collection(result.map((e) => [bot.transformers.snowflake(e.id!), bot.transformers.emoji(bot, e)])); diff --git a/src/types/guilds/mod.ts b/src/types/guilds/mod.ts index 503571df9..b7c33427f 100644 --- a/src/types/guilds/mod.ts +++ b/src/types/guilds/mod.ts @@ -29,6 +29,7 @@ export * from "./modifyGuildRole.ts"; export * from "./modifyGuildRolePositions.ts"; export * from "./modifyGuildWelcomeScreen.ts"; export * from "./premiumTiers.ts"; +export * from "./scheduledEvents.ts"; export * from "./systemChannelFlags.ts"; export * from "./unavailableGuild.ts"; export * from "./updateOthersVoiceState.ts"; From a073c0741a72b28bd80caafde37ad5de7a3125a0 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Sun, 5 Dec 2021 15:16:53 +0000 Subject: [PATCH 037/104] fix: typo --- src/helpers/guilds/editWelcomeScreen.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers/guilds/editWelcomeScreen.ts b/src/helpers/guilds/editWelcomeScreen.ts index 0508738ff..28e6cc102 100644 --- a/src/helpers/guilds/editWelcomeScreen.ts +++ b/src/helpers/guilds/editWelcomeScreen.ts @@ -9,7 +9,7 @@ export async function editWelcomeScreen(bot: Bot, guildId: bigint, options: Modi bot.constants.endpoints.GUILD_WELCOME_SCREEN(guildId), { enabled: options.enabled, - welcomeScreen: options.welcomeScreen?.map((welcomeScreen) => { + welcome_screen: options.welcomeScreen?.map((welcomeScreen) => { return { channel_id: welcomeScreen.channelId, description: welcomeScreen.description, From db63b7901a5ac408417c99fb9720f9b7f4a4dec0 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Sun, 5 Dec 2021 16:50:03 +0000 Subject: [PATCH 038/104] undefined > void --- src/helpers/channels/deleteChannelOverwrite.ts | 2 +- src/helpers/channels/deleteStageInstance.ts | 2 +- src/helpers/channels/editChannelOverwrite.ts | 2 +- src/helpers/channels/startTyping.ts | 2 +- src/helpers/channels/swapChannels.ts | 2 +- src/helpers/channels/threads/addToThread.ts | 2 +- src/helpers/channels/threads/joinThread.ts | 2 +- src/helpers/channels/threads/leaveThread.ts | 2 +- src/helpers/channels/threads/removeThreadMember.ts | 2 +- src/helpers/discovery/removeDiscoverySubcategory.ts | 2 +- src/helpers/emojis/deleteEmoji.ts | 2 +- src/helpers/guilds/deleteGuild.ts | 2 +- src/helpers/guilds/leaveGuild.ts | 2 +- src/helpers/integrations/deleteIntegration.ts | 6 +----- .../interactions/commands/deleteApplicationCommand.ts | 2 +- .../interactions/commands/deleteInteractionResponse.ts | 2 +- src/helpers/members/banMember.ts | 2 +- src/helpers/members/kickMember.ts | 9 +++------ src/helpers/members/unbanMember.ts | 2 +- src/helpers/messages/addReaction.ts | 2 +- src/helpers/messages/deleteMessage.ts | 2 +- src/helpers/messages/deleteMessages.ts | 2 +- src/helpers/messages/pinMessage.ts | 6 +----- src/helpers/messages/removeAllReactions.ts | 2 +- src/helpers/messages/removeReaction.ts | 2 +- src/helpers/messages/removeReactionEmoji.ts | 2 +- src/helpers/messages/unpinMessage.ts | 6 +----- src/helpers/roles/addRole.ts | 2 +- src/helpers/roles/deleteRole.ts | 2 +- src/helpers/roles/removeRole.ts | 2 +- src/helpers/webhooks/deleteWebhook.ts | 2 +- src/helpers/webhooks/deleteWebhookMessage.ts | 2 +- src/helpers/webhooks/deleteWebhookWithToken.ts | 6 +----- 33 files changed, 35 insertions(+), 54 deletions(-) diff --git a/src/helpers/channels/deleteChannelOverwrite.ts b/src/helpers/channels/deleteChannelOverwrite.ts index e3adb4ffa..6b855f73e 100644 --- a/src/helpers/channels/deleteChannelOverwrite.ts +++ b/src/helpers/channels/deleteChannelOverwrite.ts @@ -2,7 +2,7 @@ import type { Bot } from "../../bot.ts"; /** Delete the channel permission overwrites for a user or role in this channel. Requires `MANAGE_ROLES` permission. */ export async function deleteChannelOverwrite(bot: Bot, channelId: bigint, overwriteId: bigint): Promise { - return await bot.rest.runMethod( + await bot.rest.runMethod( bot.rest, "delete", bot.constants.endpoints.CHANNEL_OVERWRITE(channelId, overwriteId) diff --git a/src/helpers/channels/deleteStageInstance.ts b/src/helpers/channels/deleteStageInstance.ts index b2594e572..f359f2088 100644 --- a/src/helpers/channels/deleteStageInstance.ts +++ b/src/helpers/channels/deleteStageInstance.ts @@ -2,5 +2,5 @@ import type { Bot } from "../../bot.ts"; /** Deletes the Stage instance. Requires the user to be a moderator of the Stage channel. */ export async function deleteStageInstance(bot: Bot, channelId: bigint) { - return await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.STAGE_INSTANCE(channelId)); + await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.STAGE_INSTANCE(channelId)); } diff --git a/src/helpers/channels/editChannelOverwrite.ts b/src/helpers/channels/editChannelOverwrite.ts index 3fac722c7..eec214cff 100644 --- a/src/helpers/channels/editChannelOverwrite.ts +++ b/src/helpers/channels/editChannelOverwrite.ts @@ -8,7 +8,7 @@ export async function editChannelOverwrite( overwriteId: bigint, options: Omit ): Promise { - return await bot.rest.runMethod( + await bot.rest.runMethod( bot.rest, "put", bot.constants.endpoints.CHANNEL_OVERWRITE(channelId, overwriteId), diff --git a/src/helpers/channels/startTyping.ts b/src/helpers/channels/startTyping.ts index b33a21563..688c7b0eb 100644 --- a/src/helpers/channels/startTyping.ts +++ b/src/helpers/channels/startTyping.ts @@ -7,5 +7,5 @@ import type { Bot } from "../../bot.ts"; * this endpoint may be called to let the user know that the bot is processing their message. */ export async function startTyping(bot: Bot, channelId: bigint) { - return await bot.rest.runMethod(bot.rest, "post", bot.constants.endpoints.CHANNEL_TYPING(channelId)); + await bot.rest.runMethod(bot.rest, "post", bot.constants.endpoints.CHANNEL_TYPING(channelId)); } diff --git a/src/helpers/channels/swapChannels.ts b/src/helpers/channels/swapChannels.ts index 5cb8e5cd0..aec44f2ea 100644 --- a/src/helpers/channels/swapChannels.ts +++ b/src/helpers/channels/swapChannels.ts @@ -7,7 +7,7 @@ export async function swapChannels(bot: Bot, guildId: bigint, channelPositions: throw "You must provide at least one channels to be moved."; } - return await bot.rest.runMethod( + await bot.rest.runMethod( bot.rest, "patch", bot.constants.endpoints.GUILD_CHANNELS(guildId), diff --git a/src/helpers/channels/threads/addToThread.ts b/src/helpers/channels/threads/addToThread.ts index 05bc89af4..a146e48bc 100644 --- a/src/helpers/channels/threads/addToThread.ts +++ b/src/helpers/channels/threads/addToThread.ts @@ -2,5 +2,5 @@ import type { Bot } from "../../../bot.ts"; /** Adds a user to a thread. Requires the ability to send messages in the thread. Requires the thread is not archived. */ export async function addToThread(bot: Bot, threadId: bigint, userId: bigint) { - return await bot.rest.runMethod(bot.rest, "put", bot.constants.endpoints.THREAD_USER(threadId, userId)); + await bot.rest.runMethod(bot.rest, "put", bot.constants.endpoints.THREAD_USER(threadId, userId)); } diff --git a/src/helpers/channels/threads/joinThread.ts b/src/helpers/channels/threads/joinThread.ts index 0a8ec5967..17429e042 100644 --- a/src/helpers/channels/threads/joinThread.ts +++ b/src/helpers/channels/threads/joinThread.ts @@ -2,5 +2,5 @@ import type { Bot } from "../../../bot.ts"; /** Adds the bot to the thread. Cannot join an archived thread. */ export async function joinThread(bot: Bot, threadId: bigint) { - return await bot.rest.runMethod(bot.rest, "put", bot.constants.endpoints.THREAD_ME(threadId)); + await bot.rest.runMethod(bot.rest, "put", bot.constants.endpoints.THREAD_ME(threadId)); } diff --git a/src/helpers/channels/threads/leaveThread.ts b/src/helpers/channels/threads/leaveThread.ts index 6792dd31b..1fe3a611a 100644 --- a/src/helpers/channels/threads/leaveThread.ts +++ b/src/helpers/channels/threads/leaveThread.ts @@ -2,5 +2,5 @@ import type { Bot } from "../../../bot.ts"; /** Removes the bot from a thread. Requires the thread is not archived. */ export async function leaveThread(bot: Bot, threadId: bigint) { - return await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.THREAD_ME(threadId)); + await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.THREAD_ME(threadId)); } diff --git a/src/helpers/channels/threads/removeThreadMember.ts b/src/helpers/channels/threads/removeThreadMember.ts index 1dc30c5e8..3cd128a00 100644 --- a/src/helpers/channels/threads/removeThreadMember.ts +++ b/src/helpers/channels/threads/removeThreadMember.ts @@ -2,5 +2,5 @@ import type { Bot } from "../../../bot.ts"; /** Removes a user from a thread. Requires the MANAGE_THREADS permission or that you are the creator of the thread. Also requires the thread is not archived. */ export async function removeThreadMember(bot: Bot, threadId: bigint, userId: bigint) { - return await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.THREAD_USER(threadId, userId)); + await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.THREAD_USER(threadId, userId)); } diff --git a/src/helpers/discovery/removeDiscoverySubcategory.ts b/src/helpers/discovery/removeDiscoverySubcategory.ts index 7aec290c4..f25b35d90 100644 --- a/src/helpers/discovery/removeDiscoverySubcategory.ts +++ b/src/helpers/discovery/removeDiscoverySubcategory.ts @@ -2,7 +2,7 @@ import type { Bot } from "../../bot.ts"; /** Removes a discovery subcategory from the guild. Requires the MANAGE_GUILD permission. Returns a 204 No Content on success. */ export async function removeDiscoverySubcategory(bot: Bot, guildId: bigint, categoryId: number) { - return await bot.rest.runMethod( + await bot.rest.runMethod( bot.rest, "delete", bot.constants.endpoints.DISCOVERY_SUBCATEGORY(guildId, categoryId) diff --git a/src/helpers/emojis/deleteEmoji.ts b/src/helpers/emojis/deleteEmoji.ts index e9c63446f..cc77e6c88 100644 --- a/src/helpers/emojis/deleteEmoji.ts +++ b/src/helpers/emojis/deleteEmoji.ts @@ -2,7 +2,7 @@ import type { Bot } from "../../bot.ts"; /** Delete the given emoji. Requires the MANAGE_EMOJIS permission. Returns 204 No Content on success. */ export async function deleteEmoji(bot: Bot, guildId: bigint, id: bigint, reason?: string) { - return await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.GUILD_EMOJI(guildId, id), { + await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.GUILD_EMOJI(guildId, id), { reason, }); } diff --git a/src/helpers/guilds/deleteGuild.ts b/src/helpers/guilds/deleteGuild.ts index c1c4d359b..45b0e1fb5 100644 --- a/src/helpers/guilds/deleteGuild.ts +++ b/src/helpers/guilds/deleteGuild.ts @@ -2,5 +2,5 @@ import type { Bot } from "../../bot.ts"; /** Delete a guild permanently. User must be owner. Returns 204 No Content on success. Fires a Guild Delete Gateway event. */ export async function deleteGuild(bot: Bot, guildId: bigint) { - return await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.GUILDS_BASE(guildId)); + await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.GUILDS_BASE(guildId)); } diff --git a/src/helpers/guilds/leaveGuild.ts b/src/helpers/guilds/leaveGuild.ts index 06d6f1756..fade59ee2 100644 --- a/src/helpers/guilds/leaveGuild.ts +++ b/src/helpers/guilds/leaveGuild.ts @@ -2,5 +2,5 @@ import type { Bot } from "../../bot.ts"; /** Leave a guild */ export async function leaveGuild(bot: Bot, guildId: bigint) { - return await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.GUILD_LEAVE(guildId)); + await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.GUILD_LEAVE(guildId)); } diff --git a/src/helpers/integrations/deleteIntegration.ts b/src/helpers/integrations/deleteIntegration.ts index 10d420230..5be3de2af 100644 --- a/src/helpers/integrations/deleteIntegration.ts +++ b/src/helpers/integrations/deleteIntegration.ts @@ -2,9 +2,5 @@ import type { Bot } from "../../bot.ts"; /** Delete the attached integration object for the guild with this id. Requires MANAGE_GUILD permission. */ export async function deleteIntegration(bot: Bot, guildId: bigint, id: bigint) { - return await bot.rest.runMethod( - bot.rest, - "delete", - bot.constants.endpoints.GUILD_INTEGRATION(guildId, id) - ); + await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.GUILD_INTEGRATION(guildId, id)); } diff --git a/src/helpers/interactions/commands/deleteApplicationCommand.ts b/src/helpers/interactions/commands/deleteApplicationCommand.ts index d72b7cb68..8450290fc 100644 --- a/src/helpers/interactions/commands/deleteApplicationCommand.ts +++ b/src/helpers/interactions/commands/deleteApplicationCommand.ts @@ -2,7 +2,7 @@ import type { Bot } from "../../../bot.ts"; /** Deletes a slash command. */ export async function deleteApplicationCommand(bot: Bot, id: bigint, guildId?: bigint) { - return await bot.rest.runMethod( + await bot.rest.runMethod( bot.rest, "delete", guildId diff --git a/src/helpers/interactions/commands/deleteInteractionResponse.ts b/src/helpers/interactions/commands/deleteInteractionResponse.ts index 65b8b1a93..0fed0eeaa 100644 --- a/src/helpers/interactions/commands/deleteInteractionResponse.ts +++ b/src/helpers/interactions/commands/deleteInteractionResponse.ts @@ -2,7 +2,7 @@ import type { Bot } from "../../../bot.ts"; /** To delete your response to a slash command. If a message id is not provided, it will default to deleting the original response. */ export async function deleteInteractionResponse(bot: Bot, token: string, messageId?: bigint) { - return await bot.rest.runMethod( + await bot.rest.runMethod( bot.rest, "delete", messageId diff --git a/src/helpers/members/banMember.ts b/src/helpers/members/banMember.ts index fe4bc9655..e0e7cad44 100644 --- a/src/helpers/members/banMember.ts +++ b/src/helpers/members/banMember.ts @@ -3,7 +3,7 @@ import type { Bot } from "../../bot.ts"; /** Ban a user from the guild and optionally delete previous messages sent by the user. Requires the BAN_MEMBERS permission. */ export async function banMember(bot: Bot, guildId: bigint, id: bigint, options?: CreateGuildBan) { - return await bot.rest.runMethod( + await bot.rest.runMethod( bot.rest, "put", bot.constants.endpoints.GUILD_BAN(guildId, id), diff --git a/src/helpers/members/kickMember.ts b/src/helpers/members/kickMember.ts index c2dd61543..d6145521b 100644 --- a/src/helpers/members/kickMember.ts +++ b/src/helpers/members/kickMember.ts @@ -2,10 +2,7 @@ import { Bot } from "../../bot.ts"; /** Kick a member from the server */ export async function kickMember(bot: Bot, guildId: bigint, memberId: bigint, reason?: string) { - return await bot.rest.runMethod( - bot.rest, - "delete", - bot.constants.endpoints.GUILD_MEMBER(guildId, memberId), - { reason } - ); + await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.GUILD_MEMBER(guildId, memberId), { + reason, + }); } diff --git a/src/helpers/members/unbanMember.ts b/src/helpers/members/unbanMember.ts index 71bc569c5..2dd874620 100644 --- a/src/helpers/members/unbanMember.ts +++ b/src/helpers/members/unbanMember.ts @@ -2,5 +2,5 @@ import type { Bot } from "../../bot.ts"; /** Remove the ban for a user. Requires BAN_MEMBERS permission */ export async function unbanMember(bot: Bot, guildId: bigint, id: bigint) { - return await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.GUILD_BAN(guildId, id)); + await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.GUILD_BAN(guildId, id)); } diff --git a/src/helpers/messages/addReaction.ts b/src/helpers/messages/addReaction.ts index 1f4390a49..855f00e70 100644 --- a/src/helpers/messages/addReaction.ts +++ b/src/helpers/messages/addReaction.ts @@ -8,7 +8,7 @@ export async function addReaction(bot: Bot, channelId: bigint, messageId: bigint reaction = reaction.substring(3, reaction.length - 1); } - return await bot.rest.runMethod( + await bot.rest.runMethod( bot.rest, "put", bot.constants.endpoints.CHANNEL_MESSAGE_REACTION_ME(channelId, messageId, encodeURIComponent(reaction)), diff --git a/src/helpers/messages/deleteMessage.ts b/src/helpers/messages/deleteMessage.ts index a828b8698..875e404ea 100644 --- a/src/helpers/messages/deleteMessage.ts +++ b/src/helpers/messages/deleteMessage.ts @@ -10,7 +10,7 @@ export async function deleteMessage( ) { if (delayMilliseconds) await bot.utils.delay(delayMilliseconds); - return await bot.rest.runMethod( + await bot.rest.runMethod( bot.rest, "delete", bot.constants.endpoints.CHANNEL_MESSAGE(channelId, messageId), diff --git a/src/helpers/messages/deleteMessages.ts b/src/helpers/messages/deleteMessages.ts index c7c8a9249..591ad79a8 100644 --- a/src/helpers/messages/deleteMessages.ts +++ b/src/helpers/messages/deleteMessages.ts @@ -10,7 +10,7 @@ export async function deleteMessages(bot: Bot, channelId: bigint, ids: bigint[], console.warn(`This endpoint only accepts a maximum of 100 messages. Deleting the first 100 message ids provided.`); } - return await bot.rest.runMethod(bot.rest, "post", bot.constants.endpoints.CHANNEL_BULK_DELETE(channelId), { + await bot.rest.runMethod(bot.rest, "post", bot.constants.endpoints.CHANNEL_BULK_DELETE(channelId), { messages: ids.splice(0, 100).map((id) => id.toString()), reason, }); diff --git a/src/helpers/messages/pinMessage.ts b/src/helpers/messages/pinMessage.ts index cf5eff916..8421c2ebd 100644 --- a/src/helpers/messages/pinMessage.ts +++ b/src/helpers/messages/pinMessage.ts @@ -2,9 +2,5 @@ import type { Bot } from "../../bot.ts"; /** Pin a message in a channel. Requires MANAGE_MESSAGES. Max pins allowed in a channel = 50. */ export async function pinMessage(bot: Bot, channelId: bigint, messageId: bigint) { - return await bot.rest.runMethod( - bot.rest, - "put", - bot.constants.endpoints.CHANNEL_PIN(channelId, messageId) - ); + await bot.rest.runMethod(bot.rest, "put", bot.constants.endpoints.CHANNEL_PIN(channelId, messageId)); } diff --git a/src/helpers/messages/removeAllReactions.ts b/src/helpers/messages/removeAllReactions.ts index d4f18e13a..3a58c4729 100644 --- a/src/helpers/messages/removeAllReactions.ts +++ b/src/helpers/messages/removeAllReactions.ts @@ -2,7 +2,7 @@ import type { Bot } from "../../bot.ts"; /** Removes all reactions for all emojis on this message. */ export async function removeAllReactions(bot: Bot, channelId: bigint, messageId: bigint) { - return await bot.rest.runMethod( + await bot.rest.runMethod( bot.rest, "delete", bot.constants.endpoints.CHANNEL_MESSAGE_REACTIONS(channelId, messageId) diff --git a/src/helpers/messages/removeReaction.ts b/src/helpers/messages/removeReaction.ts index e15274565..4dbe2b362 100644 --- a/src/helpers/messages/removeReaction.ts +++ b/src/helpers/messages/removeReaction.ts @@ -14,7 +14,7 @@ export async function removeReaction( reaction = reaction.substring(3, reaction.length - 1); } - return await bot.rest.runMethod( + await bot.rest.runMethod( bot.rest, "delete", options?.userId diff --git a/src/helpers/messages/removeReactionEmoji.ts b/src/helpers/messages/removeReactionEmoji.ts index 252b02d80..590876429 100644 --- a/src/helpers/messages/removeReactionEmoji.ts +++ b/src/helpers/messages/removeReactionEmoji.ts @@ -8,7 +8,7 @@ export async function removeReactionEmoji(bot: Bot, channelId: bigint, messageId reaction = reaction.substring(3, reaction.length - 1); } - return await bot.rest.runMethod( + await bot.rest.runMethod( bot.rest, "delete", bot.constants.endpoints.CHANNEL_MESSAGE_REACTION(channelId, messageId, reaction) diff --git a/src/helpers/messages/unpinMessage.ts b/src/helpers/messages/unpinMessage.ts index 6962f6d70..960b94ce3 100644 --- a/src/helpers/messages/unpinMessage.ts +++ b/src/helpers/messages/unpinMessage.ts @@ -2,9 +2,5 @@ import type { Bot } from "../../bot.ts"; export async function unpinMessage(bot: Bot, channelId: bigint, messageId: bigint): Promise { - return await bot.rest.runMethod( - bot.rest, - "delete", - bot.constants.endpoints.CHANNEL_PIN(channelId, messageId) - ); + await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.CHANNEL_PIN(channelId, messageId)); } diff --git a/src/helpers/roles/addRole.ts b/src/helpers/roles/addRole.ts index 2e1a618f2..e668c2b66 100644 --- a/src/helpers/roles/addRole.ts +++ b/src/helpers/roles/addRole.ts @@ -2,7 +2,7 @@ import type { Bot } from "../../bot.ts"; /** Add a role to the member */ export async function addRole(bot: Bot, guildId: bigint, memberId: bigint, roleId: bigint, reason?: string) { - return await bot.rest.runMethod( + await bot.rest.runMethod( bot.rest, "put", bot.constants.endpoints.GUILD_MEMBER_ROLE(guildId, memberId, roleId), diff --git a/src/helpers/roles/deleteRole.ts b/src/helpers/roles/deleteRole.ts index af217256a..7cb8cb24b 100644 --- a/src/helpers/roles/deleteRole.ts +++ b/src/helpers/roles/deleteRole.ts @@ -2,5 +2,5 @@ import type { Bot } from "../../bot.ts"; /** Delete a guild role. Requires the MANAGE_ROLES permission. */ export async function deleteRole(bot: Bot, guildId: bigint, id: bigint) { - return await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.GUILD_ROLE(guildId, id)); + await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.GUILD_ROLE(guildId, id)); } diff --git a/src/helpers/roles/removeRole.ts b/src/helpers/roles/removeRole.ts index b45a7a788..f724691ae 100644 --- a/src/helpers/roles/removeRole.ts +++ b/src/helpers/roles/removeRole.ts @@ -2,7 +2,7 @@ import type { Bot } from "../../bot.ts"; /** Remove a role from the member */ export async function removeRole(bot: Bot, guildId: bigint, memberId: bigint, roleId: bigint, reason?: string) { - return await bot.rest.runMethod( + await bot.rest.runMethod( bot.rest, "delete", bot.constants.endpoints.GUILD_MEMBER_ROLE(guildId, memberId, roleId), diff --git a/src/helpers/webhooks/deleteWebhook.ts b/src/helpers/webhooks/deleteWebhook.ts index 15b8e1e62..d4b8d4470 100644 --- a/src/helpers/webhooks/deleteWebhook.ts +++ b/src/helpers/webhooks/deleteWebhook.ts @@ -2,5 +2,5 @@ import type { Bot } from "../../bot.ts"; /** Delete a webhook permanently. Requires the `MANAGE_WEBHOOKS` permission. Returns a undefined on success */ export async function deleteWebhook(bot: Bot, channelId: bigint, webhookId: bigint) { - return await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.WEBHOOK_ID(webhookId)); + await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.WEBHOOK_ID(webhookId)); } diff --git a/src/helpers/webhooks/deleteWebhookMessage.ts b/src/helpers/webhooks/deleteWebhookMessage.ts index 608d780b8..6303811ca 100644 --- a/src/helpers/webhooks/deleteWebhookMessage.ts +++ b/src/helpers/webhooks/deleteWebhookMessage.ts @@ -1,7 +1,7 @@ import type { Bot } from "../../bot.ts"; export async function deleteWebhookMessage(bot: Bot, webhookId: bigint, webhookToken: string, messageId: bigint) { - return await bot.rest.runMethod( + await bot.rest.runMethod( bot.rest, "delete", bot.constants.endpoints.WEBHOOK_MESSAGE(webhookId, webhookToken, messageId) diff --git a/src/helpers/webhooks/deleteWebhookWithToken.ts b/src/helpers/webhooks/deleteWebhookWithToken.ts index 2a98aecd6..0591a212c 100644 --- a/src/helpers/webhooks/deleteWebhookWithToken.ts +++ b/src/helpers/webhooks/deleteWebhookWithToken.ts @@ -2,9 +2,5 @@ import type { Bot } from "../../bot.ts"; /** Delete a webhook permanently. Returns a undefined on success */ export async function deleteWebhookWithToken(bot: Bot, webhookId: bigint, webhookToken: string) { - return await bot.rest.runMethod( - bot.rest, - "delete", - bot.constants.endpoints.WEBHOOK(webhookId, webhookToken) - ); + await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.WEBHOOK(webhookId, webhookToken)); } From 9e193cae419f118b0beae40caa594aaab5dc50c9 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Sun, 5 Dec 2021 17:23:53 +0000 Subject: [PATCH 039/104] fix: bugs in guild helpers --- src/bot.ts | 9 +++++ .../channels/deleteChannelOverwrite.ts | 2 +- src/helpers/channels/editChannelOverwrite.ts | 2 +- src/helpers/guilds/editWelcomeScreen.ts | 18 +++++----- src/helpers/guilds/editWidget.ts | 4 ++- .../guilds/getAvailableVoiceRegions.ts | 10 +++++- src/helpers/guilds/getBans.ts | 11 +++++- src/helpers/guilds/getGuild.ts | 6 ++-- src/helpers/messages/unpinMessage.ts | 2 +- src/transformers/voiceRegion.ts | 26 ++++++++++++++ src/transformers/welcomeScreen.ts | 34 +++++++++++++++++++ src/transformers/widget.ts | 17 ++++++++++ 12 files changed, 122 insertions(+), 19 deletions(-) create mode 100644 src/transformers/voiceRegion.ts create mode 100644 src/transformers/welcomeScreen.ts create mode 100644 src/transformers/widget.ts diff --git a/src/bot.ts b/src/bot.ts index e5cdffeeb..93a1a55ae 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -87,6 +87,9 @@ import { DiscordenoScheduledEvent } from "./transformers/scheduledEvent.ts"; import { transformThreadMember } from "./transformers/threadMember.ts"; import { transformApplicationCommandOption } from "./transformers/applicationCommandOption.ts"; import { transformApplicationCommand } from "./transformers/applicationCommand.ts"; +import { transformWelcomeScreen } from "./transformers/welcomeScreen.ts"; +import { transformVoiceRegion } from "./transformers/voiceRegion.ts"; +import { transformWidget } from "./transformers/widget.ts"; export function createBot(options: CreateBotOptions): Bot { const bot = { @@ -476,6 +479,9 @@ export interface Transformers { applicationCommandPermission: typeof transformApplicationCommandPermission; scheduledEvent: typeof transformScheduledEvent; threadMember: typeof transformThreadMember; + welcomeScreen: typeof transformWelcomeScreen; + voiceRegion: typeof transformVoiceRegion; + widget: typeof transformWidget; } export function createTransformers(options: Partial) { @@ -506,6 +512,9 @@ export function createTransformers(options: Partial) { applicationCommandPermission: options.applicationCommandPermission || transformApplicationCommandPermission, scheduledEvent: options.scheduledEvent || transformScheduledEvent, threadMember: options.threadMember || transformThreadMember, + welcomeScreen: options.welcomeScreen || transformWelcomeScreen, + voiceRegion: options.voiceRegion || transformVoiceRegion, + widget: options.widget || transformWidget, }; } diff --git a/src/helpers/channels/deleteChannelOverwrite.ts b/src/helpers/channels/deleteChannelOverwrite.ts index 6b855f73e..fa0298d85 100644 --- a/src/helpers/channels/deleteChannelOverwrite.ts +++ b/src/helpers/channels/deleteChannelOverwrite.ts @@ -1,7 +1,7 @@ import type { Bot } from "../../bot.ts"; /** Delete the channel permission overwrites for a user or role in this channel. Requires `MANAGE_ROLES` permission. */ -export async function deleteChannelOverwrite(bot: Bot, channelId: bigint, overwriteId: bigint): Promise { +export async function deleteChannelOverwrite(bot: Bot, channelId: bigint, overwriteId: bigint) { await bot.rest.runMethod( bot.rest, "delete", diff --git a/src/helpers/channels/editChannelOverwrite.ts b/src/helpers/channels/editChannelOverwrite.ts index eec214cff..b44bdb259 100644 --- a/src/helpers/channels/editChannelOverwrite.ts +++ b/src/helpers/channels/editChannelOverwrite.ts @@ -7,7 +7,7 @@ export async function editChannelOverwrite( channelId: bigint, overwriteId: bigint, options: Omit -): Promise { +) { await bot.rest.runMethod( bot.rest, "put", diff --git a/src/helpers/guilds/editWelcomeScreen.ts b/src/helpers/guilds/editWelcomeScreen.ts index 28e6cc102..9d7601fc7 100644 --- a/src/helpers/guilds/editWelcomeScreen.ts +++ b/src/helpers/guilds/editWelcomeScreen.ts @@ -3,21 +3,21 @@ import type { WelcomeScreen } from "../../types/guilds/welcomeScreen.ts"; import type { Bot } from "../../bot.ts"; export async function editWelcomeScreen(bot: Bot, guildId: bigint, options: ModifyGuildWelcomeScreen) { - return await bot.rest.runMethod( + const result = await bot.rest.runMethod( bot.rest, "patch", bot.constants.endpoints.GUILD_WELCOME_SCREEN(guildId), { enabled: options.enabled, - welcome_screen: options.welcomeScreen?.map((welcomeScreen) => { - return { - channel_id: welcomeScreen.channelId, - description: welcomeScreen.description, - emoji_id: welcomeScreen.emojiId, - emoji_name: welcomeScreen.emojiName, - }; - }), + welcome_screen: options.welcomeScreen?.map((welcomeScreen) => ({ + channel_id: welcomeScreen.channelId, + description: welcomeScreen.description, + emoji_id: welcomeScreen.emojiId, + emoji_name: welcomeScreen.emojiName, + })), description: options.description, } ); + + return bot.transformers.welcomeScreen(bot, result); } diff --git a/src/helpers/guilds/editWidget.ts b/src/helpers/guilds/editWidget.ts index ec99f7d03..0135f2722 100644 --- a/src/helpers/guilds/editWidget.ts +++ b/src/helpers/guilds/editWidget.ts @@ -3,8 +3,10 @@ import type { Bot } from "../../bot.ts"; /** Modify a guild widget object for the guild. Requires the MANAGE_GUILD permission. */ export async function editWidget(bot: Bot, guildId: bigint, enabled: boolean, channelId?: string | null) { - return await bot.rest.runMethod(bot.rest, "patch", bot.constants.endpoints.GUILD_WIDGET(guildId), { + const result = await bot.rest.runMethod(bot.rest, "patch", bot.constants.endpoints.GUILD_WIDGET(guildId), { enabled, channel_id: channelId, }); + + return bot.transformers.widget(bot, result); } diff --git a/src/helpers/guilds/getAvailableVoiceRegions.ts b/src/helpers/guilds/getAvailableVoiceRegions.ts index 781742b02..d1541582f 100644 --- a/src/helpers/guilds/getAvailableVoiceRegions.ts +++ b/src/helpers/guilds/getAvailableVoiceRegions.ts @@ -1,7 +1,15 @@ import type { VoiceRegion } from "../../types/voice/voiceRegion.ts"; import type { Bot } from "../../bot.ts"; +import { Collection } from "../../util/collection.ts"; /** Returns an array of voice regions that can be used when creating servers. */ export async function getAvailableVoiceRegions(bot: Bot) { - return await bot.rest.runMethod(bot.rest, "get", bot.constants.endpoints.VOICE_REGIONS); + const result = await bot.rest.runMethod(bot.rest, "get", bot.constants.endpoints.VOICE_REGIONS); + + return new Collection( + result.map((region) => { + const voiceRegion = bot.transformers.voiceRegion(bot, region); + return [voiceRegion.id, voiceRegion]; + }) + ); } diff --git a/src/helpers/guilds/getBans.ts b/src/helpers/guilds/getBans.ts index 2b1b2af56..ef4dcbab9 100644 --- a/src/helpers/guilds/getBans.ts +++ b/src/helpers/guilds/getBans.ts @@ -1,10 +1,19 @@ import type { Ban } from "../../types/guilds/ban.ts"; import type { Bot } from "../../bot.ts"; import { Collection } from "../../util/collection.ts"; +import { DiscordenoUser } from "../../transformers/member.ts"; /** Returns a list of ban objects for the users banned from this guild. Requires the BAN_MEMBERS permission. */ export async function getBans(bot: Bot, guildId: bigint) { const results = await bot.rest.runMethod(bot.rest, "get", bot.constants.endpoints.GUILD_BANS(guildId)); - return new Collection(results.map((res) => [bot.transformers.snowflake(res.user.id), res])); + return new Collection( + results.map((res) => [ + bot.transformers.snowflake(res.user.id), + { + reason: res.reason ?? undefined, + user: bot.transformers.user(bot, res.user), + }, + ]) + ); } diff --git a/src/helpers/guilds/getGuild.ts b/src/helpers/guilds/getGuild.ts index bce016944..d377319f2 100644 --- a/src/helpers/guilds/getGuild.ts +++ b/src/helpers/guilds/getGuild.ts @@ -8,7 +8,7 @@ import type { Bot } from "../../bot.ts"; export async function getGuild( bot: Bot, guildId: bigint, - options: { counts?: boolean; addToCache?: boolean } = { + options: { counts?: boolean } = { counts: true, } ) { @@ -16,10 +16,8 @@ export async function getGuild( with_counts: options.counts, }); - const guild = bot.transformers.guild(bot, { + return bot.transformers.guild(bot, { guild: result, shardId: bot.utils.calculateShardId(bot.gateway, guildId), }); - - return guild; } diff --git a/src/helpers/messages/unpinMessage.ts b/src/helpers/messages/unpinMessage.ts index 960b94ce3..8e9f628c7 100644 --- a/src/helpers/messages/unpinMessage.ts +++ b/src/helpers/messages/unpinMessage.ts @@ -1,6 +1,6 @@ /** Unpin a message in a channel. Requires MANAGE_MESSAGES. */ import type { Bot } from "../../bot.ts"; -export async function unpinMessage(bot: Bot, channelId: bigint, messageId: bigint): Promise { +export async function unpinMessage(bot: Bot, channelId: bigint, messageId: bigint) { await bot.rest.runMethod(bot.rest, "delete", bot.constants.endpoints.CHANNEL_PIN(channelId, messageId)); } diff --git a/src/transformers/voiceRegion.ts b/src/transformers/voiceRegion.ts new file mode 100644 index 000000000..7424d95d7 --- /dev/null +++ b/src/transformers/voiceRegion.ts @@ -0,0 +1,26 @@ +import { Bot } from "../bot.ts"; +import { SnakeCasedPropertiesDeep } from "../types/util.ts"; +import { VoiceRegion } from "../types/voice/voiceRegion.ts"; + +export function transformVoiceRegion(bot: Bot, payload: SnakeCasedPropertiesDeep): DiscordenoVoiceRegion { + return { + id: bot.transformers.snowflake(payload.id), + name: payload.name, + optimal: payload.optimal, + deprecated: payload.deprecated, + custom: payload.custom, + }; +} + +export interface DiscordenoVoiceRegion { + /** Unique Id for the region */ + id: bigint; + /** Name of the region */ + name: string; + /** true for a single server that is closest to the current user's client */ + optimal: boolean; + /** Whether this is a deprecated voice region (avoid swithing to these) */ + deprecated: boolean; + /** Whether this is a custom voice region (used for events/etc) */ + custom: boolean; +} diff --git a/src/transformers/welcomeScreen.ts b/src/transformers/welcomeScreen.ts new file mode 100644 index 000000000..5046d1b82 --- /dev/null +++ b/src/transformers/welcomeScreen.ts @@ -0,0 +1,34 @@ +import { Bot } from "../bot.ts"; +import { SnakeCasedPropertiesDeep } from "../types/util.ts"; +import { WelcomeScreen } from "../types/guilds/welcomeScreen.ts"; + +export function transformWelcomeScreen( + bot: Bot, + payload: SnakeCasedPropertiesDeep +): DiscordenoWelcomeScreen { + return { + description: payload.description ?? undefined, + welcomeChannels: payload.welcome_channels.map((channel) => ({ + channelId: bot.transformers.snowflake(channel.channel_id), + description: channel.description, + emojiId: channel.emoji_id ? bot.transformers.snowflake(channel.emoji_id) : undefined, + emojiName: channel.emoji_name ?? undefined, + })), + }; +} + +export interface DiscordenoWelcomeScreen { + /** The server description shown in the welcome screen */ + description?: string; + /** The channels shown in the welcome screen, up to 5 */ + welcomeChannels: { + /** The channel's id */ + channelId: bigint; + /** The descriptino schown for the channel */ + description: string; + /** The emoji id, if the emoji is custom */ + emojiId?: bigint; + /** The emoji name if custom, the unicode character if standard, or `null` if no emoji is set */ + emojiName?: string; + }[]; +} diff --git a/src/transformers/widget.ts b/src/transformers/widget.ts new file mode 100644 index 000000000..d3478044d --- /dev/null +++ b/src/transformers/widget.ts @@ -0,0 +1,17 @@ +import { Bot } from "../bot.ts"; +import { GuildWidget } from "../types/guilds/guildWidget.ts"; +import { SnakeCasedPropertiesDeep } from "../types/util.ts"; + +export function transformWidget(bot: Bot, payload: SnakeCasedPropertiesDeep): DiscordenoWidget { + return { + channelId: payload.channel_id ? bot.transformers.snowflake(payload.channel_id) : undefined, + enabled: payload.enabled, + }; +} + +export interface DiscordenoWidget { + /** Whether the widget is enabled */ + enabled: boolean; + /** The widget channel id */ + channelId?: bigint; +} From 072d54b8923636f14a1e33ca17c166f80f0a04cf Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Sun, 5 Dec 2021 18:42:07 +0000 Subject: [PATCH 040/104] fix: guild helpers --- src/helpers/guilds/getGuildPreview.ts | 19 ++++++++++++++++++- src/helpers/guilds/getVanityUrl.ts | 2 +- src/helpers/guilds/getWelcomeScreen.ts | 4 +++- src/helpers/guilds/getWidget.ts | 21 ++++++++++++++++++++- src/helpers/guilds/getWidgetSettings.ts | 4 +++- 5 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/helpers/guilds/getGuildPreview.ts b/src/helpers/guilds/getGuildPreview.ts index d552d6720..90905f8b8 100644 --- a/src/helpers/guilds/getGuildPreview.ts +++ b/src/helpers/guilds/getGuildPreview.ts @@ -3,5 +3,22 @@ import type { Bot } from "../../bot.ts"; /** Returns the guild preview object for the given id. If the bot is not in the guild, then the guild must be Discoverable. */ export async function getGuildPreview(bot: Bot, guildId: bigint) { - return await bot.rest.runMethod(bot.rest, "get", bot.constants.endpoints.GUILD_PREVIEW(guildId)); + const result = await bot.rest.runMethod( + bot.rest, + "get", + bot.constants.endpoints.GUILD_PREVIEW(guildId) + ); + + return { + id: bot.transformers.snowflake(result.id), + name: result.name, + icon: result.icon ?? undefined, + splash: result.splash ?? undefined, + discoverySplash: result.discovery_splash ?? undefined, + emojis: result.emojis.map((emoji) => bot.transformers.emoji(bot, emoji)), + features: result.features, + approximateMemberCount: result.approximate_member_count, + approximatePresenceCount: result.approximate_presence_count, + description: result.description ?? undefined, + }; } diff --git a/src/helpers/guilds/getVanityUrl.ts b/src/helpers/guilds/getVanityUrl.ts index 3edba9272..643fe3bdd 100644 --- a/src/helpers/guilds/getVanityUrl.ts +++ b/src/helpers/guilds/getVanityUrl.ts @@ -2,7 +2,7 @@ import type { InviteMetadata } from "../../types/invites/inviteMetadata.ts"; import type { Bot } from "../../bot.ts"; /** Returns the code and uses of the vanity url for this server if it is enabled else `code` will be null. Requires the `MANAGE_GUILD` permission. */ -export async function getVanityURL(bot: Bot, guildId: bigint) { +export async function getVanityUrl(bot: Bot, guildId: bigint) { return await bot.rest.runMethod< | (Partial & Pick) | { diff --git a/src/helpers/guilds/getWelcomeScreen.ts b/src/helpers/guilds/getWelcomeScreen.ts index d40145d1b..06e6e0fdc 100644 --- a/src/helpers/guilds/getWelcomeScreen.ts +++ b/src/helpers/guilds/getWelcomeScreen.ts @@ -2,9 +2,11 @@ import type { WelcomeScreen } from "../../types/guilds/welcomeScreen.ts"; import type { Bot } from "../../bot.ts"; export async function getWelcomeScreen(bot: Bot, guildId: bigint) { - return await bot.rest.runMethod( + const result = await bot.rest.runMethod( bot.rest, "get", bot.constants.endpoints.GUILD_WELCOME_SCREEN(guildId) ); + + return bot.transformers.welcomeScreen(bot, result); } diff --git a/src/helpers/guilds/getWidget.ts b/src/helpers/guilds/getWidget.ts index deb1b1e34..c51cc0a58 100644 --- a/src/helpers/guilds/getWidget.ts +++ b/src/helpers/guilds/getWidget.ts @@ -3,9 +3,28 @@ import type { Bot } from "../../bot.ts"; /** Returns the widget for the guild. */ export async function getWidget(bot: Bot, guildId: bigint) { - return await bot.rest.runMethod( + const result = await bot.rest.runMethod( bot.rest, "get", `${bot.constants.endpoints.GUILD_WIDGET(guildId)}.json` ); + + return { + id: bot.transformers.snowflake(result.id), + name: result.name, + instantInvite: result.instant_invite, + channels: result.channels.map((channel) => ({ + id: bot.transformers.snowflake(channel.id), + name: channel.name, + position: channel.position, + })), + members: result.members.map((member) => ({ + id: bot.transformers.snowflake(member.id), + username: member.username, + discriminator: Number(member.discriminator), + avatar: member.avatar ? bot.utils.iconHashToBigInt(member.avatar) : undefined, + status: member.status, + })), + presenceCount: result.presence_count, + }; } diff --git a/src/helpers/guilds/getWidgetSettings.ts b/src/helpers/guilds/getWidgetSettings.ts index 4131916b1..5d6c49bf5 100644 --- a/src/helpers/guilds/getWidgetSettings.ts +++ b/src/helpers/guilds/getWidgetSettings.ts @@ -3,5 +3,7 @@ import type { Bot } from "../../bot.ts"; /** Returns the guild widget object. Requires the MANAGE_GUILD permission. */ export async function getWidgetSettings(bot: Bot, guildId: bigint) { - return await bot.rest.runMethod(bot.rest, "get", bot.constants.endpoints.GUILD_WIDGET(guildId)); + const result = await bot.rest.runMethod(bot.rest, "get", bot.constants.endpoints.GUILD_WIDGET(guildId)); + + return bot.transformers.widget(bot, result); } From 8ad8101b91e70688ae6bd9bd51726167f0b43fc5 Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Sun, 5 Dec 2021 22:38:34 +0000 Subject: [PATCH 041/104] fix: integrations --- src/helpers/integrations/getIntegrations.ts | 31 ++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/helpers/integrations/getIntegrations.ts b/src/helpers/integrations/getIntegrations.ts index fb0d2fec2..4736d3d0e 100644 --- a/src/helpers/integrations/getIntegrations.ts +++ b/src/helpers/integrations/getIntegrations.ts @@ -1,7 +1,36 @@ import type { Integration } from "../../types/integrations/integration.ts"; import type { Bot } from "../../bot.ts"; +import { Collection } from "../../util/collection.ts"; /** Returns a list of integrations for the guild. Requires the MANAGE_GUILD permission. */ export async function getIntegrations(bot: Bot, guildId: bigint) { - return await bot.rest.runMethod(bot.rest, "get", bot.constants.endpoints.GUILD_INTEGRATIONS(guildId)); + const result = await bot.rest.runMethod( + bot.rest, + "get", + bot.constants.endpoints.GUILD_INTEGRATIONS(guildId) + ); + + return new Collection( + result.map((res) => { + const integration = bot.transformers.integration(bot, { + guild_id: guildId.toString(), + id: res.id, + name: res.name, + type: res.type, + enabled: res.enabled, + syncing: res.syncing, + role_id: res.role_id, + enable_emoticons: res.enable_emoticons, + expire_behavior: res.expire_behavior, + expire_grace_period: res.expire_grace_period, + user: res.user, + account: res.account, + synced_at: res.synced_at, + subscriber_count: res.subscriber_count, + revoked: res.revoked, + application: res.application, + }); + return [integration.id, integration]; + }) + ); } From c921a09420407b801a2aabfb321a796eb4e4b62f Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Mon, 6 Dec 2021 00:39:11 +0000 Subject: [PATCH 042/104] fix: more return await fixes --- src/helpers/channels/getStageInstance.ts | 13 ++++++++++++- .../threads/startThreadWithoutMessage.ts | 16 +++++++++++++--- src/helpers/channels/updateVoiceState.ts | 4 ++-- src/helpers/discovery/addDiscoverySubcategory.ts | 2 +- src/helpers/discovery/editDiscovery.ts | 16 +++++++++++++++- src/helpers/discovery/getDiscovery.ts | 16 +++++++++++++++- src/helpers/emojis/editEmoji.ts | 9 ++++++++- src/helpers/emojis/getEmoji.ts | 8 +++++++- src/helpers/guilds/getVanityUrl.ts | 16 ++++++++++------ src/helpers/guilds/getVoiceRegions.ts | 7 ++++++- src/helpers/misc/editBotProfile.ts | 4 +++- src/helpers/misc/getUser.ts | 4 +++- src/helpers/templates/deleteGuildTemplate.ts | 2 +- 13 files changed, 96 insertions(+), 21 deletions(-) diff --git a/src/helpers/channels/getStageInstance.ts b/src/helpers/channels/getStageInstance.ts index 6cded1faa..4f9d41c92 100644 --- a/src/helpers/channels/getStageInstance.ts +++ b/src/helpers/channels/getStageInstance.ts @@ -3,5 +3,16 @@ import type { Bot } from "../../bot.ts"; /** Gets the stage instance associated with the Stage channel, if it exists. */ export async function getStageInstance(bot: Bot, channelId: bigint) { - return await bot.rest.runMethod(bot.rest, "get", bot.constants.endpoints.STAGE_INSTANCE(channelId)); + const result = await bot.rest.runMethod( + bot.rest, + "get", + bot.constants.endpoints.STAGE_INSTANCE(channelId) + ); + + return { + id: bot.transformers.snowflake(result.id), + guildId: bot.transformers.snowflake(result.guild_id), + channelId: bot.transformers.snowflake(result.channel_id), + topic: result.topic, + }; } diff --git a/src/helpers/channels/threads/startThreadWithoutMessage.ts b/src/helpers/channels/threads/startThreadWithoutMessage.ts index 8498239a0..94584f5ae 100644 --- a/src/helpers/channels/threads/startThreadWithoutMessage.ts +++ b/src/helpers/channels/threads/startThreadWithoutMessage.ts @@ -4,8 +4,18 @@ import type { Bot } from "../../../bot.ts"; /** Creates a new private thread. Returns a thread channel. */ export async function startThreadWithoutMessage(bot: Bot, channelId: bigint, options: StartThreadWithoutMessage) { - return await bot.rest.runMethod(bot.rest, "post", bot.constants.endpoints.THREAD_START_PRIVATE(channelId), { - name: options.name, - auto_archive_duration: options.autoArchiveDuration, + const result = await bot.rest.runMethod( + bot.rest, + "post", + bot.constants.endpoints.THREAD_START_PRIVATE(channelId), + { + name: options.name, + auto_archive_duration: options.autoArchiveDuration, + } + ); + + return bot.transformers.channel(bot, { + channel: result, + guildId: result.guild_id ? bot.transformers.snowflake(result.guild_id) : undefined, }); } diff --git a/src/helpers/channels/updateVoiceState.ts b/src/helpers/channels/updateVoiceState.ts index 0884111ec..55fb15f3b 100644 --- a/src/helpers/channels/updateVoiceState.ts +++ b/src/helpers/channels/updateVoiceState.ts @@ -13,7 +13,7 @@ import type { Bot } from "../../bot.ts"; * - When suppressed, the user will have their `request_to_speak_timestamp` removed. */ export async function updateBotVoiceState(bot: Bot, guildId: bigint, options: UpdateSelfVoiceState) { - return await bot.rest.runMethod(bot.rest, "patch", bot.constants.endpoints.UPDATE_VOICE_STATE(guildId), { + await bot.rest.runMethod(bot.rest, "patch", bot.constants.endpoints.UPDATE_VOICE_STATE(guildId), { channel_id: options.channelId, suppress: options.suppress, request_to_speak_timestamp: options.requestToSpeakTimestamp @@ -34,7 +34,7 @@ export async function updateBotVoiceState(bot: Bot, guildId: bigint, options: Up * - When suppressed, the user will have their `request_to_speak_timestamp` removed. */ export async function updateUserVoiceState(bot: Bot, guildId: bigint, options: UpdateOthersVoiceState) { - return await bot.rest.runMethod( + await bot.rest.runMethod( bot.rest, "patch", bot.constants.endpoints.UPDATE_VOICE_STATE(guildId, options.userId), diff --git a/src/helpers/discovery/addDiscoverySubcategory.ts b/src/helpers/discovery/addDiscoverySubcategory.ts index 226bb6b57..0107c863b 100644 --- a/src/helpers/discovery/addDiscoverySubcategory.ts +++ b/src/helpers/discovery/addDiscoverySubcategory.ts @@ -3,7 +3,7 @@ import type { Bot } from "../../bot.ts"; /** Add a discovery subcategory to the guild. Requires the `MANAGE_GUILD` permission. */ export async function addDiscoverySubcategory(bot: Bot, guildId: bigint, categoryId: number) { - return await bot.rest.runMethod( + await bot.rest.runMethod( bot.rest, "post", bot.constants.endpoints.DISCOVERY_SUBCATEGORY(guildId, categoryId) diff --git a/src/helpers/discovery/editDiscovery.ts b/src/helpers/discovery/editDiscovery.ts index 1480f29d6..f00027f24 100644 --- a/src/helpers/discovery/editDiscovery.ts +++ b/src/helpers/discovery/editDiscovery.ts @@ -4,7 +4,7 @@ import type { Bot } from "../../bot.ts"; /** Modify the discovery metadata for the guild. Requires the MANAGE_GUILD permission. Returns the updated discovery metadata object on success. */ export async function editDiscovery(bot: Bot, guildId: bigint, data: ModifyGuildDiscoveryMetadata) { - return await bot.rest.runMethod( + const result = await bot.rest.runMethod( bot.rest, "patch", bot.constants.endpoints.DISCOVERY_METADATA(guildId), @@ -14,4 +14,18 @@ export async function editDiscovery(bot: Bot, guildId: bigint, data: ModifyGuild emoji_discoverability_enabled: data.emojiDiscoverabilityEnabled, } ); + + return { + guildId, + primaryCategoryId: result.primary_category_id, + keywords: result.keywords ?? undefined, + emojiDiscoverabilityEnabled: result.emoji_discoverability_enabled, + partnerActionedTimestamp: result.partner_actioned_timestamp + ? Date.parse(result.partner_actioned_timestamp) + : undefined, + partnerApplicationTimestamp: result.partner_application_timestamp + ? Date.parse(result.partner_application_timestamp) + : undefined, + categoryIds: result.category_ids, + }; } diff --git a/src/helpers/discovery/getDiscovery.ts b/src/helpers/discovery/getDiscovery.ts index 224837df3..3bcce91db 100644 --- a/src/helpers/discovery/getDiscovery.ts +++ b/src/helpers/discovery/getDiscovery.ts @@ -3,9 +3,23 @@ import type { Bot } from "../../bot.ts"; /** Returns the discovery metadata object for the guild. Requires the `MANAGE_GUILD` permission. */ export async function getDiscovery(bot: Bot, guildId: bigint) { - return await bot.rest.runMethod( + const result = await bot.rest.runMethod( bot.rest, "get", bot.constants.endpoints.DISCOVERY_METADATA(guildId) ); + + return { + guildId, + primaryCategoryId: result.primary_category_id, + keywords: result.keywords ?? undefined, + emojiDiscoverabilityEnabled: result.emoji_discoverability_enabled, + partnerActionedTimestamp: result.partner_actioned_timestamp + ? Date.parse(result.partner_actioned_timestamp) + : undefined, + partnerApplicationTimestamp: result.partner_application_timestamp + ? Date.parse(result.partner_application_timestamp) + : undefined, + categoryIds: result.category_ids, + }; } diff --git a/src/helpers/emojis/editEmoji.ts b/src/helpers/emojis/editEmoji.ts index b08ecf300..c371ba16d 100644 --- a/src/helpers/emojis/editEmoji.ts +++ b/src/helpers/emojis/editEmoji.ts @@ -4,5 +4,12 @@ import type { Bot } from "../../bot.ts"; /** Modify the given emoji. Requires the MANAGE_EMOJIS permission. */ export async function editEmoji(bot: Bot, guildId: bigint, id: bigint, options: ModifyGuildEmoji) { - return await bot.rest.runMethod(bot.rest, "patch", bot.constants.endpoints.GUILD_EMOJI(guildId, id), options); + const result = await bot.rest.runMethod( + bot.rest, + "patch", + bot.constants.endpoints.GUILD_EMOJI(guildId, id), + options + ); + + return bot.transformers.emoji(bot, result); } diff --git a/src/helpers/emojis/getEmoji.ts b/src/helpers/emojis/getEmoji.ts index 84a897f40..17287b174 100644 --- a/src/helpers/emojis/getEmoji.ts +++ b/src/helpers/emojis/getEmoji.ts @@ -6,5 +6,11 @@ import type { Bot } from "../../bot.ts"; * Returns an emoji for the given guild and emoji Id. */ export async function getEmoji(bot: Bot, guildId: bigint, emojiId: bigint) { - return await bot.rest.runMethod(bot.rest, "get", bot.constants.endpoints.GUILD_EMOJI(guildId, emojiId)); + const result = await bot.rest.runMethod( + bot.rest, + "get", + bot.constants.endpoints.GUILD_EMOJI(guildId, emojiId) + ); + + return bot.transformers.emoji(bot, result); } diff --git a/src/helpers/guilds/getVanityUrl.ts b/src/helpers/guilds/getVanityUrl.ts index 643fe3bdd..1ee1e0b86 100644 --- a/src/helpers/guilds/getVanityUrl.ts +++ b/src/helpers/guilds/getVanityUrl.ts @@ -3,10 +3,14 @@ import type { Bot } from "../../bot.ts"; /** Returns the code and uses of the vanity url for this server if it is enabled else `code` will be null. Requires the `MANAGE_GUILD` permission. */ export async function getVanityUrl(bot: Bot, guildId: bigint) { - return await bot.rest.runMethod< - | (Partial & Pick) - | { - code: null; - } - >(bot.rest, "get", bot.constants.endpoints.GUILD_VANITY_URL(guildId)); + const result = await bot.rest.runMethod>( + bot.rest, + "get", + bot.constants.endpoints.GUILD_VANITY_URL(guildId) + ); + + return { + uses: result.uses, + code: result.code, + }; } diff --git a/src/helpers/guilds/getVoiceRegions.ts b/src/helpers/guilds/getVoiceRegions.ts index 53b090266..36f016665 100644 --- a/src/helpers/guilds/getVoiceRegions.ts +++ b/src/helpers/guilds/getVoiceRegions.ts @@ -10,5 +10,10 @@ export async function getVoiceRegions(bot: Bot, guildId: bigint) { bot.constants.endpoints.GUILD_REGIONS(guildId) ); - return new Collection(result.map((region) => [region.id, region])); + return new Collection( + result.map((reg) => { + const region = bot.transformers.voiceRegion(bot, reg); + return [region.id, region]; + }) + ); } diff --git a/src/helpers/misc/editBotProfile.ts b/src/helpers/misc/editBotProfile.ts index 8e26d42a7..eb55b1a2e 100644 --- a/src/helpers/misc/editBotProfile.ts +++ b/src/helpers/misc/editBotProfile.ts @@ -26,8 +26,10 @@ export async function editBotProfile(bot: Bot, options: { username?: string; bot const avatar = options?.botAvatarURL ? await bot.utils.urlToBase64(options?.botAvatarURL) : options?.botAvatarURL; - return await bot.rest.runMethod(bot.rest, "patch", bot.constants.endpoints.USER_BOT, { + const result = await bot.rest.runMethod(bot.rest, "patch", bot.constants.endpoints.USER_BOT, { username: options.username?.trim(), avatar, }); + + return bot.transformers.user(bot, result); } diff --git a/src/helpers/misc/getUser.ts b/src/helpers/misc/getUser.ts index 8b6a170c6..c56638fc0 100644 --- a/src/helpers/misc/getUser.ts +++ b/src/helpers/misc/getUser.ts @@ -4,5 +4,7 @@ import { SnakeCasedPropertiesDeep } from "../../types/util.ts"; /** This function will return the raw user payload in the rare cases you need to fetch a user directly from the API. */ export async function getUser(bot: Bot, userId: bigint) { - return await bot.rest.runMethod(bot.rest, "get", bot.constants.endpoints.USER(userId)); + const result = await bot.rest.runMethod(bot.rest, "get", bot.constants.endpoints.USER(userId)); + + return bot.transformers.user(bot, result); } diff --git a/src/helpers/templates/deleteGuildTemplate.ts b/src/helpers/templates/deleteGuildTemplate.ts index 720b34c27..ac297ecee 100644 --- a/src/helpers/templates/deleteGuildTemplate.ts +++ b/src/helpers/templates/deleteGuildTemplate.ts @@ -6,7 +6,7 @@ import type { Bot } from "../../bot.ts"; * Requires the `MANAGE_GUILD` permission. */ export async function deleteGuildTemplate(bot: Bot, guildId: bigint, templateCode: string) { - return await bot.rest.runMethod