fix(GuildScheduledEvent): Use if...else pattern and handle partials

backport #9802 djs
This commit is contained in:
Elysia
2024-09-17 11:43:13 +07:00
parent efb5d3e35f
commit 35310968cc
2 changed files with 98 additions and 37 deletions

View File

@@ -54,11 +54,16 @@ class GuildScheduledEvent extends Base {
this.creatorId ??= null; this.creatorId ??= null;
} }
if ('name' in data) {
/** /**
* The name of the guild scheduled event * The name of the guild scheduled event
* @type {string} * @type {?string}
*/ */
this.name = data.name; this.name = data.name;
} else {
// Only if partial.
this.name ??= null;
}
if ('description' in data) { if ('description' in data) {
/** /**
@@ -70,37 +75,60 @@ class GuildScheduledEvent extends Base {
this.description ??= null; this.description ??= null;
} }
if ('scheduled_start_time' in data) {
/** /**
* The timestamp the guild scheduled event will start at * The timestamp the guild scheduled event will start at
* <info>This can be potentially `null` only when it's an {@link AuditLogEntryTarget}</info> * <info>This can be potentially `null` only when it's an {@link AuditLogEntryTarget}</info>
* @type {?number} * @type {?number}
*/ */
this.scheduledStartTimestamp = data.scheduled_start_time ? Date.parse(data.scheduled_start_time) : null; this.scheduledStartTimestamp = Date.parse(data.scheduled_start_time);
} else {
this.scheduledStartTimestamp ??= null;
}
if ('scheduled_end_time' in data) {
/** /**
* The timestamp the guild scheduled event will end at, * The timestamp the guild scheduled event will end at
* or `null` if the event does not have a scheduled time to end * or `null` if the event does not have a scheduled time to end
* @type {?number} * @type {?number}
*/ */
this.scheduledEndTimestamp = data.scheduled_end_time ? Date.parse(data.scheduled_end_time) : null; this.scheduledEndTimestamp = data.scheduled_end_time ? Date.parse(data.scheduled_end_time) : null;
} else {
this.scheduledEndTimestamp ??= null;
}
if ('privacy_level' in data) {
/** /**
* The privacy level of the guild scheduled event * The privacy level of the guild scheduled event
* @type {PrivacyLevel} * @type {PrivacyLevel}
*/ */
this.privacyLevel = GuildScheduledEventPrivacyLevels[data.privacy_level]; this.privacyLevel = GuildScheduledEventPrivacyLevels[data.privacy_level];
} else {
// Only if partial.
this.privacyLevel ??= null;
}
if ('status' in data) {
/** /**
* The status of the guild scheduled event * The status of the guild scheduled event
* @type {GuildScheduledEventStatus} * @type {GuildScheduledEventStatus}
*/ */
this.status = GuildScheduledEventStatuses[data.status]; this.status = GuildScheduledEventStatuses[data.status];
} else {
// Only if partial.
this.status ??= null;
}
if ('entity_type' in data) {
/** /**
* The type of hosting entity associated with the scheduled event * The type of hosting entity associated with the scheduled event
* @type {GuildScheduledEventEntityType} * @type {GuildScheduledEventEntityType}
*/ */
this.entityType = GuildScheduledEventEntityTypes[data.entity_type]; this.entityType = GuildScheduledEventEntityTypes[data.entity_type];
} else {
// Only if partial.
this.entityType ??= null;
}
if ('entity_id' in data) { 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); 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 * The timestamp the guild scheduled event was created at
* @type {number} * @type {number}
@@ -241,6 +278,15 @@ class GuildScheduledEvent extends Base {
return Endpoints.scheduledEvent(this.client.options.http.scheduledEvent, this.guildId, this.id); 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<GuildScheduledEvent>}
*/
fetch(force = true) {
return this.guild.scheduledEvents.fetch({ guildScheduledEvent: this.id, force });
}
/** /**
* Options used to create an invite URL to a {@link GuildScheduledEvent} * Options used to create an invite URL to a {@link GuildScheduledEvent}
* @typedef {CreateInviteOptions} CreateGuildScheduledEventInviteURLOptions * @typedef {CreateInviteOptions} CreateGuildScheduledEventInviteURLOptions

25
typings/index.d.ts vendored
View File

@@ -1697,11 +1697,13 @@ export class GuildScheduledEvent<S extends GuildScheduledEventStatus = GuildSche
public readonly guild: Guild | null; public readonly guild: Guild | null;
public readonly url: string; public readonly url: string;
public readonly image: string | null; public readonly image: string | null;
public readonly partial: false;
public coverImageURL(options?: StaticImageURLOptions): string | null; public coverImageURL(options?: StaticImageURLOptions): string | null;
public createInviteURL(options?: CreateGuildScheduledEventInviteURLOptions): Promise<string>; public createInviteURL(options?: CreateGuildScheduledEventInviteURLOptions): Promise<string>;
public edit<T extends GuildScheduledEventSetStatusArg<S>>( public edit<T extends GuildScheduledEventSetStatusArg<S>>(
options: GuildScheduledEventEditOptions<S, T>, options: GuildScheduledEventEditOptions<S, T>,
): Promise<GuildScheduledEvent<T>>; ): Promise<GuildScheduledEvent<T>>;
public fetch(force?: boolean): Promise<GuildScheduledEvent<S>>;
public delete(): Promise<GuildScheduledEvent<S>>; public delete(): Promise<GuildScheduledEvent<S>>;
public setName(name: string, reason?: string): Promise<GuildScheduledEvent<S>>; public setName(name: string, reason?: string): Promise<GuildScheduledEvent<S>>;
public setScheduledStartTime(scheduledStartTime: DateResolvable, reason?: string): Promise<GuildScheduledEvent<S>>; public setScheduledStartTime(scheduledStartTime: DateResolvable, reason?: string): Promise<GuildScheduledEvent<S>>;
@@ -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 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; export type AllowedThreadTypeForNewsChannel = 'GUILD_NEWS_THREAD' | 10;
@@ -5482,10 +5491,13 @@ export interface ClientEvents extends BaseClientEvents {
stickerDelete: [sticker: Sticker]; stickerDelete: [sticker: Sticker];
stickerUpdate: [oldSticker: Sticker, newSticker: Sticker]; stickerUpdate: [oldSticker: Sticker, newSticker: Sticker];
guildScheduledEventCreate: [guildScheduledEvent: GuildScheduledEvent]; guildScheduledEventCreate: [guildScheduledEvent: GuildScheduledEvent];
guildScheduledEventUpdate: [oldGuildScheduledEvent: GuildScheduledEvent, newGuildScheduledEvent: GuildScheduledEvent]; guildScheduledEventUpdate: [
guildScheduledEventDelete: [guildScheduledEvent: GuildScheduledEvent]; oldGuildScheduledEvent: GuildScheduledEvent | PartialGuildScheduledEvent | null,
guildScheduledEventUserAdd: [guildScheduledEvent: GuildScheduledEvent, user: User]; newGuildScheduledEvent: GuildScheduledEvent,
guildScheduledEventUserRemove: [guildScheduledEvent: GuildScheduledEvent, user: User]; ];
guildScheduledEventDelete: [guildScheduledEvent: GuildScheduledEvent | PartialGuildScheduledEvent];
guildScheduledEventUserAdd: [guildScheduledEvent: GuildScheduledEvent | PartialGuildScheduledEvent, user: User];
guildScheduledEventUserRemove: [guildScheduledEvent: GuildScheduledEvent, | PartialGuildScheduledEvent user: User];
guildAuditLogEntryCreate: [auditLogEntry: GuildAuditLogsEntry, guild: Guild]; guildAuditLogEntryCreate: [auditLogEntry: GuildAuditLogsEntry, guild: Guild];
unhandledPacket: [packet: { t?: string; d: any }, shard: number]; unhandledPacket: [packet: { t?: string; d: any }, shard: number];
relationshipAdd: [userId: Snowflake, shouldNotify: boolean]; relationshipAdd: [userId: Snowflake, shouldNotify: boolean];
@@ -7143,6 +7155,9 @@ export interface PartialMessage
export interface PartialMessageReaction extends Partialize<MessageReaction, 'count'> {} export interface PartialMessageReaction extends Partialize<MessageReaction, 'count'> {}
export interface PartialGuildScheduledEvent
extends Partialize<GuildScheduledEvent, 'userCount', 'status' | 'privacyLevel' | 'name' | 'entityType'> {}
export interface PartialOverwriteData { export interface PartialOverwriteData {
id: Snowflake | number; id: Snowflake | number;
type?: OverwriteType; type?: OverwriteType;