diff --git a/src/rest/RequestHandler.js b/src/rest/RequestHandler.js index 1bf8309..08ecf3a 100644 --- a/src/rest/RequestHandler.js +++ b/src/rest/RequestHandler.js @@ -8,7 +8,7 @@ const DiscordAPIError = require('./DiscordAPIError'); const HTTPError = require('./HTTPError'); const RateLimitError = require('./RateLimitError'); const { - Events: { DEBUG, RATE_LIMIT, INVALID_REQUEST_WARNING, API_RESPONSE, API_REQUEST }, + Events: { DEBUG, RATE_LIMIT, INVALID_REQUEST_WARNING, API_RESPONSE, API_REQUEST, CAPTCHA_REQUIRED }, } = require('../util/Constants'); const cookieFilter = str => { @@ -386,6 +386,15 @@ class RequestHandler { let data; try { data = await parseResponse(res); + if (data?.captcha_service) { + /** + * Emitted when a request is blocked by a captcha + * @event Client#captchaRequired + * @param {Request} request The request that was blocked + * @param {Captcha} data The data returned by Discord + */ + this.manager.client.emit(CAPTCHA_REQUIRED, request, data); + } if ( data?.captcha_service && this.manager.client.options.captchaService && diff --git a/src/util/Constants.js b/src/util/Constants.js index e6eeba0..0942fdc 100644 --- a/src/util/Constants.js +++ b/src/util/Constants.js @@ -517,6 +517,7 @@ exports.Events = { RELATIONSHIP_REMOVE: 'relationshipRemove', RELATIONSHIP_UPDATE: 'relationshipUpdate', UNHANDLED_PACKET: 'unhandledPacket', + CAPTCHA_REQUIRED: 'captchaRequired', }; /** diff --git a/typings/index.d.ts b/typings/index.d.ts index 3a9a36b..10feb16 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -4807,6 +4807,7 @@ export interface ClientEvents extends BaseClientEvents { relationshipUpdate: [id: Snowflake, type: RelationshipTypes, data: object]; unhandledPacket: [packet: { op: GatewayOpcodes | number; d?: any; s?: number; t?: string }, shard: WebSocketShard]; update: [oldVersion: string, newVersion: string]; + captchaRequired: [request: Request, captcha: Captcha]; } export interface ConstantsEvents { @@ -4907,6 +4908,7 @@ export interface ConstantsEvents { RELATIONSHIP_REMOVE: 'relationshipRemove'; RELATIONSHIP_UPDATE: 'relationshipUpdate'; UNHANDLED_PACKET: 'unhandledPacket'; + CAPTCHA_REQUIRED: 'captchaRequired'; } export interface WebEmbedOptions {