From eb1a999c452ab46481ac77906f7fa317bdc423d8 Mon Sep 17 00:00:00 2001 From: MARCROCK22 Date: Tue, 2 Jul 2024 21:16:54 +0000 Subject: [PATCH 1/2] feat: handleCommand update --- src/commands/handle.ts | 66 +++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/src/commands/handle.ts b/src/commands/handle.ts index 995ff18..d79d7e0 100644 --- a/src/commands/handle.ts +++ b/src/commands/handle.ts @@ -461,20 +461,28 @@ export class HandleCommand { return false; } - async fetchChannel(_option: CommandOptionWithType, id: string) { - return this.client.channels.raw(id); + async fetchChannel(_option: CommandOptionWithType, query: string) { + const id = query.match(/[0-9]{17,19}/g)?.[0]; + if (id) return this.client.channels.raw(id); + return null; } - async fetchUser(_option: CommandOptionWithType, id: string) { - return this.client.users.raw(id); + async fetchUser(_option: CommandOptionWithType, query: string) { + const id = query.match(/[0-9]{17,19}/g)?.[0]; + if (id) return this.client.users.raw(id); + return null; } - async fetchMember(_option: CommandOptionWithType, id: string, guildId: string) { - return this.client.members.raw(guildId, id); + async fetchMember(_option: CommandOptionWithType, query: string, guildId: string) { + const id = query.match(/[0-9]{17,19}/g)?.[0]; + if (id) return this.client.members.raw(guildId, id); + return null; } - async fetchRole(_option: CommandOptionWithType, id: string, guildId?: string) { - return guildId ? (await this.client.roles.listRaw(guildId)).find(x => x.id === id) : undefined; + async fetchRole(_option: CommandOptionWithType, query: string, guildId?: string) { + const id = query.match(/[0-9]{17,19}/g)?.[0]; + if (id && guildId) return (await this.client.roles.listRaw(guildId)).find(x => x.id === id); + return null; } async runGlobalMiddlewares( @@ -585,11 +593,12 @@ export class HandleCommand { break; case ApplicationCommandOptionType.Channel: { - const rawId = + const rawQuery = message.content.match(/(?<=<#)[0-9]{17,19}(?=>)/g)?.find(x => args[i.name]?.includes(x)) || - args[i.name]?.match(/[0-9]{17,19}/g)?.[0]; - if (!rawId) continue; - const channel = (await this.client.cache.channels?.raw(rawId)) ?? (await this.fetchChannel(i, rawId)); + args[i.name]; + if (!rawQuery) continue; + const channel = + (await this.client.cache.channels?.raw(rawQuery)) ?? (await this.fetchChannel(i, rawQuery)); if (channel) { if ('channel_types' in i) { if (!(i as SeyfertChannelOption).channel_types!.includes(channel.type)) { @@ -603,15 +612,15 @@ export class HandleCommand { break; } } - value = rawId; + value = channel.id; //discord funny memoentnt!!!!!!!! - resolved.channels[rawId] = channel as APIInteractionDataResolvedChannel; + resolved.channels[channel.id] = channel as APIInteractionDataResolvedChannel; } } break; case ApplicationCommandOptionType.Mentionable: { - const matches = message.content.match(/<@[0-9]{17,19}(?=>)|<@&[0-9]{17,19}(?=>)/g) ?? []; + const matches = args[i.name]?.match(/<@[0-9]{17,19}(?=>)|<@&[0-9]{17,19}(?=>)/g) ?? []; for (const match of matches) { if (match.includes('&')) { const rawId = match.slice(3); @@ -640,36 +649,33 @@ export class HandleCommand { break; case ApplicationCommandOptionType.Role: { - const rawId = - message.mention_roles.find(x => args[i.name]?.includes(x)) || args[i.name]?.match(/[0-9]{17,19}/g)?.[0]; - if (!rawId) continue; + const rawQuery = message.mention_roles.find(x => args[i.name]?.includes(x)) || args[i.name]; + if (!rawQuery) continue; const role = - (await this.client.cache.roles?.raw(rawId)) ?? (await this.fetchRole(i, rawId, message.guild_id)); + (await this.client.cache.roles?.raw(rawQuery)) ?? (await this.fetchRole(i, rawQuery, message.guild_id)); if (role) { - value = rawId; - resolved.roles[rawId] = role; + value = role.id; + resolved.roles[role.id] = role; } } break; case ApplicationCommandOptionType.User: { - const rawId = - message.mentions.find(x => args[i.name]?.includes(x.id))?.id || - args[i.name]?.match(/[0-9]{17,19}/g)?.[0]; - if (!rawId) continue; + const rawQuery = message.mentions.find(x => args[i.name]?.includes(x.id))?.id || args[i.name]; + if (!rawQuery) continue; const raw = message.mentions.find(x => args[i.name]?.includes(x.id)) ?? - (await this.client.cache.users?.raw(rawId)) ?? - (await this.fetchUser(i, rawId)); + (await this.client.cache.users?.raw(rawQuery)) ?? + (await this.fetchUser(i, rawQuery)); if (raw) { value = raw.id; resolved.users[raw.id] = raw; if (message.guild_id) { const member = message.mentions.find(x => args[i.name]?.includes(x.id))?.member ?? - (await this.client.cache.members?.raw(rawId, message.guild_id)) ?? - (await this.fetchMember(i, rawId, message.guild_id)); - if (member) resolved.members[raw.id] = member; + (await this.client.cache.members?.raw(value, message.guild_id)) ?? + (await this.fetchMember(i, value, message.guild_id)); + if (member) resolved.members[value] = member; } } } From 9e0586986d9ecdd9b52006d64fef80a6c90b6696 Mon Sep 17 00:00:00 2001 From: MARCROCK22 Date: Tue, 2 Jul 2024 21:53:00 +0000 Subject: [PATCH 2/2] feat: cache raw methods --- src/cache/resources/bans.ts | 24 ++++++++++++++++++++++++ src/cache/resources/channels.ts | 16 ++++++++++++---- src/cache/resources/emojis.ts | 12 ++++++++++++ src/cache/resources/guilds.ts | 16 ++++++++++++---- src/cache/resources/members.ts | 24 ++++++++++++++++-------- src/cache/resources/messages.ts | 14 +++++++++++++- src/cache/resources/overwrites.ts | 10 +++++++++- src/cache/resources/roles.ts | 12 ++++++++---- src/cache/resources/stickers.ts | 12 ++++++++++++ src/cache/resources/threads.ts | 12 ++++++++++++ src/cache/resources/users.ts | 8 ++++---- src/cache/resources/voice-states.ts | 12 ++++++++++++ src/common/shorters/channels.ts | 8 +++++++- 13 files changed, 153 insertions(+), 27 deletions(-) diff --git a/src/cache/resources/bans.ts b/src/cache/resources/bans.ts index 1bbed63..9c22177 100644 --- a/src/cache/resources/bans.ts +++ b/src/cache/resources/bans.ts @@ -22,6 +22,10 @@ export class Bans extends GuildBasedResource | undefined> { + return super.get(id, guild); + } + override bulk(ids: string[], guild: string): ReturnCache { return fakePromise(super.bulk(ids, guild)).then( bans => @@ -33,6 +37,16 @@ export class Bans extends GuildBasedResource[]> { + return fakePromise(super.bulk(ids, guild)).then(bans => + bans + .map(rawBan => { + return rawBan; + }) + .filter(Boolean), + ); + } + override values(guild: string): ReturnCache { return fakePromise(super.values(guild)).then( bans => @@ -43,4 +57,14 @@ export class Bans extends GuildBasedResource[]> { + return fakePromise(super.values(guild)).then(bans => + bans + .map(rawBan => { + return rawBan; + }) + .filter(Boolean), + ); + } } diff --git a/src/cache/resources/channels.ts b/src/cache/resources/channels.ts index 51aee77..bc757b5 100644 --- a/src/cache/resources/channels.ts +++ b/src/cache/resources/channels.ts @@ -13,25 +13,33 @@ export class Channels extends GuildRelatedResource { return rest; } - raw(id: string): ReturnCache { - return super.get(id); - } - override get(id: string): ReturnCache { return fakePromise(super.get(id)).then(rawChannel => rawChannel ? channelFrom(rawChannel, this.client) : undefined, ); } + raw(id: string): ReturnCache | undefined> { + return super.get(id); + } + override bulk(ids: string[]): ReturnCache[]> { return fakePromise(super.bulk(ids)).then(channels => channels.map(rawChannel => channelFrom(rawChannel, this.client)), ); } + bulkRaw(ids: string[]): ReturnCache[]> { + return fakePromise(super.bulk(ids)).then(channels => channels.map(rawChannel => rawChannel)); + } + override values(guild: string): ReturnCache[]> { return fakePromise(super.values(guild)).then(channels => channels.map(rawChannel => channelFrom(rawChannel, this.client)), ); } + + valuesRaw(guild: string): ReturnCache[]> { + return fakePromise(super.values(guild)).then(channels => channels.map(rawChannel => rawChannel)); + } } diff --git a/src/cache/resources/emojis.ts b/src/cache/resources/emojis.ts index 0a446af..51e9966 100644 --- a/src/cache/resources/emojis.ts +++ b/src/cache/resources/emojis.ts @@ -18,15 +18,27 @@ export class Emojis extends GuildRelatedResource { ); } + raw(id: string): ReturnCache { + return super.get(id); + } + override bulk(ids: string[]): ReturnCache { return fakePromise(super.bulk(ids) as (APIEmoji & { id: string; guild_id: string })[]).then(emojis => emojis.map(rawEmoji => Transformers.GuildEmoji(this.client, rawEmoji, rawEmoji.guild_id)), ); } + bulkRaw(ids: string[]): ReturnCache<(APIEmoji & { id: string; guild_id: string })[]> { + return super.bulk(ids); + } + override values(guild: string): ReturnCache { return fakePromise(super.values(guild) as (APIEmoji & { id: string; guild_id: string })[]).then(emojis => emojis.map(rawEmoji => Transformers.GuildEmoji(this.client, rawEmoji, rawEmoji.guild_id)), ); } + + valuesRaw(guild: string): ReturnCache<(APIEmoji & { id: string; guild_id: string })[]> { + return super.values(guild); + } } diff --git a/src/cache/resources/guilds.ts b/src/cache/resources/guilds.ts index 7c74d4d..a350e09 100644 --- a/src/cache/resources/guilds.ts +++ b/src/cache/resources/guilds.ts @@ -12,28 +12,36 @@ export class Guilds extends BaseResource { - return super.get(id); - } - override get(id: string): ReturnCache | undefined> { return fakePromise(super.get(id)).then(guild => guild ? Transformers.Guild<'cached'>(this.client, guild) : undefined, ); } + raw(id: string): ReturnCache { + return super.get(id); + } + override bulk(ids: string[]): ReturnCache[]> { return fakePromise(super.bulk(ids) as APIGuild[]).then(guilds => guilds.map(x => Transformers.Guild<'cached'>(this.client, x)), ); } + bulkRaw(ids: string[]): ReturnCache { + return super.bulk(ids); + } + override values(): ReturnCache[]> { return fakePromise(super.values() as APIGuild[]).then(guilds => guilds.map(x => Transformers.Guild<'cached'>(this.client, x)), ); } + valuesRaw(): ReturnCache { + return super.values(); + } + override async remove(id: string) { const keysChannels = this.cache.channels?.keys(id) ?? []; await this.cache.adapter.bulkRemove( diff --git a/src/cache/resources/members.ts b/src/cache/resources/members.ts index 40cc464..419771b 100644 --- a/src/cache/resources/members.ts +++ b/src/cache/resources/members.ts @@ -16,6 +16,14 @@ export class Members extends GuildBasedResource { return rest; } + override get(id: string, guild: string): ReturnCache { + return fakePromise(super.get(id, guild)).then(rawMember => + fakePromise(this.client.cache.users?.raw(id)).then(user => + rawMember && user ? Transformers.GuildMember(this.client, rawMember, user, guild) : undefined, + ), + ); + } + raw(id: string, guild: string): ReturnCache { return fakePromise(super.get(id, guild) as Omit).then(rawMember => { return fakePromise(this.client.cache.users?.raw(id)).then(user => @@ -29,14 +37,6 @@ export class Members extends GuildBasedResource { }); } - override get(id: string, guild: string): ReturnCache { - return fakePromise(super.get(id, guild)).then(rawMember => - fakePromise(this.client.cache.users?.raw(id)).then(user => - rawMember && user ? Transformers.GuildMember(this.client, rawMember, user, guild) : undefined, - ), - ); - } - override bulk(ids: string[], guild: string): ReturnCache { return fakePromise(super.bulk(ids, guild)).then(members => fakePromise(this.client.cache.users?.bulkRaw(ids)).then( @@ -51,6 +51,10 @@ export class Members extends GuildBasedResource { ); } + bulkRaw(ids: string[], guild: string): ReturnCache[]> { + return super.bulk(ids, guild); + } + override values(guild: string): ReturnCache { return fakePromise(super.values(guild)).then(members => fakePromise(this.client.cache.users?.valuesRaw()).then( @@ -65,6 +69,10 @@ export class Members extends GuildBasedResource { ); } + valuesRaw(guild: string): ReturnCache[]> { + return super.values(guild); + } + override async set(memberId: string, guildId: string, data: any): Promise; override async set(memberId_dataArray: [string, any][], guildId: string): Promise; override async set(__keys: string | [string, any][], guild: string, data?: any) { diff --git a/src/cache/resources/messages.ts b/src/cache/resources/messages.ts index 4f707ae..fd6a94b 100644 --- a/src/cache/resources/messages.ts +++ b/src/cache/resources/messages.ts @@ -31,6 +31,10 @@ export class Messages extends GuildRelatedResource { }); } + raw(id: string): ReturnCache { + return super.get(id); + } + override bulk(ids: string[]): ReturnCache { return fakePromise(super.bulk(ids) as APIMessageResource[]).then( messages => @@ -48,6 +52,10 @@ export class Messages extends GuildRelatedResource { ); } + bulkRaw(ids: string[]): ReturnCache { + return super.bulk(ids); + } + override values(channel: string): ReturnCache { return fakePromise(super.values(channel) as APIMessageResource[]).then(messages => { const hashes: (string | undefined)[] = this.cache.users @@ -64,9 +72,13 @@ export class Messages extends GuildRelatedResource { }); } + valuesRaw(channel: string): ReturnCache { + return super.values(channel); + } + keys(channel: string) { return super.keys(channel); } } -export type APIMessageResource = Omit & { user_id?: string }; +export type APIMessageResource = Omit & { user_id?: string }; diff --git a/src/cache/resources/overwrites.ts b/src/cache/resources/overwrites.ts index 31d62b4..5fe5e73 100644 --- a/src/cache/resources/overwrites.ts +++ b/src/cache/resources/overwrites.ts @@ -19,7 +19,7 @@ export class Overwrites extends GuildRelatedResource { return data; } - raw(id: string): ReturnCache<(APIOverwrite & { guild_id: string })[]> { + raw(id: string): ReturnCache<(APIOverwrite & { guild_id: string })[] | undefined> { return super.get(id); } @@ -59,6 +59,10 @@ export class Overwrites extends GuildRelatedResource { ); } + valuesRaw(guild: string): ReturnCache<(APIOverwrite & { guild_id: string })[][]> { + return super.values(guild); + } + override bulk( ids: string[], ): ReturnCache<{ type: number; id: string; deny: PermissionsBitField; allow: PermissionsBitField }[][]> { @@ -74,4 +78,8 @@ export class Overwrites extends GuildRelatedResource { ), ); } + + bulkRaw(ids: string[]): ReturnCache<(APIOverwrite & { guild_id: string })[][]> { + return super.bulk(ids); + } } diff --git a/src/cache/resources/roles.ts b/src/cache/resources/roles.ts index a96aa5f..afc568d 100644 --- a/src/cache/resources/roles.ts +++ b/src/cache/resources/roles.ts @@ -12,22 +12,26 @@ export class Roles extends GuildRelatedResource { return true; } - raw(id: string): ReturnCache { - return super.get(id); - } - override get(id: string): ReturnCache { return fakePromise(super.get(id)).then(rawRole => rawRole ? Transformers.GuildRole(this.client, rawRole, rawRole.guild_id) : undefined, ); } + raw(id: string): ReturnCache { + return super.get(id); + } + override bulk(ids: string[]): ReturnCache { return fakePromise(super.bulk(ids)).then(roles => roles.map(rawRole => Transformers.GuildRole(this.client, rawRole, rawRole.guild_id)), ); } + bulkRaw(ids: string[]): ReturnCache { + return super.bulk(ids); + } + override values(guild: string): ReturnCache { return fakePromise(super.values(guild)).then(roles => roles.map(rawRole => Transformers.GuildRole(this.client, rawRole, rawRole.guild_id)), diff --git a/src/cache/resources/stickers.ts b/src/cache/resources/stickers.ts index 0449842..1b2571a 100644 --- a/src/cache/resources/stickers.ts +++ b/src/cache/resources/stickers.ts @@ -18,15 +18,27 @@ export class Stickers extends GuildRelatedResource { ); } + raw(id: string): ReturnCache { + return super.get(id); + } + override bulk(ids: string[]): ReturnCache { return fakePromise(super.bulk(ids) as APISticker[]).then(emojis => emojis.map(rawSticker => Transformers.Sticker(this.client, rawSticker)), ); } + bulkRaw(ids: string[]): ReturnCache { + return super.bulk(ids); + } + override values(guild: string): ReturnCache { return fakePromise(super.values(guild) as APISticker[]).then(emojis => emojis.map(rawSticker => Transformers.Sticker(this.client, rawSticker)), ); } + + valuesRaw(guild: string): ReturnCache { + return super.values(guild); + } } diff --git a/src/cache/resources/threads.ts b/src/cache/resources/threads.ts index 29a9a26..ec1f1e9 100644 --- a/src/cache/resources/threads.ts +++ b/src/cache/resources/threads.ts @@ -18,15 +18,27 @@ export class Threads extends GuildRelatedResource { ); } + raw(id: string): ReturnCache { + return super.get(id); + } + override bulk(ids: string[]): ReturnCache { return fakePromise(super.bulk(ids) as APIThreadChannel[]).then(threads => threads.map(rawThread => Transformers.ThreadChannel(this.client, rawThread)), ); } + bulkRaw(ids: string[]): ReturnCache { + return super.bulk(ids); + } + override values(guild: string): ReturnCache { return fakePromise(super.values(guild) as APIThreadChannel[]).then(threads => threads.map(rawThread => Transformers.ThreadChannel(this.client, rawThread)), ); } + + valuesRaw(guild: string): ReturnCache { + return super.values(guild); + } } diff --git a/src/cache/resources/users.ts b/src/cache/resources/users.ts index 03b2b89..55b47c9 100644 --- a/src/cache/resources/users.ts +++ b/src/cache/resources/users.ts @@ -12,14 +12,14 @@ export class Users extends BaseResource { return true; } - raw(id: string): ReturnCache { - return super.get(id); - } - override get(id: string): ReturnCache { return fakePromise(super.get(id)).then(rawUser => (rawUser ? Transformers.User(this.client, rawUser) : undefined)); } + raw(id: string): ReturnCache { + return super.get(id); + } + override bulk(ids: string[]): ReturnCache { return fakePromise(super.bulk(ids) as APIUser[]).then(users => users.map(rawUser => Transformers.User(this.client, rawUser)), diff --git a/src/cache/resources/voice-states.ts b/src/cache/resources/voice-states.ts index 5bace4a..f9f0265 100644 --- a/src/cache/resources/voice-states.ts +++ b/src/cache/resources/voice-states.ts @@ -23,6 +23,10 @@ export class VoiceStates extends GuildBasedResource { ); } + raw(memberId: string, guildId: string): ReturnCache { + return super.get(memberId, guildId); + } + override bulk(ids: string[], guild: string): ReturnCache { return fakePromise(super.bulk(ids, guild)).then( states => @@ -32,11 +36,19 @@ export class VoiceStates extends GuildBasedResource { ); } + bulkRaw(ids: string[], guild: string): ReturnCache { + return super.bulk(ids, guild); + } + override values(guildId: string): ReturnCache { return fakePromise(super.values(guildId)).then(states => states.map(state => Transformers.VoiceState(this.client, state)), ); } + + valuesRaw(guildId: string): ReturnCache { + return super.values(guildId); + } } export type VoiceStateResource = Omit & { guild_id: string }; diff --git a/src/common/shorters/channels.ts b/src/common/shorters/channels.ts index b2cee8f..5fd93e5 100644 --- a/src/common/shorters/channels.ts +++ b/src/common/shorters/channels.ts @@ -5,6 +5,8 @@ import { type RESTPatchAPIChannelJSONBody, type RESTPostAPIChannelThreadsJSONBody, type RESTPostAPIGuildForumThreadsJSONBody, + type ChannelType, + type APIGuildChannel, } from 'discord-api-types/v10'; import { BaseChannel, type GuildRole, type GuildMember } from '../../structures'; import channelFrom, { type AllChannels } from '../../structures/channels'; @@ -29,7 +31,11 @@ export class ChannelShorter extends BaseShorter { let channel; if (!force) { channel = await this.client.cache.channels?.raw(id); - if (channel) return channel; + const overwrites = await this.client.cache.overwrites?.raw(id); + if (channel) { + if (overwrites) (channel as APIGuildChannel).permission_overwrites = overwrites; + return channel as APIChannel; + } } channel = await this.client.proxy.channels(id).get();