From d920933dc5b3c518754f526a9864582fc2c92a43 Mon Sep 17 00:00:00 2001 From: Vlad Frangu Date: Sat, 26 Apr 2025 02:54:17 +0300 Subject: [PATCH] fix(GuildAuditLogEntry): fix some incorrect types and runtime logic (#10849) * fix(GuildAuditLogEntry): fix some incorrect types and runtime logic * chore: bite me --- .../src/structures/GuildAuditLogsEntry.js | 18 +++++-- packages/discord.js/typings/index.d.ts | 51 +++++++++---------- packages/discord.js/typings/index.test-d.ts | 13 +++-- 3 files changed, 46 insertions(+), 36 deletions(-) diff --git a/packages/discord.js/src/structures/GuildAuditLogsEntry.js b/packages/discord.js/src/structures/GuildAuditLogsEntry.js index 09a83122f..2f72eabc0 100644 --- a/packages/discord.js/src/structures/GuildAuditLogsEntry.js +++ b/packages/discord.js/src/structures/GuildAuditLogsEntry.js @@ -89,6 +89,7 @@ const Targets = { * * GuildOnboarding * * GuildOnboardingPrompt * * SoundboardSound + * * AutoModeration * * Unknown * @typedef {string} AuditLogTargetType */ @@ -202,7 +203,6 @@ class GuildAuditLogsEntry { case AuditLogEvent.MemberMove: case AuditLogEvent.MessageDelete: - case AuditLogEvent.MessageBulkDelete: this.extra = { channel: guild.channels.cache.get(data.options.channel_id) ?? { id: data.options.channel_id }, count: Number(data.options.count), @@ -217,6 +217,7 @@ class GuildAuditLogsEntry { }; break; + case AuditLogEvent.MessageBulkDelete: case AuditLogEvent.MemberDisconnect: this.extra = { count: Number(data.options.count), @@ -368,12 +369,14 @@ class GuildAuditLogsEntry { data.action_type === AuditLogEvent.OnboardingPromptCreate ? new GuildOnboardingPrompt(guild.client, changesReduce(this.changes, { id: data.target_id }), guild.id) : changesReduce(this.changes, { id: data.target_id }); - } else if (targetType === Targets.GuildOnboarding) { - this.target = changesReduce(this.changes, { id: data.target_id }); + } else if (targetType === Targets.Role) { + this.target = guild.roles.cache.get(data.target_id) ?? { id: data.target_id }; + } else if (targetType === Targets.Emoji) { + this.target = guild.emojis.cache.get(data.target_id) ?? { id: data.target_id }; } else if (targetType === Targets.SoundboardSound) { this.target = guild.soundboardSounds.cache.get(data.target_id) ?? { id: data.target_id }; } else if (data.target_id) { - this.target = guild[`${targetType.toLowerCase()}s`]?.cache.get(data.target_id) ?? { id: data.target_id }; + this.target = { id: data.target_id }; } } @@ -398,7 +401,8 @@ class GuildAuditLogsEntry { if (target < 120) return Targets.Thread; if (target < 130) return Targets.ApplicationCommand; if (target < 140) return Targets.SoundboardSound; - if (target >= 143 && target < 150) return Targets.AutoModeration; + if (target < 143) return Targets.AutoModeration; + if (target < 146) return Targets.User; if (target >= 163 && target <= 165) return Targets.GuildOnboardingPrompt; if (target >= 160 && target < 170) return Targets.GuildOnboarding; return Targets.Unknown; @@ -483,7 +487,11 @@ class GuildAuditLogsEntry { AuditLogEvent.ThreadUpdate, AuditLogEvent.SoundboardSoundUpdate, AuditLogEvent.ApplicationCommandPermissionUpdate, + AuditLogEvent.SoundboardSoundUpdate, AuditLogEvent.AutoModerationRuleUpdate, + AuditLogEvent.AutoModerationBlockMessage, + AuditLogEvent.AutoModerationFlagToChannel, + AuditLogEvent.AutoModerationUserCommunicationDisabled, AuditLogEvent.OnboardingPromptUpdate, AuditLogEvent.OnboardingUpdate, ].includes(action) diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index f2184f678..17ff0aa40 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -1607,9 +1607,9 @@ export class Guild extends AnonymousGuild { public editOnboarding(options: GuildOnboardingEditOptions): Promise; public editWelcomeScreen(options: WelcomeScreenEditOptions): Promise; public equals(guild: Guild): boolean; - public fetchAuditLogs( + public fetchAuditLogs( options?: GuildAuditLogsFetchOptions, - ): Promise>; + ): Promise>; public fetchIntegrations(): Promise>; public fetchOnboarding(): Promise; public fetchOwner(options?: BaseFetchOptions): Promise; @@ -1666,7 +1666,7 @@ export class FileComponent extends Component { public get spoiler(): boolean; } -export class GuildAuditLogs { +export class GuildAuditLogs { private constructor(guild: Guild, data: RawGuildAuditLogData); private applicationCommands: Collection; private webhooks: Collection>; @@ -1678,33 +1678,30 @@ export class GuildAuditLogs { private constructor(guild: Guild, data: RawGuildAuditLogEntryData, logs?: GuildAuditLogs); public static Targets: GuildAuditLogsTargets; - public action: TResolvedType; + public action: TAction; public actionType: TActionType; public changes: AuditLogChange[]; public get createdAt(): Date; public get createdTimestamp(): number; public executorId: Snowflake | null; - public executor: User | null; - public extra: TResolvedType extends keyof GuildAuditLogsEntryExtraField - ? GuildAuditLogsEntryExtraField[TResolvedType] - : null; + public executor: User | PartialUser | null; + public extra: TAction extends keyof GuildAuditLogsEntryExtraField ? GuildAuditLogsEntryExtraField[TAction] : null; public id: Snowflake; public reason: string | null; public targetId: Snowflake | null; - public target: TTargetType extends keyof GuildAuditLogsEntryTargetField - ? GuildAuditLogsEntryTargetField[TTargetType] - : Role | GuildEmoji | { id: Snowflake } | null; + public target: TTargetType extends keyof GuildAuditLogsEntryTargetField + ? GuildAuditLogsEntryTargetField[TTargetType] + : { id: Snowflake | undefined; [x: string]: unknown } | null; public targetType: TTargetType; public static actionType(action: AuditLogEvent): GuildAuditLogsActionType; public static targetType(target: AuditLogEvent): GuildAuditLogsTargetType; @@ -6346,9 +6343,9 @@ interface GuildAuditLogsTypes { [AuditLogEvent.AutoModerationRuleCreate]: ['AutoModeration', 'Create']; [AuditLogEvent.AutoModerationRuleUpdate]: ['AutoModeration', 'Update']; [AuditLogEvent.AutoModerationRuleDelete]: ['AutoModeration', 'Delete']; - [AuditLogEvent.AutoModerationBlockMessage]: ['AutoModeration', 'Create']; - [AuditLogEvent.AutoModerationFlagToChannel]: ['AutoModeration', 'Create']; - [AuditLogEvent.AutoModerationUserCommunicationDisabled]: ['AutoModeration', 'Create']; + [AuditLogEvent.AutoModerationBlockMessage]: ['User', 'Update']; + [AuditLogEvent.AutoModerationFlagToChannel]: ['User', 'Update']; + [AuditLogEvent.AutoModerationUserCommunicationDisabled]: ['User', 'Update']; [AuditLogEvent.OnboardingPromptCreate]: ['GuildOnboardingPrompt', 'Create']; [AuditLogEvent.OnboardingPromptUpdate]: ['GuildOnboardingPrompt', 'Update']; [AuditLogEvent.OnboardingPromptDelete]: ['GuildOnboardingPrompt', 'Delete']; @@ -6364,7 +6361,7 @@ export interface GuildAuditLogsEntryExtraField { [AuditLogEvent.MemberPrune]: { removed: number; days: number }; [AuditLogEvent.MemberMove]: { channel: VoiceBasedChannel | { id: Snowflake }; count: number }; [AuditLogEvent.MessageDelete]: { channel: GuildTextBasedChannel | { id: Snowflake }; count: number }; - [AuditLogEvent.MessageBulkDelete]: { channel: GuildTextBasedChannel | { id: Snowflake }; count: number }; + [AuditLogEvent.MessageBulkDelete]: { count: number }; [AuditLogEvent.MessagePin]: { channel: GuildTextBasedChannel | { id: Snowflake }; messageId: Snowflake }; [AuditLogEvent.MessageUnpin]: { channel: GuildTextBasedChannel | { id: Snowflake }; messageId: Snowflake }; [AuditLogEvent.MemberDisconnect]: { count: number }; @@ -6404,12 +6401,14 @@ export interface GuildAuditLogsEntryExtraField { }; } -export interface GuildAuditLogsEntryTargetField { - User: User | null; +export interface GuildAuditLogsEntryTargetField { + User: User | PartialUser | null; Guild: Guild; Webhook: Webhook; Invite: Invite; - Message: TActionType extends AuditLogEvent.MessageBulkDelete ? Guild | { id: Snowflake } : User; + Emoji: GuildEmoji | { id: Snowflake }; + Role: Role | { id: Snowflake }; + Message: TAction extends AuditLogEvent.MessageBulkDelete ? GuildTextBasedChannel | { id: Snowflake } : User | null; Integration: Integration; Channel: NonThreadGuildBasedChannel | { id: Snowflake; [x: string]: unknown }; Thread: AnyThreadChannel | { id: Snowflake; [x: string]: unknown }; @@ -6418,8 +6417,8 @@ export interface GuildAuditLogsEntryTargetField { @@ -6432,10 +6431,10 @@ export interface GuildAuditLogsFetchOptions>>( guild.fetchAuditLogs({ type: AuditLogEvent.IntegrationUpdate }), ); -expectType>>(guild.fetchAuditLogs({ type: null })); +expectType>>(guild.fetchAuditLogs({ type: null })); expectType>>(guild.fetchAuditLogs()); expectType | undefined>>( @@ -2282,10 +2282,10 @@ expectAssignable al.entries.first()), ); -expectType | undefined>>( +expectType | undefined>>( guild.fetchAuditLogs({ type: null }).then(al => al.entries.first()), ); -expectType | undefined>>( +expectType | undefined>>( guild.fetchAuditLogs().then(al => al.entries.first()), ); @@ -2304,15 +2304,18 @@ expectType al.entries.first()?.extra), ); -expectType>( +expectType>( guild.fetchAuditLogs({ type: AuditLogEvent.MemberKick }).then(al => al.entries.first()?.target), ); expectType>( guild.fetchAuditLogs({ type: AuditLogEvent.StageInstanceCreate }).then(al => al.entries.first()?.target), ); -expectType>( +expectType>( guild.fetchAuditLogs({ type: AuditLogEvent.MessageDelete }).then(al => al.entries.first()?.target), ); +expectType>( + guild.fetchAuditLogs({ type: AuditLogEvent.MessageBulkDelete }).then(al => al.entries.first()?.target), +); declare const AuditLogChange: AuditLogChange; // @ts-expect-error