diff --git a/node_modules/discord-oauth2/.eslintignore b/node_modules/discord-oauth2/.eslintignore
new file mode 100644
index 0000000..08b2553
--- /dev/null
+++ b/node_modules/discord-oauth2/.eslintignore
@@ -0,0 +1 @@
+node_modules
diff --git a/node_modules/discord-oauth2/.eslintrc.json b/node_modules/discord-oauth2/.eslintrc.json
new file mode 100644
index 0000000..5209531
--- /dev/null
+++ b/node_modules/discord-oauth2/.eslintrc.json
@@ -0,0 +1,35 @@
+{
+ "env": {
+ "es6": true,
+ "node": true
+ },
+ "parserOptions": {
+ "ecmaVersion": 2020
+ },
+ "extends": "eslint:recommended",
+ "rules": {
+ "semi": "error",
+ "no-var": "error",
+ "prefer-const": "error",
+ "keyword-spacing": "error",
+ "eqeqeq": "error",
+ "eol-last": "error",
+ "brace-style": ["error", "stroustrup"],
+ "comma-dangle": ["error", "always-multiline"],
+ "object-curly-spacing": ["error", "always"],
+
+ "quotes": ["error", "double", {
+ "allowTemplateLiterals": true
+ }],
+
+ "indent": ["error", "tab", {
+ "SwitchCase": 1,
+ "flatTernaryExpressions": true
+ }],
+
+ "object-curly-newline": ["error", {
+ "ExportDeclaration": "never",
+ "ImportDeclaration": "always"
+ }]
+ }
+}
diff --git a/node_modules/discord-oauth2/.github/ISSUE_TEMPLATE/can-t-get-it-to-work.md b/node_modules/discord-oauth2/.github/ISSUE_TEMPLATE/can-t-get-it-to-work.md
new file mode 100644
index 0000000..652977c
--- /dev/null
+++ b/node_modules/discord-oauth2/.github/ISSUE_TEMPLATE/can-t-get-it-to-work.md
@@ -0,0 +1,21 @@
+---
+name: Can't get it to work
+about: Use this template if you are having issues with the library (all issues opened
+ for issues with the library that don't follow this template will be ignored and
+ closed).
+title: ''
+labels: ''
+assignees: reboxer
+
+---
+
+**Describe the error**
+A clear and concise description of what the error is.
+
+**NodeJS version**
+*Your NodeJS version*
+
+**Relevant code**
+```js
+// Put here the code you are using that is not working
+```
diff --git a/node_modules/discord-oauth2/.github/workflows/ci.yml b/node_modules/discord-oauth2/.github/workflows/ci.yml
new file mode 100644
index 0000000..487e168
--- /dev/null
+++ b/node_modules/discord-oauth2/.github/workflows/ci.yml
@@ -0,0 +1,18 @@
+name: Run ESLint
+
+on:
+ push:
+ branches: [ master ]
+ pull_request:
+ branches: [ master ]
+
+jobs:
+ lint:
+ name: Run ESlint
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - run: yarn
+ - run: yarn run lint
diff --git a/node_modules/discord-oauth2/LICENSE b/node_modules/discord-oauth2/LICENSE
new file mode 100644
index 0000000..03da1c4
--- /dev/null
+++ b/node_modules/discord-oauth2/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 reboxer
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/discord-oauth2/README.md b/node_modules/discord-oauth2/README.md
new file mode 100644
index 0000000..d931647
--- /dev/null
+++ b/node_modules/discord-oauth2/README.md
@@ -0,0 +1,358 @@
+# discord-oauth2 [![NPM version](https://img.shields.io/npm/v/discord-oauth2.svg?style=flat-square)](https://www.npmjs.com/package/discord-oauth2)
+
+A really simple to use module to use discord's OAuth2 API.
+
+Please check out discord's OAuth2 documentation: https://discord.com/developers/docs/topics/oauth2
+
+### Installing
+
+```bash
+npm install discord-oauth2
+```
+
+# Class constructor
+
+One parameter is passed to the class constructor:
+
+### `Options`
+
+Since the module uses a modified version of [Eris](https://github.com/abalabahaha/eris) request handler, it takes the same options, all of them default to the default Eris Client options if no options are passed.
+
+Request handler options:
+```
+requestTimeout: A number of milliseconds before requests are considered timed out.
+
+latencyThreshold: The average request latency at which the RequestHandler will start emitting latency errors.
+
+ratelimiterOffset: A number of milliseconds to offset the ratelimit timing calculations by.
+
+```
+
+Others, you can pass these options to the class constructor so you don't have to pass them each time you call a function:
+```
+version: The Discord API version to use. Defaults to "v7".
+
+clientId: Your application's client id.
+
+clientSecret: Your application's client secret.
+
+redirectUri: Your URL redirect uri.
+
+credentials: Base64 encoding of the UTF-8 encoded credentials string of your application, you can pass this in the constructor to not pass it every time you want to use the revokeToken() method.
+```
+
+# Events
+
+In the Eris Library, client extends the `events` modules and the client is passed to the RequestHandler so it's able to emit events, this modified RequestHandler extends `events` so it can emit the same events.
+
+There are only two events, `debug` and `warn`.
+
+# Methods
+
+### `tokenRequest()`
+
+Only takes an object with the following properties:
+
+`clientId`: Your application's client id. Can be omitted if provided on the client constructor.
+
+`clientSecret`: Your application's client secret. Can be omitted if provided on the client constructor.
+
+`scope`: The scopes requested in your authorization url, can be either a space-delimited string of scopes, or an array of strings containing scopes.
+
+`redirectUri`: Your URL redirect uri. Can be omitted if provided on the client constructor.
+
+`grantType`: The grant type to set for the request, either authorization_code or refresh_token.
+
+`code`: The code from the querystring (grantType `authorization_code` only).
+
+`refreshToken`: The user's refresh token (grantType `refresh_token` only).
+
+
+Returns a promise which resolves in an object with the access token.
+
+Please refer to discord's OAuth2 [documentation](https://discord.com/developers/docs/topics/oauth2#authorization-code-grant-access-token-exchange-example) for the parameters needed.
+
+```js
+const DiscordOauth2 = require("discord-oauth2");
+const oauth = new DiscordOauth2();
+
+oauth.tokenRequest({
+ clientId: "332269999912132097",
+ clientSecret: "937it3ow87i4ery69876wqire",
+
+ code: "query code",
+ scope: "identify guilds",
+ grantType: "authorization_code",
+
+ redirectUri: "http://localhost/callback",
+}).then(console.log)
+```
+
+Using class constructor options, array of scopes and grantType refresh_token:
+
+```js
+const DiscordOauth2 = require("discord-oauth2");
+const oauth = new DiscordOauth2({
+ clientId: "332269999912132097",
+ clientSecret: "937it3ow87i4ery69876wqire",
+ redirectUri: "http://localhost/callback",
+});
+
+oauth.tokenRequest({
+ // clientId, clientSecret and redirectUri are omitted, as they were already set on the class constructor
+ refreshToken: "D43f5y0ahjqew82jZ4NViEr2YafMKhue",
+ grantType: "refresh_token",
+ scope: ["identify", "guilds"],
+});
+
+// On successful request both requesting and refreshing an access token return the same object
+/*
+ {
+ "access_token": "6qrZcUqja7812RVdnEKjpzOL4CvHBFG",
+ "token_type": "Bearer",
+ "expires_in": 604800,
+ "refresh_token": "D43f5y0ahjqew82jZ4NViEr2YafMKhue",
+ "scope": "identify guilds"
+ }
+*/
+```
+
+### `revokeToken()`
+
+Takes two parameters, the first one is the access_token from the user, the second is a Base64 encoding of the UTF-8 encoded credentials string of your application.
+
+Returns a promise which resolves in an empty object if successful.
+
+```js
+const DiscordOauth2 = require("discord-oauth2");
+const oauth = new DiscordOauth2();
+
+const clientID = "332269999912132097";
+const client_secret = "937it3ow87i4ery69876wqire";
+const access_token = "6qrZcUqja7812RVdnEKjpzOL4CvHBFG";
+
+// You must encode your client ID along with your client secret including the colon in between
+const credentials = Buffer.from(`${clientID}:${client_secret}`).toString("base64"); // MzMyMjY5OTk5OTEyMTMyMDk3OjkzN2l0M293ODdpNGVyeTY5ODc2d3FpcmU=
+
+oauth.revokeToken(access_token, credentials).then(console.log); // {}
+```
+
+### `getUser()`
+
+Only takes one parameter which is the user's access token.
+
+Returns the [user](https://discord.com/developers/docs/resources/user#user-object) object of the requester's account, this requires the `identify` scope, which will return the object without an email, and optionally the `email` scope, which returns the object with an email.
+
+```js
+const DiscordOauth2 = require("discord-oauth2");
+const oauth = new DiscordOauth2();
+
+const access_token = "6qrZcUqja7812RVdnEKjpzOL4CvHBFG";
+
+oauth.getUser(access_token).then(console.log);
+/*
+ {
+ username: '1337 Krew',
+ locale: 'en-US',
+ mfa_enabled: true,
+ flags: 128,
+ avatar: '8342729096ea3675442027381ff50dfe',
+ discriminator: '4421',
+ id: '80351110224678912'
+ }
+*/
+```
+
+### `getUserGuilds()`
+
+Only takes one parameter which is the user's access token.
+
+Returns a list of partial [guild](https://discord.com/developers/docs/resources/guild#guild-object) objects the current user is a member of. Requires the `guilds` scope.
+
+```js
+const DiscordOauth2 = require("discord-oauth2");
+const oauth = new DiscordOauth2();
+
+const access_token = "6qrZcUqja7812RVdnEKjpzOL4CvHBFG";
+
+oauth.getUserGuilds(access_token).then(console.log);
+/*
+ {
+ "id": "80351110224678912",
+ "name": "1337 Krew",
+ "icon": "8342729096ea3675442027381ff50dfe",
+ "owner": true,
+ "permissions": 36953089,
+ "permissions_new": "36953089"
+ }
+*/
+```
+
+### `getUserConnections()`
+
+Only takes one parameter which is the user's access token.
+
+Returns a list of [connection](https://discord.com/developers/docs/resources/user#connection-object) objects. Requires the `connections` OAuth2 scope.
+
+```js
+const DiscordOauth2 = require("discord-oauth2");
+const oauth = new DiscordOauth2();
+
+const access_token = "6qrZcUqja7812RVdnEKjpzOL4CvHBFG";
+
+oauth.getUserConnections(access_token).then(console.log);
+/*
+ [ { verified: true,
+ name: 'epicusername',
+ show_activity: true,
+ friend_sync: false,
+ type: 'twitch',
+ id: '31244565',
+ visibility: 1 } ]
+*/
+```
+
+### `addMember()`
+
+Force join a user to a guild (server).
+
+Takes an object with the following properties:
+
+`accessToken`: The user access token.
+
+`botToken`: The token of the bot used to authenticate.
+
+`guildId`: The ID of the guild to join.
+
+`userId`: The ID of the user to be added to the guild.
+
+Optional properties (the above ones are required):
+
+`nickname`: Value to set users nickname to.
+
+`roles`: Array of role ids the member is assigned.
+
+`mute`: Whether the user is muted in voice channels.
+
+`deaf`: Whether the user is deafened in voice channels.
+
+Returns a member object if the user wasn't part of the guild, else, returns an empty string (length 0).
+
+```js
+const DiscordOauth2 = require("discord-oauth2");
+const oauth = new DiscordOauth2();
+
+oauth.addMember({
+ accessToken: "2qRZcUqUa9816RVnnEKRpzOL2CvHBgF",
+ botToken: "NDgyMjM4ODQzNDI1MjU5NTIz.XK93JQ.bnLsc71_DGum-Qnymb4T5F6kGY8",
+ guildId: "216488324594438692",
+ userId: "80351110224678912",
+
+ nickname: "george michael",
+ roles: ["624615851966070786"],
+ mute: true,
+ deaf: true,
+}).then(console.log); // Member object or empty string
+
+/*
+ {
+ nick: 'george michael',
+ user: {
+ username: 'some username',
+ discriminator: '0001',
+ id: '421610529323943943',
+ avatar: null
+ },
+ roles: [ '324615841966570766' ],
+ premium_since: null,
+ deaf: true,
+ mute: true,
+ joined_at: '2019-09-20T14:44:12.603123+00:00'
+ }
+*/
+```
+
+### `generateAuthUrl`
+
+Dynamically generate an OAuth2 URL.
+
+Takes an object with the following properties:
+
+`clientId`: Your application's client id. Can be omitted if provided on the client constructor.
+
+`prompt`: Controls how existing authorizations are handled, either consent or none (for passthrough scopes authorization is always required).
+
+`scope`: The scopes requested in your authorization url, can be either a space-delimited string of scopes, or an array of strings containing scopes.
+
+`redirectUri`: Your URL redirect uri. Can be omitted if provided on the client constructor.
+
+`responseType`: The response type, either code or token (token is for client-side web applications only). Defaults to code.
+
+`state`: A unique cryptographically secure string (https://discord.com/developers/docs/topics/oauth2#state-and-security).
+
+`permissions`: The permissions number for the bot invite (only with bot scope) (https://discord.com/developers/docs/topics/permissions).
+
+`guildId`: The guild id to pre-fill the bot invite (only with bot scope).
+
+`disableGuildSelect`: Disallows the user from changing the guild for the bot invite, either true or false (only with bot scope).
+
+```js
+const crypto = require('crypto')
+const DiscordOauth2 = require("discord-oauth2");
+const oauth = new DiscordOauth2({
+ clientId: "332269999912132097",
+ clientSecret: "937it3ow87i4ery69876wqire",
+ redirectUri: "http://localhost/callback",
+});
+
+const url = oauth.generateAuthUrl({
+ scope: ["identify", "guilds"],
+ state: crypto.randomBytes(16).toString("hex"), // Be aware that randomBytes is sync if no callback is provided
+});
+
+console.log(url);
+// https://discord.com/api/oauth2/authorize?client_id=332269999912132097&redirect_uri=http%3A%2F%2Flocalhost%2Fcallback&response_type=code&scope=identify%20guilds&state=132054f372bfca771de3dfe54aaacece
+
+```
+
+# Debugging
+
+By default when you log an error to the console, it will look something like this `DiscordHTTPError: 400 Bad Request on POST /api/v7/oauth2/token` followed by a very long stack trace what most of the times won't be useful (if you already know where the function is called).
+
+To easily debug any issues you are having, you can access the following properties of the error object thrown:
+
+`req`: The HTTP request sent to discord.
+
+`res`: The HTTP response sent from discord to our request.
+
+`code`: If the error is a `DiscordHTTPError`, it will be the HTTP status code of the response (same as `res.statusCode`).
+If the error is a `DiscordRESTError`, it will be a [Discord API JSON error code](https://discord.com/developers/docs/topics/opcodes-and-status-codes#json-json-error-codes).
+
+`response`: An object containing properties that describe the error.
+If the error is a `DiscordHTTPError`, the object will have the `error` and `error_description` properties.
+If the error is a `DiscordRESTError`, the object will have the `message` and `code` (JSON error code. See `code`.) properties.
+
+`message`: If the error is a `DiscordHTTPError`, it will be a string including the status of the HTTP request and the endpoint used.
+If the error is a `DiscordRESTError`, it will be a string including the error code and it's meaning.
+
+`stack`: The error stack trace.
+
+```js
+// error.response for DiscordRESTError
+{
+ message: 'Missing Permissions',
+ code: 50013
+}
+```
+
+```js
+// error.response for DiscordHTTPError
+{
+ error: 'invalid_request',
+ error_description: 'Invalid "code" in request.'
+}
+```
+
+# Contributing
+
+All contributions are welcome.
diff --git a/node_modules/discord-oauth2/index.d.ts b/node_modules/discord-oauth2/index.d.ts
new file mode 100644
index 0000000..5a56091
--- /dev/null
+++ b/node_modules/discord-oauth2/index.d.ts
@@ -0,0 +1,136 @@
+import { EventEmitter } from "events";
+
+interface User {
+ id: string;
+ username: string;
+ discriminator: string;
+ avatar: string | null | undefined;
+ mfa_enabled?: true;
+ locale?: string;
+ verified?: boolean;
+ email?: string | null | undefined;
+ flags?: number;
+ premium_type?: number;
+ public_flags?: number;
+}
+
+interface Member {
+ user?: User;
+ nick: string | null | undefined;
+ roles: string[];
+ joined_at: number;
+ premium_since?: number | null | undefined;
+ deaf: boolean;
+ mute: boolean;
+}
+
+// This is not accurate as discord sends a partial object
+interface Integration {
+ id: string;
+ name: string;
+ type: string;
+ enabled: boolean;
+ syncing: boolean;
+ role_id: string;
+ enable_emoticons?: boolean;
+ expire_behavior: 0 | 1;
+ expire_grace_period: number;
+ user?: User;
+ account: {
+ id: string;
+ name: string;
+ };
+ synced_at: number;
+ subscriber_count: number;
+ revoked: boolean;
+ application?: Application;
+}
+
+interface Connection {
+ id: string;
+ name: string;
+ type: string;
+ revoked?: string;
+ integrations?: Integration[];
+ verified: boolean;
+ friend_sync: boolean;
+ show_activity: boolean;
+ visibility: 0 | 1;
+}
+
+interface Application {
+ id: string;
+ name: string;
+ icon: string | null | undefined;
+ description: string;
+ summary: string;
+ bot?: User;
+}
+
+interface TokenRequestResult {
+ access_token: string;
+ token_type: string;
+ expires_in: number;
+ refresh_token: string;
+ scope: string;
+}
+
+interface PartialGuild {
+ id: string;
+ name: string;
+ icon: string | null | undefined;
+ owner?: boolean;
+ permissions?: number;
+ features: string[];
+ permissions_new?: string;
+}
+
+declare class OAuth extends EventEmitter {
+ constructor(opts?: {
+ version?: string,
+ clientId?: string,
+ redirectUri?: string,
+ credentials?: string,
+ clientSecret?: string,
+ requestTimeout?: number,
+ latencyThreshold?: number,
+ ratelimiterOffset?: number,
+ });
+ on(event: "debug" | "warn", listener: (message: string) => void): this;
+ tokenRequest(opts: {
+ code?: string,
+ scope: string[] | string,
+ clientId?: string,
+ grantType: "authorization_code" | "refresh_token",
+ redirectUri?: string,
+ refreshToken?: string,
+ clientSecret?: string,
+ }): Promise;
+ revokeToken(access_token: string, credentials?: string): Promise;
+ getUser(access_token: string): Promise;
+ getUserGuilds(access_token: string): Promise;
+ getUserConnections(access_token: string): Promise;
+ addMember(opts: {
+ deaf?: boolean,
+ mute?: boolean,
+ roles?: string[],
+ nickname?: string,
+ userId: string,
+ guildId: string,
+ botToken: string,
+ accessToken: string,
+ }): Promise;
+ generateAuthUrl(opts: {
+ scope: string[] | string,
+ state?: string,
+ clientId?: string,
+ prompt?: "consent" | "none",
+ redirectUri?: string,
+ responseType?: "code" | "token",
+ permissions?: number,
+ guildId?: string,
+ disableGuildSelect?: boolean,
+ }): string;
+}
+
+export = OAuth;
diff --git a/node_modules/discord-oauth2/index.js b/node_modules/discord-oauth2/index.js
new file mode 100644
index 0000000..d0d8e44
--- /dev/null
+++ b/node_modules/discord-oauth2/index.js
@@ -0,0 +1,3 @@
+"use strict";
+const OAuth = require("./lib/oauth");
+module.exports = OAuth;
diff --git a/node_modules/discord-oauth2/lib/eris/errors/DiscordHTTPError.js b/node_modules/discord-oauth2/lib/eris/errors/DiscordHTTPError.js
new file mode 100644
index 0000000..b418448
--- /dev/null
+++ b/node_modules/discord-oauth2/lib/eris/errors/DiscordHTTPError.js
@@ -0,0 +1,91 @@
+/*
+ The MIT License (MIT)
+
+ Copyright (c) 2016-2020 abalabahaha
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+/* eslint-disable no-prototype-builtins */
+
+"use strict";
+
+class DiscordHTTPError extends Error {
+ constructor(req, res, response, stack) {
+ super();
+
+ Object.defineProperty(this, "req", {
+ enumerable: false,
+ value: req,
+ writable: false,
+ });
+ Object.defineProperty(this, "res", {
+ enumerable: false,
+ value: res,
+ writable: false,
+ });
+ Object.defineProperty(this, "response", {
+ enumerable: false,
+ value: response,
+ writable: false,
+ });
+
+ Object.defineProperty(this, "code", {
+ value: res.statusCode,
+ writable: false,
+ });
+ let message = `${this.name}: ${res.statusCode} ${res.statusMessage} on ${req.method} ${req.path}`;
+ const errors = this.flattenErrors(response);
+ if (errors.length > 0) {
+ message += "\n " + errors.join("\n ");
+ }
+ Object.defineProperty(this, "message", {
+ value: message,
+ writable: false,
+ });
+
+ if (stack) {
+ Object.defineProperty(this, "stack", {
+ value: this.message + "\n" + stack,
+ writable: false,
+ });
+ }
+ else {
+ Error.captureStackTrace(this, DiscordHTTPError);
+ }
+ }
+
+ get name() {
+ return this.constructor.name;
+ }
+
+ flattenErrors(errors, keyPrefix = "") {
+ let messages = [];
+ for (const fieldName in errors) {
+ if (!errors.hasOwnProperty(fieldName) || fieldName === "message" || fieldName === "code") {
+ continue;
+ }
+ if (Array.isArray(errors[fieldName])) {
+ messages = messages.concat(errors[fieldName].map((str) => `${keyPrefix + fieldName}: ${str}`));
+ }
+ }
+ return messages;
+ }
+}
+
+module.exports = DiscordHTTPError;
diff --git a/node_modules/discord-oauth2/lib/eris/errors/DiscordRESTError.js b/node_modules/discord-oauth2/lib/eris/errors/DiscordRESTError.js
new file mode 100644
index 0000000..a7375d1
--- /dev/null
+++ b/node_modules/discord-oauth2/lib/eris/errors/DiscordRESTError.js
@@ -0,0 +1,103 @@
+/*
+ The MIT License (MIT)
+
+ Copyright (c) 2016-2020 abalabahaha
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+/* eslint-disable no-prototype-builtins */
+
+"use strict";
+
+class DiscordRESTError extends Error {
+ constructor(req, res, response, stack) {
+ super();
+
+ Object.defineProperty(this, "req", {
+ enumerable: false,
+ value: req,
+ writable: false,
+ });
+ Object.defineProperty(this, "res", {
+ enumerable: false,
+ value: res,
+ writable: false,
+ });
+ Object.defineProperty(this, "response", {
+ enumerable: false,
+ value: response,
+ writable: false,
+ });
+
+ Object.defineProperty(this, "code", {
+ value: +response.code || -1,
+ writable: false,
+ });
+
+ let message = this.name + ": " + (response.message || "Unknown error");
+ if (response.errors) {
+ message += "\n " + this.flattenErrors(response.errors).join("\n ");
+ }
+ else {
+ const errors = this.flattenErrors(response);
+ if (errors.length > 0) {
+ message += "\n " + errors.join("\n ");
+ }
+ }
+ Object.defineProperty(this, "message", {
+ value: message,
+ writable: false,
+ });
+
+ if (stack) {
+ Object.defineProperty(this, "stack", {
+ value: this.message + "\n" + stack,
+ writable: false,
+ });
+ }
+ else {
+ Error.captureStackTrace(this, DiscordRESTError);
+ }
+ }
+
+ get name() {
+ return `${this.constructor.name} [${this.code}]`;
+ }
+
+ flattenErrors(errors, keyPrefix = "") {
+ let messages = [];
+ for (const fieldName in errors) {
+ if (!errors.hasOwnProperty(fieldName) || fieldName === "message" || fieldName === "code") {
+ continue;
+ }
+ if (errors[fieldName]._errors) {
+ messages = messages.concat(errors[fieldName]._errors.map((obj) => `${keyPrefix + fieldName}: ${obj.message}`));
+ }
+ else if (Array.isArray(errors[fieldName])) {
+ messages = messages.concat(errors[fieldName].map((str) => `${keyPrefix + fieldName}: ${str}`));
+ }
+ else if (typeof errors[fieldName] === "object") {
+ messages = messages.concat(this.flattenErrors(errors[fieldName], keyPrefix + fieldName + "."));
+ }
+ }
+ return messages;
+ }
+}
+
+module.exports = DiscordRESTError;
diff --git a/node_modules/discord-oauth2/lib/eris/rest/RequestHandler.js b/node_modules/discord-oauth2/lib/eris/rest/RequestHandler.js
new file mode 100644
index 0000000..a03261e
--- /dev/null
+++ b/node_modules/discord-oauth2/lib/eris/rest/RequestHandler.js
@@ -0,0 +1,305 @@
+/*
+ The MIT License (MIT)
+
+ Copyright (c) 2016-2020 abalabahaha
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+"use strict";
+
+const DiscordHTTPError = require("../errors/DiscordHTTPError");
+const DiscordRESTError = require("../errors/DiscordRESTError");
+const HTTPS = require("https");
+const SequentialBucket = require("../util/SequentialBucket");
+const EventEmitter = require("events");
+
+/**
+* Handles API requests
+*/
+class RequestHandler extends EventEmitter {
+ constructor(options) {
+ super();
+ this.version = options.version;
+ this.userAgent = `Discord-OAuth2 (https://github.com/reboxer/discord-oauth2, ${require("../../../package.json").version})`;
+ this.ratelimits = {};
+ this.requestTimeout = options.requestTimeout;
+ this.latencyThreshold = options.latencyThreshold;
+ this.latencyRef = {
+ latency: 500,
+ offset: options.ratelimiterOffset,
+ raw: new Array(10).fill(500),
+ timeOffset: 0,
+ timeOffsets: new Array(10).fill(0),
+ lastTimeOffsetCheck: 0,
+ };
+ this.globalBlock = false;
+ this.readyQueue = [];
+ }
+
+ globalUnblock() {
+ this.globalBlock = false;
+ while (this.readyQueue.length > 0) {
+ this.readyQueue.shift()();
+ }
+ }
+
+ // We need this for the Add Guild Member endpoint
+ routefy(url) {
+ return url.replace(/\/([a-z-]+)\/(?:[0-9]{17,19})/g, function(match, p) {
+ return p === "guilds" ? match : `/${p}/:id`;
+ });
+ }
+
+ /**
+ * Make an API request
+ * @arg {String} method Uppercase HTTP method
+ * @arg {String} url URL of the endpoint
+ * @arg {Object} options
+ * @arg {Object} [options.auth]
+ * @arg {String} [options.auth.type] The type of Authorization to use in the header, wheather Basic, Bearer or Bot
+ * @arg {String} [options.auth.creds] The credentials used for the authentication (bot or user access token), if Basic, a base64 string with application's credentials must be passed
+ * @arg {String} options.contentType The content type to set in the headers of the request
+ * @arg {Object} [body] Request payload
+ * @returns {Promise