diff --git a/src/controllers/cache.ts b/src/controllers/cache.ts index 395ecfd2f..55829c14a 100644 --- a/src/controllers/cache.ts +++ b/src/controllers/cache.ts @@ -10,8 +10,7 @@ export type TableName = | "channels" | "messages" | "presences" - | "unavailableGuilds" - | "fetchAllMembersProcessingRequests"; + | "unavailableGuilds"; function set( table: "guilds", @@ -38,20 +37,21 @@ function set( key: string, value: number, ): Promise>; -function set( - table: "fetchAllMembersProcessingRequests", - key: string, - value: number, -): Promise>; async function set(table: TableName, key: string, value: any) { return cache[table].set(key, value); } -function get(table: "guilds", key: string): Promise; -function get(table: "channels", key: string): Promise; -function get(table: "messages", key: string): Promise; -function get(table: "presences", key: string): Promise; -function get(table: "unavailableGuilds", key: string): Promise; +function get(table: "guilds", key: string): Promise; +function get(table: "channels", key: string): Promise; +function get(table: "messages", key: string): Promise; +function get( + table: "presences", + key: string, +): Promise; +function get( + table: "unavailableGuilds", + key: string, +): Promise; async function get(table: TableName, key: string) { return cache[table].get(key); } @@ -101,12 +101,3 @@ export let cacheHandlers = { /** Run a function on all items in this cache */ forEach, }; - -export type CacheHandlers = typeof cacheHandlers; - -export function updateCacheHandlers(newCacheHandlers: CacheHandlers) { - cacheHandlers = { - ...cacheHandlers, - ...newCacheHandlers, - }; -} diff --git a/src/controllers/channels.ts b/src/controllers/channels.ts index d1c850fba..3d5fb30ee 100644 --- a/src/controllers/channels.ts +++ b/src/controllers/channels.ts @@ -8,7 +8,7 @@ export async function handleInternalChannelCreate(data: DiscordPayload) { if (data.t !== "CHANNEL_CREATE") return; const payload = data.d as ChannelCreatePayload; - const channel = structures.createChannel(payload); + const channel = await structures.createChannel(payload); await cacheHandlers.set("channels", channel.id, channel); if (channel.guildID) { @@ -61,7 +61,7 @@ export async function handleInternalChannelUpdate(data: DiscordPayload) { const payload = data.d as ChannelCreatePayload; const cachedChannel = await cacheHandlers.get("channels", payload.id); - const channel = structures.createChannel(payload); + const channel = await structures.createChannel(payload); cacheHandlers.set("channels", channel.id, channel); if (!cachedChannel) return; diff --git a/src/controllers/guilds.ts b/src/controllers/guilds.ts index 6410ab65d..014e5e0d6 100644 --- a/src/controllers/guilds.ts +++ b/src/controllers/guilds.ts @@ -21,7 +21,7 @@ export async function handleInternalGuildCreate( // When shards resume they emit GUILD_CREATE again. if (await cacheHandlers.has("guilds", payload.id)) return; - const guild = structures.createGuild( + const guild = await structures.createGuild( data.d as CreateGuildPayload, shardID, ); diff --git a/src/controllers/members.ts b/src/controllers/members.ts index 22676a45e..1645beeca 100644 --- a/src/controllers/members.ts +++ b/src/controllers/members.ts @@ -18,7 +18,7 @@ export async function handleInternalGuildMemberAdd(data: DiscordPayload) { if (!guild) return; guild.memberCount++; - const member = structures.createMember( + const member = await structures.createMember( payload, guild.id, ); @@ -66,7 +66,7 @@ export async function handleInternalGuildMemberUpdate(data: DiscordPayload) { deaf: cachedMember?.deaf || false, mute: cachedMember?.mute || false, }; - const member = structures.createMember( + const member = await structures.createMember( newMemberData, guild.id, ); @@ -104,10 +104,10 @@ export async function handleInternalGuildMembersChunk(data: DiscordPayload) { const guild = await cacheHandlers.get("guilds", payload.guild_id); if (!guild) return; - payload.members.forEach((member) => { + payload.members.forEach(async (member) => { guild.members.set( member.user.id, - structures.createMember( + await structures.createMember( member, guild.id, ), diff --git a/src/controllers/messages.ts b/src/controllers/messages.ts index 72f799c22..eab8a1e51 100644 --- a/src/controllers/messages.ts +++ b/src/controllers/messages.ts @@ -15,7 +15,7 @@ export async function handleInternalMessageCreate(data: DiscordPayload) { const channel = await cacheHandlers.get("channels", payload.channel_id); if (channel) channel.lastMessageID = payload.id; - const message = structures.createMessage(payload); + const message = await structures.createMessage(payload); // Cache the message cacheHandlers.set("messages", payload.id, message); const guild = payload.guild_id @@ -26,19 +26,19 @@ export async function handleInternalMessageCreate(data: DiscordPayload) { // If in a guild cache the author as a member guild?.members.set( payload.author.id, - structures.createMember( + await structures.createMember( { ...payload.member, user: payload.author }, guild.id, ), ); } - payload.mentions.forEach((mention) => { + payload.mentions.forEach(async (mention) => { // Cache the member if its a valid member if (mention.member) { guild?.members.set( mention.id, - structures.createMember( + await structures.createMember( { ...mention.member, user: mention }, guild.id, ), diff --git a/src/controllers/misc.ts b/src/controllers/misc.ts index 141ffb744..67b2df6bf 100644 --- a/src/controllers/misc.ts +++ b/src/controllers/misc.ts @@ -82,7 +82,7 @@ export async function handleInternalVoiceStateUpdate(data: DiscordPayload) { const member = guild.members.get(payload.user_id) || (payload.member - ? structures.createMember(payload.member, guild.id) + ? await structures.createMember(payload.member, guild.id) : undefined); if (!member) return; diff --git a/src/controllers/reactions.ts b/src/controllers/reactions.ts index 0ff5fe142..3e867a9b8 100644 --- a/src/controllers/reactions.ts +++ b/src/controllers/reactions.ts @@ -41,7 +41,7 @@ export async function handleInternalMessageReactionAdd(data: DiscordPayload) { const guild = await cacheHandlers.get("guilds", payload.guild_id); guild?.members.set( payload.member.user.id, - structures.createMember( + await structures.createMember( payload.member, guild.id, ), @@ -97,7 +97,7 @@ export async function handleInternalMessageReactionRemove( const guild = await cacheHandlers.get("guilds", payload.guild_id); guild?.members.set( payload.member.user.id, - structures.createMember( + await structures.createMember( payload.member, guild.id, ), diff --git a/src/controllers/roles.ts b/src/controllers/roles.ts index c6b94e7ae..695af4c61 100644 --- a/src/controllers/roles.ts +++ b/src/controllers/roles.ts @@ -11,7 +11,7 @@ export async function handleInternalGuildRoleCreate(data: DiscordPayload) { const guild = await cacheHandlers.get("guilds", payload.guild_id); if (!guild) return; - const role = structures.createRole(payload.role); + const role = await structures.createRole(payload.role); const roles = guild.roles.set(payload.role.id, role); guild.roles = roles; return eventHandlers.roleCreate?.(guild, role); @@ -39,6 +39,6 @@ export async function handleInternalGuildRoleUpdate(data: DiscordPayload) { const cachedRole = guild.roles.get(payload.role.id); if (!cachedRole) return; - const role = structures.createRole(payload.role); + const role = await structures.createRole(payload.role); eventHandlers.roleUpdate?.(guild, role, cachedRole); } diff --git a/src/handlers/channel.ts b/src/handlers/channel.ts index d110930b7..add8509d6 100644 --- a/src/handlers/channel.ts +++ b/src/handlers/channel.ts @@ -91,7 +91,7 @@ export async function getMessages( endpoints.CHANNEL_MESSAGES(channelID), options, )) as MessageCreateOptions[]; - return result.map((res) => structures.createMessage(res)); + return Promise.all(result.map((res) => structures.createMessage(res))); } /** Get pinned messages in this channel. */ @@ -99,7 +99,7 @@ export async function getPins(channelID: string) { const result = (await RequestManager.get( endpoints.CHANNEL_PINS(channelID), )) as MessageCreateOptions[]; - return result.map((res) => structures.createMessage(res)); + return Promise.all(result.map((res) => structures.createMessage(res))); } /** Send a message to the channel. Requires SEND_MESSAGES permission. */ diff --git a/src/handlers/guild.ts b/src/handlers/guild.ts index 176c982fb..7492ecf57 100644 --- a/src/handlers/guild.ts +++ b/src/handlers/guild.ts @@ -110,7 +110,7 @@ export async function createGuildChannel( type: options?.type || ChannelTypes.GUILD_TEXT, })) as ChannelCreatePayload; - const channel = structures.createChannel(result); + const channel = await structures.createChannel(result); guild.channels.set(result.id, channel); return channel; } @@ -136,13 +136,13 @@ export async function getChannels(guildID: string, addToCache = true) { const result = await RequestManager.get( endpoints.GUILD_CHANNELS(guildID), ) as ChannelCreatePayload[]; - return result.map((res) => { - const channel = structures.createChannel(res, guildID); + return Promise.all(result.map(async (res) => { + const channel = await structures.createChannel(res, guildID); if (addToCache) { cacheHandlers.set("channels", channel.id, channel); } return channel; - }); + })); } /** Fetches a single channel object from the api. @@ -153,7 +153,7 @@ export async function getChannel(channelID: string, addToCache = true) { const result = await RequestManager.get( endpoints.GUILD_CHANNEL(channelID), ) as ChannelCreatePayload; - const channel = structures.createChannel(result, result.guild_id); + const channel = await structures.createChannel(result, result.guild_id); if (addToCache) cacheHandlers.set("channels", channel.id, channel); return channel; } @@ -184,7 +184,7 @@ export async function getMember(guildID: string, id: string) { endpoints.GUILD_MEMBER(guildID, id), ) as MemberCreatePayload; - const member = structures.createMember(data, guild.id); + const member = await structures.createMember(data, guild.id); guild.members.set(id, member); return member; } @@ -290,7 +290,7 @@ export async function createGuildRole( ); const roleData = result as RoleData; - const role = structures.createRole(roleData); + const role = await structures.createRole(roleData); const guild = await cacheHandlers.get("guilds", guildID); guild?.roles.set(role.id, role); return role; diff --git a/src/handlers/member.ts b/src/handlers/member.ts index a7f2b9586..54a2a963a 100644 --- a/src/handlers/member.ts +++ b/src/handlers/member.ts @@ -108,7 +108,7 @@ export async function sendDirectMessage( ) as DMChannelCreatePayload; // Channel create event will have added this channel to the cache cacheHandlers.delete("channels", dmChannelData.id); - const channel = structures.createChannel(dmChannelData); + const channel = await structures.createChannel(dmChannelData); // Recreate the channel and add it undert he users id cacheHandlers.set("channels", memberID, channel); dmChannel = channel; diff --git a/src/structures/channel.ts b/src/structures/channel.ts index 572443d98..6ce23b6d4 100644 --- a/src/structures/channel.ts +++ b/src/structures/channel.ts @@ -1,8 +1,12 @@ import { ChannelCreatePayload } from "../types/channel.ts"; import { calculatePermissions } from "../utils/permissions.ts"; import { cacheHandlers } from "../controllers/cache.ts"; +import { Unpromise } from "../types/misc.ts"; -export function createChannel(data: ChannelCreatePayload, guildID?: string) { +export async function createChannel( + data: ChannelCreatePayload, + guildID?: string, +) { const { guild_id: rawGuildID, last_message_id: lastMessageID, @@ -45,4 +49,4 @@ export function createChannel(data: ChannelCreatePayload, guildID?: string) { return channel; } -export interface Channel extends ReturnType {} +export interface Channel extends Unpromise> {} diff --git a/src/structures/guild.ts b/src/structures/guild.ts index bc7a5d6f8..346ef4c78 100644 --- a/src/structures/guild.ts +++ b/src/structures/guild.ts @@ -2,8 +2,9 @@ import { CreateGuildPayload } from "../types/guild.ts"; import { Collection } from "../utils/collection.ts"; import { structures } from "./mod.ts"; import { Member } from "./member.ts"; +import { Unpromise } from "../types/misc.ts"; -export function createGuild(data: CreateGuildPayload, shardID: number) { +export async function createGuild(data: CreateGuildPayload, shardID: number) { const { owner_id: ownerID, afk_channel_id: afkChannelID, @@ -25,6 +26,13 @@ export function createGuild(data: CreateGuildPayload, shardID: number) { ...rest } = data; + const roles = await Promise.all( + data.roles.map((r) => structures.createRole(r)), + ); + const channels = await Promise.all( + data.channels.map((c) => structures.createChannel(c, data.id)), + ); + const guild = { ...rest, /** The shard id that this guild is on */ @@ -59,17 +67,13 @@ export function createGuild(data: CreateGuildPayload, shardID: number) { preferredLocale, /** The roles in the guild */ - roles: new Collection( - data.roles.map((r) => [r.id, structures.createRole(r)]), - ), + roles: new Collection(roles.map((r) => [r.id, r])), /** When this guild was joined at. */ joinedAt: Date.parse(joinedAt), /** The users in this guild. */ members: new Collection(), /** The channels in the guild */ - channels: new Collection( - data.channels.map((c) => [c.id, structures.createChannel(c, data.id)]), - ), + channels: new Collection(channels.map((c) => [c.id, c])), /** The presences of all the users in the guild. */ presences: new Collection(data.presences.map((p) => [p.user.id, p])), /** The total number of members in this guild. This value is updated as members leave and join the server. However, if you do not have the intent enabled to be able to listen to these events, then this will not be accurate. */ @@ -87,11 +91,11 @@ export function createGuild(data: CreateGuildPayload, shardID: number) { }])), }; - data.members.forEach((m) => - guild.members.set(m.user.id, structures.createMember(m, guild.id)) + data.members.forEach(async (m) => + guild.members.set(m.user.id, await structures.createMember(m, guild.id)) ); return guild; } -export interface Guild extends ReturnType {} +export interface Guild extends Unpromise> {} diff --git a/src/structures/member.ts b/src/structures/member.ts index d97dd2e01..86686af31 100644 --- a/src/structures/member.ts +++ b/src/structures/member.ts @@ -1,6 +1,7 @@ import { MemberCreatePayload } from "../types/member.ts"; +import { Unpromise } from "../types/misc.ts"; -export function createMember(data: MemberCreatePayload, guildID: string) { +export async function createMember(data: MemberCreatePayload, guildID: string) { const { joined_at: joinedAt, premium_since: premiumSince, @@ -36,4 +37,4 @@ export function createMember(data: MemberCreatePayload, guildID: string) { return member; } -export interface Member extends ReturnType {} +export interface Member extends Unpromise> {} diff --git a/src/structures/message.ts b/src/structures/message.ts index 60fcb39c9..4d56a3b9b 100644 --- a/src/structures/message.ts +++ b/src/structures/message.ts @@ -1,6 +1,7 @@ import { MessageCreateOptions } from "../types/message.ts"; +import { Unpromise } from "../types/misc.ts"; -export function createMessage(data: MessageCreateOptions) { +export async function createMessage(data: MessageCreateOptions) { const { guild_id: guildID, channel_id: channelID, @@ -29,4 +30,4 @@ export function createMessage(data: MessageCreateOptions) { return message; } -export interface Message extends ReturnType {} +export interface Message extends Unpromise> {} diff --git a/src/structures/role.ts b/src/structures/role.ts index 550286534..8f8f87e3d 100644 --- a/src/structures/role.ts +++ b/src/structures/role.ts @@ -1,6 +1,7 @@ +import { Unpromise } from "../types/misc.ts"; import { RoleData } from "../types/role.ts"; -export function createRole(data: RoleData) { +export async function createRole(data: RoleData) { return { ...data, /** The @ mention of the role in a string. */ @@ -8,4 +9,4 @@ export function createRole(data: RoleData) { }; } -export interface Role extends ReturnType {} +export interface Role extends Unpromise> {} diff --git a/src/types/misc.ts b/src/types/misc.ts new file mode 100644 index 000000000..84bb25051 --- /dev/null +++ b/src/types/misc.ts @@ -0,0 +1,3 @@ +export type Unpromise> = T extends Promise + ? K + : never;