From 484f86638faba6694a98829a82773f0892353a61 Mon Sep 17 00:00:00 2001 From: TriForMine Date: Wed, 30 Dec 2020 09:31:11 +0100 Subject: [PATCH] refactor: resolve async promises, fixed typos, and used inline variable for return (#299) * Added await in async function, fixed typos and used inline variable for return * Added await in async function, fixed typos and used inline variable for return * Revert "Added await in async function, fixed typos and used inline variable for return" This reverts commit f31caf5d * Added await in async function, fixed typos and used inline variable for return * Fixes format * Fixes format 2 * Fixes format 4475757 * Fixes format 878757854786312378657865785785785785 * Change return to await * Fixing more issues * Fixing even more issues * Fixing even more issues + * Fixes format --- src/api/controllers/cache.ts | 2 +- src/api/controllers/channels.ts | 10 +++---- src/api/controllers/guilds.ts | 11 ++++---- src/api/controllers/members.ts | 6 +++-- src/api/controllers/messages.ts | 12 ++++----- src/api/controllers/misc.ts | 20 +++++++------- src/api/controllers/reactions.ts | 6 ++--- src/api/controllers/roles.ts | 5 ++-- src/api/handlers/channel.ts | 19 ++++++-------- src/api/handlers/guild.ts | 34 +++++++++--------------- src/api/handlers/member.ts | 14 +++++----- src/api/handlers/message.ts | 10 +++---- src/api/handlers/webhook.ts | 4 +-- src/api/structures/channel.ts | 2 +- src/api/structures/message.ts | 1 + src/api/structures/template.ts | 4 +-- src/bot.ts | 2 +- src/interactions/types/embed.ts | 2 +- src/interactions/types/interactions.ts | 2 +- src/interactions/types/slash.ts | 2 +- src/rest/request_manager.ts | 8 +++--- src/types/channel.ts | 2 +- src/types/guild.ts | 2 +- src/types/interactions.ts | 2 +- src/types/webhook.ts | 2 +- src/util/collection.ts | 4 +-- src/util/permissions.ts | 31 +++++++++++----------- src/ws/shard.ts | 36 +++++++++++++------------- src/ws/shard_manager.ts | 12 ++++----- 29 files changed, 126 insertions(+), 141 deletions(-) diff --git a/src/api/controllers/cache.ts b/src/api/controllers/cache.ts index b91d45ba7..f08397188 100644 --- a/src/api/controllers/cache.ts +++ b/src/api/controllers/cache.ts @@ -1,7 +1,7 @@ import { PresenceUpdatePayload } from "../../types/mod.ts"; import { cache } from "../../util/cache.ts"; import { Collection } from "../../util/collection.ts"; -import { Channel, Guild, Member, Message } from "../structures/structures.ts"; +import { Channel, Guild, Member, Message } from "../structures/mod.ts"; export type TableName = | "guilds" diff --git a/src/api/controllers/channels.ts b/src/api/controllers/channels.ts index cc0f3b7bf..86c00fe87 100644 --- a/src/api/controllers/channels.ts +++ b/src/api/controllers/channels.ts @@ -4,7 +4,7 @@ import { ChannelTypes, DiscordPayload, } from "../../types/mod.ts"; -import { structures } from "../structures/structures.ts"; +import { structures } from "../structures/mod.ts"; import { cacheHandlers } from "./cache.ts"; export async function handleInternalChannelCreate(data: DiscordPayload) { @@ -29,7 +29,7 @@ export async function handleInternalChannelDelete(data: DiscordPayload) { const guild = await cacheHandlers.get("guilds", payload.guild_id); if (guild) { - guild.voiceStates.forEach(async (vs, key) => { + return Promise.all(guild.voiceStates.map(async (vs, key) => { if (vs.channelID !== payload.id) return; // Since this channel was deleted all voice states for this channel should be deleted @@ -39,11 +39,11 @@ export async function handleInternalChannelDelete(data: DiscordPayload) { if (!member) return; eventHandlers.voiceChannelLeave?.(member, vs.channelID); - }); + })); } } - cacheHandlers.delete("channels", payload.id); + await cacheHandlers.delete("channels", payload.id); cacheHandlers.forEach("messages", (message) => { if (message.channelID === payload.id) { cacheHandlers.delete("messages", message.id); @@ -58,7 +58,7 @@ export async function handleInternalChannelUpdate(data: DiscordPayload) { const payload = data.d as ChannelCreatePayload; const cachedChannel = await cacheHandlers.get("channels", payload.id); const channel = await structures.createChannel(payload); - cacheHandlers.set("channels", channel.id, channel); + await cacheHandlers.set("channels", channel.id, channel); if (!cachedChannel) return; diff --git a/src/api/controllers/guilds.ts b/src/api/controllers/guilds.ts index 2f8029c95..aea53fc29 100644 --- a/src/api/controllers/guilds.ts +++ b/src/api/controllers/guilds.ts @@ -8,7 +8,7 @@ import { UpdateGuildPayload, } from "../../types/mod.ts"; import { cache } from "../../util/cache.ts"; -import { structures } from "../structures/structures.ts"; +import { structures } from "../structures/mod.ts"; import { cacheHandlers } from "./cache.ts"; export async function handleInternalGuildCreate( @@ -26,10 +26,10 @@ export async function handleInternalGuildCreate( shardID, ); - cacheHandlers.set("guilds", guild.id, guild); + await cacheHandlers.set("guilds", guild.id, guild); - if (cacheHandlers.has("unavailableGuilds", payload.id)) { - cacheHandlers.delete("unavailableGuilds", payload.id); + if (await cacheHandlers.has("unavailableGuilds", payload.id)) { + await cacheHandlers.delete("unavailableGuilds", payload.id); } if (!cache.isReady) return eventHandlers.guildLoaded?.(guild); @@ -52,7 +52,7 @@ export async function handleInternalGuildDelete(data: DiscordPayload) { } }); - cacheHandlers.delete("guilds", payload.id); + await cacheHandlers.delete("guilds", payload.id); if (payload.unavailable) { return cacheHandlers.set("unavailableGuilds", payload.id, Date.now()); @@ -101,7 +101,6 @@ export async function handleInternalGuildUpdate(data: DiscordPayload) { cachedGuild[key] = value; return { key, oldValue: cachedValue, value }; } - return; }).filter((change) => change) as GuildUpdateChange[]; return eventHandlers.guildUpdate?.(cachedGuild, changes); diff --git a/src/api/controllers/members.ts b/src/api/controllers/members.ts index 0ea0a4a7c..9dede1a50 100644 --- a/src/api/controllers/members.ts +++ b/src/api/controllers/members.ts @@ -8,7 +8,7 @@ import { } from "../../types/mod.ts"; import { cache } from "../../util/cache.ts"; import { Collection } from "../../util/collection.ts"; -import { structures } from "../structures/structures.ts"; +import { structures } from "../structures/mod.ts"; import { cacheHandlers } from "./cache.ts"; export async function handleInternalGuildMemberAdd(data: DiscordPayload) { @@ -39,7 +39,9 @@ export async function handleInternalGuildMemberRemove(data: DiscordPayload) { eventHandlers.guildMemberRemove?.(guild, payload.user, member); member?.guilds.delete(guild.id); - if (member && !member.guilds.size) cacheHandlers.delete("members", member.id); + if (member && !member.guilds.size) { + await cacheHandlers.delete("members", member.id); + } } export async function handleInternalGuildMemberUpdate(data: DiscordPayload) { diff --git a/src/api/controllers/messages.ts b/src/api/controllers/messages.ts index db9ac2f7b..12e8aac74 100644 --- a/src/api/controllers/messages.ts +++ b/src/api/controllers/messages.ts @@ -5,7 +5,7 @@ import { MessageDeleteBulkPayload, MessageDeletePayload, } from "../../types/mod.ts"; -import { structures } from "../structures/structures.ts"; +import { structures } from "../structures/mod.ts"; import { cacheHandlers } from "./cache.ts"; export async function handleInternalMessageCreate(data: DiscordPayload) { @@ -39,7 +39,7 @@ export async function handleInternalMessageCreate(data: DiscordPayload) { const message = await structures.createMessage(payload); // Cache the message - cacheHandlers.set("messages", payload.id, message); + await cacheHandlers.set("messages", payload.id, message); eventHandlers.messageCreate?.(message); } @@ -56,7 +56,7 @@ export async function handleInternalMessageDelete(data: DiscordPayload) { await cacheHandlers.get("messages", payload.id), ); - cacheHandlers.delete("messages", payload.id); + await cacheHandlers.delete("messages", payload.id); } export async function handleInternalMessageDeleteBulk(data: DiscordPayload) { @@ -66,13 +66,13 @@ export async function handleInternalMessageDeleteBulk(data: DiscordPayload) { const channel = await cacheHandlers.get("channels", payload.channel_id); if (!channel) return; - payload.ids.forEach(async (id) => { + return Promise.all(payload.ids.map(async (id) => { eventHandlers.messageDelete?.( { id, channel }, await cacheHandlers.get("messages", id), ); - cacheHandlers.delete("messages", id); - }); + await cacheHandlers.delete("messages", id); + })); } export async function handleInternalMessageUpdate(data: DiscordPayload) { diff --git a/src/api/controllers/misc.ts b/src/api/controllers/misc.ts index 8e2ad89df..3992c099b 100644 --- a/src/api/controllers/misc.ts +++ b/src/api/controllers/misc.ts @@ -54,7 +54,7 @@ export async function handleInternalPresenceUpdate(data: DiscordPayload) { const payload = data.d as PresenceUpdatePayload; const oldPresence = await cacheHandlers.get("presences", payload.user.id); - cacheHandlers.set("presences", payload.user.id, payload); + await cacheHandlers.set("presences", payload.user.id, payload); return eventHandlers.presenceUpdate?.(payload, oldPresence); } @@ -113,15 +113,15 @@ export async function handleInternalVoiceStateUpdate(data: DiscordPayload) { if (cachedState?.channelID !== payload.channel_id) { // Either joined or moved channels if (payload.channel_id) { - cachedState?.channelID - ? // Was in a channel before - eventHandlers.voiceChannelSwitch?.( - member, - payload.channel_id, - cachedState.channelID, - ) - : // Was not in a channel before so user just joined - eventHandlers.voiceChannelJoin?.(member, payload.channel_id); + if (cachedState?.channelID) { // Was in a channel before + eventHandlers.voiceChannelSwitch?.( + member, + payload.channel_id, + cachedState.channelID, + ); + } else { // Was not in a channel before so user just joined + eventHandlers.voiceChannelJoin?.(member, payload.channel_id); + } } // Left the channel else if (cachedState?.channelID) { guild.voiceStates.delete(payload.user_id); diff --git a/src/api/controllers/reactions.ts b/src/api/controllers/reactions.ts index da3c33fe7..b74b3ae3d 100644 --- a/src/api/controllers/reactions.ts +++ b/src/api/controllers/reactions.ts @@ -5,7 +5,7 @@ import { MessageReactionPayload, MessageReactionRemoveEmojiPayload, } from "../../types/mod.ts"; -import { structures } from "../structures/structures.ts"; +import { structures } from "../structures/mod.ts"; import { cacheHandlers } from "./cache.ts"; export async function handleInternalMessageReactionAdd(data: DiscordPayload) { @@ -34,7 +34,7 @@ export async function handleInternalMessageReactionAdd(data: DiscordPayload) { : [newReaction]; } - cacheHandlers.set("messages", payload.message_id, message); + await cacheHandlers.set("messages", payload.message_id, message); } if (payload.member && payload.guild_id) { @@ -87,7 +87,7 @@ export async function handleInternalMessageReactionRemove( : [newReaction]; } - cacheHandlers.set("messages", payload.message_id, message); + await cacheHandlers.set("messages", payload.message_id, message); } if (payload.member && payload.guild_id) { diff --git a/src/api/controllers/roles.ts b/src/api/controllers/roles.ts index 16dda7e1c..3d4f11692 100644 --- a/src/api/controllers/roles.ts +++ b/src/api/controllers/roles.ts @@ -4,7 +4,7 @@ import { GuildRoleDeletePayload, GuildRolePayload, } from "../../types/mod.ts"; -import { structures } from "../structures/structures.ts"; +import { structures } from "../structures/mod.ts"; import { cacheHandlers } from "./cache.ts"; export async function handleInternalGuildRoleCreate(data: DiscordPayload) { @@ -15,8 +15,7 @@ export async function handleInternalGuildRoleCreate(data: DiscordPayload) { if (!guild) return; const role = await structures.createRole(payload.role); - const roles = guild.roles.set(payload.role.id, role); - guild.roles = roles; + guild.roles = guild.roles.set(payload.role.id, role); return eventHandlers.roleCreate?.(guild, role); } diff --git a/src/api/handlers/channel.ts b/src/api/handlers/channel.ts index c608c30d8..f11f0e8c5 100644 --- a/src/api/handlers/channel.ts +++ b/src/api/handlers/channel.ts @@ -22,7 +22,7 @@ import { calculateBits, } from "../../util/permissions.ts"; import { cacheHandlers } from "../controllers/cache.ts"; -import { structures } from "../structures/structures.ts"; +import { structures } from "../structures/mod.ts"; /** Checks if a channel overwrite for a user id or a role id has permission in this channel */ export function channelOverwriteHasPermission( @@ -38,8 +38,8 @@ export function channelOverwriteHasPermission( if (overwrite) { const allowBits = overwrite.allow; const denyBits = overwrite.deny; - if (BigInt(denyBits) & BigInt(Permissions[perm])) return false; - if (BigInt(allowBits) & BigInt(Permissions[perm])) return true; + if (BigInt(denyBits) && BigInt(Permissions[perm])) return false; + if (BigInt(allowBits) && BigInt(Permissions[perm])) return true; } return false; }); @@ -303,7 +303,9 @@ export async function getChannelWebhooks(channelID: string) { ) { throw new Error(Errors.MISSING_MANAGE_WEBHOOKS); } - return RequestManager.get(endpoints.CHANNEL_WEBHOOKS(channelID)) as Promise< + return await RequestManager.get( + endpoints.CHANNEL_WEBHOOKS(channelID), + ) as Promise< WebhookPayload[] >; } @@ -461,12 +463,7 @@ export async function isChannelSynced(channelID: string) { ow.id === overwrite.id ); if (!permission) return false; - if ( - overwrite.allow !== permission.allow || overwrite.deny !== permission.deny - ) { - return false; - } - - return true; + return !(overwrite.allow !== permission.allow || + overwrite.deny !== permission.deny); }); } diff --git a/src/api/handlers/guild.ts b/src/api/handlers/guild.ts index 597a14094..28458c8bb 100644 --- a/src/api/handlers/guild.ts +++ b/src/api/handlers/guild.ts @@ -38,12 +38,7 @@ import { botHasPermission, calculateBits } from "../../util/permissions.ts"; import { formatImageURL, urlToBase64 } from "../../util/utils.ts"; import { requestAllMembers } from "../../ws/shard_manager.ts"; import { cacheHandlers } from "../controllers/cache.ts"; -import { - Guild, - Member, - structures, - Template, -} from "../structures/structures.ts"; +import { Guild, Member, structures, Template } from "../structures/mod.ts"; /** Create a new guild. Returns a guild object on success. Fires a Guild Create Gateway event. This endpoint can be used only by bots in less than 10 guilds. */ export async function createServer(options: CreateServerOptions) { @@ -135,8 +130,7 @@ export async function createGuildChannel( type: options?.type || ChannelTypes.GUILD_TEXT, })) as ChannelCreatePayload; - const channel = await structures.createChannel(result); - return channel; + return await structures.createChannel(result); } /** Delete a channel in your server. Bot needs MANAGE_CHANNEL permissions in the server. */ @@ -167,7 +161,7 @@ export async function getChannels(guildID: string, addToCache = true) { return Promise.all(result.map(async (res) => { const channel = await structures.createChannel(res, guildID); if (addToCache) { - cacheHandlers.set("channels", channel.id, channel); + await cacheHandlers.set("channels", channel.id, channel); } return channel; })); @@ -182,7 +176,7 @@ export async function getChannel(channelID: string, addToCache = true) { endpoints.GUILD_CHANNEL(channelID), ) as ChannelCreatePayload; const channel = await structures.createChannel(result, result.guild_id); - if (addToCache) cacheHandlers.set("channels", channel.id, channel); + if (addToCache) await cacheHandlers.set("channels", channel.id, channel); return channel; } @@ -192,7 +186,7 @@ export function swapChannels( channelPositions: PositionSwap[], ) { if (channelPositions.length < 2) { - throw "You must provide atleast two channels to be swapped."; + throw "You must provide at least two channels to be swapped."; } return RequestManager.patch( endpoints.GUILD_CHANNELS(guildID), @@ -216,8 +210,7 @@ export async function getMember( endpoints.GUILD_MEMBER(guildID, id), ) as MemberCreatePayload; - const member = await structures.createMember(data, guildID); - return member; + return await structures.createMember(data, guildID); } /** Returns guild member objects for the specified user by their nickname/username. @@ -310,8 +303,6 @@ export async function createGuildRole( throw new Error(Errors.MISSING_MANAGE_ROLES); } - const bits = calculateBits(options.permissions || []); - const result = await RequestManager.post( endpoints.GUILD_ROLES(guildID), { @@ -410,7 +401,7 @@ export async function pruneMembers(guildID: string, options: PruneOptions) { throw new Error(Errors.MISSING_KICK_MEMBERS); } - RequestManager.post( + return RequestManager.post( endpoints.GUILD_PRUNE(guildID), { ...options, include_roles: options.roles.join(",") }, ); @@ -428,7 +419,7 @@ export function fetchMembers(guild: Guild, options?: FetchMembersOptions) { // You can request 1 member without the intent if ( (!options?.limit || options.limit > 1) && - !(identifyPayload.intents & Intents.GUILD_MEMBERS) + !(identifyPayload.intents && Intents.GUILD_MEMBERS) ) { throw new Error(Errors.MISSING_INTENT_GUILD_MEMBERS); } @@ -437,8 +428,8 @@ export function fetchMembers(guild: Guild, options?: FetchMembersOptions) { options.limit = options.userIDs.length; } - return new Promise((resolve) => { - requestAllMembers(guild, resolve, options); + return new Promise(async (resolve) => { + await requestAllMembers(guild, resolve, options); }) as Promise>; } @@ -565,7 +556,7 @@ export async function getBan(guildID: string, memberID: string) { throw new Error(Errors.MISSING_BAN_MEMBERS); } - return RequestManager.get( + return await RequestManager.get( endpoints.GUILD_BAN(guildID, memberID), ) as Promise; } @@ -694,11 +685,10 @@ export async function createGuildFromTemplate( data.icon = await urlToBase64(data.icon); } - const guild = await RequestManager.post( + return await RequestManager.post( endpoints.GUILD_TEMPLATE(templateCode), data, ) as Promise; - return guild; } /** diff --git a/src/api/handlers/member.ts b/src/api/handlers/member.ts index dd4508af1..b2c4e178c 100644 --- a/src/api/handlers/member.ts +++ b/src/api/handlers/member.ts @@ -16,7 +16,7 @@ import { } from "../../util/permissions.ts"; import { formatImageURL, urlToBase64 } from "../../util/utils.ts"; import { cacheHandlers } from "../controllers/cache.ts"; -import { Member, structures } from "../structures/structures.ts"; +import { Member, structures } from "../structures/mod.ts"; import { sendMessage } from "./channel.ts"; /** The users custom avatar or the default avatar if you don't have a member object. */ @@ -127,10 +127,10 @@ export async function sendDirectMessage( { recipient_id: memberID }, ) as DMChannelCreatePayload; // Channel create event will have added this channel to the cache - cacheHandlers.delete("channels", dmChannelData.id); + await cacheHandlers.delete("channels", dmChannelData.id); const channel = await structures.createChannel(dmChannelData); // Recreate the channel and add it undert he users id - cacheHandlers.set("channels", memberID, channel); + await cacheHandlers.set("channels", memberID, channel); dmChannel = channel; } @@ -240,9 +240,9 @@ export function moveMember( /** Modifies the bot's username or avatar. * NOTE: username: if changed may cause the bot's discriminator to be randomized. */ -export async function editBotProfile(username?: string, avatarURL?: string) { +export async function editBotProfile(username?: string, botAvatarURL?: string) { // Nothing was edited - if (!username && !avatarURL) return; + if (!username && !botAvatarURL) return; // Check username requirements if username was provided if (username) { if (username.length > 32) { @@ -259,8 +259,8 @@ export async function editBotProfile(username?: string, avatarURL?: string) { } } - const avatar = avatarURL ? await urlToBase64(avatarURL) : undefined; - RequestManager.patch( + const avatar = botAvatarURL ? await urlToBase64(botAvatarURL) : undefined; + return RequestManager.patch( endpoints.USER_BOT, { username: username?.trim(), diff --git a/src/api/handlers/message.ts b/src/api/handlers/message.ts index 0a12a8d55..6c55b0266 100644 --- a/src/api/handlers/message.ts +++ b/src/api/handlers/message.ts @@ -10,7 +10,7 @@ import { endpoints } from "../../util/constants.ts"; import { botHasChannelPermissions } from "../../util/permissions.ts"; import { delay } from "../../util/utils.ts"; import { cacheHandlers } from "../controllers/cache.ts"; -import { Message, structures } from "../structures/structures.ts"; +import { Message, structures } from "../structures/mod.ts"; /** Delete a message with the channel id and message id only. */ export async function deleteMessageByID( @@ -68,7 +68,7 @@ export async function pin(channelID: string, messageID: string) { ) { throw new Error(Errors.MISSING_MANAGE_MESSAGES); } - RequestManager.put(endpoints.CHANNEL_MESSAGE(channelID, messageID)); + return RequestManager.put(endpoints.CHANNEL_MESSAGE(channelID, messageID)); } /** Unpin a message in a channel. Requires MANAGE_MESSAGES. */ @@ -82,7 +82,7 @@ export async function unpin(channelID: string, messageID: string) { ) { throw new Error(Errors.MISSING_MANAGE_MESSAGES); } - RequestManager.delete( + return RequestManager.delete( endpoints.CHANNEL_MESSAGE(channelID, messageID), ); } @@ -134,8 +134,8 @@ export async function addReactions( ordered = false, ) { if (!ordered) { - reactions.forEach((reaction) => - addReaction(channelID, messageID, reaction) + await Promise.all( + reactions.map((reaction) => addReaction(channelID, messageID, reaction)), ); } else { for (const reaction of reactions) { diff --git a/src/api/handlers/webhook.ts b/src/api/handlers/webhook.ts index c08fa8099..36811cc2b 100644 --- a/src/api/handlers/webhook.ts +++ b/src/api/handlers/webhook.ts @@ -17,7 +17,7 @@ import { cache } from "../../util/cache.ts"; import { endpoints } from "../../util/constants.ts"; import { botHasChannelPermissions } from "../../util/permissions.ts"; import { urlToBase64 } from "../../util/utils.ts"; -import { structures } from "../structures/structures.ts"; +import { structures } from "../structures/mod.ts"; /** Create a new webhook. Requires the MANAGE_WEBHOOKS permission. Returns a webhook object on success. Webhook names follow our naming restrictions that can be found in our Usernames and Nicknames documentation, with the following additional stipulations: * @@ -46,7 +46,7 @@ export async function createWebhook( throw new Error(Errors.INVALID_WEBHOOK_NAME); } - return RequestManager.post( + return await RequestManager.post( endpoints.CHANNEL_WEBHOOKS(channelID), { ...options, diff --git a/src/api/structures/channel.ts b/src/api/structures/channel.ts index 20e5f9e86..2b795494d 100644 --- a/src/api/structures/channel.ts +++ b/src/api/structures/channel.ts @@ -62,7 +62,7 @@ export async function createChannel( nsfw: createNewProp(data.nsfw || false), }); - cacheHandlers.set("channels", data.id, channel); + await cacheHandlers.set("channels", data.id, channel); return channel as Channel; } diff --git a/src/api/structures/message.ts b/src/api/structures/message.ts index 4c889e161..393ed4fdd 100644 --- a/src/api/structures/message.ts +++ b/src/api/structures/message.ts @@ -127,6 +127,7 @@ export async function createMessage(data: MessageCreateOptions) { message_reference: messageReference, edited_timestamp: editedTimestamp, referenced_message: referencedMessageID, + member, ...rest } = data; diff --git a/src/api/structures/template.ts b/src/api/structures/template.ts index faafdda83..1e2b3e40b 100644 --- a/src/api/structures/template.ts +++ b/src/api/structures/template.ts @@ -28,7 +28,7 @@ export function createTemplate( restProps[key] = createNewProp((rest as any)[key]); } - const template = Object.create(baseTemplate, { + return Object.create(baseTemplate, { ...restProps, usageCount: createNewProp(sourceGuildID), creatorID: createNewProp(creatorID), @@ -38,8 +38,6 @@ export function createTemplate( serializedSourceGuild: createNewProp(serializedSourceGuild), isDirty: createNewProp(isDirty), }); - - return template; } export interface Template { diff --git a/src/bot.ts b/src/bot.ts index 366cf0272..698a9c44b 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -106,7 +106,7 @@ export async function startBigBrainBot(data: BigBrainBotConfig) { ) as DiscordBotGatewayData; if (!data.wsURL) proxyWSURL = botGatewayData.url; - spawnShards( + await spawnShards( botGatewayData, identifyPayload, data.firstShardID, diff --git a/src/interactions/types/embed.ts b/src/interactions/types/embed.ts index 08522ab54..0bc98cd45 100644 --- a/src/interactions/types/embed.ts +++ b/src/interactions/types/embed.ts @@ -7,7 +7,7 @@ export interface Embed { description?: string; /** The url of embed */ url?: string; - /** The timestap of the embed content */ + /** The timestamp of the embed content */ timestamp?: string; /** The color code of the embed */ color?: number; diff --git a/src/interactions/types/interactions.ts b/src/interactions/types/interactions.ts index 8b7d0a68c..212344bc6 100644 --- a/src/interactions/types/interactions.ts +++ b/src/interactions/types/interactions.ts @@ -29,7 +29,7 @@ export interface SlashCommandInteractionData { } export interface SlashCommandInteractionDataOption { - /** The name of the parammeter */ + /** The name of the parameter */ name: string; /** The value of the pair */ value?: any; diff --git a/src/interactions/types/slash.ts b/src/interactions/types/slash.ts index 36386fd7c..ae9e2a1a7 100644 --- a/src/interactions/types/slash.ts +++ b/src/interactions/types/slash.ts @@ -7,7 +7,7 @@ export interface CreateSlashCommandOptions { /** The name of the slash command. */ name: string; /** The description of the slash command. */ - description: String; + description: string; /** If a guildID is provided, this will be a GUILD command. If none is provided it will be a GLOBAL command. */ guildID?: string; /** The options for this command */ diff --git a/src/rest/request_manager.ts b/src/rest/request_manager.ts index bce07eee5..91c62ddde 100644 --- a/src/rest/request_manager.ts +++ b/src/rest/request_manager.ts @@ -41,7 +41,7 @@ async function processRateLimitedPaths() { }); await delay(1000); - processRateLimitedPaths(); + await processRateLimitedPaths(); } function addToQueue(request: QueuedRequest) { @@ -59,7 +59,7 @@ function addToQueue(request: QueuedRequest) { } async function cleanupQueues() { - Object.entries(pathQueues).map(([key, value]) => { + Object.entries(pathQueues).forEach(([key, value]) => { if (!value.length) { // Remove it entirely delete pathQueues[key]; @@ -115,7 +115,7 @@ async function processQueue() { } if (Object.keys(pathQueues).length) { - cleanupQueues(); + await cleanupQueues(); } else queueInProcess = false; } } @@ -215,7 +215,7 @@ async function runMethod( }); } - // No proxy so we need to handl all rate limiting and such + // No proxy so we need to handle all rate limiting and such return new Promise((resolve, reject) => { const callback = async () => { try { diff --git a/src/types/channel.ts b/src/types/channel.ts index 6c116b853..fa1f03785 100644 --- a/src/types/channel.ts +++ b/src/types/channel.ts @@ -87,7 +87,7 @@ export enum ChannelTypes { GROUP_DM, /** An organizational category that contains channels */ GUILD_CATEGORY, - /** A channel that users can follow and crosspost into their own server. */ + /** A channel that users can follow and cross post into their own server. */ GUILD_NEWS, /** A channel in which game developers can sell their game on Discord. */ GUILD_STORE, diff --git a/src/types/guild.ts b/src/types/guild.ts index 013404bb3..fa9588ebd 100644 --- a/src/types/guild.ts +++ b/src/types/guild.ts @@ -357,7 +357,7 @@ export interface VanityInvite { } export interface GuildEmbed { - /** Whether the embed is enbaled. */ + /** Whether the embed is enabled. */ enabled: boolean; } diff --git a/src/types/interactions.ts b/src/types/interactions.ts index 986aaf6b8..d1cdf741b 100644 --- a/src/types/interactions.ts +++ b/src/types/interactions.ts @@ -13,7 +13,7 @@ export interface InteractionCommandPayload { channel_id: string; /** guild member data for the invoking user */ member: MemberCreatePayload; - /** a contintuation token for responding to the interaction */ + /** a continuation token for responding to the interaction */ token: string; } diff --git a/src/types/webhook.ts b/src/types/webhook.ts index 6394f3355..f10832e69 100644 --- a/src/types/webhook.ts +++ b/src/types/webhook.ts @@ -72,7 +72,7 @@ export interface CreateSlashCommandOptions { /** The name of the slash command. */ name: string; /** The description of the slash command. */ - description: String; + description: string; /** If a guildID is provided, this will be a GUILD command. If none is provided it will be a GLOBAL command. */ guildID?: string; /** The options for this command */ diff --git a/src/util/collection.ts b/src/util/collection.ts index 9576512e0..01489432e 100644 --- a/src/util/collection.ts +++ b/src/util/collection.ts @@ -5,8 +5,8 @@ export class Collection extends Map { set(key: K, value: V) { // When this collection is maxSizeed make sure we can add first - if (this.maxSize || this.maxSize === 0) { - if (this.size >= this.maxSize) return this; + if ((this.maxSize || this.maxSize === 0) && this.size >= this.maxSize) { + return this; } return super.set(key, value); diff --git a/src/util/permissions.ts b/src/util/permissions.ts index 5417e8393..d7d75a216 100644 --- a/src/util/permissions.ts +++ b/src/util/permissions.ts @@ -36,15 +36,15 @@ export function memberHasPermission( ) // Removes any edge case undefined .filter((id) => id) - .reduce((bits, permissions) => { - bits |= BigInt(permissions); + .reduce((bits, perms) => { + bits |= BigInt(perms); return bits; }, BigInt(0)); - if (permissionBits & BigInt(Permissions.ADMINISTRATOR)) return true; + if (permissionBits && BigInt(Permissions.ADMINISTRATOR)) return true; return permissions.every((permission) => - permissionBits & BigInt(Permissions[permission]) + permissionBits && BigInt(Permissions[permission]) ); } @@ -74,10 +74,10 @@ export async function botHasPermission( return bits; }, BigInt(0)); - if (permissionBits & BigInt(Permissions.ADMINISTRATOR)) return true; + if (permissionBits && BigInt(Permissions.ADMINISTRATOR)) return true; return permissions.every((permission) => - permissionBits & BigInt(Permissions[permission]) + permissionBits && BigInt(Permissions[permission]) ); } @@ -134,12 +134,12 @@ export async function hasChannelPermissions( const denyBits = memberOverwrite.deny; for (const perm of permissions) { // One of the necessary permissions is denied. Since this is main permission we can cancel if its denied. - if (BigInt(denyBits) & BigInt(Permissions[perm])) return false; + if (BigInt(denyBits) && BigInt(Permissions[perm])) return false; // Already allowed perm if (allowedPermissions.has(perm)) continue; // This perm is allowed so we save it - if (BigInt(allowBits) & BigInt(Permissions[perm])) { + if (BigInt(allowBits) && BigInt(Permissions[perm])) { allowedPermissions.add(perm); } } @@ -153,17 +153,17 @@ export async function hasChannelPermissions( for (const overwrite of rolesOverwrites) { const allowBits = overwrite.allow; // This perm is allowed so we save it - if (BigInt(allowBits) & BigInt(Permissions[perm])) { + if (BigInt(allowBits) && BigInt(Permissions[perm])) { allowedPermissions.add(perm); break; } const denyBits = overwrite.deny; // If this role denies it we need to save and check if another role allows it, allows > deny - if (BigInt(denyBits) & BigInt(Permissions[perm])) { + if (BigInt(denyBits) && BigInt(Permissions[perm])) { // This role denies his perm, but before denying we need to check all other roles if any allow as allow > deny const isAllowed = rolesOverwrites.some((o) => - BigInt(o.allow) & BigInt(Permissions[perm]) + BigInt(o.allow) && BigInt(Permissions[perm]) ); if (isAllowed) continue; // This permission is in fact denied. Since Roles overrule everything below here we can cancel ou here @@ -179,9 +179,9 @@ export async function hasChannelPermissions( // Already allowed perm if (allowedPermissions.has(perm)) continue; // One of the necessary permissions is denied. Since everyone overwrite overrides role perms we can cancel here - if (BigInt(denyBits) & BigInt(Permissions[perm])) return false; + if (BigInt(denyBits) && BigInt(Permissions[perm])) return false; // This perm is allowed so we save it - if (BigInt(allowBits) & BigInt(Permissions[perm])) { + if (BigInt(allowBits) && BigInt(Permissions[perm])) { allowedPermissions.add(perm); } } @@ -191,15 +191,14 @@ export async function hasChannelPermissions( if (permissions.every((perm) => allowedPermissions.has(perm))) return true; // Some permission was not explicitly allowed so we default to checking role perms directly - const hasPerms = await memberIDHasPermission(memberID, guild.id, permissions); - return hasPerms; + return await memberIDHasPermission(memberID, guild.id, permissions); } /** This function converts a bitwise string to permission strings */ export function calculatePermissions(permissionBits: bigint) { return Object.keys(Permissions).filter((perm) => { if (Number(perm)) return false; - return permissionBits & BigInt(Permissions[perm as Permission]); + return permissionBits && BigInt(Permissions[perm as Permission]); }) as Permission[]; } diff --git a/src/ws/shard.ts b/src/ws/shard.ts index b21f48655..2ac68db28 100644 --- a/src/ws/shard.ts +++ b/src/ws/shard.ts @@ -61,9 +61,9 @@ export async function createShard( ws.onopen = async () => { if (!resuming) { // Initial identify with the gateway - await identify(basicShard, identifyPayload); + identify(basicShard, identifyPayload); } else { - await resume(basicShard, identifyPayload); + resume(basicShard, identifyPayload); } }; @@ -85,14 +85,14 @@ export async function createShard( } if (typeof message === "string") { - const data = JSON.parse(message); - if (!data.t) eventHandlers.rawGateway?.(data); - switch (data.op) { + const messageData = JSON.parse(message); + if (!messageData.t) eventHandlers.rawGateway?.(messageData); + switch (messageData.op) { case GatewayOpcode.Hello: if (!heartbeating.has(basicShard.id)) { heartbeat( basicShard, - (data.d as DiscordHeartbeatPayload).heartbeat_interval, + (messageData.d as DiscordHeartbeatPayload).heartbeat_interval, identifyPayload, data, ); @@ -116,7 +116,7 @@ export async function createShard( }, ); // When d is false we need to reidentify - if (!data.d) { + if (!messageData.d) { createShard(data, identifyPayload, false, shardID); break; } @@ -124,7 +124,7 @@ export async function createShard( resumeConnection(data, identifyPayload, basicShard.id); break; default: - if (data.t === "RESUMED") { + if (messageData.t === "RESUMED") { eventHandlers.debug?.( { type: "gatewayResumed", data: { shardID: basicShard.id } }, ); @@ -133,14 +133,14 @@ export async function createShard( break; } // Important for RESUME - if (data.t === "READY") { - basicShard.sessionID = (data.d as ReadyPayload).session_id; + if (messageData.t === "READY") { + basicShard.sessionID = (messageData.d as ReadyPayload).session_id; } // Update the sequence number if it is present - if (data.s) basicShard.previousSequenceNumber = data.s; + if (messageData.s) basicShard.previousSequenceNumber = messageData.s; - handleDiscordPayload(data, basicShard.id); + handleDiscordPayload(messageData, basicShard.id); break; } } @@ -247,7 +247,7 @@ async function heartbeat( // We lost socket connection between heartbeats, resume connection if (shard.ws.readyState === WebSocket.CLOSED) { shard.needToResume = true; - resumeConnection(data, payload, shard.id); + await resumeConnection(data, payload, shard.id); heartbeating.delete(shard.id); return; } @@ -289,7 +289,7 @@ async function heartbeat( }, ); await delay(interval); - heartbeat(shard, interval, payload, data); + await heartbeat(shard, interval, payload, data); } async function resumeConnection( @@ -309,10 +309,10 @@ async function resumeConnection( eventHandlers.debug?.({ type: "gatewayResume", data: { shardID: shard.id } }); // Run it once - createShard(data, payload, true, shard.id); + await createShard(data, payload, true, shard.id); // Then retry every 15 seconds await delay(1000 * 15); - if (shard.needToResume) resumeConnection(data, payload, shardID); + if (shard.needToResume) await resumeConnection(data, payload, shardID); } export function requestGuildMembers( @@ -335,7 +335,7 @@ export function requestGuildMembers( if (!processQueue) { processQueue = true; - processGatewayQueue(); + return processGatewayQueue(); } return; } @@ -419,7 +419,7 @@ async function processGatewayQueue() { await delay(1500); - processGatewayQueue(); + await processGatewayQueue(); } export function botGatewayStatusRequest(payload: BotStatusRequest) { diff --git a/src/ws/shard_manager.ts b/src/ws/shard_manager.ts index ed5b5bf9d..67c0c97c2 100644 --- a/src/ws/shard_manager.ts +++ b/src/ws/shard_manager.ts @@ -1,5 +1,5 @@ import { controllers } from "../api/controllers/mod.ts"; -import { Guild } from "../api/structures/structures.ts"; +import { Guild } from "../api/structures/guild.ts"; import { eventHandlers, IdentifyPayload } from "../bot.ts"; import { DiscordBotGatewayData, @@ -38,9 +38,9 @@ export async function spawnShards( data.shards > lastShardID ? data.shards : lastShardID, ]; // Start The shard - createShard(data, payload, false, shardID); + await createShard(data, payload, false, shardID); // Spawn next shard - spawnShards( + await spawnShards( data, payload, shardID + 1, @@ -54,7 +54,7 @@ export async function spawnShards( if (createNextShard) { createNextShard = false; // Start the next few shards based on max concurrency - spawnShards( + await spawnShards( data, payload, shardID, @@ -65,7 +65,7 @@ export async function spawnShards( } await delay(1000); - spawnShards(data, payload, shardID, lastShardID, skipChecks); + await spawnShards(data, payload, shardID, lastShardID, skipChecks); } export async function handleDiscordPayload( @@ -77,7 +77,7 @@ export async function handleDiscordPayload( switch (data.op) { case GatewayOpcode.HeartbeatACK: - // Incase the user wants to listen to heartbeat responses + // In case the user wants to listen to heartbeat responses return eventHandlers.heartbeat?.(); case GatewayOpcode.Dispatch: if (!data.t) return;