From d333962715a58bd5ac14ad80e900b43b02777794 Mon Sep 17 00:00:00 2001 From: Shubham Parihar Date: Thu, 25 Nov 2021 18:45:05 +0530 Subject: [PATCH] feat: add guild scheduled event (#186) Co-authored-by: Vlad Frangu --- deno/gateway/v8.ts | 55 +++++++++ deno/gateway/v9.ts | 55 +++++++++ deno/payloads/v8/auditLog.ts | 31 ++++- deno/payloads/v8/guild.ts | 9 ++ deno/payloads/v8/guildScheduledEvent.ts | 104 ++++++++++++++++ deno/payloads/v8/invite.ts | 5 + deno/payloads/v8/mod.ts | 1 + deno/payloads/v8/permissions.ts | 1 + deno/payloads/v9/auditLog.ts | 31 ++++- deno/payloads/v9/guild.ts | 9 ++ deno/payloads/v9/guildScheduledEvent.ts | 104 ++++++++++++++++ deno/payloads/v9/invite.ts | 5 + deno/payloads/v9/mod.ts | 1 + deno/payloads/v9/permissions.ts | 1 + deno/rest/common.ts | 5 + deno/rest/v8/guildScheduledEvent.ts | 150 ++++++++++++++++++++++++ deno/rest/v8/invite.ts | 5 + deno/rest/v8/mod.ts | 28 +++++ deno/rest/v9/guildScheduledEvent.ts | 150 ++++++++++++++++++++++++ deno/rest/v9/invite.ts | 5 + deno/rest/v9/mod.ts | 28 +++++ gateway/v8.ts | 55 +++++++++ gateway/v9.ts | 55 +++++++++ payloads/v8/auditLog.ts | 31 ++++- payloads/v8/guild.ts | 9 ++ payloads/v8/guildScheduledEvent.ts | 104 ++++++++++++++++ payloads/v8/index.ts | 1 + payloads/v8/invite.ts | 5 + payloads/v8/permissions.ts | 1 + payloads/v9/auditLog.ts | 31 ++++- payloads/v9/guild.ts | 9 ++ payloads/v9/guildScheduledEvent.ts | 104 ++++++++++++++++ payloads/v9/index.ts | 1 + payloads/v9/invite.ts | 5 + payloads/v9/permissions.ts | 1 + rest/common.ts | 5 + rest/v8/guildScheduledEvent.ts | 150 ++++++++++++++++++++++++ rest/v8/index.ts | 28 +++++ rest/v8/invite.ts | 5 + rest/v9/guildScheduledEvent.ts | 150 ++++++++++++++++++++++++ rest/v9/index.ts | 28 +++++ rest/v9/invite.ts | 5 + 42 files changed, 1550 insertions(+), 16 deletions(-) create mode 100644 deno/payloads/v8/guildScheduledEvent.ts create mode 100644 deno/payloads/v9/guildScheduledEvent.ts create mode 100644 deno/rest/v8/guildScheduledEvent.ts create mode 100644 deno/rest/v9/guildScheduledEvent.ts create mode 100644 payloads/v8/guildScheduledEvent.ts create mode 100644 payloads/v9/guildScheduledEvent.ts create mode 100644 rest/v8/guildScheduledEvent.ts create mode 100644 rest/v9/guildScheduledEvent.ts diff --git a/deno/gateway/v8.ts b/deno/gateway/v8.ts index 6f59919a..b6cf16cb 100644 --- a/deno/gateway/v8.ts +++ b/deno/gateway/v8.ts @@ -9,6 +9,7 @@ import type { APIChannel, APIEmoji, APIGuild, + APIGuildScheduledEvent, APIGuildIntegration, APIGuildMember, APIMessage, @@ -183,6 +184,7 @@ export enum GatewayIntentBits { DirectMessages = 1 << 12, DirectMessageReactions = 1 << 13, DirectMessageTyping = 1 << 14, + GuildScheduledEvents = 1 << 16, } /** @@ -233,6 +235,11 @@ export enum GatewayDispatchEvents { VoiceServerUpdate = 'VOICE_SERVER_UPDATE', VoiceStateUpdate = 'VOICE_STATE_UPDATE', WebhooksUpdate = 'WEBHOOKS_UPDATE', + GuildScheduledEventCreate = 'GUILD_SCHEDULED_EVENT_CREATE', + GuildScheduledEventUpdate = 'GUILD_SCHEDULED_EVENT_UPDATE', + GuildScheduledEventDelete = 'GUILD_SCHEDULED_EVENT_DELETE', + GuildScheduledEventUserAdd = 'GUILD_SCHEDULED_EVENT_USER_ADD', + GuildScheduledEventUserRemove = 'GUILD_SCHEDULED_EVENT_USER_REMOVE', } export type GatewaySendPayload = @@ -265,6 +272,11 @@ export type GatewayDispatchPayload = | GatewayGuildModifyDispatch | GatewayGuildRoleDeleteDispatch | GatewayGuildRoleModifyDispatch + | GatewayGuildScheduledEventCreateDispatch + | GatewayGuildScheduledEventUpdateDispatch + | GatewayGuildScheduledEventDeleteDispatch + | GatewayGuildScheduledEventUserAddDispatch + | GatewayGuildScheduledEventUserRemoveDispatch | GatewayGuildStickersUpdateDispatch | GatewayIntegrationCreateDispatch | GatewayIntegrationDeleteDispatch @@ -808,6 +820,49 @@ export interface GatewayGuildRoleDeleteDispatchData { role_id: Snowflake; } +export type GatewayGuildScheduledEventCreateDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventCreate, + GatewayGuildScheduledEventCreateDispatchData +>; + +export type GatewayGuildScheduledEventCreateDispatchData = APIGuildScheduledEvent; + +export type GatewayGuildScheduledEventUpdateDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventUpdate, + GatewayGuildScheduledEventUpdateDispatchData +>; + +export type GatewayGuildScheduledEventUpdateDispatchData = APIGuildScheduledEvent; + +export type GatewayGuildScheduledEventDeleteDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventDelete, + GatewayGuildScheduledEventDeleteDispatchData +>; + +export type GatewayGuildScheduledEventDeleteDispatchData = APIGuildScheduledEvent; + +export type GatewayGuildScheduledEventUserAddDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventUserAdd, + GatewayGuildScheduledEventUserAddDispatchData +>; + +export interface GatewayGuildScheduledEventUserAddDispatchData { + guild_scheduled_event_id: Snowflake; + user_id: Snowflake; + guild_id: Snowflake; +} + +export type GatewayGuildScheduledEventUserRemoveDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventUserRemove, + GatewayGuildScheduledEventUserAddDispatchData +>; + +export interface GatewayGuildScheduledEventUserRemoveDispatchData { + guild_scheduled_event_id: Snowflake; + user_id: Snowflake; + guild_id: Snowflake; +} + /** * https://discord.com/developers/docs/topics/gateway#integration-create */ diff --git a/deno/gateway/v9.ts b/deno/gateway/v9.ts index 44ea7bbd..9afc8277 100644 --- a/deno/gateway/v9.ts +++ b/deno/gateway/v9.ts @@ -9,6 +9,7 @@ import type { APIChannel, APIEmoji, APIGuild, + APIGuildScheduledEvent, APIGuildIntegration, APIGuildMember, APIMessage, @@ -186,6 +187,7 @@ export enum GatewayIntentBits { DirectMessages = 1 << 12, DirectMessageReactions = 1 << 13, DirectMessageTyping = 1 << 14, + GuildScheduledEvents = 1 << 16, } /** @@ -242,6 +244,11 @@ export enum GatewayDispatchEvents { VoiceServerUpdate = 'VOICE_SERVER_UPDATE', VoiceStateUpdate = 'VOICE_STATE_UPDATE', WebhooksUpdate = 'WEBHOOKS_UPDATE', + GuildScheduledEventCreate = 'GUILD_SCHEDULED_EVENT_CREATE', + GuildScheduledEventUpdate = 'GUILD_SCHEDULED_EVENT_UPDATE', + GuildScheduledEventDelete = 'GUILD_SCHEDULED_EVENT_DELETE', + GuildScheduledEventUserAdd = 'GUILD_SCHEDULED_EVENT_USER_ADD', + GuildScheduledEventUserRemove = 'GUILD_SCHEDULED_EVENT_USER_REMOVE', } export type GatewaySendPayload = @@ -274,6 +281,11 @@ export type GatewayDispatchPayload = | GatewayGuildModifyDispatch | GatewayGuildRoleDeleteDispatch | GatewayGuildRoleModifyDispatch + | GatewayGuildScheduledEventCreateDispatch + | GatewayGuildScheduledEventUpdateDispatch + | GatewayGuildScheduledEventDeleteDispatch + | GatewayGuildScheduledEventUserAddDispatch + | GatewayGuildScheduledEventUserRemoveDispatch | GatewayGuildStickersUpdateDispatch | GatewayIntegrationCreateDispatch | GatewayIntegrationDeleteDispatch @@ -818,6 +830,49 @@ export interface GatewayGuildRoleDeleteDispatchData { role_id: Snowflake; } +export type GatewayGuildScheduledEventCreateDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventCreate, + GatewayGuildScheduledEventCreateDispatchData +>; + +export type GatewayGuildScheduledEventCreateDispatchData = APIGuildScheduledEvent; + +export type GatewayGuildScheduledEventUpdateDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventUpdate, + GatewayGuildScheduledEventUpdateDispatchData +>; + +export type GatewayGuildScheduledEventUpdateDispatchData = APIGuildScheduledEvent; + +export type GatewayGuildScheduledEventDeleteDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventDelete, + GatewayGuildScheduledEventDeleteDispatchData +>; + +export type GatewayGuildScheduledEventDeleteDispatchData = APIGuildScheduledEvent; + +export type GatewayGuildScheduledEventUserAddDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventUserAdd, + GatewayGuildScheduledEventUserAddDispatchData +>; + +export interface GatewayGuildScheduledEventUserAddDispatchData { + guild_scheduled_event_id: Snowflake; + user_id: Snowflake; + guild_id: Snowflake; +} + +export type GatewayGuildScheduledEventUserRemoveDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventUserRemove, + GatewayGuildScheduledEventUserAddDispatchData +>; + +export interface GatewayGuildScheduledEventUserRemoveDispatchData { + guild_scheduled_event_id: Snowflake; + user_id: Snowflake; + guild_id: Snowflake; +} + /** * https://discord.com/developers/docs/topics/gateway#integration-create */ diff --git a/deno/payloads/v8/auditLog.ts b/deno/payloads/v8/auditLog.ts index 6e532228..35428fe5 100644 --- a/deno/payloads/v8/auditLog.ts +++ b/deno/payloads/v8/auditLog.ts @@ -17,6 +17,7 @@ import type { StickerFormatType } from './sticker.ts'; import type { APIUser } from './user.ts'; import type { APIWebhook } from './webhook.ts'; import type { StageInstancePrivacyLevel } from './stageInstance.ts'; +import type { GuildScheduledEventEntityType, GuildScheduledEventStatus } from './guildScheduledEvent.ts'; /** * https://discord.com/developers/docs/resources/audit-log#audit-log-object-audit-log-structure @@ -144,6 +145,10 @@ export enum AuditLogEvent { StickerCreate = 90, StickerUpdate, StickerDelete, + + GuildScheduledEventCreate = 100, + GuildScheduledEventUpdate, + GuildScheduledEventDelete, } /** @@ -302,7 +307,10 @@ export type APIAuditLogChange = | APIAuditLogChangeKeyFormatType | APIAuditLogChangeKeyAsset | APIAuditLogChangeKeyAvailable - | APIAuditLogChangeKeyGuildId; + | APIAuditLogChangeKeyGuildId + | APIAuditLogChangeKeyEntityType + | APIAuditLogChangeKeyStatus + | APIAuditLogChangeKeyLocation; /** * Returned when an entity's name is changed @@ -310,7 +318,7 @@ export type APIAuditLogChange = export type APIAuditLogChangeKeyName = AuditLogChangeData<'name', string>; /** - * Returned when a guild's or sticker's description is changed + * Returned when a guild's or sticker's or guild scheduled event's description is changed */ export type APIAuditLogChangeKeyDescription = AuditLogChangeData<'description', string>; @@ -502,7 +510,7 @@ export type APIAuditLogChangeKeyDeny = AuditLogChangeData<'deny', string>; export type APIAuditLogChangeKeyCode = AuditLogChangeData<'code', string>; /** - * Returned when an invite's channel_id is changed + * Returned when an invite's or guild scheduled event's channel_id is changed */ export type APIAuditLogChangeKeyChannelId = AuditLogChangeData<'channel_id', Snowflake>; @@ -582,7 +590,7 @@ export type APIAuditLogChangeKeyExpireGracePeriod = AuditLogChangeData<'expire_g export type APIAuditLogChangeKeyUserLimit = AuditLogChangeData<'user_limit', number>; /** - * Returned when privacy level of a stage instance is changed + * Returned when privacy level of a stage instance or guild scheduled event is changed */ export type APIAuditLogChangeKeyPrivacyLevel = AuditLogChangeData<'privacy_level', StageInstancePrivacyLevel>; @@ -611,6 +619,21 @@ export type APIAuditLogChangeKeyAvailable = AuditLogChangeData<'available', bool */ export type APIAuditLogChangeKeyGuildId = AuditLogChangeData<'guild_id', Snowflake>; +/** + * Returned when entity type of a guild scheduled event is changed + */ +export type APIAuditLogChangeKeyEntityType = AuditLogChangeData<'entity_type', GuildScheduledEventEntityType>; + +/** + * Returned when status of a guild scheduled event is changed + */ +export type APIAuditLogChangeKeyStatus = AuditLogChangeData<'status', GuildScheduledEventStatus>; + +/** + * Returned when location of a guild scheduled event is changed + */ +export type APIAuditLogChangeKeyLocation = AuditLogChangeData<'location', string>; + interface AuditLogChangeData { key: K; /** diff --git a/deno/payloads/v8/guild.ts b/deno/payloads/v8/guild.ts index ce64e668..1ef60204 100644 --- a/deno/payloads/v8/guild.ts +++ b/deno/payloads/v8/guild.ts @@ -11,6 +11,7 @@ import type { APIStageInstance } from './stageInstance.ts'; import type { APISticker } from './sticker.ts'; import type { APIUser } from './user.ts'; import type { GatewayVoiceState } from './voice.ts'; +import type { APIGuildScheduledEvent } from './guildScheduledEvent.ts'; /** * https://discord.com/developers/docs/resources/guild#unavailable-guild-object @@ -325,6 +326,14 @@ export interface APIGuild extends APIPartialGuild { * See https://discord.com/developers/docs/resources/sticker#sticker-object */ stickers: APISticker[]; + /** + * The scheduled events in the guild + * + * **This field is only sent within the [GUILD_CREATE](https://discord.com/developers/docs/topics/gateway#guild-create) event** + * + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object + */ + guild_scheduled_events?: APIGuildScheduledEvent[]; } /** diff --git a/deno/payloads/v8/guildScheduledEvent.ts b/deno/payloads/v8/guildScheduledEvent.ts new file mode 100644 index 00000000..0e62552a --- /dev/null +++ b/deno/payloads/v8/guildScheduledEvent.ts @@ -0,0 +1,104 @@ +import type { APIUser } from './user.ts'; +import type { Snowflake } from '../../globals.ts'; + +export interface APIGuildScheduledEvent { + /** + * The id of the guild event + */ + id: Snowflake; + /** + * The guild id which the scheduled event belongs to + */ + guild_id: Snowflake; + /** + * The channel id in which the scheduled event will be hosted, or `null` if entity type is `EXTERNAL` + */ + channel_id: Snowflake | null; + /** + * The id of the user that created the scheduled event + */ + creator_id: Snowflake | null; + /** + * The name of the scheduled event + */ + name: string; + /** + * The description of the scheduled event + */ + description?: string; + /** + * The time the scheduled event will start + */ + scheduled_start_time: string; + /** + * The time at which the guild event will end, or `null` if the event does not have a scheduled time to end + */ + scheduled_end_time: string | null; + /** + * The privacy level of the scheduled event + */ + privacy_level: GuildScheduledEventPrivacyLevel; + /** + * The status of the scheduled event + */ + status: GuildScheduledEventStatus; + /** + * The type of hosting entity associated with the scheduled event + */ + entity_type: GuildScheduledEventEntityType; + /** + * The id of the hosting entity associated with the scheduled event + */ + entity_id: Snowflake | null; + /** + * The entity metadata for the scheduled event + */ + entity_metadata: APIGuildScheduledEventEntityMetadata; + /** + * The user that created the scheduled event + */ + creator?: APIUser; + /** + * The number of users subscribed to the scheduled event + */ + user_count?: number; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-entity-metadata + */ +export interface APIGuildScheduledEventEntityMetadata { + /** + * The location of the scheduled event + */ + location?: string; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-entity-types + */ +export enum GuildScheduledEventEntityType { + StageInstance = 1, + Voice, + External, +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-status + */ +export enum GuildScheduledEventStatus { + Scheduled = 1, + Active, + Completed, + Canceled, +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-privacy-level + */ +export enum GuildScheduledEventPrivacyLevel { + /** + * The scheduled event is only accessible to guild members + */ + GuildOnly = 2, +} diff --git a/deno/payloads/v8/invite.ts b/deno/payloads/v8/invite.ts index 448533f7..09b10c35 100644 --- a/deno/payloads/v8/invite.ts +++ b/deno/payloads/v8/invite.ts @@ -7,6 +7,7 @@ import type { APIPartialGuild } from './guild.ts'; import type { APIApplication } from './application.ts'; import type { APIInviteStageInstance } from './stageInstance.ts'; import type { APIUser } from './user.ts'; +import type { APIGuildScheduledEvent } from './guildScheduledEvent.ts'; /** * https://discord.com/developers/docs/resources/invite#invite-object @@ -68,6 +69,10 @@ export interface APIInvite { * The stage instance data if there is a public stage instance in the stage channel this invite is for */ stage_instance?: APIInviteStageInstance; + /** + * The guild scheduled event data, returned from the `GET /invites/` endpoint when `guild_scheduled_event_id` is a valid guild scheduled event id + */ + guild_scheduled_event?: APIGuildScheduledEvent; } /** diff --git a/deno/payloads/v8/mod.ts b/deno/payloads/v8/mod.ts index 35b759d4..0efdc9f0 100644 --- a/deno/payloads/v8/mod.ts +++ b/deno/payloads/v8/mod.ts @@ -4,6 +4,7 @@ export * from './channel.ts'; export * from './emoji.ts'; export * from './gateway.ts'; export * from './guild.ts'; +export * from './guildScheduledEvent.ts'; export * from './interactions.ts'; export * from './invite.ts'; export * from './oauth2.ts'; diff --git a/deno/payloads/v8/permissions.ts b/deno/payloads/v8/permissions.ts index c862e0d6..d8d48749 100644 --- a/deno/payloads/v8/permissions.ts +++ b/deno/payloads/v8/permissions.ts @@ -45,6 +45,7 @@ export const PermissionFlagsBits = { ManageEmojisAndStickers: 1n << 30n, UseApplicationCommands: 1n << 31n, RequestToSpeak: 1n << 32n, + ManageEvents: 1n << 33n, UseExternalStickers: 1n << 37n, StartEmbeddedActivities: 1n << 39n, } as const; diff --git a/deno/payloads/v9/auditLog.ts b/deno/payloads/v9/auditLog.ts index 5af1243e..69dcd504 100644 --- a/deno/payloads/v9/auditLog.ts +++ b/deno/payloads/v9/auditLog.ts @@ -17,6 +17,7 @@ import type { StickerFormatType } from './sticker.ts'; import type { APIUser } from './user.ts'; import type { APIWebhook } from './webhook.ts'; import type { StageInstancePrivacyLevel } from './stageInstance.ts'; +import type { GuildScheduledEventEntityType, GuildScheduledEventStatus } from './guildScheduledEvent.ts'; /** * https://discord.com/developers/docs/resources/audit-log#audit-log-object-audit-log-structure @@ -153,6 +154,10 @@ export enum AuditLogEvent { StickerUpdate, StickerDelete, + GuildScheduledEventCreate = 100, + GuildScheduledEventUpdate, + GuildScheduledEventDelete, + ThreadCreate = 110, ThreadUpdate, ThreadDelete, @@ -318,7 +323,10 @@ export type APIAuditLogChange = | APIAuditLogChangeKeyArchived | APIAuditLogChangeKeyLocked | APIAuditLogChangeKeyAutoArchiveDuration - | APIAuditLogChangeKeyDefaultAutoArchiveDuration; + | APIAuditLogChangeKeyDefaultAutoArchiveDuration + | APIAuditLogChangeKeyEntityType + | APIAuditLogChangeKeyStatus + | APIAuditLogChangeKeyLocation; /** * Returned when an entity's name is changed @@ -326,7 +334,7 @@ export type APIAuditLogChange = export type APIAuditLogChangeKeyName = AuditLogChangeData<'name', string>; /** - * Returned when a guild's or sticker's description is changed + * Returned when a guild's or sticker's or guild scheduled event's description is changed */ export type APIAuditLogChangeKeyDescription = AuditLogChangeData<'description', string>; @@ -518,7 +526,7 @@ export type APIAuditLogChangeKeyDeny = AuditLogChangeData<'deny', string>; export type APIAuditLogChangeKeyCode = AuditLogChangeData<'code', string>; /** - * Returned when an invite's channel_id is changed + * Returned when an invite's or guild scheduled event's channel_id is changed */ export type APIAuditLogChangeKeyChannelId = AuditLogChangeData<'channel_id', Snowflake>; @@ -598,7 +606,7 @@ export type APIAuditLogChangeKeyExpireGracePeriod = AuditLogChangeData<'expire_g export type APIAuditLogChangeKeyUserLimit = AuditLogChangeData<'user_limit', number>; /** - * Returned when privacy level of a stage instance is changed + * Returned when privacy level of a stage instance or guild scheduled event is changed */ export type APIAuditLogChangeKeyPrivacyLevel = AuditLogChangeData<'privacy_level', StageInstancePrivacyLevel>; @@ -650,6 +658,21 @@ export type APIAuditLogChangeKeyDefaultAutoArchiveDuration = AuditLogChangeData< number >; +/** + * Returned when entity type of a guild scheduled event is changed + */ +export type APIAuditLogChangeKeyEntityType = AuditLogChangeData<'entity_type', GuildScheduledEventEntityType>; + +/** + * Returned when status of a guild scheduled event is changed + */ +export type APIAuditLogChangeKeyStatus = AuditLogChangeData<'status', GuildScheduledEventStatus>; + +/** + * Returned when location of a guild scheduled event is changed + */ +export type APIAuditLogChangeKeyLocation = AuditLogChangeData<'location', string>; + interface AuditLogChangeData { key: K; /** diff --git a/deno/payloads/v9/guild.ts b/deno/payloads/v9/guild.ts index a2089ef9..ba67eda5 100644 --- a/deno/payloads/v9/guild.ts +++ b/deno/payloads/v9/guild.ts @@ -11,6 +11,7 @@ import type { APIStageInstance } from './stageInstance.ts'; import type { APISticker } from './sticker.ts'; import type { APIUser } from './user.ts'; import type { GatewayVoiceState } from './voice.ts'; +import type { APIGuildScheduledEvent } from './guildScheduledEvent.ts'; /** * https://discord.com/developers/docs/resources/guild#unavailable-guild-object @@ -333,6 +334,14 @@ export interface APIGuild extends APIPartialGuild { * See https://discord.com/developers/docs/resources/sticker#sticker-object */ stickers: APISticker[]; + /** + * The scheduled events in the guild + * + * **This field is only sent within the [GUILD_CREATE](https://discord.com/developers/docs/topics/gateway#guild-create) event** + * + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object + */ + guild_scheduled_events?: APIGuildScheduledEvent[]; } /** diff --git a/deno/payloads/v9/guildScheduledEvent.ts b/deno/payloads/v9/guildScheduledEvent.ts new file mode 100644 index 00000000..0e62552a --- /dev/null +++ b/deno/payloads/v9/guildScheduledEvent.ts @@ -0,0 +1,104 @@ +import type { APIUser } from './user.ts'; +import type { Snowflake } from '../../globals.ts'; + +export interface APIGuildScheduledEvent { + /** + * The id of the guild event + */ + id: Snowflake; + /** + * The guild id which the scheduled event belongs to + */ + guild_id: Snowflake; + /** + * The channel id in which the scheduled event will be hosted, or `null` if entity type is `EXTERNAL` + */ + channel_id: Snowflake | null; + /** + * The id of the user that created the scheduled event + */ + creator_id: Snowflake | null; + /** + * The name of the scheduled event + */ + name: string; + /** + * The description of the scheduled event + */ + description?: string; + /** + * The time the scheduled event will start + */ + scheduled_start_time: string; + /** + * The time at which the guild event will end, or `null` if the event does not have a scheduled time to end + */ + scheduled_end_time: string | null; + /** + * The privacy level of the scheduled event + */ + privacy_level: GuildScheduledEventPrivacyLevel; + /** + * The status of the scheduled event + */ + status: GuildScheduledEventStatus; + /** + * The type of hosting entity associated with the scheduled event + */ + entity_type: GuildScheduledEventEntityType; + /** + * The id of the hosting entity associated with the scheduled event + */ + entity_id: Snowflake | null; + /** + * The entity metadata for the scheduled event + */ + entity_metadata: APIGuildScheduledEventEntityMetadata; + /** + * The user that created the scheduled event + */ + creator?: APIUser; + /** + * The number of users subscribed to the scheduled event + */ + user_count?: number; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-entity-metadata + */ +export interface APIGuildScheduledEventEntityMetadata { + /** + * The location of the scheduled event + */ + location?: string; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-entity-types + */ +export enum GuildScheduledEventEntityType { + StageInstance = 1, + Voice, + External, +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-status + */ +export enum GuildScheduledEventStatus { + Scheduled = 1, + Active, + Completed, + Canceled, +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-privacy-level + */ +export enum GuildScheduledEventPrivacyLevel { + /** + * The scheduled event is only accessible to guild members + */ + GuildOnly = 2, +} diff --git a/deno/payloads/v9/invite.ts b/deno/payloads/v9/invite.ts index 448533f7..09b10c35 100644 --- a/deno/payloads/v9/invite.ts +++ b/deno/payloads/v9/invite.ts @@ -7,6 +7,7 @@ import type { APIPartialGuild } from './guild.ts'; import type { APIApplication } from './application.ts'; import type { APIInviteStageInstance } from './stageInstance.ts'; import type { APIUser } from './user.ts'; +import type { APIGuildScheduledEvent } from './guildScheduledEvent.ts'; /** * https://discord.com/developers/docs/resources/invite#invite-object @@ -68,6 +69,10 @@ export interface APIInvite { * The stage instance data if there is a public stage instance in the stage channel this invite is for */ stage_instance?: APIInviteStageInstance; + /** + * The guild scheduled event data, returned from the `GET /invites/` endpoint when `guild_scheduled_event_id` is a valid guild scheduled event id + */ + guild_scheduled_event?: APIGuildScheduledEvent; } /** diff --git a/deno/payloads/v9/mod.ts b/deno/payloads/v9/mod.ts index 35b759d4..0efdc9f0 100644 --- a/deno/payloads/v9/mod.ts +++ b/deno/payloads/v9/mod.ts @@ -4,6 +4,7 @@ export * from './channel.ts'; export * from './emoji.ts'; export * from './gateway.ts'; export * from './guild.ts'; +export * from './guildScheduledEvent.ts'; export * from './interactions.ts'; export * from './invite.ts'; export * from './oauth2.ts'; diff --git a/deno/payloads/v9/permissions.ts b/deno/payloads/v9/permissions.ts index 172657f3..74391dbb 100644 --- a/deno/payloads/v9/permissions.ts +++ b/deno/payloads/v9/permissions.ts @@ -45,6 +45,7 @@ export const PermissionFlagsBits = { ManageEmojisAndStickers: 1n << 30n, UseApplicationCommands: 1n << 31n, RequestToSpeak: 1n << 32n, + ManageEvents: 1n << 33n, ManageThreads: 1n << 34n, CreatePublicThreads: 1n << 35n, CreatePrivateThreads: 1n << 36n, diff --git a/deno/rest/common.ts b/deno/rest/common.ts index ea445c94..5990b9a8 100644 --- a/deno/rest/common.ts +++ b/deno/rest/common.ts @@ -101,6 +101,7 @@ export enum RESTJSONErrorCodes { MaximumNumberOfNonGuildMemberBansHasBeenExceeded = 30035, MaximumNumberOfBanFetchesHasBeenReached = 30037, + MaximumNumberOfUncompletedGuildScheduledEventsReached, MaximumNumberOfStickersReached = 30039, MaximumNumberOfPruneRequestsHasBeenReached, @@ -198,4 +199,8 @@ export enum RESTJSONErrorCodes { LottieAnimationMaximumDimensionsExceeded, StickerFramerateIsTooSmallOrTooLarge, StickerAnimationDurationExceedsMaximumOf5Seconds, + + CannotUpdateAFinishedEvent = 180000, + + FailedToCreateStageNeededForStageEvent = 180002, } diff --git a/deno/rest/v8/guildScheduledEvent.ts b/deno/rest/v8/guildScheduledEvent.ts new file mode 100644 index 00000000..17e3ff48 --- /dev/null +++ b/deno/rest/v8/guildScheduledEvent.ts @@ -0,0 +1,150 @@ +import type { Snowflake } from '../../globals.ts'; +import type { + APIGuildScheduledEvent, + GuildScheduledEventEntityType, + GuildScheduledEventPrivacyLevel, + APIGuildScheduledEventEntityMetadata, + GuildScheduledEventStatus, + APIGuildMember, + APIUser, +} from '../../payloads/v8.ts'; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#list-scheduled-events-for-guild + */ +export interface RESTGetAPIGuildScheduledEventsQuery { + /** + * Whether to include number of users subscribed to each event + */ + with_user_count?: boolean; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#list-scheduled-events-for-guild + */ +export type RESTGetAPIGuildScheduledEventsResult = APIGuildScheduledEvent[]; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#create-guild-scheduled-event + */ +export interface RESTPostAPIGuildScheduledEventJSONBody { + /** + * The stage channel id of the guild event + */ + channel_id?: Snowflake; + /** + * The name of the guild event + */ + name: string; + /** + * The privacy level of the guild event + */ + privacy_level: GuildScheduledEventPrivacyLevel; + /** + * The time to schedule the guild event at + */ + scheduled_start_time: string; + /** + * The time when the scheduled event is scheduled to end + */ + scheduled_end_time?: string; + /** + * The description of the guild event + */ + description?: string; + /** + * The scheduled entity type of the guild event + */ + entity_type?: GuildScheduledEventEntityType; + /** + * The entity metadata of the scheduled event + */ + entity_metadata?: APIGuildScheduledEventEntityMetadata; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#create-guild-scheduled-event + */ +export type RESTPostAPIGuildScheduledEventResult = APIGuildScheduledEvent; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#get-guild-scheduled-event + */ +export interface RESTGetAPIGuildScheduledEventQuery { + /** + * Whether to include number of users subscribed to this event + */ + with_user_count?: boolean; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#get-guild-scheduled-event + */ +export type RESTGetAPIGuildScheduledEventResult = APIGuildScheduledEvent; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#modify-guild-scheduled-event + */ +export interface RESTPatchAPIGuildScheduledEventJSONBody extends Partial { + /** + * The status of the scheduled event + */ + status?: GuildScheduledEventStatus; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#modify-guild-scheduled-event + */ +export type RESTPatchAPIGuildScheduledEventResult = APIGuildScheduledEvent; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#delete-guild-scheduled-event + */ +export type RESTDeleteAPIGuildScheduledEventResult = never; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#get-guild-scheduled-event-users + */ +export interface RESTGetAPIGuildScheduledEventUsersQuery { + /** + * Number of users to receive from the event + * + * @default 100 + */ + limit?: number; + /** + * Whether to include guild member data if it exists + */ + with_member?: boolean; + /** + * Consider only users before given user id + */ + before?: Snowflake; + /** + * Consider only users after given user id + */ + after?: Snowflake; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#get-guild-scheduled-event-users + */ +export type RESTGetAPIGuildScheduledEventUsersResult = APIGuildScheduledEventUser[]; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-user-object-guild-scheduled-event-user-structure + */ +export interface APIGuildScheduledEventUser { + /** + * The scheduled event id which the user subscribed to + */ + guild_scheduled_event_id: Snowflake; + /** + * The user which subscribed to the event + */ + user: APIUser; + /** + * The guild member data for this user for the guild which this event belongs to, if any + */ + member?: APIGuildMember; +} diff --git a/deno/rest/v8/invite.ts b/deno/rest/v8/invite.ts index 9c24ccf4..17ea2f77 100644 --- a/deno/rest/v8/invite.ts +++ b/deno/rest/v8/invite.ts @@ -1,3 +1,4 @@ +import type { Snowflake } from '../../globals.ts'; import type { APIInvite } from '../../payloads/v8/mod.ts'; /** @@ -12,6 +13,10 @@ export interface RESTGetAPIInviteQuery { * Whether the invite should contain the expiration date */ with_expiration?: boolean; + /** + * The guild scheduled event to include with the invite + */ + guild_scheduled_event_id?: Snowflake; } export type RESTGetAPIInviteResult = APIInvite; diff --git a/deno/rest/v8/mod.ts b/deno/rest/v8/mod.ts index 6b3f4bd4..7885f2db 100644 --- a/deno/rest/v8/mod.ts +++ b/deno/rest/v8/mod.ts @@ -7,6 +7,7 @@ export * from './channel.ts'; export * from './emoji.ts'; export * from './gateway.ts'; export * from './guild.ts'; +export * from './guildScheduledEvent.ts'; export * from './interactions.ts'; export * from './invite.ts'; export * from './oauth2.ts'; @@ -738,6 +739,33 @@ export const Routes = { guildSticker(guildId: Snowflake, stickerId: Snowflake) { return `/guilds/${guildId}/stickers/${stickerId}` as const; }, + + /** + * Route for: + * - GET `/guilds/{guild.id}/scheduled-events` + * - POST `/guilds/{guild.id}/scheduled-events` + */ + guildScheduledEvents(guildId: Snowflake) { + return `/guilds/${guildId}/scheduled-events`; + }, + + /** + * Route for: + * - GET `/guilds/{guild.id}/scheduled-events/{guildScheduledEvent.id}` + * - PATCH `/guilds/{guild.id}/scheduled-events/{guildScheduledEvent.id}` + * - DELETE `/guilds/{guild.id}/scheduled-events/{guildScheduledEvent.id}` + */ + guildScheduledEvent(guildId: Snowflake, guildScheduledEventId: Snowflake) { + return `/guilds/${guildId}/scheduled-events/${guildScheduledEventId}`; + }, + + /** + * Route for: + * - GET `/guilds/{guild.id}/scheduled-events/{guildScheduledEvent.id}/users` + */ + guildScheduledEventUsers(guildId: Snowflake, guildScheduledEventId: Snowflake) { + return `/guilds/${guildId}/scheduled-events/${guildScheduledEventId}/users`; + }, }; export const RouteBases = { diff --git a/deno/rest/v9/guildScheduledEvent.ts b/deno/rest/v9/guildScheduledEvent.ts new file mode 100644 index 00000000..7aafb4ca --- /dev/null +++ b/deno/rest/v9/guildScheduledEvent.ts @@ -0,0 +1,150 @@ +import type { Snowflake } from '../../globals.ts'; +import type { + APIGuildScheduledEvent, + GuildScheduledEventEntityType, + GuildScheduledEventPrivacyLevel, + APIGuildScheduledEventEntityMetadata, + GuildScheduledEventStatus, + APIGuildMember, + APIUser, +} from '../../payloads/v9.ts'; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#list-scheduled-events-for-guild + */ +export interface RESTGetAPIGuildScheduledEventsQuery { + /** + * Whether to include number of users subscribed to each event + */ + with_user_count?: boolean; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#list-scheduled-events-for-guild + */ +export type RESTGetAPIGuildScheduledEventsResult = APIGuildScheduledEvent[]; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#create-guild-scheduled-event + */ +export interface RESTPostAPIGuildScheduledEventJSONBody { + /** + * The stage channel id of the guild event + */ + channel_id?: Snowflake; + /** + * The name of the guild event + */ + name: string; + /** + * The privacy level of the guild event + */ + privacy_level: GuildScheduledEventPrivacyLevel; + /** + * The time to schedule the guild event at + */ + scheduled_start_time: string; + /** + * The time when the scheduled event is scheduled to end + */ + scheduled_end_time?: string; + /** + * The description of the guild event + */ + description?: string; + /** + * The scheduled entity type of the guild event + */ + entity_type?: GuildScheduledEventEntityType; + /** + * The entity metadata of the scheduled event + */ + entity_metadata?: APIGuildScheduledEventEntityMetadata; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#create-guild-scheduled-event + */ +export type RESTPostAPIGuildScheduledEventResult = APIGuildScheduledEvent; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#get-guild-scheduled-event + */ +export interface RESTGetAPIGuildScheduledEventQuery { + /** + * Whether to include number of users subscribed to this event + */ + with_user_count?: boolean; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#get-guild-scheduled-event + */ +export type RESTGetAPIGuildScheduledEventResult = APIGuildScheduledEvent; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#modify-guild-scheduled-event + */ +export interface RESTPatchAPIGuildScheduledEventJSONBody extends Partial { + /** + * The status of the scheduled event + */ + status?: GuildScheduledEventStatus; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#modify-guild-scheduled-event + */ +export type RESTPatchAPIGuildScheduledEventResult = APIGuildScheduledEvent; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#delete-guild-scheduled-event + */ +export type RESTDeleteAPIGuildScheduledEventResult = never; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#get-guild-scheduled-event-users + */ +export interface RESTGetAPIGuildScheduledEventUsersQuery { + /** + * Number of users to receive from the event + * + * @default 100 + */ + limit?: number; + /** + * Whether to include guild member data if it exists + */ + with_member?: boolean; + /** + * Consider only users before given user id + */ + before?: Snowflake; + /** + * Consider only users after given user id + */ + after?: Snowflake; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#get-guild-scheduled-event-users + */ +export type RESTGetAPIGuildScheduledEventUsersResult = APIGuildScheduledEventUser[]; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-user-object-guild-scheduled-event-user-structure + */ +export interface APIGuildScheduledEventUser { + /** + * The scheduled event id which the user subscribed to + */ + guild_scheduled_event_id: Snowflake; + /** + * The user which subscribed to the event + */ + user: APIUser; + /** + * The guild member data for this user for the guild which this event belongs to, if any + */ + member?: APIGuildMember; +} diff --git a/deno/rest/v9/invite.ts b/deno/rest/v9/invite.ts index 4e8c5f83..74cb68a1 100644 --- a/deno/rest/v9/invite.ts +++ b/deno/rest/v9/invite.ts @@ -1,3 +1,4 @@ +import type { Snowflake } from '../../globals.ts'; import type { APIInvite } from '../../payloads/v9/mod.ts'; /** @@ -12,6 +13,10 @@ export interface RESTGetAPIInviteQuery { * Whether the invite should contain the expiration date */ with_expiration?: boolean; + /** + * The guild scheduled event to include with the invite + */ + guild_scheduled_event_id?: Snowflake; } export type RESTGetAPIInviteResult = APIInvite; diff --git a/deno/rest/v9/mod.ts b/deno/rest/v9/mod.ts index 7041a862..5a80b861 100644 --- a/deno/rest/v9/mod.ts +++ b/deno/rest/v9/mod.ts @@ -7,6 +7,7 @@ export * from './channel.ts'; export * from './emoji.ts'; export * from './gateway.ts'; export * from './guild.ts'; +export * from './guildScheduledEvent.ts'; export * from './interactions.ts'; export * from './invite.ts'; export * from './oauth2.ts'; @@ -807,6 +808,33 @@ export const Routes = { guildSticker(guildId: Snowflake, stickerId: Snowflake) { return `/guilds/${guildId}/stickers/${stickerId}` as const; }, + + /** + * Route for: + * - GET `/guilds/{guild.id}/scheduled-events` + * - POST `/guilds/{guild.id}/scheduled-events` + */ + guildScheduledEvents(guildId: Snowflake) { + return `/guilds/${guildId}/scheduled-events`; + }, + + /** + * Route for: + * - GET `/guilds/{guild.id}/scheduled-events/{guildScheduledEvent.id}` + * - PATCH `/guilds/{guild.id}/scheduled-events/{guildScheduledEvent.id}` + * - DELETE `/guilds/{guild.id}/scheduled-events/{guildScheduledEvent.id}` + */ + guildScheduledEvent(guildId: Snowflake, guildScheduledEventId: Snowflake) { + return `/guilds/${guildId}/scheduled-events/${guildScheduledEventId}`; + }, + + /** + * Route for: + * - GET `/guilds/{guild.id}/scheduled-events/{guildScheduledEvent.id}/users` + */ + guildScheduledEventUsers(guildId: Snowflake, guildScheduledEventId: Snowflake) { + return `/guilds/${guildId}/scheduled-events/${guildScheduledEventId}/users`; + }, }; export const RouteBases = { diff --git a/gateway/v8.ts b/gateway/v8.ts index 4802f4bc..8b5acf5d 100644 --- a/gateway/v8.ts +++ b/gateway/v8.ts @@ -9,6 +9,7 @@ import type { APIChannel, APIEmoji, APIGuild, + APIGuildScheduledEvent, APIGuildIntegration, APIGuildMember, APIMessage, @@ -183,6 +184,7 @@ export const enum GatewayIntentBits { DirectMessages = 1 << 12, DirectMessageReactions = 1 << 13, DirectMessageTyping = 1 << 14, + GuildScheduledEvents = 1 << 16, } /** @@ -233,6 +235,11 @@ export const enum GatewayDispatchEvents { VoiceServerUpdate = 'VOICE_SERVER_UPDATE', VoiceStateUpdate = 'VOICE_STATE_UPDATE', WebhooksUpdate = 'WEBHOOKS_UPDATE', + GuildScheduledEventCreate = 'GUILD_SCHEDULED_EVENT_CREATE', + GuildScheduledEventUpdate = 'GUILD_SCHEDULED_EVENT_UPDATE', + GuildScheduledEventDelete = 'GUILD_SCHEDULED_EVENT_DELETE', + GuildScheduledEventUserAdd = 'GUILD_SCHEDULED_EVENT_USER_ADD', + GuildScheduledEventUserRemove = 'GUILD_SCHEDULED_EVENT_USER_REMOVE', } export type GatewaySendPayload = @@ -265,6 +272,11 @@ export type GatewayDispatchPayload = | GatewayGuildModifyDispatch | GatewayGuildRoleDeleteDispatch | GatewayGuildRoleModifyDispatch + | GatewayGuildScheduledEventCreateDispatch + | GatewayGuildScheduledEventUpdateDispatch + | GatewayGuildScheduledEventDeleteDispatch + | GatewayGuildScheduledEventUserAddDispatch + | GatewayGuildScheduledEventUserRemoveDispatch | GatewayGuildStickersUpdateDispatch | GatewayIntegrationCreateDispatch | GatewayIntegrationDeleteDispatch @@ -808,6 +820,49 @@ export interface GatewayGuildRoleDeleteDispatchData { role_id: Snowflake; } +export type GatewayGuildScheduledEventCreateDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventCreate, + GatewayGuildScheduledEventCreateDispatchData +>; + +export type GatewayGuildScheduledEventCreateDispatchData = APIGuildScheduledEvent; + +export type GatewayGuildScheduledEventUpdateDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventUpdate, + GatewayGuildScheduledEventUpdateDispatchData +>; + +export type GatewayGuildScheduledEventUpdateDispatchData = APIGuildScheduledEvent; + +export type GatewayGuildScheduledEventDeleteDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventDelete, + GatewayGuildScheduledEventDeleteDispatchData +>; + +export type GatewayGuildScheduledEventDeleteDispatchData = APIGuildScheduledEvent; + +export type GatewayGuildScheduledEventUserAddDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventUserAdd, + GatewayGuildScheduledEventUserAddDispatchData +>; + +export interface GatewayGuildScheduledEventUserAddDispatchData { + guild_scheduled_event_id: Snowflake; + user_id: Snowflake; + guild_id: Snowflake; +} + +export type GatewayGuildScheduledEventUserRemoveDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventUserRemove, + GatewayGuildScheduledEventUserAddDispatchData +>; + +export interface GatewayGuildScheduledEventUserRemoveDispatchData { + guild_scheduled_event_id: Snowflake; + user_id: Snowflake; + guild_id: Snowflake; +} + /** * https://discord.com/developers/docs/topics/gateway#integration-create */ diff --git a/gateway/v9.ts b/gateway/v9.ts index c9513c62..2d2cab9c 100644 --- a/gateway/v9.ts +++ b/gateway/v9.ts @@ -9,6 +9,7 @@ import type { APIChannel, APIEmoji, APIGuild, + APIGuildScheduledEvent, APIGuildIntegration, APIGuildMember, APIMessage, @@ -186,6 +187,7 @@ export const enum GatewayIntentBits { DirectMessages = 1 << 12, DirectMessageReactions = 1 << 13, DirectMessageTyping = 1 << 14, + GuildScheduledEvents = 1 << 16, } /** @@ -242,6 +244,11 @@ export const enum GatewayDispatchEvents { VoiceServerUpdate = 'VOICE_SERVER_UPDATE', VoiceStateUpdate = 'VOICE_STATE_UPDATE', WebhooksUpdate = 'WEBHOOKS_UPDATE', + GuildScheduledEventCreate = 'GUILD_SCHEDULED_EVENT_CREATE', + GuildScheduledEventUpdate = 'GUILD_SCHEDULED_EVENT_UPDATE', + GuildScheduledEventDelete = 'GUILD_SCHEDULED_EVENT_DELETE', + GuildScheduledEventUserAdd = 'GUILD_SCHEDULED_EVENT_USER_ADD', + GuildScheduledEventUserRemove = 'GUILD_SCHEDULED_EVENT_USER_REMOVE', } export type GatewaySendPayload = @@ -274,6 +281,11 @@ export type GatewayDispatchPayload = | GatewayGuildModifyDispatch | GatewayGuildRoleDeleteDispatch | GatewayGuildRoleModifyDispatch + | GatewayGuildScheduledEventCreateDispatch + | GatewayGuildScheduledEventUpdateDispatch + | GatewayGuildScheduledEventDeleteDispatch + | GatewayGuildScheduledEventUserAddDispatch + | GatewayGuildScheduledEventUserRemoveDispatch | GatewayGuildStickersUpdateDispatch | GatewayIntegrationCreateDispatch | GatewayIntegrationDeleteDispatch @@ -818,6 +830,49 @@ export interface GatewayGuildRoleDeleteDispatchData { role_id: Snowflake; } +export type GatewayGuildScheduledEventCreateDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventCreate, + GatewayGuildScheduledEventCreateDispatchData +>; + +export type GatewayGuildScheduledEventCreateDispatchData = APIGuildScheduledEvent; + +export type GatewayGuildScheduledEventUpdateDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventUpdate, + GatewayGuildScheduledEventUpdateDispatchData +>; + +export type GatewayGuildScheduledEventUpdateDispatchData = APIGuildScheduledEvent; + +export type GatewayGuildScheduledEventDeleteDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventDelete, + GatewayGuildScheduledEventDeleteDispatchData +>; + +export type GatewayGuildScheduledEventDeleteDispatchData = APIGuildScheduledEvent; + +export type GatewayGuildScheduledEventUserAddDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventUserAdd, + GatewayGuildScheduledEventUserAddDispatchData +>; + +export interface GatewayGuildScheduledEventUserAddDispatchData { + guild_scheduled_event_id: Snowflake; + user_id: Snowflake; + guild_id: Snowflake; +} + +export type GatewayGuildScheduledEventUserRemoveDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventUserRemove, + GatewayGuildScheduledEventUserAddDispatchData +>; + +export interface GatewayGuildScheduledEventUserRemoveDispatchData { + guild_scheduled_event_id: Snowflake; + user_id: Snowflake; + guild_id: Snowflake; +} + /** * https://discord.com/developers/docs/topics/gateway#integration-create */ diff --git a/payloads/v8/auditLog.ts b/payloads/v8/auditLog.ts index 77d87c98..ffa4898f 100644 --- a/payloads/v8/auditLog.ts +++ b/payloads/v8/auditLog.ts @@ -17,6 +17,7 @@ import type { StickerFormatType } from './sticker'; import type { APIUser } from './user'; import type { APIWebhook } from './webhook'; import type { StageInstancePrivacyLevel } from './stageInstance'; +import type { GuildScheduledEventEntityType, GuildScheduledEventStatus } from './guildScheduledEvent'; /** * https://discord.com/developers/docs/resources/audit-log#audit-log-object-audit-log-structure @@ -144,6 +145,10 @@ export const enum AuditLogEvent { StickerCreate = 90, StickerUpdate, StickerDelete, + + GuildScheduledEventCreate = 100, + GuildScheduledEventUpdate, + GuildScheduledEventDelete, } /** @@ -302,7 +307,10 @@ export type APIAuditLogChange = | APIAuditLogChangeKeyFormatType | APIAuditLogChangeKeyAsset | APIAuditLogChangeKeyAvailable - | APIAuditLogChangeKeyGuildId; + | APIAuditLogChangeKeyGuildId + | APIAuditLogChangeKeyEntityType + | APIAuditLogChangeKeyStatus + | APIAuditLogChangeKeyLocation; /** * Returned when an entity's name is changed @@ -310,7 +318,7 @@ export type APIAuditLogChange = export type APIAuditLogChangeKeyName = AuditLogChangeData<'name', string>; /** - * Returned when a guild's or sticker's description is changed + * Returned when a guild's or sticker's or guild scheduled event's description is changed */ export type APIAuditLogChangeKeyDescription = AuditLogChangeData<'description', string>; @@ -502,7 +510,7 @@ export type APIAuditLogChangeKeyDeny = AuditLogChangeData<'deny', string>; export type APIAuditLogChangeKeyCode = AuditLogChangeData<'code', string>; /** - * Returned when an invite's channel_id is changed + * Returned when an invite's or guild scheduled event's channel_id is changed */ export type APIAuditLogChangeKeyChannelId = AuditLogChangeData<'channel_id', Snowflake>; @@ -582,7 +590,7 @@ export type APIAuditLogChangeKeyExpireGracePeriod = AuditLogChangeData<'expire_g export type APIAuditLogChangeKeyUserLimit = AuditLogChangeData<'user_limit', number>; /** - * Returned when privacy level of a stage instance is changed + * Returned when privacy level of a stage instance or guild scheduled event is changed */ export type APIAuditLogChangeKeyPrivacyLevel = AuditLogChangeData<'privacy_level', StageInstancePrivacyLevel>; @@ -611,6 +619,21 @@ export type APIAuditLogChangeKeyAvailable = AuditLogChangeData<'available', bool */ export type APIAuditLogChangeKeyGuildId = AuditLogChangeData<'guild_id', Snowflake>; +/** + * Returned when entity type of a guild scheduled event is changed + */ +export type APIAuditLogChangeKeyEntityType = AuditLogChangeData<'entity_type', GuildScheduledEventEntityType>; + +/** + * Returned when status of a guild scheduled event is changed + */ +export type APIAuditLogChangeKeyStatus = AuditLogChangeData<'status', GuildScheduledEventStatus>; + +/** + * Returned when location of a guild scheduled event is changed + */ +export type APIAuditLogChangeKeyLocation = AuditLogChangeData<'location', string>; + interface AuditLogChangeData { key: K; /** diff --git a/payloads/v8/guild.ts b/payloads/v8/guild.ts index 9b5987a5..2cd6b1d0 100644 --- a/payloads/v8/guild.ts +++ b/payloads/v8/guild.ts @@ -11,6 +11,7 @@ import type { APIStageInstance } from './stageInstance'; import type { APISticker } from './sticker'; import type { APIUser } from './user'; import type { GatewayVoiceState } from './voice'; +import type { APIGuildScheduledEvent } from './guildScheduledEvent'; /** * https://discord.com/developers/docs/resources/guild#unavailable-guild-object @@ -325,6 +326,14 @@ export interface APIGuild extends APIPartialGuild { * See https://discord.com/developers/docs/resources/sticker#sticker-object */ stickers: APISticker[]; + /** + * The scheduled events in the guild + * + * **This field is only sent within the [GUILD_CREATE](https://discord.com/developers/docs/topics/gateway#guild-create) event** + * + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object + */ + guild_scheduled_events?: APIGuildScheduledEvent[]; } /** diff --git a/payloads/v8/guildScheduledEvent.ts b/payloads/v8/guildScheduledEvent.ts new file mode 100644 index 00000000..be045710 --- /dev/null +++ b/payloads/v8/guildScheduledEvent.ts @@ -0,0 +1,104 @@ +import type { APIUser } from './user'; +import type { Snowflake } from '../../globals'; + +export interface APIGuildScheduledEvent { + /** + * The id of the guild event + */ + id: Snowflake; + /** + * The guild id which the scheduled event belongs to + */ + guild_id: Snowflake; + /** + * The channel id in which the scheduled event will be hosted, or `null` if entity type is `EXTERNAL` + */ + channel_id: Snowflake | null; + /** + * The id of the user that created the scheduled event + */ + creator_id: Snowflake | null; + /** + * The name of the scheduled event + */ + name: string; + /** + * The description of the scheduled event + */ + description?: string; + /** + * The time the scheduled event will start + */ + scheduled_start_time: string; + /** + * The time at which the guild event will end, or `null` if the event does not have a scheduled time to end + */ + scheduled_end_time: string | null; + /** + * The privacy level of the scheduled event + */ + privacy_level: GuildScheduledEventPrivacyLevel; + /** + * The status of the scheduled event + */ + status: GuildScheduledEventStatus; + /** + * The type of hosting entity associated with the scheduled event + */ + entity_type: GuildScheduledEventEntityType; + /** + * The id of the hosting entity associated with the scheduled event + */ + entity_id: Snowflake | null; + /** + * The entity metadata for the scheduled event + */ + entity_metadata: APIGuildScheduledEventEntityMetadata; + /** + * The user that created the scheduled event + */ + creator?: APIUser; + /** + * The number of users subscribed to the scheduled event + */ + user_count?: number; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-entity-metadata + */ +export interface APIGuildScheduledEventEntityMetadata { + /** + * The location of the scheduled event + */ + location?: string; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-entity-types + */ +export const enum GuildScheduledEventEntityType { + StageInstance = 1, + Voice, + External, +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-status + */ +export const enum GuildScheduledEventStatus { + Scheduled = 1, + Active, + Completed, + Canceled, +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-privacy-level + */ +export const enum GuildScheduledEventPrivacyLevel { + /** + * The scheduled event is only accessible to guild members + */ + GuildOnly = 2, +} diff --git a/payloads/v8/index.ts b/payloads/v8/index.ts index b5a3c9e0..164a19c5 100644 --- a/payloads/v8/index.ts +++ b/payloads/v8/index.ts @@ -4,6 +4,7 @@ export * from './channel'; export * from './emoji'; export * from './gateway'; export * from './guild'; +export * from './guildScheduledEvent'; export * from './interactions'; export * from './invite'; export * from './oauth2'; diff --git a/payloads/v8/invite.ts b/payloads/v8/invite.ts index b026338f..f34370e1 100644 --- a/payloads/v8/invite.ts +++ b/payloads/v8/invite.ts @@ -7,6 +7,7 @@ import type { APIPartialGuild } from './guild'; import type { APIApplication } from './application'; import type { APIInviteStageInstance } from './stageInstance'; import type { APIUser } from './user'; +import type { APIGuildScheduledEvent } from './guildScheduledEvent'; /** * https://discord.com/developers/docs/resources/invite#invite-object @@ -68,6 +69,10 @@ export interface APIInvite { * The stage instance data if there is a public stage instance in the stage channel this invite is for */ stage_instance?: APIInviteStageInstance; + /** + * The guild scheduled event data, returned from the `GET /invites/` endpoint when `guild_scheduled_event_id` is a valid guild scheduled event id + */ + guild_scheduled_event?: APIGuildScheduledEvent; } /** diff --git a/payloads/v8/permissions.ts b/payloads/v8/permissions.ts index 6f207669..60cf9616 100644 --- a/payloads/v8/permissions.ts +++ b/payloads/v8/permissions.ts @@ -45,6 +45,7 @@ export const PermissionFlagsBits = { ManageEmojisAndStickers: 1n << 30n, UseApplicationCommands: 1n << 31n, RequestToSpeak: 1n << 32n, + ManageEvents: 1n << 33n, UseExternalStickers: 1n << 37n, StartEmbeddedActivities: 1n << 39n, } as const; diff --git a/payloads/v9/auditLog.ts b/payloads/v9/auditLog.ts index 2b068172..a309fd74 100644 --- a/payloads/v9/auditLog.ts +++ b/payloads/v9/auditLog.ts @@ -17,6 +17,7 @@ import type { StickerFormatType } from './sticker'; import type { APIUser } from './user'; import type { APIWebhook } from './webhook'; import type { StageInstancePrivacyLevel } from './stageInstance'; +import type { GuildScheduledEventEntityType, GuildScheduledEventStatus } from './guildScheduledEvent'; /** * https://discord.com/developers/docs/resources/audit-log#audit-log-object-audit-log-structure @@ -153,6 +154,10 @@ export const enum AuditLogEvent { StickerUpdate, StickerDelete, + GuildScheduledEventCreate = 100, + GuildScheduledEventUpdate, + GuildScheduledEventDelete, + ThreadCreate = 110, ThreadUpdate, ThreadDelete, @@ -318,7 +323,10 @@ export type APIAuditLogChange = | APIAuditLogChangeKeyArchived | APIAuditLogChangeKeyLocked | APIAuditLogChangeKeyAutoArchiveDuration - | APIAuditLogChangeKeyDefaultAutoArchiveDuration; + | APIAuditLogChangeKeyDefaultAutoArchiveDuration + | APIAuditLogChangeKeyEntityType + | APIAuditLogChangeKeyStatus + | APIAuditLogChangeKeyLocation; /** * Returned when an entity's name is changed @@ -326,7 +334,7 @@ export type APIAuditLogChange = export type APIAuditLogChangeKeyName = AuditLogChangeData<'name', string>; /** - * Returned when a guild's or sticker's description is changed + * Returned when a guild's or sticker's or guild scheduled event's description is changed */ export type APIAuditLogChangeKeyDescription = AuditLogChangeData<'description', string>; @@ -518,7 +526,7 @@ export type APIAuditLogChangeKeyDeny = AuditLogChangeData<'deny', string>; export type APIAuditLogChangeKeyCode = AuditLogChangeData<'code', string>; /** - * Returned when an invite's channel_id is changed + * Returned when an invite's or guild scheduled event's channel_id is changed */ export type APIAuditLogChangeKeyChannelId = AuditLogChangeData<'channel_id', Snowflake>; @@ -598,7 +606,7 @@ export type APIAuditLogChangeKeyExpireGracePeriod = AuditLogChangeData<'expire_g export type APIAuditLogChangeKeyUserLimit = AuditLogChangeData<'user_limit', number>; /** - * Returned when privacy level of a stage instance is changed + * Returned when privacy level of a stage instance or guild scheduled event is changed */ export type APIAuditLogChangeKeyPrivacyLevel = AuditLogChangeData<'privacy_level', StageInstancePrivacyLevel>; @@ -650,6 +658,21 @@ export type APIAuditLogChangeKeyDefaultAutoArchiveDuration = AuditLogChangeData< number >; +/** + * Returned when entity type of a guild scheduled event is changed + */ +export type APIAuditLogChangeKeyEntityType = AuditLogChangeData<'entity_type', GuildScheduledEventEntityType>; + +/** + * Returned when status of a guild scheduled event is changed + */ +export type APIAuditLogChangeKeyStatus = AuditLogChangeData<'status', GuildScheduledEventStatus>; + +/** + * Returned when location of a guild scheduled event is changed + */ +export type APIAuditLogChangeKeyLocation = AuditLogChangeData<'location', string>; + interface AuditLogChangeData { key: K; /** diff --git a/payloads/v9/guild.ts b/payloads/v9/guild.ts index 626d8d7d..4a4d4768 100644 --- a/payloads/v9/guild.ts +++ b/payloads/v9/guild.ts @@ -11,6 +11,7 @@ import type { APIStageInstance } from './stageInstance'; import type { APISticker } from './sticker'; import type { APIUser } from './user'; import type { GatewayVoiceState } from './voice'; +import type { APIGuildScheduledEvent } from './guildScheduledEvent'; /** * https://discord.com/developers/docs/resources/guild#unavailable-guild-object @@ -333,6 +334,14 @@ export interface APIGuild extends APIPartialGuild { * See https://discord.com/developers/docs/resources/sticker#sticker-object */ stickers: APISticker[]; + /** + * The scheduled events in the guild + * + * **This field is only sent within the [GUILD_CREATE](https://discord.com/developers/docs/topics/gateway#guild-create) event** + * + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object + */ + guild_scheduled_events?: APIGuildScheduledEvent[]; } /** diff --git a/payloads/v9/guildScheduledEvent.ts b/payloads/v9/guildScheduledEvent.ts new file mode 100644 index 00000000..be045710 --- /dev/null +++ b/payloads/v9/guildScheduledEvent.ts @@ -0,0 +1,104 @@ +import type { APIUser } from './user'; +import type { Snowflake } from '../../globals'; + +export interface APIGuildScheduledEvent { + /** + * The id of the guild event + */ + id: Snowflake; + /** + * The guild id which the scheduled event belongs to + */ + guild_id: Snowflake; + /** + * The channel id in which the scheduled event will be hosted, or `null` if entity type is `EXTERNAL` + */ + channel_id: Snowflake | null; + /** + * The id of the user that created the scheduled event + */ + creator_id: Snowflake | null; + /** + * The name of the scheduled event + */ + name: string; + /** + * The description of the scheduled event + */ + description?: string; + /** + * The time the scheduled event will start + */ + scheduled_start_time: string; + /** + * The time at which the guild event will end, or `null` if the event does not have a scheduled time to end + */ + scheduled_end_time: string | null; + /** + * The privacy level of the scheduled event + */ + privacy_level: GuildScheduledEventPrivacyLevel; + /** + * The status of the scheduled event + */ + status: GuildScheduledEventStatus; + /** + * The type of hosting entity associated with the scheduled event + */ + entity_type: GuildScheduledEventEntityType; + /** + * The id of the hosting entity associated with the scheduled event + */ + entity_id: Snowflake | null; + /** + * The entity metadata for the scheduled event + */ + entity_metadata: APIGuildScheduledEventEntityMetadata; + /** + * The user that created the scheduled event + */ + creator?: APIUser; + /** + * The number of users subscribed to the scheduled event + */ + user_count?: number; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-entity-metadata + */ +export interface APIGuildScheduledEventEntityMetadata { + /** + * The location of the scheduled event + */ + location?: string; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-entity-types + */ +export const enum GuildScheduledEventEntityType { + StageInstance = 1, + Voice, + External, +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-status + */ +export const enum GuildScheduledEventStatus { + Scheduled = 1, + Active, + Completed, + Canceled, +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-privacy-level + */ +export const enum GuildScheduledEventPrivacyLevel { + /** + * The scheduled event is only accessible to guild members + */ + GuildOnly = 2, +} diff --git a/payloads/v9/index.ts b/payloads/v9/index.ts index b5a3c9e0..164a19c5 100644 --- a/payloads/v9/index.ts +++ b/payloads/v9/index.ts @@ -4,6 +4,7 @@ export * from './channel'; export * from './emoji'; export * from './gateway'; export * from './guild'; +export * from './guildScheduledEvent'; export * from './interactions'; export * from './invite'; export * from './oauth2'; diff --git a/payloads/v9/invite.ts b/payloads/v9/invite.ts index b026338f..f34370e1 100644 --- a/payloads/v9/invite.ts +++ b/payloads/v9/invite.ts @@ -7,6 +7,7 @@ import type { APIPartialGuild } from './guild'; import type { APIApplication } from './application'; import type { APIInviteStageInstance } from './stageInstance'; import type { APIUser } from './user'; +import type { APIGuildScheduledEvent } from './guildScheduledEvent'; /** * https://discord.com/developers/docs/resources/invite#invite-object @@ -68,6 +69,10 @@ export interface APIInvite { * The stage instance data if there is a public stage instance in the stage channel this invite is for */ stage_instance?: APIInviteStageInstance; + /** + * The guild scheduled event data, returned from the `GET /invites/` endpoint when `guild_scheduled_event_id` is a valid guild scheduled event id + */ + guild_scheduled_event?: APIGuildScheduledEvent; } /** diff --git a/payloads/v9/permissions.ts b/payloads/v9/permissions.ts index 1cabbf61..c44b1893 100644 --- a/payloads/v9/permissions.ts +++ b/payloads/v9/permissions.ts @@ -45,6 +45,7 @@ export const PermissionFlagsBits = { ManageEmojisAndStickers: 1n << 30n, UseApplicationCommands: 1n << 31n, RequestToSpeak: 1n << 32n, + ManageEvents: 1n << 33n, ManageThreads: 1n << 34n, CreatePublicThreads: 1n << 35n, CreatePrivateThreads: 1n << 36n, diff --git a/rest/common.ts b/rest/common.ts index 8def0fe7..982c2271 100644 --- a/rest/common.ts +++ b/rest/common.ts @@ -101,6 +101,7 @@ export const enum RESTJSONErrorCodes { MaximumNumberOfNonGuildMemberBansHasBeenExceeded = 30035, MaximumNumberOfBanFetchesHasBeenReached = 30037, + MaximumNumberOfUncompletedGuildScheduledEventsReached, MaximumNumberOfStickersReached = 30039, MaximumNumberOfPruneRequestsHasBeenReached, @@ -198,4 +199,8 @@ export const enum RESTJSONErrorCodes { LottieAnimationMaximumDimensionsExceeded, StickerFramerateIsTooSmallOrTooLarge, StickerAnimationDurationExceedsMaximumOf5Seconds, + + CannotUpdateAFinishedEvent = 180000, + + FailedToCreateStageNeededForStageEvent = 180002, } diff --git a/rest/v8/guildScheduledEvent.ts b/rest/v8/guildScheduledEvent.ts new file mode 100644 index 00000000..661079bc --- /dev/null +++ b/rest/v8/guildScheduledEvent.ts @@ -0,0 +1,150 @@ +import type { Snowflake } from '../../globals'; +import type { + APIGuildScheduledEvent, + GuildScheduledEventEntityType, + GuildScheduledEventPrivacyLevel, + APIGuildScheduledEventEntityMetadata, + GuildScheduledEventStatus, + APIGuildMember, + APIUser, +} from '../../payloads/v8'; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#list-scheduled-events-for-guild + */ +export interface RESTGetAPIGuildScheduledEventsQuery { + /** + * Whether to include number of users subscribed to each event + */ + with_user_count?: boolean; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#list-scheduled-events-for-guild + */ +export type RESTGetAPIGuildScheduledEventsResult = APIGuildScheduledEvent[]; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#create-guild-scheduled-event + */ +export interface RESTPostAPIGuildScheduledEventJSONBody { + /** + * The stage channel id of the guild event + */ + channel_id?: Snowflake; + /** + * The name of the guild event + */ + name: string; + /** + * The privacy level of the guild event + */ + privacy_level: GuildScheduledEventPrivacyLevel; + /** + * The time to schedule the guild event at + */ + scheduled_start_time: string; + /** + * The time when the scheduled event is scheduled to end + */ + scheduled_end_time?: string; + /** + * The description of the guild event + */ + description?: string; + /** + * The scheduled entity type of the guild event + */ + entity_type?: GuildScheduledEventEntityType; + /** + * The entity metadata of the scheduled event + */ + entity_metadata?: APIGuildScheduledEventEntityMetadata; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#create-guild-scheduled-event + */ +export type RESTPostAPIGuildScheduledEventResult = APIGuildScheduledEvent; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#get-guild-scheduled-event + */ +export interface RESTGetAPIGuildScheduledEventQuery { + /** + * Whether to include number of users subscribed to this event + */ + with_user_count?: boolean; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#get-guild-scheduled-event + */ +export type RESTGetAPIGuildScheduledEventResult = APIGuildScheduledEvent; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#modify-guild-scheduled-event + */ +export interface RESTPatchAPIGuildScheduledEventJSONBody extends Partial { + /** + * The status of the scheduled event + */ + status?: GuildScheduledEventStatus; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#modify-guild-scheduled-event + */ +export type RESTPatchAPIGuildScheduledEventResult = APIGuildScheduledEvent; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#delete-guild-scheduled-event + */ +export type RESTDeleteAPIGuildScheduledEventResult = never; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#get-guild-scheduled-event-users + */ +export interface RESTGetAPIGuildScheduledEventUsersQuery { + /** + * Number of users to receive from the event + * + * @default 100 + */ + limit?: number; + /** + * Whether to include guild member data if it exists + */ + with_member?: boolean; + /** + * Consider only users before given user id + */ + before?: Snowflake; + /** + * Consider only users after given user id + */ + after?: Snowflake; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#get-guild-scheduled-event-users + */ +export type RESTGetAPIGuildScheduledEventUsersResult = APIGuildScheduledEventUser[]; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-user-object-guild-scheduled-event-user-structure + */ +export interface APIGuildScheduledEventUser { + /** + * The scheduled event id which the user subscribed to + */ + guild_scheduled_event_id: Snowflake; + /** + * The user which subscribed to the event + */ + user: APIUser; + /** + * The guild member data for this user for the guild which this event belongs to, if any + */ + member?: APIGuildMember; +} diff --git a/rest/v8/index.ts b/rest/v8/index.ts index de475255..2e3bed59 100644 --- a/rest/v8/index.ts +++ b/rest/v8/index.ts @@ -7,6 +7,7 @@ export * from './channel'; export * from './emoji'; export * from './gateway'; export * from './guild'; +export * from './guildScheduledEvent'; export * from './interactions'; export * from './invite'; export * from './oauth2'; @@ -738,6 +739,33 @@ export const Routes = { guildSticker(guildId: Snowflake, stickerId: Snowflake) { return `/guilds/${guildId}/stickers/${stickerId}` as const; }, + + /** + * Route for: + * - GET `/guilds/{guild.id}/scheduled-events` + * - POST `/guilds/{guild.id}/scheduled-events` + */ + guildScheduledEvents(guildId: Snowflake) { + return `/guilds/${guildId}/scheduled-events`; + }, + + /** + * Route for: + * - GET `/guilds/{guild.id}/scheduled-events/{guildScheduledEvent.id}` + * - PATCH `/guilds/{guild.id}/scheduled-events/{guildScheduledEvent.id}` + * - DELETE `/guilds/{guild.id}/scheduled-events/{guildScheduledEvent.id}` + */ + guildScheduledEvent(guildId: Snowflake, guildScheduledEventId: Snowflake) { + return `/guilds/${guildId}/scheduled-events/${guildScheduledEventId}`; + }, + + /** + * Route for: + * - GET `/guilds/{guild.id}/scheduled-events/{guildScheduledEvent.id}/users` + */ + guildScheduledEventUsers(guildId: Snowflake, guildScheduledEventId: Snowflake) { + return `/guilds/${guildId}/scheduled-events/${guildScheduledEventId}/users`; + }, }; export const RouteBases = { diff --git a/rest/v8/invite.ts b/rest/v8/invite.ts index a0680ec2..704423ee 100644 --- a/rest/v8/invite.ts +++ b/rest/v8/invite.ts @@ -1,3 +1,4 @@ +import type { Snowflake } from '../../globals'; import type { APIInvite } from '../../payloads/v8/index'; /** @@ -12,6 +13,10 @@ export interface RESTGetAPIInviteQuery { * Whether the invite should contain the expiration date */ with_expiration?: boolean; + /** + * The guild scheduled event to include with the invite + */ + guild_scheduled_event_id?: Snowflake; } export type RESTGetAPIInviteResult = APIInvite; diff --git a/rest/v9/guildScheduledEvent.ts b/rest/v9/guildScheduledEvent.ts new file mode 100644 index 00000000..a75981f6 --- /dev/null +++ b/rest/v9/guildScheduledEvent.ts @@ -0,0 +1,150 @@ +import type { Snowflake } from '../../globals'; +import type { + APIGuildScheduledEvent, + GuildScheduledEventEntityType, + GuildScheduledEventPrivacyLevel, + APIGuildScheduledEventEntityMetadata, + GuildScheduledEventStatus, + APIGuildMember, + APIUser, +} from '../../payloads/v9'; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#list-scheduled-events-for-guild + */ +export interface RESTGetAPIGuildScheduledEventsQuery { + /** + * Whether to include number of users subscribed to each event + */ + with_user_count?: boolean; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#list-scheduled-events-for-guild + */ +export type RESTGetAPIGuildScheduledEventsResult = APIGuildScheduledEvent[]; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#create-guild-scheduled-event + */ +export interface RESTPostAPIGuildScheduledEventJSONBody { + /** + * The stage channel id of the guild event + */ + channel_id?: Snowflake; + /** + * The name of the guild event + */ + name: string; + /** + * The privacy level of the guild event + */ + privacy_level: GuildScheduledEventPrivacyLevel; + /** + * The time to schedule the guild event at + */ + scheduled_start_time: string; + /** + * The time when the scheduled event is scheduled to end + */ + scheduled_end_time?: string; + /** + * The description of the guild event + */ + description?: string; + /** + * The scheduled entity type of the guild event + */ + entity_type?: GuildScheduledEventEntityType; + /** + * The entity metadata of the scheduled event + */ + entity_metadata?: APIGuildScheduledEventEntityMetadata; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#create-guild-scheduled-event + */ +export type RESTPostAPIGuildScheduledEventResult = APIGuildScheduledEvent; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#get-guild-scheduled-event + */ +export interface RESTGetAPIGuildScheduledEventQuery { + /** + * Whether to include number of users subscribed to this event + */ + with_user_count?: boolean; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#get-guild-scheduled-event + */ +export type RESTGetAPIGuildScheduledEventResult = APIGuildScheduledEvent; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#modify-guild-scheduled-event + */ +export interface RESTPatchAPIGuildScheduledEventJSONBody extends Partial { + /** + * The status of the scheduled event + */ + status?: GuildScheduledEventStatus; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#modify-guild-scheduled-event + */ +export type RESTPatchAPIGuildScheduledEventResult = APIGuildScheduledEvent; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#delete-guild-scheduled-event + */ +export type RESTDeleteAPIGuildScheduledEventResult = never; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#get-guild-scheduled-event-users + */ +export interface RESTGetAPIGuildScheduledEventUsersQuery { + /** + * Number of users to receive from the event + * + * @default 100 + */ + limit?: number; + /** + * Whether to include guild member data if it exists + */ + with_member?: boolean; + /** + * Consider only users before given user id + */ + before?: Snowflake; + /** + * Consider only users after given user id + */ + after?: Snowflake; +} + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#get-guild-scheduled-event-users + */ +export type RESTGetAPIGuildScheduledEventUsersResult = APIGuildScheduledEventUser[]; + +/** + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-user-object-guild-scheduled-event-user-structure + */ +export interface APIGuildScheduledEventUser { + /** + * The scheduled event id which the user subscribed to + */ + guild_scheduled_event_id: Snowflake; + /** + * The user which subscribed to the event + */ + user: APIUser; + /** + * The guild member data for this user for the guild which this event belongs to, if any + */ + member?: APIGuildMember; +} diff --git a/rest/v9/index.ts b/rest/v9/index.ts index 5b3ce706..36b53f02 100644 --- a/rest/v9/index.ts +++ b/rest/v9/index.ts @@ -7,6 +7,7 @@ export * from './channel'; export * from './emoji'; export * from './gateway'; export * from './guild'; +export * from './guildScheduledEvent'; export * from './interactions'; export * from './invite'; export * from './oauth2'; @@ -807,6 +808,33 @@ export const Routes = { guildSticker(guildId: Snowflake, stickerId: Snowflake) { return `/guilds/${guildId}/stickers/${stickerId}` as const; }, + + /** + * Route for: + * - GET `/guilds/{guild.id}/scheduled-events` + * - POST `/guilds/{guild.id}/scheduled-events` + */ + guildScheduledEvents(guildId: Snowflake) { + return `/guilds/${guildId}/scheduled-events`; + }, + + /** + * Route for: + * - GET `/guilds/{guild.id}/scheduled-events/{guildScheduledEvent.id}` + * - PATCH `/guilds/{guild.id}/scheduled-events/{guildScheduledEvent.id}` + * - DELETE `/guilds/{guild.id}/scheduled-events/{guildScheduledEvent.id}` + */ + guildScheduledEvent(guildId: Snowflake, guildScheduledEventId: Snowflake) { + return `/guilds/${guildId}/scheduled-events/${guildScheduledEventId}`; + }, + + /** + * Route for: + * - GET `/guilds/{guild.id}/scheduled-events/{guildScheduledEvent.id}/users` + */ + guildScheduledEventUsers(guildId: Snowflake, guildScheduledEventId: Snowflake) { + return `/guilds/${guildId}/scheduled-events/${guildScheduledEventId}/users`; + }, }; export const RouteBases = { diff --git a/rest/v9/invite.ts b/rest/v9/invite.ts index 33f31414..cfdc8c9c 100644 --- a/rest/v9/invite.ts +++ b/rest/v9/invite.ts @@ -1,3 +1,4 @@ +import type { Snowflake } from '../../globals'; import type { APIInvite } from '../../payloads/v9/index'; /** @@ -12,6 +13,10 @@ export interface RESTGetAPIInviteQuery { * Whether the invite should contain the expiration date */ with_expiration?: boolean; + /** + * The guild scheduled event to include with the invite + */ + guild_scheduled_event_id?: Snowflake; } export type RESTGetAPIInviteResult = APIInvite;