diff --git a/examples/AddBot.js b/examples/AddBot.js index 438b292..db6e80d 100644 --- a/examples/AddBot.js +++ b/examples/AddBot.js @@ -17,18 +17,22 @@ const client = new Discord.Client({ }, }); +async function getMFACode() { + // This is just an example, you should implement your own MFA code retrieval + return '123456'; +} + client.on('ready', async () => { console.log('Ready!', client.user.tag); // Note - // You need to include `guild_id` and `permissions` to invite the bot. + // You need to include `guild_id` to invite the bot // These two fields can appear either in the URL or in the options. await client.authorizeURL( `https://discord.com/api/oauth2/authorize?client_id=289066747443675143&permissions=414501424448&scope=bot%20applications.commands`, { guild_id: 'guild id', - permissions: '414501424448', - authorize: true, }, + await getMFACode(), // Optional ); }); diff --git a/src/client/Client.js b/src/client/Client.js index df1b031..8af6eee 100644 --- a/src/client/Client.js +++ b/src/client/Client.js @@ -708,6 +708,7 @@ class Client extends BaseClient { * Authorize an application. * @param {string} urlOAuth2 Discord Auth URL * @param {OAuth2AuthorizeOptions} [options] Oauth2 options + * @param {string|number} [mfaCode = null] The mfa code if you have it enabled * @returns {Promise<{ location: string }>} * @example * client.authorizeURL(`https://discord.com/api/oauth2/authorize?client_id=botID&permissions=8&scope=applications.commands%20bot`, { @@ -716,7 +717,7 @@ class Client extends BaseClient { authorize: true }) */ - authorizeURL(urlOAuth2, options = {}) { + authorizeURL(urlOAuth2, options = {}, mfaCode = null) { // ! throw new Error('METHOD_WARNING'); const url = new URL(urlOAuth2); if (!/https:\/\/(canary\.|ptb\.)?discord.com\/api(\/v\d{1,2})?\/oauth2\/authorize\?/.test(urlOAuth2)) { @@ -742,6 +743,7 @@ class Client extends BaseClient { return this.api.oauth2.authorize.post({ query: searchParams, data: options, + mfaCode, }); } diff --git a/src/rest/APIRequest.js b/src/rest/APIRequest.js index c637925..c287d92 100644 --- a/src/rest/APIRequest.js +++ b/src/rest/APIRequest.js @@ -99,10 +99,15 @@ class APIRequest { 'base64', ); } + if (this.options.mfaToken) { headers['X-Discord-Mfa-Authorization'] = this.options.mfaToken; } + // Captcha + if (captchaKey && typeof captchaKey == 'string') headers['X-Captcha-Key'] = captchaKey; + if (captchaRqToken && typeof captchaRqToken == 'string') headers['X-Captcha-Rqtoken'] = captchaRqToken; + let body; if (this.options.files?.length) { body = new FormData(); @@ -128,10 +133,6 @@ class APIRequest { } } - // Captcha - if (captchaKey && typeof captchaKey == 'string') headers['X-Captcha-Key'] = captchaKey; - if (captchaRqToken && typeof captchaRqToken == 'string') headers['X-Captcha-Rqtoken'] = captchaRqToken; - const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), this.client.options.restRequestTimeout).unref(); return fetch(url, { diff --git a/typings/index.d.ts b/typings/index.d.ts index fef2bef..6e63dae 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -794,7 +794,7 @@ export class Client extends BaseClient { options?: AcceptInviteOptions, ): Promise; public redeemNitro(nitro: string, channel?: TextChannelResolvable, paymentSourceId?: Snowflake): Promise; - public authorizeURL(urlOAuth2: string, options?: OAuth2AuthorizeOptions): Promise; + public authorizeURL(urlOAuth2: string, options?: OAuth2AuthorizeOptions, mfaCode?: string | number): Promise; public installUserApps(applicationId: Snowflake): Promise; public deauthorize(applicationId: Snowflake): Promise;