fix(GuildAuditLogs): typings and consistency (#7445)

This commit is contained in:
IRONM00N
2022-02-15 12:47:12 -05:00
committed by GitHub
parent 9311fa7b42
commit c1b27f8eed
4 changed files with 338 additions and 235 deletions

View File

@@ -14,19 +14,19 @@ const Util = require('../util/Util');
/**
* The target type of an entry. Here are the available types:
* * GUILD
* * CHANNEL
* * USER
* * ROLE
* * INVITE
* * WEBHOOK
* * EMOJI
* * MESSAGE
* * INTEGRATION
* * STAGE_INSTANCE
* * STICKER
* * THREAD
* * GUILD_SCHEDULED_EVENT
* * Guild
* * Channel
* * User
* * Role
* * Invite
* * Webhook
* * Emoji
* * Message
* * Integration
* * StageInstance
* * Sticker
* * Thread
* * GuildScheduledEvent
* @typedef {string} AuditLogTargetType
*/
@@ -36,21 +36,21 @@ const Util = require('../util/Util');
* @type {Object<string, string>}
*/
const Targets = {
ALL: 'ALL',
GUILD: 'GUILD',
GUILD_SCHEDULED_EVENT: 'GUILD_SCHEDULED_EVENT',
CHANNEL: 'CHANNEL',
USER: 'USER',
ROLE: 'ROLE',
INVITE: 'INVITE',
WEBHOOK: 'WEBHOOK',
EMOJI: 'EMOJI',
MESSAGE: 'MESSAGE',
INTEGRATION: 'INTEGRATION',
STAGE_INSTANCE: 'STAGE_INSTANCE',
STICKER: 'STICKER',
THREAD: 'THREAD',
UNKNOWN: 'UNKNOWN',
All: 'All',
Guild: 'Guild',
GuildScheduledEvent: 'GuildScheduledEvent',
Channel: 'Channel',
User: 'User',
Role: 'Role',
Invite: 'Invite',
Webhook: 'Webhook',
Emoji: 'Emoji',
Message: 'Message',
Integration: 'Integration',
StageInstance: 'StageInstance',
Sticker: 'Sticker',
Thread: 'Thread',
Unknown: 'Unknown',
};
/**
@@ -132,28 +132,28 @@ class GuildAuditLogs {
* @returns {AuditLogTargetType}
*/
static targetType(target) {
if (target < 10) return Targets.GUILD;
if (target < 20) return Targets.CHANNEL;
if (target < 30) return Targets.USER;
if (target < 40) return Targets.ROLE;
if (target < 50) return Targets.INVITE;
if (target < 60) return Targets.WEBHOOK;
if (target < 70) return Targets.EMOJI;
if (target < 80) return Targets.MESSAGE;
if (target < 83) return Targets.INTEGRATION;
if (target < 86) return Targets.STAGE_INSTANCE;
if (target < 100) return Targets.STICKER;
if (target < 110) return Targets.GUILD_SCHEDULED_EVENT;
if (target < 120) return Targets.THREAD;
return Targets.UNKNOWN;
if (target < 10) return Targets.Guild;
if (target < 20) return Targets.Channel;
if (target < 30) return Targets.User;
if (target < 40) return Targets.Role;
if (target < 50) return Targets.Invite;
if (target < 60) return Targets.Webhook;
if (target < 70) return Targets.Emoji;
if (target < 80) return Targets.Message;
if (target < 83) return Targets.Integration;
if (target < 86) return Targets.StageInstance;
if (target < 100) return Targets.Sticker;
if (target < 110) return Targets.GuildScheduledEvent;
if (target < 120) return Targets.Thread;
return Targets.Unknown;
}
/**
* The action type of an entry, e.g. `CREATE`. Here are the available types:
* * CREATE
* * DELETE
* * UPDATE
* * ALL
* The action type of an entry, e.g. `Create`. Here are the available types:
* * Create
* * Delete
* * Update
* * All
* @typedef {string} AuditLogActionType
*/
@@ -181,7 +181,7 @@ class GuildAuditLogs {
AuditLogEvent.ThreadCreate,
].includes(action)
) {
return 'CREATE';
return 'Create';
}
if (
@@ -206,7 +206,7 @@ class GuildAuditLogs {
AuditLogEvent.ThreadDelete,
].includes(action)
) {
return 'DELETE';
return 'Delete';
}
if (
@@ -228,10 +228,10 @@ class GuildAuditLogs {
AuditLogEvent.ThreadUpdate,
].includes(action)
) {
return 'UPDATE';
return 'Update';
}
return 'ALL';
return 'All';
}
toJSON() {
@@ -376,20 +376,20 @@ class GuildAuditLogsEntry {
* @type {?AuditLogEntryTarget}
*/
this.target = null;
if (targetType === Targets.UNKNOWN) {
if (targetType === Targets.Unknown) {
this.target = this.changes.reduce((o, c) => {
o[c.key] = c.new ?? c.old;
return o;
}, {});
this.target.id = data.target_id;
// MEMBER_DISCONNECT and similar types do not provide a target_id.
} else if (targetType === Targets.USER && data.target_id) {
// MemberDisconnect and similar types do not provide a target_id.
} else if (targetType === Targets.User && data.target_id) {
this.target = guild.client.options.partials.includes(Partials.User)
? guild.client.users._add({ id: data.target_id })
: guild.client.users.cache.get(data.target_id);
} else if (targetType === Targets.GUILD) {
} else if (targetType === Targets.Guild) {
this.target = guild.client.guilds.cache.get(data.target_id);
} else if (targetType === Targets.WEBHOOK) {
} else if (targetType === Targets.Webhook) {
this.target =
logs.webhooks.get(data.target_id) ??
new Webhook(
@@ -405,7 +405,7 @@ class GuildAuditLogsEntry {
},
),
);
} else if (targetType === Targets.INVITE) {
} else if (targetType === Targets.Invite) {
let change = this.changes.find(c => c.key === 'code');
change = change.new ?? change.old;
@@ -421,13 +421,13 @@ class GuildAuditLogsEntry {
{ guild },
),
);
} else if (targetType === Targets.MESSAGE) {
// Discord sends a channel id for the MESSAGE_BULK_DELETE action type.
} else if (targetType === Targets.Message) {
// Discord sends a channel id for the MessageBulkDelete action type.
this.target =
data.action_type === AuditLogEvent.MessageBulkDelete
? guild.channels.cache.get(data.target_id) ?? { id: data.target_id }
: guild.client.users.cache.get(data.target_id);
} else if (targetType === Targets.INTEGRATION) {
} else if (targetType === Targets.Integration) {
this.target =
logs.integrations.get(data.target_id) ??
new Integration(
@@ -441,7 +441,7 @@ class GuildAuditLogsEntry {
),
guild,
);
} else if (targetType === Targets.CHANNEL || targetType === Targets.THREAD) {
} else if (targetType === Targets.Channel || targetType === Targets.Thread) {
this.target =
guild.channels.cache.get(data.target_id) ??
this.changes.reduce(
@@ -451,7 +451,7 @@ class GuildAuditLogsEntry {
},
{ id: data.target_id },
);
} else if (targetType === Targets.STAGE_INSTANCE) {
} else if (targetType === Targets.StageInstance) {
this.target =
guild.stageInstances.cache.get(data.target_id) ??
new StageInstance(
@@ -468,7 +468,7 @@ class GuildAuditLogsEntry {
},
),
);
} else if (targetType === Targets.STICKER) {
} else if (targetType === Targets.Sticker) {
this.target =
guild.stickers.cache.get(data.target_id) ??
new Sticker(
@@ -481,7 +481,7 @@ class GuildAuditLogsEntry {
{ id: data.target_id },
),
);
} else if (targetType === Targets.GUILD_SCHEDULED_EVENT) {
} else if (targetType === Targets.GuildScheduledEvent) {
this.target =
guild.scheduledEvents.cache.get(data.target_id) ??
new GuildScheduledEvent(

View File

@@ -20,6 +20,7 @@ const {
TeamMemberMembershipState,
GuildScheduledEventEntityType,
IntegrationExpireBehavior,
AuditLogEvent,
} = require('discord-api-types/v9');
function unknownKeyStrategy(val) {
@@ -633,6 +634,157 @@ class EnumResolvers extends null {
return unknownKeyStrategy(key);
}
}
/**
* A string that can be resolved to a {@link AuditLogEvent} enum value. Here are the available types:
* * GUILD_UPDATE
* * CHANNEL_CREATE
* * CHANNEL_UPDATE
* * CHANNEL_DELETE
* * CHANNEL_OVERWRITE_CREATE
* * CHANNEL_OVERWRITE_UPDATE
* * CHANNEL_OVERWRITE_DELETE
* * MEMBER_KICK
* * MEMBER_PRUNE
* * MEMBER_BAN_ADD
* * MEMBER_BAN_REMOVE
* * MEMBER_UPDATE
* * MEMBER_ROLE_UPDATE
* * MEMBER_MOVE
* * MEMBER_DISCONNECT
* * BOT_ADD
* * ROLE_CREATE
* * ROLE_UPDATE
* * ROLE_DELETE
* * INVITE_CREATE
* * INVITE_UPDATE
* * INVITE_DELETE
* * WEBHOOK_CREATE
* * WEBHOOK_UPDATE
* * WEBHOOK_DELETE
* * INTEGRATION_CREATE
* * INTEGRATION_UPDATE
* * INTEGRATION_DELETE
* * STAGE_INSTANCE_CREATE
* * STAGE_INSTANCE_UPDATE
* * STAGE_INSTANCE_DELETE
* * STICKER_CREATE
* * STICKER_UPDATE
* * STICKER_DELETE
* * GUILD_SCHEDULED_EVENT_CREATE
* * GUILD_SCHEDULED_EVENT_UPDATE
* * GUILD_SCHEDULED_EVENT_DELETE
* * THREAD_CREATE
* * THREAD_UPDATE
* * THREAD_DELETE
* @typedef {string} AuditLogEventEnumResolvable
*/
/**
* Resolves enum key to {@link AuditLogEvent} enum value
* @param {AuditLogEventEnumResolvable|AuditLogEvent} key The key to lookup
* @returns {AuditLogEvent}
*/
static resolveAuditLogEvent(key) {
switch (key) {
case 'GUILD_UPDATE':
return AuditLogEvent.GuildUpdate;
case 'CHANNEL_CREATE':
return AuditLogEvent.ChannelCreate;
case 'CHANNEL_UPDATE':
return AuditLogEvent.ChannelUpdate;
case 'CHANNEL_DELETE':
return AuditLogEvent.ChannelDelete;
case 'CHANNEL_OVERWRITE_CREATE':
return AuditLogEvent.ChannelOverwriteCreate;
case 'CHANNEL_OVERWRITE_UPDATE':
return AuditLogEvent.ChannelOverwriteUpdate;
case 'CHANNEL_OVERWRITE_DELETE':
return AuditLogEvent.ChannelOverwriteDelete;
case 'MEMBER_KICK':
return AuditLogEvent.MemberKick;
case 'MEMBER_PRUNE':
return AuditLogEvent.MemberPrune;
case 'MEMBER_BAN_ADD':
return AuditLogEvent.MemberBanAdd;
case 'MEMBER_BAN_REMOVE':
return AuditLogEvent.MemberBanRemove;
case 'MEMBER_UPDATE':
return AuditLogEvent.MemberUpdate;
case 'MEMBER_ROLE_UPDATE':
return AuditLogEvent.MemberRoleUpdate;
case 'MEMBER_MOVE':
return AuditLogEvent.MemberMove;
case 'MEMBER_DISCONNECT':
return AuditLogEvent.MemberDisconnect;
case 'BOT_ADD':
return AuditLogEvent.BotAdd;
case 'ROLE_CREATE':
return AuditLogEvent.RoleCreate;
case 'ROLE_UPDATE':
return AuditLogEvent.RoleUpdate;
case 'ROLE_DELETE':
return AuditLogEvent.RoleDelete;
case 'INVITE_CREATE':
return AuditLogEvent.InviteCreate;
case 'INVITE_UPDATE':
return AuditLogEvent.InviteUpdate;
case 'INVITE_DELETE':
return AuditLogEvent.InviteDelete;
case 'WEBHOOK_CREATE':
return AuditLogEvent.WebhookCreate;
case 'WEBHOOK_UPDATE':
return AuditLogEvent.WebhookUpdate;
case 'WEBHOOK_DELETE':
return AuditLogEvent.WebhookDelete;
case 'EMOJI_CREATE':
return AuditLogEvent.EmojiCreate;
case 'EMOJI_UPDATE':
return AuditLogEvent.EmojiUpdate;
case 'EMOJI_DELETE':
return AuditLogEvent.EmojiDelete;
case 'MESSAGE_DELETE':
return AuditLogEvent.MessageDelete;
case 'MESSAGE_BULK_DELETE':
return AuditLogEvent.MessageBulkDelete;
case 'MESSAGE_PIN':
return AuditLogEvent.MessagePin;
case 'MESSAGE_UNPIN':
return AuditLogEvent.MessageUnpin;
case 'INTEGRATION_CREATE':
return AuditLogEvent.IntegrationCreate;
case 'INTEGRATION_UPDATE':
return AuditLogEvent.IntegrationUpdate;
case 'INTEGRATION_DELETE':
return AuditLogEvent.IntegrationDelete;
case 'STAGE_INSTANCE_CREATE':
return AuditLogEvent.StageInstanceCreate;
case 'STAGE_INSTANCE_UPDATE':
return AuditLogEvent.StageInstanceUpdate;
case 'STAGE_INSTANCE_DELETE':
return AuditLogEvent.StageInstanceDelete;
case 'STICKER_CREATE':
return AuditLogEvent.StickerCreate;
case 'STICKER_UPDATE':
return AuditLogEvent.StickerUpdate;
case 'STICKER_DELETE':
return AuditLogEvent.StickerDelete;
case 'GUILD_SCHEDULED_EVENT_CREATE':
return AuditLogEvent.GuildScheduledEventCreate;
case 'GUILD_SCHEDULED_EVENT_UPDATE':
return AuditLogEvent.GuildScheduledEventUpdate;
case 'GUILD_SCHEDULED_EVENT_DELETE':
return AuditLogEvent.GuildScheduledEventDelete;
case 'THREAD_CREATE':
return AuditLogEvent.ThreadCreate;
case 'THREAD_UPDATE':
return AuditLogEvent.ThreadUpdate;
case 'THREAD_DELETE':
return AuditLogEvent.ThreadDelete;
default:
return unknownKeyStrategy(key);
}
}
}
// Precondition logic wrapper

View File

@@ -91,6 +91,7 @@ import {
GuildSystemChannelFlags,
GatewayIntentBits,
ActivityFlags,
AuditLogEvent,
APIMessageComponentEmoji,
EmbedType,
} from 'discord-api-types/v9';
@@ -908,6 +909,7 @@ export class EnumResolvers extends null {
public static resolveIntegrationExpireBehavior(
key: IntegrationExpireBehaviorEnumResolvable | IntegrationExpireBehavior,
): IntegrationExpireBehavior;
public static resolveAuditLogEvent(key: AuditLogEventEnumResolvable | AuditLogEvent): AuditLogEvent;
}
export class DMChannel extends TextBasedChannelMixin(Channel, ['bulkDelete']) {
@@ -991,7 +993,7 @@ export class Guild extends AnonymousGuild {
public edit(data: GuildEditData, reason?: string): Promise<Guild>;
public editWelcomeScreen(data: WelcomeScreenEditData): Promise<WelcomeScreen>;
public equals(guild: Guild): boolean;
public fetchAuditLogs<T extends GuildAuditLogsResolvable = 'All'>(
public fetchAuditLogs<T extends GuildAuditLogsResolvable = null>(
options?: GuildAuditLogsFetchOptions<T>,
): Promise<GuildAuditLogs<T>>;
public fetchIntegrations(): Promise<Collection<Snowflake | string, Integration>>;
@@ -1031,14 +1033,13 @@ export class Guild extends AnonymousGuild {
public toJSON(): unknown;
}
export class GuildAuditLogs<T extends GuildAuditLogsResolvable = 'All'> {
export class GuildAuditLogs<T extends GuildAuditLogsResolvable = null> {
private constructor(guild: Guild, data: RawGuildAuditLogData);
private webhooks: Collection<Snowflake, Webhook>;
private integrations: Collection<Snowflake | string, Integration>;
public entries: Collection<Snowflake, GuildAuditLogsEntry<T>>;
public static Actions: GuildAuditLogsActions;
public static Targets: GuildAuditLogsTargets;
public static Entry: typeof GuildAuditLogsEntry;
public static actionType(action: number): GuildAuditLogsActionType;
@@ -1048,12 +1049,7 @@ export class GuildAuditLogs<T extends GuildAuditLogsResolvable = 'All'> {
}
export class GuildAuditLogsEntry<
TActionRaw extends GuildAuditLogsResolvable = 'All',
TAction = TActionRaw extends keyof GuildAuditLogsIds
? GuildAuditLogsIds[TActionRaw]
: TActionRaw extends null
? 'All'
: TActionRaw,
TAction extends GuildAuditLogsResolvable = null,
TActionType extends GuildAuditLogsActionType = TAction extends keyof GuildAuditLogsTypes
? GuildAuditLogsTypes[TAction][1]
: 'All',
@@ -3994,6 +3990,48 @@ export type GuildScheduledEventEntityTypeEnumResolvable = 'STAGE_INSTANCE' | 'VO
export type IntegrationExpireBehaviorEnumResolvable = 'REMOVE_ROLE' | 'KICK';
export type AuditLogEventEnumResolvable =
| 'GUILD_UPDATE'
| 'CHANNEL_CREATE'
| 'CHANNEL_UPDATE'
| 'CHANNEL_DELETE'
| 'CHANNEL_OVERWRITE_CREATE'
| 'CHANNEL_OVERWRITE_UPDATE'
| 'CHANNEL_OVERWRITE_DELETE'
| 'MEMBER_KICK'
| 'MEMBER_PRUNE'
| 'MEMBER_BAN_ADD'
| 'MEMBER_BAN_REMOVE'
| 'MEMBER_UPDATE'
| 'MEMBER_ROLE_UPDATE'
| 'MEMBER_MOVE'
| 'MEMBER_DISCONNECT'
| 'BOT_ADD'
| 'ROLE_CREATE'
| 'ROLE_UPDATE'
| 'ROLE_DELETE'
| 'INVITE_CREATE'
| 'INVITE_UPDATE'
| 'INVITE_DELETE'
| 'WEBHOOK_CREATE'
| 'WEBHOOK_UPDATE'
| 'WEBHOOK_DELETE'
| 'INTEGRATION_CREATE'
| 'INTEGRATION_UPDATE'
| 'INTEGRATION_DELETE'
| 'STAGE_INSTANCE_CREATE'
| 'STAGE_INSTANCE_UPDATE'
| 'STAGE_INSTANCE_DELETE'
| 'STICKER_CREATE'
| 'STICKER_UPDATE'
| 'STICKER_DELETE'
| 'GUILD_SCHEDULED_EVENT_CREATE'
| 'GUILD_SCHEDULED_EVENT_UPDATE'
| 'GUILD_SCHEDULED_EVENT_DELETE'
| 'THREAD_CREATE'
| 'THREAD_UPDATE'
| 'THREAD_DELETE';
export interface ErrorEvent {
error: unknown;
message: string;
@@ -4114,137 +4152,83 @@ export interface GuildApplicationCommandPermissionData {
}
interface GuildAuditLogsTypes {
GuildUpdate: ['Guild', 'Update'];
ChannelCreate: ['Channel', 'Create'];
ChannelUpdate: ['Channel', 'Update'];
ChannelDelete: ['Channel', 'Delete'];
ChannelOverwriteCreate: ['Channel', 'Create'];
ChannelOverwriteUpdate: ['Channel', 'Update'];
ChannelOverwriteDelete: ['Channel', 'Delete'];
MemberKick: ['User', 'Delete'];
MemberPrune: ['User', 'Delete'];
MemberBanAdd: ['User', 'Delete'];
MemberBanRemove: ['User', 'Create'];
MemberUpdate: ['User', 'Update'];
MemberRoleUpdate: ['User', 'Update'];
MemberMove: ['User', 'Update'];
MemberDisconnect: ['User', 'Delete'];
BotAdd: ['User', 'Create'];
RoleCreate: ['Role', 'Create'];
RoleUpdate: ['Role', 'Update'];
RoleDelete: ['Role', 'Delete'];
InviteCreate: ['Invite', 'Create'];
InviteUpdate: ['Invite', 'Update'];
InviteDelete: ['Invite', 'Delete'];
WebhookCreate: ['Webhook', 'Create'];
WebhookUpdate: ['Webhook', 'Update'];
WebhookDelete: ['Webhook', 'Delete'];
EmojiCreate: ['Emoji', 'Create'];
EmojiUpdate: ['Emoji', 'Update'];
EmojiDelete: ['Emoji', 'Delete'];
MessageDelete: ['Message', 'Delete'];
MessageBulkDelete: ['Message', 'Delete'];
MessagePin: ['Message', 'Create'];
MessageUnpin: ['Message', 'Delete'];
IntegrationCreate: ['Integration', 'Create'];
IntegrationUpdate: ['Integration', 'Update'];
IntegrationDelete: ['Integration', 'Delete'];
StageInstanceCreate: ['StageInstance', 'Create'];
StageInstanceUpdate: ['StageInstance', 'Update'];
StageInstanceDelete: ['StageInstance', 'Delete'];
StickerCreate: ['Sticker', 'Create'];
StickerUpdate: ['Sticker', 'Update'];
StickerDelete: ['Sticker', 'Delete'];
GuildScheduledEventCreate: ['GuildScheduledEvent', 'Create'];
GuildScheduledEventUpdate: ['GuildScheduledEvent', 'Update'];
GuildScheduledEventDelete: ['GuildScheduledEvent', 'Delete'];
ThreadCreate: ['Thread', 'Create'];
ThreadUpdate: ['Thread', 'Update'];
ThreadDelete: ['Thread', 'Delete'];
[AuditLogEvent.GuildUpdate]: ['Guild', 'Update'];
[AuditLogEvent.ChannelCreate]: ['Channel', 'Create'];
[AuditLogEvent.ChannelUpdate]: ['Channel', 'Update'];
[AuditLogEvent.ChannelDelete]: ['Channel', 'Delete'];
[AuditLogEvent.ChannelOverwriteCreate]: ['Channel', 'Create'];
[AuditLogEvent.ChannelOverwriteUpdate]: ['Channel', 'Update'];
[AuditLogEvent.ChannelOverwriteDelete]: ['Channel', 'Delete'];
[AuditLogEvent.MemberKick]: ['User', 'Delete'];
[AuditLogEvent.MemberPrune]: ['User', 'Delete'];
[AuditLogEvent.MemberBanAdd]: ['User', 'Delete'];
[AuditLogEvent.MemberBanRemove]: ['User', 'Create'];
[AuditLogEvent.MemberUpdate]: ['User', 'Update'];
[AuditLogEvent.MemberRoleUpdate]: ['User', 'Update'];
[AuditLogEvent.MemberMove]: ['User', 'Update'];
[AuditLogEvent.MemberDisconnect]: ['User', 'Delete'];
[AuditLogEvent.BotAdd]: ['User', 'Create'];
[AuditLogEvent.RoleCreate]: ['Role', 'Create'];
[AuditLogEvent.RoleUpdate]: ['Role', 'Update'];
[AuditLogEvent.RoleDelete]: ['Role', 'Delete'];
[AuditLogEvent.InviteCreate]: ['Invite', 'Create'];
[AuditLogEvent.InviteUpdate]: ['Invite', 'Update'];
[AuditLogEvent.InviteDelete]: ['Invite', 'Delete'];
[AuditLogEvent.WebhookCreate]: ['Webhook', 'Create'];
[AuditLogEvent.WebhookUpdate]: ['Webhook', 'Update'];
[AuditLogEvent.WebhookDelete]: ['Webhook', 'Delete'];
[AuditLogEvent.EmojiCreate]: ['Emoji', 'Create'];
[AuditLogEvent.EmojiUpdate]: ['Emoji', 'Update'];
[AuditLogEvent.EmojiDelete]: ['Emoji', 'Delete'];
[AuditLogEvent.MessageDelete]: ['Message', 'Delete'];
[AuditLogEvent.MessageBulkDelete]: ['Message', 'Delete'];
[AuditLogEvent.MessagePin]: ['Message', 'Create'];
[AuditLogEvent.MessageUnpin]: ['Message', 'Delete'];
[AuditLogEvent.IntegrationCreate]: ['Integration', 'Create'];
[AuditLogEvent.IntegrationUpdate]: ['Integration', 'Update'];
[AuditLogEvent.IntegrationDelete]: ['Integration', 'Delete'];
[AuditLogEvent.StageInstanceCreate]: ['StageInstance', 'Create'];
[AuditLogEvent.StageInstanceUpdate]: ['StageInstance', 'Update'];
[AuditLogEvent.StageInstanceDelete]: ['StageInstance', 'Delete'];
[AuditLogEvent.StickerCreate]: ['Sticker', 'Create'];
[AuditLogEvent.StickerUpdate]: ['Sticker', 'Update'];
[AuditLogEvent.StickerDelete]: ['Sticker', 'Delete'];
[AuditLogEvent.GuildScheduledEventCreate]: ['GuildScheduledEvent', 'Create'];
[AuditLogEvent.GuildScheduledEventUpdate]: ['GuildScheduledEvent', 'Update'];
[AuditLogEvent.GuildScheduledEventDelete]: ['GuildScheduledEvent', 'Delete'];
[AuditLogEvent.ThreadCreate]: ['Thread', 'Create'];
[AuditLogEvent.ThreadUpdate]: ['Thread', 'Update'];
[AuditLogEvent.ThreadDelete]: ['Thread', 'Delete'];
}
export interface GuildAuditLogsIds {
1: 'GuildUpdate';
10: 'ChannelCreate';
11: 'ChannelUpdate';
12: 'ChannelDelete';
13: 'ChannelOverwriteCreate';
14: 'ChannelOverwriteUpdate';
15: 'ChannelOverwriteDelete';
20: 'MemberKick';
21: 'MemberPrune';
22: 'MemberBanAdd';
23: 'MemberBanRemove';
24: 'MemberUpdate';
25: 'MemberRoleUpdate';
26: 'MemberMove';
27: 'MemberDisconnect';
28: 'BotAdd';
30: 'RoleCreate';
31: 'RoleUpdate';
32: 'RoleDelete';
40: 'InviteCreate';
41: 'InviteUpdate';
42: 'InviteDelete';
50: 'WebhookCreate';
51: 'WebhookUpdate';
52: 'WebhookDelete';
60: 'EmojiCreate';
61: 'EmojiUpdate';
62: 'EmojiDelete';
72: 'MessageDelete';
73: 'MessageBulkDelete';
74: 'MessagePin';
75: 'MessageUnpin';
80: 'IntegrationCreate';
81: 'IntegrationUpdate';
82: 'IntegrationDelete';
83: 'StageInstanceCreate';
84: 'StageInstanceUpdate';
85: 'StageInstanceDelete';
90: 'StickerCreate';
91: 'StickerUpdate';
92: 'StickerDelete';
100: 'GuildScheduledEventCreate';
101: 'GuildScheduledEventUpdate';
102: 'GuildScheduledEventDelete';
110: 'ThreadCreate';
111: 'ThreadUpdate';
112: 'ThreadDelete';
}
export type GuildAuditLogsActions = { [Key in keyof GuildAuditLogsIds as GuildAuditLogsIds[Key]]: Key } & { All: null };
export type GuildAuditLogsAction = keyof GuildAuditLogsActions;
export type GuildAuditLogsActionType = GuildAuditLogsTypes[keyof GuildAuditLogsTypes][1] | 'All';
export interface GuildAuditLogsEntryExtraField {
MemberPrune: { removed: number; days: number };
MemberMove: { channel: VoiceBasedChannel | { id: Snowflake }; count: number };
MessageDelete: { channel: GuildTextBasedChannel | { id: Snowflake }; count: number };
MessageBulkDelete: { channel: GuildTextBasedChannel | { id: Snowflake }; count: number };
MessagePin: { channel: GuildTextBasedChannel | { id: Snowflake }; messageId: Snowflake };
MessageUnpin: { channel: GuildTextBasedChannel | { id: Snowflake }; messageId: Snowflake };
MemberDisconnect: { count: number };
ChannelOverwriteCreate:
[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.MessagePin]: { channel: GuildTextBasedChannel | { id: Snowflake }; messageId: Snowflake };
[AuditLogEvent.MessageUnpin]: { channel: GuildTextBasedChannel | { id: Snowflake }; messageId: Snowflake };
[AuditLogEvent.MemberDisconnect]: { count: number };
[AuditLogEvent.ChannelOverwriteCreate]:
| Role
| GuildMember
| { id: Snowflake; name: string; type: 'Role' }
| { id: Snowflake; type: 'Member' };
ChannelOverwriteUpdate:
[AuditLogEvent.ChannelOverwriteUpdate]:
| Role
| GuildMember
| { id: Snowflake; name: string; type: 'Role' }
| { id: Snowflake; type: 'Member' };
ChannelOverwriteDelete:
[AuditLogEvent.ChannelOverwriteDelete]:
| Role
| GuildMember
| { id: Snowflake; name: string; type: OverwriteType.Role }
| { id: Snowflake; type: OverwriteType.Member };
StageInstanceCreate: StageChannel | { id: Snowflake };
StageInstanceDelete: StageChannel | { id: Snowflake };
StageInstanceUpdate: StageChannel | { id: Snowflake };
[AuditLogEvent.StageInstanceCreate]: StageChannel | { id: Snowflake };
[AuditLogEvent.StageInstanceDelete]: StageChannel | { id: Snowflake };
[AuditLogEvent.StageInstanceUpdate]: StageChannel | { id: Snowflake };
}
export interface GuildAuditLogsEntryTargetField<TActionType extends GuildAuditLogsActionType> {
@@ -4252,7 +4236,7 @@ export interface GuildAuditLogsEntryTargetField<TActionType extends GuildAuditLo
Guild: Guild;
Webhook: Webhook;
Invite: Invite;
Message: TActionType extends 'MESSAGE_BULK_DELETE' ? Guild | { id: Snowflake } : User;
Message: TActionType extends AuditLogEvent.MessageBulkDelete ? Guild | { id: Snowflake } : User;
Integration: Integration;
Channel: NonThreadGuildBasedChannel | { id: Snowflake; [x: string]: unknown };
Thread: ThreadChannel | { id: Snowflake; [x: string]: unknown };
@@ -4268,12 +4252,12 @@ export interface GuildAuditLogsFetchOptions<T extends GuildAuditLogsResolvable>
type?: T;
}
export type GuildAuditLogsResolvable = keyof GuildAuditLogsIds | GuildAuditLogsAction | null;
export type GuildAuditLogsResolvable = AuditLogEvent | null;
export type GuildAuditLogsTarget = GuildAuditLogsTypes[keyof GuildAuditLogsTypes][0] | 'All' | 'Unknown';
export type GuildAuditLogsTargets = {
[key in GuildAuditLogsTarget]?: string;
[key in GuildAuditLogsTarget]: GuildAuditLogsTarget;
};
export type GuildBanResolvable = GuildBan | UserResolvable;

View File

@@ -16,9 +16,9 @@ import {
InteractionType,
GatewayIntentBits,
PermissionFlagsBits,
AuditLogEvent,
ButtonStyle,
} from 'discord-api-types/v9';
import { AuditLogEvent } from 'discord-api-types/v9';
import {
ApplicationCommand,
ApplicationCommandData,
@@ -1226,84 +1226,51 @@ collector.on('end', (collection, reason) => {
expectType<Promise<number | null>>(shard.eval(c => c.readyTimestamp));
// Test audit logs
expectType<Promise<GuildAuditLogs<'MemberKick'>>>(guild.fetchAuditLogs({ type: 'MemberKick' }));
expectAssignable<Promise<GuildAuditLogs<AuditLogEvent.MemberKick>>>(
guild.fetchAuditLogs({ type: GuildAuditLogs.Actions.MemberKick }),
);
expectType<Promise<GuildAuditLogs<AuditLogEvent.MemberKick>>>(guild.fetchAuditLogs({ type: AuditLogEvent.MemberKick }));
expectType<Promise<GuildAuditLogs<'ChannelCreate'>>>(guild.fetchAuditLogs({ type: 'ChannelCreate' }));
expectAssignable<Promise<GuildAuditLogs<AuditLogEvent.ChannelCreate>>>(
guild.fetchAuditLogs({ type: GuildAuditLogs.Actions.ChannelCreate }),
);
expectType<Promise<GuildAuditLogs<AuditLogEvent.ChannelCreate>>>(
guild.fetchAuditLogs({ type: AuditLogEvent.ChannelCreate }),
);
expectType<Promise<GuildAuditLogs<'IntegrationUpdate'>>>(guild.fetchAuditLogs({ type: 'IntegrationUpdate' }));
expectAssignable<Promise<GuildAuditLogs<AuditLogEvent.IntegrationUpdate>>>(
guild.fetchAuditLogs({ type: GuildAuditLogs.Actions.IntegrationUpdate }),
);
expectType<Promise<GuildAuditLogs<AuditLogEvent.IntegrationUpdate>>>(
guild.fetchAuditLogs({ type: AuditLogEvent.IntegrationUpdate }),
);
expectType<Promise<GuildAuditLogs<'All'>>>(guild.fetchAuditLogs({ type: 'All' }));
expectType<Promise<GuildAuditLogs<null>>>(guild.fetchAuditLogs({ type: GuildAuditLogs.Actions.All }));
expectType<Promise<GuildAuditLogs<'All'>>>(guild.fetchAuditLogs());
expectType<Promise<GuildAuditLogs<null>>>(guild.fetchAuditLogs({ type: null }));
expectType<Promise<GuildAuditLogs<null>>>(guild.fetchAuditLogs());
expectType<Promise<GuildAuditLogsEntry<'MemberKick', 'MemberKick', 'Delete', 'User'> | undefined>>(
guild.fetchAuditLogs({ type: 'MemberKick' }).then(al => al.entries.first()),
expectType<Promise<GuildAuditLogsEntry<AuditLogEvent.MemberKick, 'Delete', 'User'> | undefined>>(
guild.fetchAuditLogs({ type: AuditLogEvent.MemberKick }).then(al => al.entries.first()),
);
expectType<Promise<GuildAuditLogsEntry<'MemberKick', 'MemberKick', 'Delete', 'User'> | undefined>>(
guild.fetchAuditLogs({ type: GuildAuditLogs.Actions.MemberKick }).then(al => al.entries.first()),
);
expectAssignable<Promise<GuildAuditLogsEntry<'MemberKick', 'MemberKick', 'Delete', 'User'> | undefined>>(
expectAssignable<Promise<GuildAuditLogsEntry<AuditLogEvent.MemberKick, 'Delete', 'User'> | undefined>>(
guild.fetchAuditLogs({ type: AuditLogEvent.MemberKick }).then(al => al.entries.first()),
);
expectType<Promise<GuildAuditLogsEntry<'All', 'All', 'All', 'Unknown'> | undefined>>(
guild.fetchAuditLogs({ type: 'All' }).then(al => al.entries.first()),
);
expectType<Promise<GuildAuditLogsEntry<'All', 'All', 'All', 'Unknown'> | undefined>>(
guild.fetchAuditLogs({ type: GuildAuditLogs.Actions.All }).then(al => al.entries.first()),
);
expectType<Promise<GuildAuditLogsEntry<'All', 'All', 'All', 'Unknown'> | undefined>>(
expectType<Promise<GuildAuditLogsEntry<null, 'All', 'Unknown'> | undefined>>(
guild.fetchAuditLogs({ type: null }).then(al => al.entries.first()),
);
expectType<Promise<GuildAuditLogsEntry<'All', 'All', 'All', 'Unknown'> | undefined>>(
expectType<Promise<GuildAuditLogsEntry<null, 'All', 'Unknown'> | undefined>>(
guild.fetchAuditLogs().then(al => al.entries.first()),
);
expectType<Promise<null | undefined>>(
guild.fetchAuditLogs({ type: 'MemberKick' }).then(al => al.entries.first()?.extra),
);
expectType<Promise<null | undefined>>(
guild.fetchAuditLogs({ type: AuditLogEvent.MemberKick }).then(al => al.entries.first()?.extra),
);
expectType<Promise<StageChannel | { id: Snowflake } | undefined>>(
guild.fetchAuditLogs({ type: 'StageInstanceCreate' }).then(al => al.entries.first()?.extra),
guild.fetchAuditLogs({ type: AuditLogEvent.StageInstanceCreate }).then(al => al.entries.first()?.extra),
);
expectType<Promise<{ channel: GuildTextBasedChannel | { id: Snowflake }; count: number } | undefined>>(
guild.fetchAuditLogs({ type: 'MessageDelete' }).then(al => al.entries.first()?.extra),
guild.fetchAuditLogs({ type: AuditLogEvent.MessageDelete }).then(al => al.entries.first()?.extra),
);
expectType<Promise<User | null | undefined>>(
guild.fetchAuditLogs({ type: 'MemberKick' }).then(al => al.entries.first()?.target),
);
expectType<Promise<User | null | undefined>>(
guild.fetchAuditLogs({ type: AuditLogEvent.MemberKick }).then(al => al.entries.first()?.target),
);
expectType<Promise<StageInstance | undefined>>(
guild.fetchAuditLogs({ type: 'StageInstanceCreate' }).then(al => al.entries.first()?.target),
guild.fetchAuditLogs({ type: AuditLogEvent.StageInstanceCreate }).then(al => al.entries.first()?.target),
);
expectType<Promise<User | undefined>>(
guild.fetchAuditLogs({ type: 'MessageDelete' }).then(al => al.entries.first()?.target),
);
expectType<Promise<User | undefined>>(
// @ts-expect-error Invalid audit log ID
guild.fetchAuditLogs({ type: 2000 }).then(al => al.entries.first()?.target),
guild.fetchAuditLogs({ type: AuditLogEvent.MessageDelete }).then(al => al.entries.first()?.target),
);
declare const TextBasedChannel: TextBasedChannel;