fix(GuildAuditLogEntry): fix some incorrect types and runtime logic (#10849)

* fix(GuildAuditLogEntry): fix some incorrect types and runtime logic

* chore: bite me
This commit is contained in:
Vlad Frangu
2025-04-26 02:54:17 +03:00
committed by GitHub
parent 2d817df3b5
commit d920933dc5
3 changed files with 46 additions and 36 deletions

View File

@@ -89,6 +89,7 @@ const Targets = {
* * GuildOnboarding * * GuildOnboarding
* * GuildOnboardingPrompt * * GuildOnboardingPrompt
* * SoundboardSound * * SoundboardSound
* * AutoModeration
* * Unknown * * Unknown
* @typedef {string} AuditLogTargetType * @typedef {string} AuditLogTargetType
*/ */
@@ -202,7 +203,6 @@ class GuildAuditLogsEntry {
case AuditLogEvent.MemberMove: case AuditLogEvent.MemberMove:
case AuditLogEvent.MessageDelete: case AuditLogEvent.MessageDelete:
case AuditLogEvent.MessageBulkDelete:
this.extra = { this.extra = {
channel: guild.channels.cache.get(data.options.channel_id) ?? { id: data.options.channel_id }, channel: guild.channels.cache.get(data.options.channel_id) ?? { id: data.options.channel_id },
count: Number(data.options.count), count: Number(data.options.count),
@@ -217,6 +217,7 @@ class GuildAuditLogsEntry {
}; };
break; break;
case AuditLogEvent.MessageBulkDelete:
case AuditLogEvent.MemberDisconnect: case AuditLogEvent.MemberDisconnect:
this.extra = { this.extra = {
count: Number(data.options.count), count: Number(data.options.count),
@@ -368,12 +369,14 @@ class GuildAuditLogsEntry {
data.action_type === AuditLogEvent.OnboardingPromptCreate data.action_type === AuditLogEvent.OnboardingPromptCreate
? new GuildOnboardingPrompt(guild.client, changesReduce(this.changes, { id: data.target_id }), guild.id) ? new GuildOnboardingPrompt(guild.client, changesReduce(this.changes, { id: data.target_id }), guild.id)
: changesReduce(this.changes, { id: data.target_id }); : changesReduce(this.changes, { id: data.target_id });
} else if (targetType === Targets.GuildOnboarding) { } else if (targetType === Targets.Role) {
this.target = changesReduce(this.changes, { id: data.target_id }); 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) { } else if (targetType === Targets.SoundboardSound) {
this.target = guild.soundboardSounds.cache.get(data.target_id) ?? { id: data.target_id }; this.target = guild.soundboardSounds.cache.get(data.target_id) ?? { id: data.target_id };
} else if (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 < 120) return Targets.Thread;
if (target < 130) return Targets.ApplicationCommand; if (target < 130) return Targets.ApplicationCommand;
if (target < 140) return Targets.SoundboardSound; 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 >= 163 && target <= 165) return Targets.GuildOnboardingPrompt;
if (target >= 160 && target < 170) return Targets.GuildOnboarding; if (target >= 160 && target < 170) return Targets.GuildOnboarding;
return Targets.Unknown; return Targets.Unknown;
@@ -483,7 +487,11 @@ class GuildAuditLogsEntry {
AuditLogEvent.ThreadUpdate, AuditLogEvent.ThreadUpdate,
AuditLogEvent.SoundboardSoundUpdate, AuditLogEvent.SoundboardSoundUpdate,
AuditLogEvent.ApplicationCommandPermissionUpdate, AuditLogEvent.ApplicationCommandPermissionUpdate,
AuditLogEvent.SoundboardSoundUpdate,
AuditLogEvent.AutoModerationRuleUpdate, AuditLogEvent.AutoModerationRuleUpdate,
AuditLogEvent.AutoModerationBlockMessage,
AuditLogEvent.AutoModerationFlagToChannel,
AuditLogEvent.AutoModerationUserCommunicationDisabled,
AuditLogEvent.OnboardingPromptUpdate, AuditLogEvent.OnboardingPromptUpdate,
AuditLogEvent.OnboardingUpdate, AuditLogEvent.OnboardingUpdate,
].includes(action) ].includes(action)

View File

@@ -1607,9 +1607,9 @@ export class Guild extends AnonymousGuild {
public editOnboarding(options: GuildOnboardingEditOptions): Promise<GuildOnboarding>; public editOnboarding(options: GuildOnboardingEditOptions): Promise<GuildOnboarding>;
public editWelcomeScreen(options: WelcomeScreenEditOptions): Promise<WelcomeScreen>; public editWelcomeScreen(options: WelcomeScreenEditOptions): Promise<WelcomeScreen>;
public equals(guild: Guild): boolean; public equals(guild: Guild): boolean;
public fetchAuditLogs<Event extends GuildAuditLogsResolvable = null>( public fetchAuditLogs<Event extends GuildAuditLogsResolvable = AuditLogEvent>(
options?: GuildAuditLogsFetchOptions<Event>, options?: GuildAuditLogsFetchOptions<Event>,
): Promise<GuildAuditLogs<Event>>; ): Promise<GuildAuditLogs<Event extends null ? AuditLogEvent : Event>>;
public fetchIntegrations(): Promise<Collection<Snowflake | string, Integration>>; public fetchIntegrations(): Promise<Collection<Snowflake | string, Integration>>;
public fetchOnboarding(): Promise<GuildOnboarding>; public fetchOnboarding(): Promise<GuildOnboarding>;
public fetchOwner(options?: BaseFetchOptions): Promise<GuildMember>; public fetchOwner(options?: BaseFetchOptions): Promise<GuildMember>;
@@ -1666,7 +1666,7 @@ export class FileComponent extends Component<APIFileComponent> {
public get spoiler(): boolean; public get spoiler(): boolean;
} }
export class GuildAuditLogs<Event extends GuildAuditLogsResolvable = AuditLogEvent> { export class GuildAuditLogs<Event extends AuditLogEvent = AuditLogEvent> {
private constructor(guild: Guild, data: RawGuildAuditLogData); private constructor(guild: Guild, data: RawGuildAuditLogData);
private applicationCommands: Collection<Snowflake, ApplicationCommand>; private applicationCommands: Collection<Snowflake, ApplicationCommand>;
private webhooks: Collection<Snowflake, Webhook<WebhookType.ChannelFollower | WebhookType.Incoming>>; private webhooks: Collection<Snowflake, Webhook<WebhookType.ChannelFollower | WebhookType.Incoming>>;
@@ -1678,33 +1678,30 @@ export class GuildAuditLogs<Event extends GuildAuditLogsResolvable = AuditLogEve
} }
export class GuildAuditLogsEntry< export class GuildAuditLogsEntry<
TAction extends GuildAuditLogsResolvable = AuditLogEvent, TAction extends AuditLogEvent = AuditLogEvent,
TActionType extends GuildAuditLogsActionType = TAction extends keyof GuildAuditLogsTypes TActionType extends GuildAuditLogsActionType = TAction extends keyof GuildAuditLogsTypes
? GuildAuditLogsTypes[TAction][1] ? GuildAuditLogsTypes[TAction][1]
: GuildAuditLogsActionType, : 'All',
TTargetType extends GuildAuditLogsTargetType = TAction extends keyof GuildAuditLogsTypes TTargetType extends GuildAuditLogsTargetType = TAction extends keyof GuildAuditLogsTypes
? GuildAuditLogsTypes[TAction][0] ? GuildAuditLogsTypes[TAction][0]
: GuildAuditLogsTargetType, : 'Unknown',
TResolvedType = TAction extends null ? AuditLogEvent : TAction,
> { > {
private constructor(guild: Guild, data: RawGuildAuditLogEntryData, logs?: GuildAuditLogs); private constructor(guild: Guild, data: RawGuildAuditLogEntryData, logs?: GuildAuditLogs);
public static Targets: GuildAuditLogsTargets; public static Targets: GuildAuditLogsTargets;
public action: TResolvedType; public action: TAction;
public actionType: TActionType; public actionType: TActionType;
public changes: AuditLogChange[]; public changes: AuditLogChange[];
public get createdAt(): Date; public get createdAt(): Date;
public get createdTimestamp(): number; public get createdTimestamp(): number;
public executorId: Snowflake | null; public executorId: Snowflake | null;
public executor: User | null; public executor: User | PartialUser | null;
public extra: TResolvedType extends keyof GuildAuditLogsEntryExtraField public extra: TAction extends keyof GuildAuditLogsEntryExtraField ? GuildAuditLogsEntryExtraField[TAction] : null;
? GuildAuditLogsEntryExtraField[TResolvedType]
: null;
public id: Snowflake; public id: Snowflake;
public reason: string | null; public reason: string | null;
public targetId: Snowflake | null; public targetId: Snowflake | null;
public target: TTargetType extends keyof GuildAuditLogsEntryTargetField<TActionType> public target: TTargetType extends keyof GuildAuditLogsEntryTargetField<TAction>
? GuildAuditLogsEntryTargetField<TActionType>[TTargetType] ? GuildAuditLogsEntryTargetField<TAction>[TTargetType]
: Role | GuildEmoji | { id: Snowflake } | null; : { id: Snowflake | undefined; [x: string]: unknown } | null;
public targetType: TTargetType; public targetType: TTargetType;
public static actionType(action: AuditLogEvent): GuildAuditLogsActionType; public static actionType(action: AuditLogEvent): GuildAuditLogsActionType;
public static targetType(target: AuditLogEvent): GuildAuditLogsTargetType; public static targetType(target: AuditLogEvent): GuildAuditLogsTargetType;
@@ -6346,9 +6343,9 @@ interface GuildAuditLogsTypes {
[AuditLogEvent.AutoModerationRuleCreate]: ['AutoModeration', 'Create']; [AuditLogEvent.AutoModerationRuleCreate]: ['AutoModeration', 'Create'];
[AuditLogEvent.AutoModerationRuleUpdate]: ['AutoModeration', 'Update']; [AuditLogEvent.AutoModerationRuleUpdate]: ['AutoModeration', 'Update'];
[AuditLogEvent.AutoModerationRuleDelete]: ['AutoModeration', 'Delete']; [AuditLogEvent.AutoModerationRuleDelete]: ['AutoModeration', 'Delete'];
[AuditLogEvent.AutoModerationBlockMessage]: ['AutoModeration', 'Create']; [AuditLogEvent.AutoModerationBlockMessage]: ['User', 'Update'];
[AuditLogEvent.AutoModerationFlagToChannel]: ['AutoModeration', 'Create']; [AuditLogEvent.AutoModerationFlagToChannel]: ['User', 'Update'];
[AuditLogEvent.AutoModerationUserCommunicationDisabled]: ['AutoModeration', 'Create']; [AuditLogEvent.AutoModerationUserCommunicationDisabled]: ['User', 'Update'];
[AuditLogEvent.OnboardingPromptCreate]: ['GuildOnboardingPrompt', 'Create']; [AuditLogEvent.OnboardingPromptCreate]: ['GuildOnboardingPrompt', 'Create'];
[AuditLogEvent.OnboardingPromptUpdate]: ['GuildOnboardingPrompt', 'Update']; [AuditLogEvent.OnboardingPromptUpdate]: ['GuildOnboardingPrompt', 'Update'];
[AuditLogEvent.OnboardingPromptDelete]: ['GuildOnboardingPrompt', 'Delete']; [AuditLogEvent.OnboardingPromptDelete]: ['GuildOnboardingPrompt', 'Delete'];
@@ -6364,7 +6361,7 @@ export interface GuildAuditLogsEntryExtraField {
[AuditLogEvent.MemberPrune]: { removed: number; days: number }; [AuditLogEvent.MemberPrune]: { removed: number; days: number };
[AuditLogEvent.MemberMove]: { channel: VoiceBasedChannel | { id: Snowflake }; count: number }; [AuditLogEvent.MemberMove]: { channel: VoiceBasedChannel | { id: Snowflake }; count: number };
[AuditLogEvent.MessageDelete]: { channel: GuildTextBasedChannel | { 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.MessagePin]: { channel: GuildTextBasedChannel | { id: Snowflake }; messageId: Snowflake };
[AuditLogEvent.MessageUnpin]: { channel: GuildTextBasedChannel | { id: Snowflake }; messageId: Snowflake }; [AuditLogEvent.MessageUnpin]: { channel: GuildTextBasedChannel | { id: Snowflake }; messageId: Snowflake };
[AuditLogEvent.MemberDisconnect]: { count: number }; [AuditLogEvent.MemberDisconnect]: { count: number };
@@ -6404,12 +6401,14 @@ export interface GuildAuditLogsEntryExtraField {
}; };
} }
export interface GuildAuditLogsEntryTargetField<TActionType extends GuildAuditLogsActionType> { export interface GuildAuditLogsEntryTargetField<TAction extends AuditLogEvent> {
User: User | null; User: User | PartialUser | null;
Guild: Guild; Guild: Guild;
Webhook: Webhook<WebhookType.ChannelFollower | WebhookType.Incoming>; Webhook: Webhook<WebhookType.ChannelFollower | WebhookType.Incoming>;
Invite: Invite; 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; Integration: Integration;
Channel: NonThreadGuildBasedChannel | { id: Snowflake; [x: string]: unknown }; Channel: NonThreadGuildBasedChannel | { id: Snowflake; [x: string]: unknown };
Thread: AnyThreadChannel | { id: Snowflake; [x: string]: unknown }; Thread: AnyThreadChannel | { id: Snowflake; [x: string]: unknown };
@@ -6418,8 +6417,8 @@ export interface GuildAuditLogsEntryTargetField<TActionType extends GuildAuditLo
GuildScheduledEvent: GuildScheduledEvent; GuildScheduledEvent: GuildScheduledEvent;
ApplicationCommand: ApplicationCommand | { id: Snowflake }; ApplicationCommand: ApplicationCommand | { id: Snowflake };
AutoModerationRule: AutoModerationRule; AutoModerationRule: AutoModerationRule;
GuildOnboardingPrompt: GuildOnboardingPrompt; GuildOnboardingPrompt: GuildOnboardingPrompt | { id: Snowflake; [x: string]: unknown };
SoundboardSound: { id: Snowflake }; SoundboardSound: SoundboardSound | { id: Snowflake };
} }
export interface GuildAuditLogsFetchOptions<Event extends GuildAuditLogsResolvable> { export interface GuildAuditLogsFetchOptions<Event extends GuildAuditLogsResolvable> {
@@ -6432,10 +6431,10 @@ export interface GuildAuditLogsFetchOptions<Event extends GuildAuditLogsResolvab
export type GuildAuditLogsResolvable = AuditLogEvent | null; export type GuildAuditLogsResolvable = AuditLogEvent | null;
export type GuildAuditLogsTargetType = GuildAuditLogsTypes[keyof GuildAuditLogsTypes][0] | 'All' | 'Unknown'; export type GuildAuditLogsTargetType = GuildAuditLogsTypes[keyof GuildAuditLogsTypes][0] | 'Unknown';
export type GuildAuditLogsTargets = { export type GuildAuditLogsTargets = {
[Key in GuildAuditLogsTargetType]: GuildAuditLogsTargetType; [Key in GuildAuditLogsTargetType]: Key;
}; };
export type GuildBanResolvable = GuildBan | UserResolvable; export type GuildBanResolvable = GuildBan | UserResolvable;

View File

@@ -2272,7 +2272,7 @@ expectType<Promise<GuildAuditLogs<AuditLogEvent.IntegrationUpdate>>>(
guild.fetchAuditLogs({ type: AuditLogEvent.IntegrationUpdate }), guild.fetchAuditLogs({ type: AuditLogEvent.IntegrationUpdate }),
); );
expectType<Promise<GuildAuditLogs<null>>>(guild.fetchAuditLogs({ type: null })); expectType<Promise<GuildAuditLogs<AuditLogEvent>>>(guild.fetchAuditLogs({ type: null }));
expectType<Promise<GuildAuditLogs<AuditLogEvent>>>(guild.fetchAuditLogs()); expectType<Promise<GuildAuditLogs<AuditLogEvent>>>(guild.fetchAuditLogs());
expectType<Promise<GuildAuditLogsEntry<AuditLogEvent.MemberKick, 'Delete', 'User'> | undefined>>( expectType<Promise<GuildAuditLogsEntry<AuditLogEvent.MemberKick, 'Delete', 'User'> | undefined>>(
@@ -2282,10 +2282,10 @@ expectAssignable<Promise<GuildAuditLogsEntry<AuditLogEvent.MemberKick, 'Delete',
guild.fetchAuditLogs({ type: AuditLogEvent.MemberKick }).then(al => al.entries.first()), guild.fetchAuditLogs({ type: AuditLogEvent.MemberKick }).then(al => al.entries.first()),
); );
expectType<Promise<GuildAuditLogsEntry<null, GuildAuditLogsActionType, GuildAuditLogsTargetType> | undefined>>( expectType<Promise<GuildAuditLogsEntry<AuditLogEvent, GuildAuditLogsActionType, GuildAuditLogsTargetType> | undefined>>(
guild.fetchAuditLogs({ type: null }).then(al => al.entries.first()), guild.fetchAuditLogs({ type: null }).then(al => al.entries.first()),
); );
expectType<Promise<GuildAuditLogsEntry<null, GuildAuditLogsActionType, GuildAuditLogsTargetType> | undefined>>( expectType<Promise<GuildAuditLogsEntry<AuditLogEvent, GuildAuditLogsActionType, GuildAuditLogsTargetType> | undefined>>(
guild.fetchAuditLogs().then(al => al.entries.first()), guild.fetchAuditLogs().then(al => al.entries.first()),
); );
@@ -2304,15 +2304,18 @@ expectType<Promise<{ channel: GuildTextBasedChannel | { id: Snowflake }; count:
guild.fetchAuditLogs({ type: AuditLogEvent.MessageDelete }).then(al => al.entries.first()?.extra), guild.fetchAuditLogs({ type: AuditLogEvent.MessageDelete }).then(al => al.entries.first()?.extra),
); );
expectType<Promise<User | null | undefined>>( expectType<Promise<User | PartialUser | null | undefined>>(
guild.fetchAuditLogs({ type: AuditLogEvent.MemberKick }).then(al => al.entries.first()?.target), guild.fetchAuditLogs({ type: AuditLogEvent.MemberKick }).then(al => al.entries.first()?.target),
); );
expectType<Promise<StageInstance | undefined>>( expectType<Promise<StageInstance | undefined>>(
guild.fetchAuditLogs({ type: AuditLogEvent.StageInstanceCreate }).then(al => al.entries.first()?.target), guild.fetchAuditLogs({ type: AuditLogEvent.StageInstanceCreate }).then(al => al.entries.first()?.target),
); );
expectType<Promise<User | undefined>>( expectType<Promise<User | null | undefined>>(
guild.fetchAuditLogs({ type: AuditLogEvent.MessageDelete }).then(al => al.entries.first()?.target), guild.fetchAuditLogs({ type: AuditLogEvent.MessageDelete }).then(al => al.entries.first()?.target),
); );
expectType<Promise<GuildTextBasedChannel | { id: string } | undefined>>(
guild.fetchAuditLogs({ type: AuditLogEvent.MessageBulkDelete }).then(al => al.entries.first()?.target),
);
declare const AuditLogChange: AuditLogChange; declare const AuditLogChange: AuditLogChange;
// @ts-expect-error // @ts-expect-error