From 35310968cc06018b069e4a7ff40eb649c3e553b6 Mon Sep 17 00:00:00 2001 From: Elysia <71698422+aiko-chan-ai@users.noreply.github.com> Date: Tue, 17 Sep 2024 11:43:13 +0700 Subject: [PATCH] fix(GuildScheduledEvent): Use if...else pattern and handle partials backport #9802 djs --- src/structures/GuildScheduledEvent.js | 110 ++++++++++++++++++-------- typings/index.d.ts | 25 ++++-- 2 files changed, 98 insertions(+), 37 deletions(-) diff --git a/src/structures/GuildScheduledEvent.js b/src/structures/GuildScheduledEvent.js index 5be66d8..6ffd8b3 100644 --- a/src/structures/GuildScheduledEvent.js +++ b/src/structures/GuildScheduledEvent.js @@ -54,11 +54,16 @@ class GuildScheduledEvent extends Base { this.creatorId ??= null; } - /** - * The name of the guild scheduled event - * @type {string} - */ - this.name = data.name; + if ('name' in data) { + /** + * The name of the guild scheduled event + * @type {?string} + */ + this.name = data.name; + } else { + // Only if partial. + this.name ??= null; + } if ('description' in data) { /** @@ -70,37 +75,60 @@ class GuildScheduledEvent extends Base { this.description ??= null; } - /** - * The timestamp the guild scheduled event will start at - * This can be potentially `null` only when it's an {@link AuditLogEntryTarget} - * @type {?number} - */ - this.scheduledStartTimestamp = data.scheduled_start_time ? Date.parse(data.scheduled_start_time) : null; + if ('scheduled_start_time' in data) { + /** + * The timestamp the guild scheduled event will start at + * This can be potentially `null` only when it's an {@link AuditLogEntryTarget} + * @type {?number} + */ + this.scheduledStartTimestamp = Date.parse(data.scheduled_start_time); + } else { + this.scheduledStartTimestamp ??= null; + } - /** - * The timestamp the guild scheduled event will end at, - * or `null` if the event does not have a scheduled time to end - * @type {?number} - */ - this.scheduledEndTimestamp = data.scheduled_end_time ? Date.parse(data.scheduled_end_time) : null; + if ('scheduled_end_time' in data) { + /** + * The timestamp the guild scheduled event will end at + * or `null` if the event does not have a scheduled time to end + * @type {?number} + */ + this.scheduledEndTimestamp = data.scheduled_end_time ? Date.parse(data.scheduled_end_time) : null; + } else { + this.scheduledEndTimestamp ??= null; + } - /** - * The privacy level of the guild scheduled event - * @type {PrivacyLevel} - */ - this.privacyLevel = GuildScheduledEventPrivacyLevels[data.privacy_level]; + if ('privacy_level' in data) { + /** + * The privacy level of the guild scheduled event + * @type {PrivacyLevel} + */ + this.privacyLevel = GuildScheduledEventPrivacyLevels[data.privacy_level]; + } else { + // Only if partial. + this.privacyLevel ??= null; + } - /** - * The status of the guild scheduled event - * @type {GuildScheduledEventStatus} - */ - this.status = GuildScheduledEventStatuses[data.status]; + if ('status' in data) { + /** + * The status of the guild scheduled event + * @type {GuildScheduledEventStatus} + */ + this.status = GuildScheduledEventStatuses[data.status]; + } else { + // Only if partial. + this.status ??= null; + } - /** - * The type of hosting entity associated with the scheduled event - * @type {GuildScheduledEventEntityType} - */ - this.entityType = GuildScheduledEventEntityTypes[data.entity_type]; + if ('entity_type' in data) { + /** + * The type of hosting entity associated with the scheduled event + * @type {GuildScheduledEventEntityType} + */ + this.entityType = GuildScheduledEventEntityTypes[data.entity_type]; + } else { + // Only if partial. + this.entityType ??= null; + } if ('entity_id' in data) { /** @@ -177,6 +205,15 @@ class GuildScheduledEvent extends Base { return this.image && this.client.rest.cdn.guildScheduledEventCover(this.id, this.image, format, size); } + /** + * Whether this guild scheduled event is partial. + * @type {boolean} + * @readonly + */ + get partial() { + return this.name === null; + } + /** * The timestamp the guild scheduled event was created at * @type {number} @@ -241,6 +278,15 @@ class GuildScheduledEvent extends Base { return Endpoints.scheduledEvent(this.client.options.http.scheduledEvent, this.guildId, this.id); } + /** + * Fetches this guild scheduled event. + * @param {boolean} [force=true] Whether to skip the cache check and request the API + * @returns {Promise} + */ + fetch(force = true) { + return this.guild.scheduledEvents.fetch({ guildScheduledEvent: this.id, force }); + } + /** * Options used to create an invite URL to a {@link GuildScheduledEvent} * @typedef {CreateInviteOptions} CreateGuildScheduledEventInviteURLOptions diff --git a/typings/index.d.ts b/typings/index.d.ts index 15fb541..1803651 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1697,11 +1697,13 @@ export class GuildScheduledEvent; public edit>( options: GuildScheduledEventEditOptions, ): Promise>; + public fetch(force?: boolean): Promise>; public delete(): Promise>; public setName(name: string, reason?: string): Promise>; public setScheduledStartTime(scheduledStartTime: DateResolvable, reason?: string): Promise>; @@ -4650,7 +4652,14 @@ export type AllowedImageFormat = 'webp' | 'png' | 'jpg' | 'jpeg'; export type AllowedImageSize = 16 | 32 | 56 | 64 | 96 | 128 | 256 | 300 | 512 | 600 | 1024 | 2048 | 4096; -export type AllowedPartial = User | Channel | GuildMember | Message | MessageReaction; +export type AllowedPartial = + | User + | Channel + | GuildMember + | Message + | MessageReaction + | GuildScheduledEvent + | ThreadMember; export type AllowedThreadTypeForNewsChannel = 'GUILD_NEWS_THREAD' | 10; @@ -5482,10 +5491,13 @@ export interface ClientEvents extends BaseClientEvents { stickerDelete: [sticker: Sticker]; stickerUpdate: [oldSticker: Sticker, newSticker: Sticker]; guildScheduledEventCreate: [guildScheduledEvent: GuildScheduledEvent]; - guildScheduledEventUpdate: [oldGuildScheduledEvent: GuildScheduledEvent, newGuildScheduledEvent: GuildScheduledEvent]; - guildScheduledEventDelete: [guildScheduledEvent: GuildScheduledEvent]; - guildScheduledEventUserAdd: [guildScheduledEvent: GuildScheduledEvent, user: User]; - guildScheduledEventUserRemove: [guildScheduledEvent: GuildScheduledEvent, user: User]; + guildScheduledEventUpdate: [ + oldGuildScheduledEvent: GuildScheduledEvent | PartialGuildScheduledEvent | null, + newGuildScheduledEvent: GuildScheduledEvent, + ]; + guildScheduledEventDelete: [guildScheduledEvent: GuildScheduledEvent | PartialGuildScheduledEvent]; + guildScheduledEventUserAdd: [guildScheduledEvent: GuildScheduledEvent | PartialGuildScheduledEvent, user: User]; + guildScheduledEventUserRemove: [guildScheduledEvent: GuildScheduledEvent, | PartialGuildScheduledEvent user: User]; guildAuditLogEntryCreate: [auditLogEntry: GuildAuditLogsEntry, guild: Guild]; unhandledPacket: [packet: { t?: string; d: any }, shard: number]; relationshipAdd: [userId: Snowflake, shouldNotify: boolean]; @@ -7143,6 +7155,9 @@ export interface PartialMessage export interface PartialMessageReaction extends Partialize {} +export interface PartialGuildScheduledEvent + extends Partialize {} + export interface PartialOverwriteData { id: Snowflake | number; type?: OverwriteType;