feat: acceptInvite options

This commit is contained in:
Elysia 2024-01-25 23:37:11 +07:00
parent 5758f0fdbf
commit 4e909fd889
2 changed files with 84 additions and 71 deletions

View File

@ -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<Guild|DMChannel|GroupDMChannel>}
* @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)`);

27
typings/index.d.ts vendored
View File

@ -807,7 +807,7 @@ export class Client<Ready extends boolean = boolean> extends BaseClient {
/** @deprecated Use {@link Sweepers#sweepMessages} instead */
public sweepMessages(lifetime?: number): number;
public toJSON(): unknown;
public acceptInvite(invite: InviteResolvable): Promise<Guild | DMChannel | GroupDMChannel>;
public acceptInvite(invite: InviteResolvable, options?: AcceptInviteOptions): Promise<Guild | DMChannel | GroupDMChannel>;
public redeemNitro(nitro: string, channel?: TextChannelResolvable, paymentSourceId?: Snowflake): Promise<any>;
public authorizeURL(url: string, options?: OAuth2AuthorizeOptions): Promise<any>;
@ -836,6 +836,11 @@ export class Client<Ready extends boolean = boolean> extends BaseClient {
public removeAllListeners<S extends string | symbol>(event?: Exclude<S, keyof ClientEvents>): this;
}
export interface AcceptInviteOptions {
bypassOnboarding: boolean;
bypassVerify: boolean;
}
export interface OAuth2AuthorizeOptions {
guild_id?: Snowflake;
permissions?: PermissionResolvable;
@ -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';
@ -4917,9 +4922,9 @@ export interface AutoModerationRuleCreateOptions {
reason?: string;
}
export interface AutoModerationRuleEditOptions extends Partial<Omit<AutoModerationRuleCreateOptions, 'triggerType'>> {}
export interface AutoModerationRuleEditOptions extends Partial<Omit<AutoModerationRuleCreateOptions, 'triggerType'>> { }
export interface AutoModerationTriggerMetadataOptions extends Partial<AutoModerationTriggerMetadata> {}
export interface AutoModerationTriggerMetadataOptions extends Partial<AutoModerationTriggerMetadata> { }
export interface AutoModerationActionOptions {
type: AutoModerationActionType | AutoModerationActionTypes;
@ -5980,8 +5985,8 @@ export interface GuildAuditLogsEntryTargetField<TActionType extends GuildAuditLo
INVITE: Invite;
MESSAGE: TActionType extends 'MESSAGE_BULK_DELETE' ? Guild | { id: Snowflake } : User;
INTEGRATION: Integration;
CHANNEL: NonThreadGuildBasedChannel | { id: Snowflake; [x: string]: unknown };
THREAD: ThreadChannel | { id: Snowflake; [x: string]: unknown };
CHANNEL: NonThreadGuildBasedChannel | { id: Snowflake;[x: string]: unknown };
THREAD: ThreadChannel | { id: Snowflake;[x: string]: unknown };
STAGE_INSTANCE: StageInstance;
STICKER: Sticker;
GUILD_SCHEDULED_EVENT: GuildScheduledEvent;
@ -6822,18 +6827,18 @@ export type Partialize<
partial: true;
} & {
[K in keyof Omit<T, 'client' | 'id' | 'partial' | E>]: K extends N ? null : K extends M ? T[K] | null : T[K];
};
};
export interface PartialDMChannel extends Partialize<DMChannel, null, null, 'lastMessageId'> {
lastMessageId: undefined;
}
export interface PartialGuildMember extends Partialize<GuildMember, 'joinedAt' | 'joinedTimestamp'> {}
export interface PartialGuildMember extends Partialize<GuildMember, 'joinedAt' | 'joinedTimestamp'> { }
export interface PartialMessage
extends Partialize<Message, 'type' | 'system' | 'pinned' | 'tts', 'content' | 'cleanContent' | 'author'> {}
extends Partialize<Message, 'type' | 'system' | 'pinned' | 'tts', 'content' | 'cleanContent' | 'author'> { }
export interface PartialMessageReaction extends Partialize<MessageReaction, 'count'> {}
export interface PartialMessageReaction extends Partialize<MessageReaction, 'count'> { }
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<User, 'username' | 'tag' | 'discriminator'> {}
export interface PartialUser extends Partialize<User, 'username' | 'tag' | 'discriminator'> { }
export type PresenceStatusData = ClientPresenceStatus | 'invisible';