From 2c58d6d28d0e5a120f1c682258b187721258ba7e Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Mon, 3 May 2021 22:56:32 +0200 Subject: [PATCH 01/29] remove guild member being cached in parent object --- src/structures/member.ts | 32 ++------------------------------ 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/src/structures/member.ts b/src/structures/member.ts index a250cb15f..093b9b9d4 100644 --- a/src/structures/member.ts +++ b/src/structures/member.ts @@ -23,7 +23,6 @@ import { createNewProp } from "../util/utils.ts"; import { DiscordenoGuild } from "./guild.ts"; const MEMBER_SNOWFLAKES = [ - "roles", "id", "discriminator", ]; @@ -87,29 +86,10 @@ export async function createDiscordenoMember( user, joinedAt, premiumSince, - ...rest } = data; const props: Record> = {}; - for (const [key, value] of Object.entries(rest)) { - eventHandlers.debug?.( - "loop", - `Running for of loop for Object.keys(rest) in DiscordenoMember function.`, - ); - - if (key === "roles") { - props[key] = value.map((id: string) => snowflakeToBigint(id)); - continue; - } - - props[key] = createNewProp( - MEMBER_SNOWFLAKES.includes(key) - ? value ? snowflakeToBigint(value) : undefined - : value, - ); - } - for (const [key, value] of Object.entries(user)) { eventHandlers.debug?.( "loop", @@ -142,29 +122,21 @@ export async function createDiscordenoMember( // User was never cached before member.guilds.set(guildId, { - nick: rest.nick, - roles: rest.roles.map((id) => snowflakeToBigint(id)), + ...data, + roles: data.roles.map((id) => snowflakeToBigint(id)), joinedAt: Date.parse(joinedAt), premiumSince: premiumSince ? Date.parse(premiumSince) : undefined, - deaf: rest.deaf, - mute: rest.mute, }); return member; } export interface DiscordenoMember extends - Omit< - GuildMember, - "roles" - >, Omit< User, | "discriminator" | "id" > { - /** Array of role object ids */ - roles: bigint[]; /** The user's id */ id: bigint; /** The user's 4-digit discord-tag */ From 6c80e1c47ebf3cd8d7d7d522cdbb1825367e5a76 Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Mon, 3 May 2021 22:57:11 +0200 Subject: [PATCH 02/29] fmt stuff --- src/structures/message.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/structures/message.ts b/src/structures/message.ts index 47a798594..bc0d23d42 100644 --- a/src/structures/message.ts +++ b/src/structures/message.ts @@ -231,7 +231,9 @@ export interface DiscordenoMessage extends isBot: boolean; /** The username#discrimnator for the user who sent this message */ tag: string; + // For better user experience + /** Id of the guild which the massage has been send in. "0n" if it a DM */ guildId: bigint; /** id of the channel the message was sent in */ @@ -252,6 +254,7 @@ export interface DiscordenoMessage extends timestamp: number; /** When this message was edited (or undefined if never) */ editedTimestamp?: number; + // GETTERS /** The channel where this message was sent. Can be undefined if uncached. */ From 6d0b0cb974824fc2b97975e29377aa2b2d699b05 Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Mon, 3 May 2021 22:58:06 +0200 Subject: [PATCH 03/29] now sendWebhook --- src/helpers/mod.ts | 6 +++--- .../webhooks/{execute_webhook.ts => send_webhook.ts} | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) rename src/helpers/webhooks/{execute_webhook.ts => send_webhook.ts} (95%) diff --git a/src/helpers/mod.ts b/src/helpers/mod.ts index 44bb6a467..b4ed6c9f1 100644 --- a/src/helpers/mod.ts +++ b/src/helpers/mod.ts @@ -118,7 +118,7 @@ import { deleteWebhookWithToken } from "./webhooks/delete_webhook_with_token.ts" import { editWebhook } from "./webhooks/edit_webhook.ts"; import { editWebhookMessage } from "./webhooks/edit_webhook_message.ts"; import { editWebhookWithToken } from "./webhooks/edit_webhook_with_token.ts"; -import { executeWebhook } from "./webhooks/execute_webhook.ts"; +import { sendWebhook } from "./webhooks/send_webhook.ts"; import { getWebhook } from "./webhooks/get_webhook.ts"; import { getWebhooks } from "./webhooks/get_webhooks.ts"; import { getWebhookWithToken } from "./webhooks/get_webhook_with_token.ts"; @@ -181,7 +181,7 @@ export { editWelcomeScreen, editWidget, emojiURL, - executeWebhook, + sendWebhook, fetchMembers, followChannel, getAuditLogs, @@ -392,7 +392,7 @@ export let helpers = { editWebhookMessage, editWebhookWithToken, editWebhook, - executeWebhook, + sendWebhook, getWebhookWithToken, getWebhook, getWebhooks, diff --git a/src/helpers/webhooks/execute_webhook.ts b/src/helpers/webhooks/send_webhook.ts similarity index 95% rename from src/helpers/webhooks/execute_webhook.ts rename to src/helpers/webhooks/send_webhook.ts index 2a03e3ebb..e53f86e74 100644 --- a/src/helpers/webhooks/execute_webhook.ts +++ b/src/helpers/webhooks/send_webhook.ts @@ -6,8 +6,8 @@ import { Errors } from "../../types/misc/errors.ts"; import { ExecuteWebhook } from "../../types/webhooks/execute_webhook.ts"; import { endpoints } from "../../util/constants.ts"; -/** Execute a webhook with webhook Id and webhook token */ -export async function executeWebhook( +/** Send a webhook with webhook Id and webhook token */ +export async function sendWebhook( webhookId: bigint, webhookToken: string, options: ExecuteWebhook, @@ -75,7 +75,6 @@ export async function executeWebhook( avatar_url: options.avatarUrl, }, ); - // TODO: not sure if (!options.wait) return; return structures.createDiscordenoMessage(result); From 889d03066addb2ab5fabac4f04860121791a9640 Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Mon, 3 May 2021 22:58:11 +0200 Subject: [PATCH 04/29] Update create_role.ts --- src/helpers/roles/create_role.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/helpers/roles/create_role.ts b/src/helpers/roles/create_role.ts index 363809489..2b53d295e 100644 --- a/src/helpers/roles/create_role.ts +++ b/src/helpers/roles/create_role.ts @@ -31,9 +31,13 @@ export async function createRole( role: result, guildId, }); - const guild = await cacheHandlers.get("guilds", guildId); - guild?.roles.set(role.id, role); - // TODO: ADD TO CACHE? + const guild = await cacheHandlers.get("guilds", guildId); + if (guild) { + guild.roles.set(role.id, role); + + await cacheHandlers.set("guilds", guildId, guild); + } + return role; } From 61c61dabdb6be2f094e4918a03bae425f6941c4e Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Mon, 3 May 2021 22:58:15 +0200 Subject: [PATCH 05/29] Update get_roles.ts --- src/helpers/roles/get_roles.ts | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/helpers/roles/get_roles.ts b/src/helpers/roles/get_roles.ts index b65dbf882..a94a7fa84 100644 --- a/src/helpers/roles/get_roles.ts +++ b/src/helpers/roles/get_roles.ts @@ -1,5 +1,8 @@ +import { cacheHandlers } from "../../cache.ts"; import { rest } from "../../rest/rest.ts"; +import { structures } from "../../structures/mod.ts"; import { Role } from "../../types/permissions/role.ts"; +import { snowflakeToBigint } from "../../util/bigint.ts"; import { Collection } from "../../util/collection.ts"; import { endpoints } from "../../util/constants.ts"; import { requireBotGuildPermissions } from "../../util/permissions.ts"; @@ -8,7 +11,7 @@ import { requireBotGuildPermissions } from "../../util/permissions.ts"; * * ⚠️ **If you need this, you are probably doing something wrong. This is not intended for use. Your roles will be cached in your guild.** */ -export async function getRoles(guildId: bigint) { +export async function getRoles(guildId: bigint, addToCache = true) { await requireBotGuildPermissions(guildId, ["MANAGE_ROLES"]); const result = await rest.runMethod( @@ -16,9 +19,23 @@ export async function getRoles(guildId: bigint) { endpoints.GUILD_ROLES(guildId), ); - // TODO: addToCache - - return new Collection( - result.map((role) => [role.id, role]), + const roleStructures = await Promise.all( + result.map(async (role) => + await structures.createDiscordenoRole({ role, guildId }) + ), ); + + const roles = new Collection( + roleStructures.map((role) => [role.id, role]), + ); + + if (addToCache) { + const guild = await cacheHandlers.get("guilds", guildId); + if (guild) { + guild.roles = roles; + await cacheHandlers.set("guilds", guild.id, guild); + } + } + + return roleStructures; } From 3ef1f9fa8fce124b4d890fe0ddc87e0cb959eba8 Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Mon, 3 May 2021 22:58:17 +0200 Subject: [PATCH 06/29] Update create_guild_from_template.ts --- .../templates/create_guild_from_template.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/helpers/templates/create_guild_from_template.ts b/src/helpers/templates/create_guild_from_template.ts index 770f71299..6bbd3795e 100644 --- a/src/helpers/templates/create_guild_from_template.ts +++ b/src/helpers/templates/create_guild_from_template.ts @@ -1,9 +1,11 @@ import { cacheHandlers } from "../../cache.ts"; import { rest } from "../../rest/rest.ts"; +import { structures } from "../../structures/mod.ts"; import { Guild } from "../../types/guilds/guild.ts"; import { CreateGuildFromTemplate } from "../../types/templates/create_guild_from_template.ts"; import { endpoints } from "../../util/constants.ts"; import { urlToBase64 } from "../../util/utils.ts"; +import { ws } from "../../ws/ws.ts"; /** * Create a new guild based on a template @@ -23,11 +25,17 @@ export async function createGuildFromTemplate( data.icon = await urlToBase64(data.icon); } - // TODO: discordeno guild? - - return await rest.runMethod( + const createdGuild = await rest.runMethod( "post", endpoints.GUILD_TEMPLATE(templateCode), data, ); + + return await structures.createDiscordenoGuild( + createdGuild, + Number( + (BigInt(createdGuild.id) >> 22n % BigInt(ws.botGatewayData.shards)) + .toString(), + ), + ); } From d3bd06e297d8a73ba3c8cea94c0b38d4ea81ee5f Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Mon, 3 May 2021 22:58:21 +0200 Subject: [PATCH 07/29] Update modify_channel.ts --- src/types/channels/modify_channel.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/types/channels/modify_channel.ts b/src/types/channels/modify_channel.ts index b6defe24b..09db31d89 100644 --- a/src/types/channels/modify_channel.ts +++ b/src/types/channels/modify_channel.ts @@ -35,7 +35,6 @@ export interface DiscordModifyChannel extends SnakeCasedPropertiesDeep< Omit > { + // deno-lint-ignore camelcase permission_overwrites?: DiscordOverwrite[]; } - -//TODO: check this From 5d755dfedb083598311de1dc95aa9262e684c289 Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Mon, 3 May 2021 22:58:23 +0200 Subject: [PATCH 08/29] Update create_guild_channel.ts --- src/types/guilds/create_guild_channel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/guilds/create_guild_channel.ts b/src/types/guilds/create_guild_channel.ts index d6fe506d0..38eb79102 100644 --- a/src/types/guilds/create_guild_channel.ts +++ b/src/types/guilds/create_guild_channel.ts @@ -30,6 +30,6 @@ export interface DiscordCreateGuildChannel extends SnakeCasedPropertiesDeep< Omit > { + // deno-lint-ignore camelcase permission_overwrites: DiscordOverwrite[]; } -// TODO: check this From 31318f6dee3e749c24ecc8bf5a09618b0acb9b2a Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Mon, 3 May 2021 22:58:24 +0200 Subject: [PATCH 09/29] Update create_guild_role.ts --- src/types/guilds/create_guild_role.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/types/guilds/create_guild_role.ts b/src/types/guilds/create_guild_role.ts index 2183a0f7d..d1be99b30 100644 --- a/src/types/guilds/create_guild_role.ts +++ b/src/types/guilds/create_guild_role.ts @@ -18,4 +18,3 @@ export interface DiscordCreateGuildRole extends Omit { permissions?: string; } -// TODO: check this From 8ee9a7cdecd16ff6435620dff3c3c796d699eec9 Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Mon, 3 May 2021 22:58:27 +0200 Subject: [PATCH 10/29] Update guild.ts --- src/types/guilds/guild.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/guilds/guild.ts b/src/types/guilds/guild.ts index bcaa3dc9f..1f7ea91fe 100644 --- a/src/types/guilds/guild.ts +++ b/src/types/guilds/guild.ts @@ -105,7 +105,7 @@ export interface Guild { approximateMemberCount?: number; /** Approximate number of non-offline members in this guild, returned from the GET /guilds/ endpoint when with_counts is true */ approximatePresenceCount?: number; - /** The welcome screen of a Community guild, shown to new members, returned when in the invite object */ + /** The welcome screen of a Community guild, shown to new members, returned in an Invite's guild object */ welcomeScreen?: WelcomeScreen; /** `true` if this guild is designated as NSFW */ nsfw: boolean; From 8f05a60fc46fe587c5bad4b037d631617d3f4626 Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Mon, 3 May 2021 22:58:30 +0200 Subject: [PATCH 11/29] Update modify_guild_channel_position.ts --- src/types/guilds/modify_guild_channel_position.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/types/guilds/modify_guild_channel_position.ts b/src/types/guilds/modify_guild_channel_position.ts index 646cce814..734786e9c 100644 --- a/src/types/guilds/modify_guild_channel_position.ts +++ b/src/types/guilds/modify_guild_channel_position.ts @@ -1,4 +1,3 @@ -// TODO: most likely it is but check if lockPositions and parentId really are optional /** https://discord.com/developers/docs/resources/guild#modify-guild-channel-positions */ export interface ModifyGuildChannelPositions { /** Channel id */ From b638f9bee8967c0fb513ca561c2eef9e95a666fd Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Mon, 3 May 2021 22:58:32 +0200 Subject: [PATCH 12/29] Update modify_guild_role.ts --- src/types/guilds/modify_guild_role.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/types/guilds/modify_guild_role.ts b/src/types/guilds/modify_guild_role.ts index cb5e09006..a23d92329 100644 --- a/src/types/guilds/modify_guild_role.ts +++ b/src/types/guilds/modify_guild_role.ts @@ -18,5 +18,3 @@ export interface DiscordModifyGuildRole extends Omit { permissions?: string | null; } - -// TODO: check this From 02fe69a48d2fb28298f3d45b254765fa56f0aac2 Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Mon, 3 May 2021 22:58:34 +0200 Subject: [PATCH 13/29] Update create_message.ts --- src/types/messages/create_message.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/types/messages/create_message.ts b/src/types/messages/create_message.ts index 836b0040c..fa1704f90 100644 --- a/src/types/messages/create_message.ts +++ b/src/types/messages/create_message.ts @@ -28,5 +28,3 @@ export interface CreateMessage { export type DiscordCreateMessage = SnakeCasedPropertiesDeep< Omit >; - -// TODO: check this From 70e64bb16d261a3d0f6bcf4a526ef28d19c6f956 Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Mon, 3 May 2021 22:58:38 +0200 Subject: [PATCH 14/29] Update application_flags.ts --- src/types/oauth2/application_flags.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/types/oauth2/application_flags.ts b/src/types/oauth2/application_flags.ts index 5fe9538f2..d2ada528b 100644 --- a/src/types/oauth2/application_flags.ts +++ b/src/types/oauth2/application_flags.ts @@ -1,5 +1,4 @@ -// https://github.com/discord/discord-api-docs/pull/2624 -// TODO: add documentation link +/** https://discord.com/developers/docs/topics/oauth2#application-application-flags */ export enum DiscordApplicationFlags { GatewayPresence = 1 << 12, GatewayPresenceLimited = 1 << 13, From b24853e5b734870f0884e3c9dc895bdaeeb8db42 Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Mon, 3 May 2021 22:58:41 +0200 Subject: [PATCH 15/29] Update execute_webhook.ts --- src/types/webhooks/execute_webhook.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/types/webhooks/execute_webhook.ts b/src/types/webhooks/execute_webhook.ts index f668a0906..9268f21bf 100644 --- a/src/types/webhooks/execute_webhook.ts +++ b/src/types/webhooks/execute_webhook.ts @@ -26,4 +26,3 @@ export interface ExecuteWebhook { export type DiscordExecuteWebhook = SnakeCasedPropertiesDeep< Omit >; -//TODO: check this From 2ffec5b09fcfbc4400820ff1a052b85f1c74ad0d Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Mon, 3 May 2021 22:58:43 +0200 Subject: [PATCH 16/29] Update channel_overwrite_has_permission.ts --- tests/channels/channel_overwrite_has_permission.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/channels/channel_overwrite_has_permission.ts b/tests/channels/channel_overwrite_has_permission.ts index 239f81886..2eaa988c7 100644 --- a/tests/channels/channel_overwrite_has_permission.ts +++ b/tests/channels/channel_overwrite_has_permission.ts @@ -10,8 +10,7 @@ import { assertEquals, assertExists } from "../deps.ts"; import { delayUntil } from "../util/delay_until.ts"; import { defaultTestOptions, tempData } from "../ws/start_bot.ts"; -// TODO: whats save? -async function ifItFailsBlameWolf(options: CreateGuildChannel, _save = false) { +async function ifItFailsBlameWolf(options: CreateGuildChannel) { const channel = await createChannel(tempData.guildId, options); // Assertions @@ -60,7 +59,6 @@ Deno.test({ }, ], }, - true, ); }, ...defaultTestOptions, From bb03468d56a568b48b543fcf0b767818abb75b47 Mon Sep 17 00:00:00 2001 From: itohatweb Date: Mon, 3 May 2021 20:59:18 +0000 Subject: [PATCH 17/29] Commit from GitHub Actions (Lint) --- src/helpers/mod.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers/mod.ts b/src/helpers/mod.ts index b4ed6c9f1..6d0aea748 100644 --- a/src/helpers/mod.ts +++ b/src/helpers/mod.ts @@ -181,7 +181,6 @@ export { editWelcomeScreen, editWidget, emojiURL, - sendWebhook, fetchMembers, followChannel, getAuditLogs, @@ -247,6 +246,7 @@ export { sendDirectMessage, sendInteractionResponse, sendMessage, + sendWebhook, startTyping, swapChannels, syncGuildTemplate, From 6adf0b5359a8013f813e75698401ef4abee0a1e6 Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Mon, 3 May 2021 22:59:56 +0200 Subject: [PATCH 18/29] i guess remove --- tests/channels/edit_channel_overwrite.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/channels/edit_channel_overwrite.ts b/tests/channels/edit_channel_overwrite.ts index 64dbcb787..c26dcff6a 100644 --- a/tests/channels/edit_channel_overwrite.ts +++ b/tests/channels/edit_channel_overwrite.ts @@ -11,8 +11,7 @@ import { assertEquals, assertExists } from "../deps.ts"; import { delayUntil } from "../util/delay_until.ts"; import { defaultTestOptions, tempData } from "../ws/start_bot.ts"; -// TODO: whats save -async function ifItFailsBlameWolf(options: CreateGuildChannel, _save = false) { +async function ifItFailsBlameWolf(options: CreateGuildChannel) { const channel = await createChannel(tempData.guildId, options); // Assertions @@ -78,7 +77,6 @@ Deno.test({ }, ], }, - true, ); }, ...defaultTestOptions, From 0e4c3481b2759c08de984ae2b98a37cce19d793e Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Mon, 3 May 2021 23:00:39 +0200 Subject: [PATCH 19/29] all are false anyways --- tests/channels/clone_channel.ts | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/tests/channels/clone_channel.ts b/tests/channels/clone_channel.ts index df772deb5..168c60b86 100644 --- a/tests/channels/clone_channel.ts +++ b/tests/channels/clone_channel.ts @@ -10,8 +10,7 @@ import { assertEquals, assertExists } from "../deps.ts"; import { delayUntil } from "../util/delay_until.ts"; import { defaultTestOptions, tempData } from "../ws/start_bot.ts"; -// TODO: whats save -async function ifItFailsBlameWolf(options: CreateGuildChannel, _save = false) { +async function ifItFailsBlameWolf(options: CreateGuildChannel) { const channel = await createChannel(tempData.guildId, options); const cloned = await cloneChannel(channel.id); @@ -51,7 +50,7 @@ async function ifItFailsBlameWolf(options: CreateGuildChannel, _save = false) { Deno.test({ name: "[channel] clone a new text channel", async fn() { - await ifItFailsBlameWolf({ name: "Discordeno-clone-test" }, false); + await ifItFailsBlameWolf({ name: "Discordeno-clone-test" }); }, ...defaultTestOptions, }); @@ -64,7 +63,6 @@ Deno.test({ name: "Discordeno-clone-test", type: DiscordChannelTypes.GUILD_CATEGORY, }, - false, ); }, ...defaultTestOptions, @@ -78,7 +76,6 @@ Deno.test({ name: "Discordeno-clone-test", type: DiscordChannelTypes.GUILD_VOICE, }, - false, ); }, ...defaultTestOptions, @@ -93,7 +90,6 @@ Deno.test({ type: DiscordChannelTypes.GUILD_VOICE, bitrate: 32000, }, - false, ); }, ...defaultTestOptions, @@ -108,7 +104,6 @@ Deno.test({ type: DiscordChannelTypes.GUILD_VOICE, userLimit: 32, }, - false, ); }, ...defaultTestOptions, @@ -122,7 +117,6 @@ Deno.test({ name: "Discordeno-clone-test", rateLimitPerUser: 2423, }, - false, ); }, ...defaultTestOptions, @@ -133,7 +127,6 @@ Deno.test({ async fn() { await ifItFailsBlameWolf( { name: "Discordeno-clone-test", nsfw: true }, - false, ); }, ...defaultTestOptions, @@ -154,7 +147,6 @@ Deno.test({ }, ], }, - false, ); }, ...defaultTestOptions, From c7fdf8e287599b192e6648ef2a11adacaeb44c21 Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Tue, 4 May 2021 10:44:50 +0200 Subject: [PATCH 20/29] remove unused import --- src/helpers/roles/get_roles.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/helpers/roles/get_roles.ts b/src/helpers/roles/get_roles.ts index a94a7fa84..c2b3f6aaf 100644 --- a/src/helpers/roles/get_roles.ts +++ b/src/helpers/roles/get_roles.ts @@ -2,7 +2,6 @@ import { cacheHandlers } from "../../cache.ts"; import { rest } from "../../rest/rest.ts"; import { structures } from "../../structures/mod.ts"; import { Role } from "../../types/permissions/role.ts"; -import { snowflakeToBigint } from "../../util/bigint.ts"; import { Collection } from "../../util/collection.ts"; import { endpoints } from "../../util/constants.ts"; import { requireBotGuildPermissions } from "../../util/permissions.ts"; From 8072122b851f76631e1e47eb3181ce6453a899d1 Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Tue, 4 May 2021 11:23:15 +0200 Subject: [PATCH 21/29] fix: toggleBits value can be false --- src/structures/voice_state.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/structures/voice_state.ts b/src/structures/voice_state.ts index c5c846562..002ec81da 100644 --- a/src/structures/voice_state.ts +++ b/src/structures/voice_state.ts @@ -82,7 +82,7 @@ export async function createDiscordenoVoiceState( const toggleBits = voiceStateToggles[key as keyof typeof voiceStateToggles]; if (toggleBits) { - bitfield |= toggleBits; + bitfield |= value ? toggleBits : 0n; continue; } From 81435535f8ca9735e74b37cf18f4a88c25b309cf Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Tue, 4 May 2021 11:30:59 +0200 Subject: [PATCH 22/29] add: bitfield --- src/structures/guild.ts | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/structures/guild.ts b/src/structures/guild.ts index 87f6dccc1..96f8a8b06 100644 --- a/src/structures/guild.ts +++ b/src/structures/guild.ts @@ -47,6 +47,19 @@ const GUILD_SNOWFLAKES = [ "publicUpdatesChannelId", ]; +export const guildToggles = { + /** Whether this user is owner of this guild */ + owner: 1n, + /** Whether the guild widget is enabled */ + widgetEnabled: 2n, + /** Whether this is a large guild */ + large: 4n, + /** Whether this guild is unavailable due to an outage */ + unavailable: 8n, + /** Whether this server is an nsfw guild */ + nsfw: 16n, +}; + const baseGuild: Partial = { get members() { return cache.members.filter((member) => member.guilds.has(this.id!)); @@ -120,6 +133,21 @@ const baseGuild: Partial = { leave() { return leaveGuild(this.id!); }, + get isOwner() { + return Boolean(this.bitfield! & guildToggles.owner); + }, + get widgetEnabled() { + return Boolean(this.bitfield! & guildToggles.widgetEnabled); + }, + get large() { + return Boolean(this.bitfield! & guildToggles.large); + }, + get unavailable() { + return Boolean(this.bitfield! & guildToggles.unavailable); + }, + get nsfw() { + return Boolean(this.bitfield! & guildToggles.nsfw); + }, }; export async function createDiscordenoGuild( @@ -137,6 +165,7 @@ export async function createDiscordenoGuild( ...rest } = data; + let bitfield = 0n; const guildId = snowflakeToBigint(rest.id); const roles = await Promise.all( @@ -172,6 +201,12 @@ export async function createDiscordenoGuild( `Running for of loop in createDiscordenoGuild function.`, ); + const toggleBits = guildToggles[key as keyof typeof guildToggles]; + if (toggleBits) { + bitfield |= value ? toggleBits : 0n; + continue; + } + props[key] = createNewProp( GUILD_SNOWFLAKES.includes(key) ? value ? snowflakeToBigint(value) : undefined @@ -278,6 +313,10 @@ export interface DiscordenoGuild extends voiceStates: Collection; /** Custom guild emojis */ emojis: Collection; + /** Whether the bot is the owner of this guild */ + isOwner: boolean; + /** Holds all the boolean toggles. */ + bitfield: bigint; // GETTERS /** Members in this guild. */ From cceee6bc5b6f621226c70ac50d2a1f04601ca389 Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Tue, 4 May 2021 12:05:11 +0200 Subject: [PATCH 23/29] add: member bitfield --- src/structures/member.ts | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/structures/member.ts b/src/structures/member.ts index 093b9b9d4..6f28ca7b0 100644 --- a/src/structures/member.ts +++ b/src/structures/member.ts @@ -27,6 +27,17 @@ const MEMBER_SNOWFLAKES = [ "discriminator", ]; +export const memberToggles = { + /** Whether the user belongs to an OAuth2 application */ + bot: 1n, + /** Whether the user is an Official Discord System user (part of the urgent message system) */ + system: 2n, + /** Whether the user has two factor enabled on their account */ + mfaEnabled: 4n, + /** Whether the email on this account has been verified */ + verified: 8n, +}; + const baseMember: Partial = { get avatarURL() { return avatarURL(this.id!, this.discriminator!, this.avatar!); @@ -75,6 +86,18 @@ const baseMember: Partial = { removeRole(guildId, roleId, reason) { return removeRole(guildId, this.id!, roleId, reason); }, + get bot() { + return Boolean(this.bitfield! & memberToggles.bot); + }, + get system() { + return Boolean(this.bitfield! & memberToggles.system) + }, + get mfaEnabled() { + return Boolean(this.bitfield! & memberToggles.mfaEnabled) + }, + get verified() { + return Boolean(this.bitfield! & memberToggles.verified) + } }; export async function createDiscordenoMember( @@ -88,6 +111,7 @@ export async function createDiscordenoMember( premiumSince, } = data; + let bitfield = 0n; const props: Record> = {}; for (const [key, value] of Object.entries(user)) { @@ -96,6 +120,12 @@ export async function createDiscordenoMember( `Running for of for Object.keys(user) loop in DiscordenoMember function.`, ); + const toggleBits = memberToggles[key as keyof typeof memberToggles]; + if (toggleBits) { + bitfield |= value ? toggleBits : 0n; + continue; + } + props[key] = createNewProp( MEMBER_SNOWFLAKES.includes(key) ? value ? snowflakeToBigint(value) : undefined @@ -150,6 +180,8 @@ export interface DiscordenoMember extends roles: bigint[]; } >; + /** Holds all the boolean toggles. */ + bitfield: bigint; // GETTERS /** The avatar url using the default format and size. */ From e63e6319a8d6617593c19727916505e92e7c3719 Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Tue, 4 May 2021 12:05:17 +0200 Subject: [PATCH 24/29] add: message bitfield --- src/structures/message.ts | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/structures/message.ts b/src/structures/message.ts index bc0d23d42..3902398c7 100644 --- a/src/structures/message.ts +++ b/src/structures/message.ts @@ -29,6 +29,15 @@ const MESSAGE_SNOWFLAKES = [ "webhookId", ]; +const messageToggles = { + /** Whether this was a TTS message */ + tts: 1n, + /** Whether this message mentions everyone */ + mentionEveryone: 2n, + /** Whether this message is pinned */ + pinned: 4n, +}; + const baseMessage: Partial = { get channel() { if (this.guildId) return cache.channels.get(this.channelId!); @@ -132,6 +141,15 @@ const baseMessage: Partial = { removeReaction(reaction, userId) { return removeReaction(this.channelId!, this.id!, reaction, { userId }); }, + get tts() { + return Boolean(this.bitfield! & messageToggles.tts); + }, + get mentionEveryone() { + return Boolean(this.bitfield! & messageToggles.mentionEveryone); + }, + get pinned() { + return Boolean(this.bitfield! & messageToggles.pinned); + }, }; export async function createDiscordenoMessage(data: Message) { @@ -146,6 +164,8 @@ export async function createDiscordenoMessage(data: Message) { ...rest } = data; + let bitfield = 0n; + const props: Record> = {}; for (const [key, value] of Object.entries(rest)) { eventHandlers.debug?.( @@ -153,6 +173,12 @@ export async function createDiscordenoMessage(data: Message) { `Running for of loop in createDiscordenoMessage function.`, ); + const toggleBits = messageToggles[key as keyof typeof messageToggles]; + if (toggleBits) { + bitfield |= value ? toggleBits : 0n; + continue; + } + props[key] = createNewProp( MESSAGE_SNOWFLAKES.includes(key) ? value ? snowflakeToBigint(value) : undefined @@ -231,6 +257,8 @@ export interface DiscordenoMessage extends isBot: boolean; /** The username#discrimnator for the user who sent this message */ tag: string; + /** Holds all the boolean toggles. */ + bitfield: bigint; // For better user experience From d8f9e28fb02b25bcb67f5ad3f2035c580cb6e83e Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Tue, 4 May 2021 12:05:24 +0200 Subject: [PATCH 25/29] add: role bitfield --- src/structures/role.ts | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/structures/role.ts b/src/structures/role.ts index 783c20ce2..7a0c15a7c 100644 --- a/src/structures/role.ts +++ b/src/structures/role.ts @@ -19,6 +19,17 @@ const ROLE_SNOWFLAKES = [ "guildId", ]; +const roleToggles = { + /** If this role is showed seperately in the user listing */ + hoist: 1n, + /** Whether this role is managed by an integration */ + managed: 2n, + /** Whether this role is mentionable */ + mentionable: 4n, + /** If this role is the nitro boost role. */ + isNitroBoostRole: 8n, +}; + const baseRole: Partial = { get guild() { return cache.guilds.get(this.guildId!); @@ -71,6 +82,18 @@ const baseRole: Partial = { memberHighestRole.position, ); }, + get hoist() { + return Boolean(this.bitfield! & roleToggles.hoist); + }, + get managed() { + return Boolean(this.bitfield! & roleToggles.managed); + }, + get mentionable() { + return Boolean(this.bitfield! & roleToggles.mentionable); + }, + get isNitroBoostRole() { + return Boolean(this.bitfield! & roleToggles.isNitroBoostRole); + }, }; // deno-lint-ignore require-await @@ -84,6 +107,8 @@ export async function createDiscordenoRole( ...rest } = ({ guildId: data.guildId, ...data.role }); + let bitfield = 0n; + const props: Record> = {}; for (const [key, value] of Object.entries(rest)) { eventHandlers.debug?.( @@ -91,6 +116,12 @@ export async function createDiscordenoRole( `Running for of loop in createDiscordenoRole function.`, ); + const toggleBits = roleToggles[key as keyof typeof roleToggles]; + if (toggleBits) { + bitfield |= value ? toggleBits : 0n; + continue; + } + props[key] = createNewProp( ROLE_SNOWFLAKES.includes(key) ? value ? snowflakeToBigint(value) : undefined @@ -123,6 +154,8 @@ export interface DiscordenoRole extends Omit { integrationId: bigint; /** The roles guildId */ guildId: bigint; + /** Holds all the boolean toggles. */ + bitfield: bigint; // GETTERS From f9da3d03bfb50291490f165e7ef9a2a10a992ebd Mon Sep 17 00:00:00 2001 From: itohatweb Date: Tue, 4 May 2021 10:05:47 +0000 Subject: [PATCH 26/29] Commit from GitHub Actions (Lint) --- src/structures/member.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/structures/member.ts b/src/structures/member.ts index 6f28ca7b0..e3d46d3bc 100644 --- a/src/structures/member.ts +++ b/src/structures/member.ts @@ -90,14 +90,14 @@ const baseMember: Partial = { return Boolean(this.bitfield! & memberToggles.bot); }, get system() { - return Boolean(this.bitfield! & memberToggles.system) + return Boolean(this.bitfield! & memberToggles.system); }, get mfaEnabled() { - return Boolean(this.bitfield! & memberToggles.mfaEnabled) + return Boolean(this.bitfield! & memberToggles.mfaEnabled); }, get verified() { - return Boolean(this.bitfield! & memberToggles.verified) - } + return Boolean(this.bitfield! & memberToggles.verified); + }, }; export async function createDiscordenoMember( From 8544a3e48cd0f1d937ef9a934826e0046d4470db Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Tue, 4 May 2021 13:02:29 +0100 Subject: [PATCH 27/29] fix: CONTRIBUTING invalid discord server invite link --- .github/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 42ad9a86c..fa2fcc399 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,7 +1,7 @@ # Contributing - Read the [style guide](#style-guide). -- Ask for help on the [official Discord server](https:) +- Ask for help on the [official Discord server](https://discord.gg/5vBgXk3UcZ) - If you are going to work on an issue, mention so in the issue comments before you start working on the issue. - If you are going to work on a new feature, create an issue and discuss with From 5b9f3e110b4022ec3669ee6e977c9294786fa33a Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Tue, 4 May 2021 13:04:36 +0100 Subject: [PATCH 28/29] fix: type design has changed now --- .github/CONTRIBUTING.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index fa2fcc399..609f329d2 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -38,10 +38,9 @@ ## Types Guide -- Must use snake case (according to Discord API). +- Must use camel case (same property name as in the docs just in camel case). - Each field or property must be accompanied with a reasonable JSDoc comment right above its type definition. -- The name of the type must be prefixed with `Discord`. - Must be placed inside of the types module (in `src/types` directory). Example: @@ -61,6 +60,4 @@ export interface User { flags?: number; premiumType?: number; } - -export type DiscordUser = SnakeCasedPropertiesDeep; ``` From 5c64d4a1ac19791514ff2883d23b54e267ea584d Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Tue, 4 May 2021 14:48:50 +0200 Subject: [PATCH 29/29] this back --- src/structures/member.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/structures/member.ts b/src/structures/member.ts index e3d46d3bc..ebeb2fc4c 100644 --- a/src/structures/member.ts +++ b/src/structures/member.ts @@ -152,10 +152,12 @@ export async function createDiscordenoMember( // User was never cached before member.guilds.set(guildId, { - ...data, + nick: data.nick, roles: data.roles.map((id) => snowflakeToBigint(id)), joinedAt: Date.parse(joinedAt), premiumSince: premiumSince ? Date.parse(premiumSince) : undefined, + deaf: data.deaf, + mute: data.mute, }); return member;