feat: add support for GuildScheduledEvent (#6493)

Co-authored-by: Rodry <38259440+ImRodry@users.noreply.github.com>
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com>
Co-authored-by: GoldenAngel <50855202+GoldenAngel2@users.noreply.github.com>
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
This commit is contained in:
Shubham Parihar
2021-12-23 18:09:09 +05:30
committed by GitHub
parent aa7c1b2081
commit 1316fd4c6a
29 changed files with 1261 additions and 13 deletions

17
typings/enums.d.ts vendored
View File

@@ -86,6 +86,23 @@ export const enum ExplicitContentFilterLevels {
ALL_MEMBERS = 2,
}
export const enum GuildScheduledEventEntityTypes {
STAGE_INSTANCE = 1,
VOICE = 2,
EXTERNAL = 3,
}
export const enum GuildScheduledEventPrivacyLevels {
GUILD_ONLY = 2,
}
export const enum GuildScheduledEventStatuses {
SCHEDULED = 1,
ACTIVE = 2,
COMPLETED = 3,
CANCELED = 4,
}
export const enum InteractionResponseTypes {
PONG = 1,
CHANNEL_MESSAGE_WITH_SOURCE = 4,

198
typings/index.d.ts vendored
View File

@@ -80,6 +80,9 @@ import {
StickerTypes,
VerificationLevels,
WebhookTypes,
GuildScheduledEventEntityTypes,
GuildScheduledEventStatuses,
GuildScheduledEventPrivacyLevels,
} from './enums';
import {
RawActivityData,
@@ -99,6 +102,7 @@ import {
RawGuildEmojiData,
RawGuildMemberData,
RawGuildPreviewData,
RawGuildScheduledEventData,
RawGuildTemplateData,
RawIntegrationApplicationData,
RawIntegrationData,
@@ -557,7 +561,7 @@ export class Client<Ready extends boolean = boolean> extends BaseClient {
public ws: WebSocketManager;
public destroy(): void;
public fetchGuildPreview(guild: GuildResolvable): Promise<GuildPreview>;
public fetchInvite(invite: InviteResolvable): Promise<Invite>;
public fetchInvite(invite: InviteResolvable, options?: ClientFetchInviteOptions): Promise<Invite>;
public fetchGuildTemplate(template: GuildTemplateResolvable): Promise<GuildTemplate>;
public fetchVoiceRegions(): Promise<Collection<string, VoiceRegion>>;
public fetchSticker(id: Snowflake): Promise<Sticker>;
@@ -909,6 +913,7 @@ export class Guild extends AnonymousGuild {
public roles: RoleManager;
public readonly rulesChannel: TextChannel | null;
public rulesChannelId: Snowflake | null;
public scheduledEvents: GuildScheduledEventManager;
public readonly shard: WebSocketShard;
public shardId: number;
public stageInstances: StageInstanceManager;
@@ -1151,6 +1156,54 @@ export class GuildPreview extends Base {
public toString(): string;
}
export class GuildScheduledEvent<S extends GuildScheduledEventStatus = GuildScheduledEventStatus> extends Base {
private constructor(client: Client, data: RawGuildScheduledEventData);
public id: Snowflake;
public guildId: Snowflake;
public channelId: Snowflake | null;
public creatorId: Snowflake | null;
public name: string;
public description: string | null;
public scheduledStartTimestamp: number | null;
public scheduledEndTimestamp: number | null;
public privacyLevel: GuildScheduledEventPrivacyLevel;
public status: S;
public entityType: GuildScheduledEventEntityType;
public entityId: Snowflake | null;
public entityMetadata: GuildScheduledEventEntityMetadata;
public userCount: number | null;
public creator: User | null;
public readonly createdTimestamp: number;
public readonly createdAt: Date;
public readonly scheduledStartAt: Date;
public readonly scheduledEndAt: Date | null;
public readonly channel: VoiceChannel | StageChannel | null;
public readonly guild: Guild | null;
public readonly url: string;
public createInviteURL(options?: CreateGuildScheduledEventInviteURLOptions): Promise<string>;
public edit<T extends GuildScheduledEventSetStatusArg<S>>(
options: GuildScheduledEventEditOptions<S, T>,
): Promise<GuildScheduledEvent<T>>;
public delete(): Promise<GuildScheduledEvent<S>>;
public setName(name: string, reason?: string): Promise<GuildScheduledEvent<S>>;
public setScheduledStartTime(scheduledStartTime: DateResolvable, reason?: string): Promise<GuildScheduledEvent<S>>;
public setScheduledEndTime(scheduledEndTime: DateResolvable, reason?: string): Promise<GuildScheduledEvent<S>>;
public setDescription(description: string, reason?: string): Promise<GuildScheduledEvent<S>>;
public setStatus<T extends GuildScheduledEventSetStatusArg<S>>(
status: T,
reason?: string,
): Promise<GuildScheduledEvent<T>>;
public setLocation(location: string, reason?: string): Promise<GuildScheduledEvent<S>>;
public fetchSubscribers<T extends FetchGuildScheduledEventSubscribersOptions>(
options?: T,
): Promise<GuildScheduledEventManagerFetchSubscribersResult<T>>;
public toString(): string;
public isActive(): this is GuildScheduledEvent<'ACTIVE'>;
public isCanceled(): this is GuildScheduledEvent<'CANCELED'>;
public isCompleted(): this is GuildScheduledEvent<'COMPLETED'>;
public isScheduled(): this is GuildScheduledEvent<'SCHEDULED'>;
}
export class GuildTemplate extends Base {
private constructor(client: Client, data: RawGuildTemplateData);
public readonly createdTimestamp: number;
@@ -1352,6 +1405,7 @@ export class Invite extends Base {
public toString(): string;
public static INVITES_PATTERN: RegExp;
public stageInstance: InviteStageInstance | null;
public guildScheduledEvent: GuildScheduledEvent | null;
}
export class InviteStageInstance extends Base {
@@ -2670,7 +2724,8 @@ export const Constants: {
UserAgent: string;
Endpoints: {
botGateway: string;
invite: (root: string, code: string) => string;
invite: (root: string, code: string, eventId?: Snowflake) => string;
scheduledEvent: (root: string, guildId: Snowflake, eventId: Snowflake) => string;
CDN: (root: string) => {
Emoji: (emojiId: Snowflake, format: DynamicImageFormat) => string;
Asset: (name: string) => string;
@@ -2774,6 +2829,9 @@ export const Constants: {
WebhookTypes: EnumHolder<typeof WebhookTypes>;
PremiumTiers: EnumHolder<typeof PremiumTiers>;
ApplicationCommandTypes: EnumHolder<typeof ApplicationCommandTypes>;
GuildScheduledEventEntityTypes: EnumHolder<typeof GuildScheduledEventEntityTypes>;
GuildScheduledEventStatuses: EnumHolder<typeof GuildScheduledEventStatuses>;
GuildScheduledEventPrivacyLevels: EnumHolder<typeof GuildScheduledEventPrivacyLevels>;
};
export const version: string;
@@ -3021,6 +3079,29 @@ export class GuildInviteManager extends DataManager<string, Invite, InviteResolv
public delete(invite: InviteResolvable, reason?: string): Promise<Invite>;
}
export class GuildScheduledEventManager extends CachedManager<
Snowflake,
GuildScheduledEvent,
GuildScheduledEventResolvable
> {
private constructor(guild: Guild, iterable?: Iterable<RawGuildScheduledEventData>);
public guild: Guild;
public create(options: GuildScheduledEventCreateOptions): Promise<GuildScheduledEvent>;
public fetch(): Promise<Collection<Snowflake, GuildScheduledEvent>>;
public fetch<
T extends GuildScheduledEventResolvable | FetchGuildScheduledEventOptions | FetchGuildScheduledEventsOptions,
>(options?: T): Promise<GuildScheduledEventManagerFetchResult<T>>;
public edit<S extends GuildScheduledEventStatus, T extends GuildScheduledEventSetStatusArg<S>>(
guildScheduledEvent: GuildScheduledEventResolvable,
options: GuildScheduledEventEditOptions<S, T>,
): Promise<GuildScheduledEvent<T>>;
public delete(guildScheduledEvent: GuildScheduledEventResolvable): Promise<void>;
public fetchSubscribers<T extends FetchGuildScheduledEventSubscribersOptions>(
guildScheduledEvent: GuildScheduledEventResolvable,
options?: T,
): Promise<GuildScheduledEventManagerFetchSubscribersResult<T>>;
}
export class GuildStickerManager extends CachedManager<Snowflake, Sticker, StickerResolvable> {
private constructor(guild: Guild, iterable?: Iterable<RawStickerData>);
public guild: Guild;
@@ -3366,6 +3447,7 @@ export interface APIErrors {
MAXIMUM_THREAD_PARICIPANTS: 30033;
MAXIMUM_NON_GUILD_MEMBERS_BANS: 30035;
MAXIMUM_BAN_FETCHES: 30037;
MAXIMUM_NUMBER_OF_UNCOMPLETED_GUILD_SCHEDULED_EVENTS_REACHED: 30038;
MAXIMUM_NUMBER_OF_STICKERS_REACHED: 30039;
MAXIMUM_PRUNE_REQUESTS: 30040;
MAXIMUM_GUILD_WIDGET_SETTINGS_UPDATE: 30042;
@@ -3437,6 +3519,8 @@ export interface APIErrors {
LOTTIE_ANIMATION_MAXIMUM_DIMENSIONS_EXCEEDED: 170005;
STICKER_FRAME_RATE_IS_TOO_SMALL_OR_TOO_LARGE: 170006;
STICKER_ANIMATION_DURATION_EXCEEDS_MAXIMUM_OF_5_SECONDS: 170007;
CANNOT_UPDATE_A_FINISHED_EVENT: 180000;
FAILED_TO_CREATE_STAGE_NEEDED_FOR_STAGE_EVENT: 180002;
}
export interface APIRequest {
@@ -3700,6 +3784,7 @@ export interface Caches {
GuildMemberManager: [manager: typeof GuildMemberManager, holds: typeof GuildMember];
GuildBanManager: [manager: typeof GuildBanManager, holds: typeof GuildBan];
GuildInviteManager: [manager: typeof GuildInviteManager, holds: typeof Invite];
GuildScheduledEventManager: [manager: typeof GuildScheduledEventManager, holds: typeof GuildScheduledEvent];
GuildStickerManager: [manager: typeof GuildStickerManager, holds: typeof Sticker];
MessageManager: [manager: typeof MessageManager, holds: typeof Message];
// TODO: PermissionOverwriteManager: [manager: typeof PermissionOverwriteManager, holds: typeof PermissionOverwrites];
@@ -3891,6 +3976,15 @@ export interface ClientEvents extends BaseClientEvents {
stickerCreate: [sticker: Sticker];
stickerDelete: [sticker: Sticker];
stickerUpdate: [oldSticker: Sticker, newSticker: Sticker];
guildScheduledEventCreate: [guildScheduledEvent: GuildScheduledEvent];
guildScheduledEventUpdate: [oldGuildScheduledEvent: GuildScheduledEvent, newGuildScheduledEvent: GuildScheduledEvent];
guildScheduledEventDelete: [guildScheduledEvent: GuildScheduledEvent];
guildScheduledEventUserAdd: [guildScheduledEvent: GuildScheduledEvent, user: User];
guildScheduledEventUserRemove: [guildScheduledEvent: GuildScheduledEvent, user: User];
}
export interface ClientFetchInviteOptions {
guildScheduledEventId?: Snowflake;
}
export interface ClientOptions {
@@ -4124,6 +4218,11 @@ export interface ConstantsEvents {
GUILD_STICKER_CREATE: 'stickerCreate';
GUILD_STICKER_DELETE: 'stickerDelete';
GUILD_STICKER_UPDATE: 'stickerUpdate';
GUILD_SCHEDULED_EVENT_CREATE: 'guildScheduledEventCreate';
GUILD_SCHEDULED_EVENT_UPDATE: 'guildScheduledEventUpdate';
GUILD_SCHEDULED_EVENT_DELETE: 'guildScheduledEventDelete';
GUILD_SCHEDULED_EVENT_USER_ADD: 'guildScheduledEventUserAdd';
GUILD_SCHEDULED_EVENT_USER_REMOVE: 'guildScheduledEventUserRemove';
}
export interface ConstantsOpcodes {
@@ -4158,6 +4257,10 @@ export interface ConstantsStatus {
DISCONNECTED: 5;
}
export interface CreateGuildScheduledEventInviteURLOptions extends CreateInviteOptions {
channel?: GuildInvitableChannelResolvable;
}
export interface CreateRoleOptions extends RoleData {
reason?: string;
}
@@ -4276,6 +4379,21 @@ export interface FetchGuildsOptions {
limit?: number;
}
export interface FetchGuildScheduledEventOptions extends BaseFetchOptions {
guildScheduledEvent: GuildScheduledEventResolvable;
withUserCount?: boolean;
}
export interface FetchGuildScheduledEventsOptions {
cache?: boolean;
withUserCount?: boolean;
}
export interface FetchGuildScheduledEventSubscribersOptions {
limit?: number;
withMember?: boolean;
}
interface FetchInviteOptions extends BaseFetchOptions {
code: string;
}
@@ -4364,6 +4482,9 @@ interface GuildAuditLogsTypes {
STICKER_CREATE: ['STICKER', 'CREATE'];
STICKER_UPDATE: ['STICKER', 'UPDATE'];
STICKER_DELETE: ['STICKER', 'DELETE'];
GUILD_SCHEDULED_EVENT_CREATE: ['GUILD_SCHEDULED_EVENT', 'CREATE'];
GUILD_SCHEDULED_EVENT_UPDATE: ['GUILD_SCHEDULED_EVENT', 'UPDATE'];
GUILD_SCHEDULED_EVENT_DELETE: ['GUILD_SCHEDULED_EVENT', 'DELETE'];
THREAD_CREATE: ['THREAD', 'CREATE'];
THREAD_UPDATE: ['THREAD', 'UPDATE'];
THREAD_DELETE: ['THREAD', 'DELETE'];
@@ -4411,6 +4532,9 @@ export interface GuildAuditLogsIds {
90: 'STICKER_CREATE';
91: 'STICKER_UPDATE';
92: 'STICKER_DELETE';
100: 'GUILD_SCHEDULED_EVENT_CREATE';
101: 'GUILD_SCHEDULED_EVENT_UPDATE';
102: 'GUILD_SCHEDULED_EVENT_DELETE';
110: 'THREAD_CREATE';
111: 'THREAD_UPDATE';
112: 'THREAD_DELETE';
@@ -4461,6 +4585,7 @@ export interface GuildAuditLogsEntryTargetField<TActionType extends GuildAuditLo
THREAD: ThreadChannel | { id: Snowflake; [x: string]: unknown };
STAGE_INSTANCE: StageInstance;
STICKER: Sticker;
GUILD_SCHEDULED_EVENT: GuildScheduledEvent;
}
export interface GuildAuditLogsFetchOptions<T extends GuildAuditLogsResolvable> {
@@ -4627,6 +4752,66 @@ export interface GuildListMembersOptions {
cache?: boolean;
}
// TODO: use conditional types for better TS support
export interface GuildScheduledEventCreateOptions {
name: string;
scheduledStartTime: DateResolvable;
scheduledEndTime?: DateResolvable;
privacyLevel: GuildScheduledEventPrivacyLevel | number;
entityType: GuildScheduledEventEntityType | number;
description?: string;
channel?: GuildVoiceChannelResolvable;
entityMetadata?: GuildScheduledEventEntityMetadataOptions;
reason?: string;
}
export interface GuildScheduledEventEditOptions<
S extends GuildScheduledEventStatus,
T extends GuildScheduledEventSetStatusArg<S>,
> extends Omit<Partial<GuildScheduledEventCreateOptions>, 'channel'> {
channel?: GuildVoiceChannelResolvable | null;
status?: T | number;
}
export interface GuildScheduledEventEntityMetadata {
location: string | null;
}
export interface GuildScheduledEventEntityMetadataOptions {
location?: string;
}
export type GuildScheduledEventEntityType = keyof typeof GuildScheduledEventEntityTypes;
export type GuildScheduledEventManagerFetchResult<
T extends GuildScheduledEventResolvable | FetchGuildScheduledEventOptions | FetchGuildScheduledEventsOptions,
> = T extends GuildScheduledEventResolvable | FetchGuildScheduledEventOptions
? GuildScheduledEvent
: Collection<Snowflake, GuildScheduledEvent>;
export type GuildScheduledEventManagerFetchSubscribersResult<T extends FetchGuildScheduledEventSubscribersOptions> =
T extends { withMember: true }
? Collection<Snowflake, GuildScheduledEventUser<true>>
: Collection<Snowflake, GuildScheduledEventUser<false>>;
export type GuildScheduledEventPrivacyLevel = keyof typeof GuildScheduledEventPrivacyLevels;
export type GuildScheduledEventResolvable = Snowflake | GuildScheduledEvent;
export type GuildScheduledEventSetStatusArg<T extends GuildScheduledEventStatus> = T extends 'SCHEDULED'
? 'ACTIVE' | 'CANCELED'
: T extends 'ACTIVE'
? 'COMPLETED'
: never;
export type GuildScheduledEventStatus = keyof typeof GuildScheduledEventStatuses;
export interface GuildScheduledEventUser<T> {
guildScheduledEventId: Snowflake;
user: User;
member: T extends true ? GuildMember : null;
}
export type GuildTemplateResolvable = string;
export type GuildVoiceChannelResolvable = VoiceBasedChannel | Snowflake;
@@ -4653,6 +4838,7 @@ export interface HTTPOptions {
invite?: string;
template?: string;
headers?: Record<string, string>;
scheduledEvent?: string;
}
export interface ImageURLOptions extends Omit<StaticImageURLOptions, 'format'> {
@@ -4714,7 +4900,8 @@ export type IntentsString =
| 'GUILD_MESSAGE_TYPING'
| 'DIRECT_MESSAGES'
| 'DIRECT_MESSAGE_REACTIONS'
| 'DIRECT_MESSAGE_TYPING';
| 'DIRECT_MESSAGE_TYPING'
| 'GUILD_SCHEDULED_EVENTS';
export interface InviteGenerationOptions {
permissions?: PermissionResolvable;
@@ -5087,7 +5274,8 @@ export type PermissionString =
| 'USE_EXTERNAL_STICKERS'
| 'SEND_MESSAGES_IN_THREADS'
| 'START_EMBEDDED_ACTIVITIES'
| 'MODERATE_MEMBERS';
| 'MODERATE_MEMBERS'
| 'MANAGE_EVENTS';
export type RecursiveArray<T> = ReadonlyArray<T | RecursiveArray<T>>;
@@ -5168,7 +5356,7 @@ export interface PartialRoleData extends RoleData {
id?: Snowflake | number;
}
export type PartialTypes = 'USER' | 'CHANNEL' | 'GUILD_MEMBER' | 'MESSAGE' | 'REACTION';
export type PartialTypes = 'USER' | 'CHANNEL' | 'GUILD_MEMBER' | 'MESSAGE' | 'REACTION' | 'GUILD_SCHEDULED_EVENT';
export interface PartialUser extends Partialize<User, 'username' | 'tag' | 'discriminator'> {}

View File

@@ -75,6 +75,7 @@ import {
RESTPostAPIInteractionFollowupJSONBody,
RESTPostAPIWebhookWithTokenJSONBody,
Snowflake,
APIGuildScheduledEvent,
} from 'discord-api-types/v9';
import { GuildChannel, Guild, PermissionOverwrites } from '.';
@@ -128,6 +129,8 @@ export type RawThreadMemberData = APIThreadMember;
export type RawGuildPreviewData = APIGuildPreview;
export type RawGuildScheduledEventData = APIGuildScheduledEvent;
export type RawGuildTemplateData = APITemplate;
export type RawIntegrationData = APIGuildIntegration;