Skip to content

Commit 32d614c

Browse files
fix(GuildScheduledEvent): Use if...else pattern and handle partials (#9802)
fix: handle partial case Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
1 parent 4588e07 commit 32d614c

File tree

2 files changed

+94
-37
lines changed

2 files changed

+94
-37
lines changed

packages/discord.js/src/structures/GuildScheduledEvent.js

Lines changed: 77 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,16 @@ class GuildScheduledEvent extends Base {
5050
this.creatorId ??= null;
5151
}
5252

53-
/**
54-
* The name of the guild scheduled event
55-
* @type {string}
56-
*/
57-
this.name = data.name;
53+
if ('name' in data) {
54+
/**
55+
* The name of the guild scheduled event
56+
* @type {?string}
57+
*/
58+
this.name = data.name;
59+
} else {
60+
// Only if partial.
61+
this.name ??= null;
62+
}
5863

5964
if ('description' in data) {
6065
/**
@@ -66,37 +71,59 @@ class GuildScheduledEvent extends Base {
6671
this.description ??= null;
6772
}
6873

69-
/**
70-
* The timestamp the guild scheduled event will start at
71-
* <info>This can be potentially `null` only when it's an {@link AuditLogEntryTarget}</info>
72-
* @type {?number}
73-
*/
74-
this.scheduledStartTimestamp = data.scheduled_start_time ? Date.parse(data.scheduled_start_time) : null;
74+
if ('scheduled_start_time' in data) {
75+
/**
76+
* The timestamp the guild scheduled event will start at
77+
* @type {?number}
78+
*/
79+
this.scheduledStartTimestamp = Date.parse(data.scheduled_start_time);
80+
} else {
81+
this.scheduledStartTimestamp ??= null;
82+
}
7583

76-
/**
77-
* The timestamp the guild scheduled event will end at,
78-
* or `null` if the event does not have a scheduled time to end
79-
* @type {?number}
80-
*/
81-
this.scheduledEndTimestamp = data.scheduled_end_time ? Date.parse(data.scheduled_end_time) : null;
84+
if ('scheduled_end_time' in data) {
85+
/**
86+
* The timestamp the guild scheduled event will end at
87+
* or `null` if the event does not have a scheduled time to end
88+
* @type {?number}
89+
*/
90+
this.scheduledEndTimestamp = data.scheduled_end_time ? Date.parse(data.scheduled_end_time) : null;
91+
} else {
92+
this.scheduledEndTimestamp ??= null;
93+
}
8294

83-
/**
84-
* The privacy level of the guild scheduled event
85-
* @type {GuildScheduledEventPrivacyLevel}
86-
*/
87-
this.privacyLevel = data.privacy_level;
95+
if ('privacy_level' in data) {
96+
/**
97+
* The privacy level of the guild scheduled event
98+
* @type {?GuildScheduledEventPrivacyLevel}
99+
*/
100+
this.privacyLevel = data.privacy_level;
101+
} else {
102+
// Only if partial.
103+
this.privacyLevel ??= null;
104+
}
88105

89-
/**
90-
* The status of the guild scheduled event
91-
* @type {GuildScheduledEventStatus}
92-
*/
93-
this.status = data.status;
106+
if ('status' in data) {
107+
/**
108+
* The status of the guild scheduled event
109+
* @type {?GuildScheduledEventStatus}
110+
*/
111+
this.status = data.status;
112+
} else {
113+
// Only if partial.
114+
this.status ??= null;
115+
}
94116

95-
/**
96-
* The type of hosting entity associated with the scheduled event
97-
* @type {GuildScheduledEventEntityType}
98-
*/
99-
this.entityType = data.entity_type;
117+
if ('entity_type' in data) {
118+
/**
119+
* The type of hosting entity associated with the scheduled event
120+
* @type {?GuildScheduledEventEntityType}
121+
*/
122+
this.entityType = data.entity_type;
123+
} else {
124+
// Only if partial.
125+
this.entityType ??= null;
126+
}
100127

101128
if ('entity_id' in data) {
102129
/**
@@ -164,6 +191,15 @@ class GuildScheduledEvent extends Base {
164191
}
165192
}
166193

194+
/**
195+
* Whether this guild scheduled event is partial.
196+
* @type {boolean}
197+
* @readonly
198+
*/
199+
get partial() {
200+
return this.name === null;
201+
}
202+
167203
/**
168204
* The URL of this scheduled event's cover image
169205
* @param {BaseImageURLOptions} [options={}] Options for image URL
@@ -276,6 +312,15 @@ class GuildScheduledEvent extends Base {
276312
return this.guild.scheduledEvents.edit(this.id, options);
277313
}
278314

315+
/**
316+
* Fetches this guild scheduled event.
317+
* @param {boolean} [force=true] Whether to skip the cache check and request the API
318+
* @returns {Promise<GuildScheduledEvent>}
319+
*/
320+
fetch(force = true) {
321+
return this.guild.scheduledEvents.fetch({ guildScheduledEvent: this.id, force });
322+
}
323+
279324
/**
280325
* Deletes this guild scheduled event.
281326
* @returns {Promise<GuildScheduledEvent>}

packages/discord.js/typings/index.d.ts

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1670,11 +1670,13 @@ export class GuildScheduledEvent<S extends GuildScheduledEventStatus = GuildSche
16701670
public get guild(): Guild | null;
16711671
public get url(): string;
16721672
public image: string | null;
1673+
public get partial(): false;
16731674
public coverImageURL(options?: Readonly<BaseImageURLOptions>): string | null;
16741675
public createInviteURL(options?: GuildScheduledEventInviteURLCreateOptions): Promise<string>;
16751676
public edit<T extends GuildScheduledEventSetStatusArg<S>>(
16761677
options: GuildScheduledEventEditOptions<S, T>,
16771678
): Promise<GuildScheduledEvent<T>>;
1679+
public fetch(force?: boolean): Promise<GuildScheduledEvent<S>>;
16781680
public delete(): Promise<GuildScheduledEvent<S>>;
16791681
public setName(name: string, reason?: string): Promise<GuildScheduledEvent<S>>;
16801682
public setScheduledStartTime(scheduledStartTime: DateResolvable, reason?: string): Promise<GuildScheduledEvent<S>>;
@@ -4359,7 +4361,14 @@ export interface AddGuildMemberOptions {
43594361
fetchWhenExisting?: boolean;
43604362
}
43614363

4362-
export type AllowedPartial = User | Channel | GuildMember | Message | MessageReaction | ThreadMember;
4364+
export type AllowedPartial =
4365+
| User
4366+
| Channel
4367+
| GuildMember
4368+
| Message
4369+
| MessageReaction
4370+
| GuildScheduledEvent
4371+
| ThreadMember;
43634372

43644373
export type AllowedThreadTypeForNewsChannel = ChannelType.AnnouncementThread;
43654374

@@ -4929,12 +4938,12 @@ export interface ClientEvents {
49294938
stickerUpdate: [oldSticker: Sticker, newSticker: Sticker];
49304939
guildScheduledEventCreate: [guildScheduledEvent: GuildScheduledEvent];
49314940
guildScheduledEventUpdate: [
4932-
oldGuildScheduledEvent: GuildScheduledEvent | null,
4941+
oldGuildScheduledEvent: GuildScheduledEvent | PartialGuildScheduledEvent | null,
49334942
newGuildScheduledEvent: GuildScheduledEvent,
49344943
];
4935-
guildScheduledEventDelete: [guildScheduledEvent: GuildScheduledEvent];
4936-
guildScheduledEventUserAdd: [guildScheduledEvent: GuildScheduledEvent, user: User];
4937-
guildScheduledEventUserRemove: [guildScheduledEvent: GuildScheduledEvent, user: User];
4944+
guildScheduledEventDelete: [guildScheduledEvent: GuildScheduledEvent | PartialGuildScheduledEvent];
4945+
guildScheduledEventUserAdd: [guildScheduledEvent: GuildScheduledEvent | PartialGuildScheduledEvent, user: User];
4946+
guildScheduledEventUserRemove: [guildScheduledEvent: GuildScheduledEvent | PartialGuildScheduledEvent, user: User];
49384947
}
49394948

49404949
export interface ClientFetchInviteOptions {
@@ -6149,6 +6158,9 @@ export interface PartialMessage
61496158

61506159
export interface PartialMessageReaction extends Partialize<MessageReaction, 'count'> {}
61516160

6161+
export interface PartialGuildScheduledEvent
6162+
extends Partialize<GuildScheduledEvent, 'userCount', 'status' | 'privacyLevel' | 'name' | 'entityType'> {}
6163+
61526164
export interface PartialThreadMember extends Partialize<ThreadMember, 'flags' | 'joinedAt' | 'joinedTimestamp'> {}
61536165

61546166
export interface PartialOverwriteData {

0 commit comments

Comments
 (0)