diff --git a/src/client/Client.js b/src/client/Client.js index 4d055bf..6b95378 100644 --- a/src/client/Client.js +++ b/src/client/Client.js @@ -507,14 +507,22 @@ class Client extends BaseClient { }); } + /** + * Options for {@link Client#acceptInvite}. + * @typedef {Object} AcceptInviteOptions + * @property {boolean} [bypassOnboarding=true] Whether to bypass onboarding + * @property {boolean} [bypassVerify=true] Whether to bypass rule screening + */ + /** * Join this Guild using this invite * @param {InviteResolvable} invite Invite code or URL + * @param {AcceptInviteOptions} [options={ bypassOnboarding: true, bypassVerify: true }] Options * @returns {Promise} * @example - * await client.acceptInvite('https://discord.gg/genshinimpact') + * await client.acceptInvite('https://discord.gg/genshinimpact', { bypassOnboarding: true, bypassVerify: true }) */ - async acceptInvite(invite) { + async acceptInvite(invite, options = { bypassOnboarding: true, bypassVerify: true }) { const code = DataResolver.resolveInviteCode(invite); if (!code) throw new Error('INVITE_RESOLVE_CODE'); const i = await this.fetchInvite(code); @@ -539,7 +547,7 @@ class Client extends BaseClient { if (i.guild?.id) { const onboardingData = await this.api.guilds[i.guild?.id].onboarding.get(); // Onboarding - if (onboardingData.enabled) { + if (onboardingData.enabled && options.bypassOnboarding) { const prompts = onboardingData.prompts.filter(o => o.in_onboarding); if (prompts.length) { const onboarding_prompts_seen = {}; @@ -567,7 +575,7 @@ class Client extends BaseClient { } } // Read rule - if (data.show_verification_form) { + if (data.show_verification_form && options.bypassVerify) { // Check Guild if (i.guild.verificationLevel == 'VERY_HIGH' && !this.user.phone) { this.emit(Events.DEBUG, `[Invite > Guild ${i.guild?.id}] Cannot bypass verify (Phone required)`); diff --git a/typings/index.d.ts b/typings/index.d.ts index 59d00c1..4dbba07 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -807,7 +807,7 @@ export class Client extends BaseClient { /** @deprecated Use {@link Sweepers#sweepMessages} instead */ public sweepMessages(lifetime?: number): number; public toJSON(): unknown; - public acceptInvite(invite: InviteResolvable): Promise; + public acceptInvite(invite: InviteResolvable, options?: AcceptInviteOptions): Promise; public redeemNitro(nitro: string, channel?: TextChannelResolvable, paymentSourceId?: Snowflake): Promise; public authorizeURL(url: string, options?: OAuth2AuthorizeOptions): Promise; @@ -836,6 +836,11 @@ export class Client extends BaseClient { public removeAllListeners(event?: Exclude): this; } +export interface AcceptInviteOptions { + bypassOnboarding: boolean; + bypassVerify: boolean; +} + export interface OAuth2AuthorizeOptions { guild_id?: Snowflake; permissions?: PermissionResolvable; @@ -1305,16 +1310,16 @@ export class GuildAuditLogs { export class GuildAuditLogsEntry< TActionRaw extends GuildAuditLogsResolvable = 'ALL', TAction = TActionRaw extends keyof GuildAuditLogsIds - ? GuildAuditLogsIds[TActionRaw] - : TActionRaw extends null - ? 'ALL' - : TActionRaw, + ? GuildAuditLogsIds[TActionRaw] + : TActionRaw extends null + ? 'ALL' + : TActionRaw, TActionType extends GuildAuditLogsActionType = TAction extends keyof GuildAuditLogsTypes - ? GuildAuditLogsTypes[TAction][1] - : 'ALL', + ? GuildAuditLogsTypes[TAction][1] + : 'ALL', TTargetType extends GuildAuditLogsTarget = TAction extends keyof GuildAuditLogsTypes - ? GuildAuditLogsTypes[TAction][0] - : 'UNKNOWN', + ? GuildAuditLogsTypes[TAction][0] + : 'UNKNOWN', > { private constructor(guild: Guild, data: RawGuildAuditLogEntryData, logs?: GuildAuditLogs); public action: TAction; @@ -1571,7 +1576,7 @@ export class HTTPError extends Error { } // tslint:disable-next-line:no-empty-interface - Merge RateLimitData into RateLimitError to not have to type it again -export interface RateLimitError extends RateLimitData {} +export interface RateLimitError extends RateLimitData { } export class RateLimitError extends Error { private constructor(data: RateLimitData); public name: 'RateLimitError'; @@ -1914,8 +1919,8 @@ export class MessageActionRow< T extends MessageActionRowComponent | ModalActionRowComponent = MessageActionRowComponent, U = T extends ModalActionRowComponent ? ModalActionRowComponentResolvable : MessageActionRowComponentResolvable, V = T extends ModalActionRowComponent - ? APIActionRowComponent - : APIActionRowComponent, + ? APIActionRowComponent + : APIActionRowComponent, > extends BaseMessageComponent { // tslint:disable-next-line:ban-ts-ignore // @ts-ignore (TS:2344, Caused by TypeScript 4.8) @@ -3699,13 +3704,13 @@ export class ApplicationCommandPermissionsManager< public remove( options: | (FetchSingleOptions & { - users: UserResolvable | UserResolvable[]; - roles?: RoleResolvable | RoleResolvable[]; - }) + users: UserResolvable | UserResolvable[]; + roles?: RoleResolvable | RoleResolvable[]; + }) | (FetchSingleOptions & { - users?: UserResolvable | UserResolvable[]; - roles: RoleResolvable | RoleResolvable[]; - }), + users?: UserResolvable | UserResolvable[]; + roles: RoleResolvable | RoleResolvable[]; + }), ): Promise; public set( options: FetchSingleOptions & { permissions: ApplicationCommandPermissionData[] }, @@ -4640,12 +4645,12 @@ export interface ApplicationCommandChannelOption extends BaseApplicationCommandO export interface ApplicationCommandAutocompleteOption extends Omit { type: - | 'STRING' - | 'NUMBER' - | 'INTEGER' - | ApplicationCommandOptionTypes.STRING - | ApplicationCommandOptionTypes.NUMBER - | ApplicationCommandOptionTypes.INTEGER; + | 'STRING' + | 'NUMBER' + | 'INTEGER' + | ApplicationCommandOptionTypes.STRING + | ApplicationCommandOptionTypes.NUMBER + | ApplicationCommandOptionTypes.INTEGER; autocomplete: true; } @@ -4917,9 +4922,9 @@ export interface AutoModerationRuleCreateOptions { reason?: string; } -export interface AutoModerationRuleEditOptions extends Partial> {} +export interface AutoModerationRuleEditOptions extends Partial> { } -export interface AutoModerationTriggerMetadataOptions extends Partial {} +export interface AutoModerationTriggerMetadataOptions extends Partial { } export interface AutoModerationActionOptions { type: AutoModerationActionType | AutoModerationActionTypes; @@ -5026,8 +5031,8 @@ export type CacheFactory = ( export type CacheWithLimitsOptions = { [K in keyof Caches]?: Caches[K][0]['prototype'] extends DataManager - ? LimitedCollectionOptions | number - : never; + ? LimitedCollectionOptions | number + : never; }; export interface CategoryCreateChannelOptions { permissionOverwrites?: OverwriteResolvable[] | Collection; @@ -5376,12 +5381,12 @@ export interface ConstantsClientApplicationAssetTypes { export type AutocompleteFocusedOption = Pick & { focused: true; type: - | 'STRING' - | 'INTEGER' - | 'NUMBER' - | ApplicationCommandOptionTypes.STRING - | ApplicationCommandOptionTypes.INTEGER - | ApplicationCommandOptionTypes.NUMBER; + | 'STRING' + | 'INTEGER' + | 'NUMBER' + | ApplicationCommandOptionTypes.STRING + | ApplicationCommandOptionTypes.INTEGER + | ApplicationCommandOptionTypes.NUMBER; value: string; }; @@ -5936,20 +5941,20 @@ export interface GuildAuditLogsEntryExtraField { MESSAGE_UNPIN: { channel: GuildTextBasedChannel | { id: Snowflake }; messageId: Snowflake }; MEMBER_DISCONNECT: { count: number }; CHANNEL_OVERWRITE_CREATE: - | Role - | GuildMember - | { id: Snowflake; name: string; type: OverwriteTypes.role } - | { id: Snowflake; type: OverwriteTypes.member }; + | Role + | GuildMember + | { id: Snowflake; name: string; type: OverwriteTypes.role } + | { id: Snowflake; type: OverwriteTypes.member }; CHANNEL_OVERWRITE_UPDATE: - | Role - | GuildMember - | { id: Snowflake; name: string; type: OverwriteTypes.role } - | { id: Snowflake; type: OverwriteTypes.member }; + | Role + | GuildMember + | { id: Snowflake; name: string; type: OverwriteTypes.role } + | { id: Snowflake; type: OverwriteTypes.member }; CHANNEL_OVERWRITE_DELETE: - | Role - | GuildMember - | { id: Snowflake; name: string; type: OverwriteTypes.role } - | { id: Snowflake; type: OverwriteTypes.member }; + | Role + | GuildMember + | { id: Snowflake; name: string; type: OverwriteTypes.role } + | { id: Snowflake; type: OverwriteTypes.member }; STAGE_INSTANCE_CREATE: StageChannel | { id: Snowflake }; STAGE_INSTANCE_DELETE: StageChannel | { id: Snowflake }; STAGE_INSTANCE_UPDATE: StageChannel | { id: Snowflake }; @@ -5980,8 +5985,8 @@ export interface GuildAuditLogsEntryTargetField = T extends { withMember: true } - ? Collection> - : Collection>; + ? Collection> + : Collection>; export type GuildScheduledEventPrivacyLevel = keyof typeof GuildScheduledEventPrivacyLevels; @@ -6407,8 +6412,8 @@ export type ModalActionRowComponentResolvable = export interface MessageActionRowOptions< T extends - | MessageActionRowComponentResolvable - | ModalActionRowComponentResolvable = MessageActionRowComponentResolvable, + | MessageActionRowComponentResolvable + | ModalActionRowComponentResolvable = MessageActionRowComponentResolvable, > extends BaseMessageComponentOptions { components: T[]; } @@ -6659,8 +6664,8 @@ export type MFALevel = keyof typeof MFALevels; export interface ModalOptions { components: - | MessageActionRow[] - | MessageActionRowOptions[]; + | MessageActionRow[] + | MessageActionRowOptions[]; customId: string; title: string; } @@ -6821,19 +6826,19 @@ export type Partialize< id: Snowflake; partial: true; } & { - [K in keyof Omit]: K extends N ? null : K extends M ? T[K] | null : T[K]; -}; + [K in keyof Omit]: K extends N ? null : K extends M ? T[K] | null : T[K]; + }; export interface PartialDMChannel extends Partialize { lastMessageId: undefined; } -export interface PartialGuildMember extends Partialize {} +export interface PartialGuildMember extends Partialize { } export interface PartialMessage - extends Partialize {} + extends Partialize { } -export interface PartialMessageReaction extends Partialize {} +export interface PartialMessageReaction extends Partialize { } export interface PartialOverwriteData { id: Snowflake | number; @@ -6848,7 +6853,7 @@ export interface PartialRoleData extends RoleData { export type PartialTypes = 'USER' | 'CHANNEL' | 'GUILD_MEMBER' | 'MESSAGE' | 'REACTION' | 'GUILD_SCHEDULED_EVENT'; -export interface PartialUser extends Partialize {} +export interface PartialUser extends Partialize { } export type PresenceStatusData = ClientPresenceStatus | 'invisible'; @@ -7042,8 +7047,8 @@ export interface SweeperDefinitions { export type SweeperOptions = { [K in keyof SweeperDefinitions]?: SweeperDefinitions[K][2] extends true - ? SweepOptions | LifetimeSweepOptions - : SweepOptions; + ? SweepOptions | LifetimeSweepOptions + : SweepOptions; }; export interface LimitedCollectionOptions { @@ -7182,12 +7187,12 @@ export interface WebhookClientDataURL { export type FriendRequestOptions = | { - user: UserResolvable; - } + user: UserResolvable; + } | { - username: string; - discriminator: number | null; - }; + username: string; + discriminator: number | null; + }; export type WebhookClientOptions = Pick< ClientOptions,