Downgrade to v13
[vi] cảm giác đau khổ
This commit is contained in:
@@ -1,8 +1,24 @@
|
||||
'use strict';
|
||||
|
||||
const process = require('node:process');
|
||||
const Transformers = require('./Transformers');
|
||||
const JSONBig = require('json-bigint');
|
||||
/**
|
||||
* Rate limit data
|
||||
* @typedef {Object} RateLimitData
|
||||
* @property {number} timeout Time until this rate limit ends, in ms
|
||||
* @property {number} limit The maximum amount of requests of this endpoint
|
||||
* @property {string} method The HTTP method of this request
|
||||
* @property {string} path The path of the request relative to the HTTP endpoint
|
||||
* @property {string} route The route of the request relative to the HTTP endpoint
|
||||
* @property {boolean} global Whether this is a global rate limit
|
||||
*/
|
||||
|
||||
/**
|
||||
* Whether this rate limit should throw an Error
|
||||
* @typedef {Function} RateLimitQueueFilter
|
||||
* @param {RateLimitData} rateLimitData The data of this rate limit
|
||||
* @returns {boolean|Promise<boolean>}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Function} CacheFactory
|
||||
@@ -23,20 +39,44 @@ const JSONBig = require('json-bigint');
|
||||
* You can use your own function, or the {@link Options} class to customize the Collection used for the cache.
|
||||
* <warn>Overriding the cache used in `GuildManager`, `ChannelManager`, `GuildChannelManager`, `RoleManager`,
|
||||
* and `PermissionOverwriteManager` is unsupported and **will** break functionality</warn>
|
||||
* @property {number} [messageCacheLifetime=0] DEPRECATED: Pass `lifetime` to `sweepers.messages` instead.
|
||||
* How long a message should stay in the cache until it is considered sweepable (in seconds, 0 for forever)
|
||||
* @property {number} [messageSweepInterval=0] DEPRECATED: Pass `interval` to `sweepers.messages` instead.
|
||||
* How frequently to remove messages from the cache that are older than the message cache lifetime
|
||||
* (in seconds, 0 for never)
|
||||
* @property {MessageMentionOptions} [allowedMentions] Default value for {@link MessageOptions#allowedMentions}
|
||||
* @property {Partials[]} [partials] Structures allowed to be partial. This means events can be emitted even when
|
||||
* @property {number} [invalidRequestWarningInterval=0] The number of invalid REST requests (those that return
|
||||
* 401, 403, or 429) in a 10 minute window between emitted warnings (0 for no warnings). That is, if set to 500,
|
||||
* warnings will be emitted at invalid request number 500, 1000, 1500, and so on.
|
||||
* @property {PartialType[]} [partials] Structures allowed to be partial. This means events can be emitted even when
|
||||
* they're missing all the data for a particular structure. See the "Partial Structures" topic on the
|
||||
* [guide](https://discordjs.guide/popular-topics/partials.html) for some
|
||||
* important usage information, as partials require you to put checks in place when handling data.
|
||||
* @property {number} [restWsBridgeTimeout=5000] Maximum time permitted between REST responses and their
|
||||
* corresponding WebSocket events
|
||||
* @property {number} [restTimeOffset=500] Extra time in milliseconds to wait before continuing to make REST
|
||||
* requests (higher values will reduce rate-limiting errors on bad connections)
|
||||
* @property {number} [restRequestTimeout=15000] Time to wait before cancelling a REST request, in milliseconds
|
||||
* @property {number} [restSweepInterval=60] How frequently to delete inactive request buckets, in seconds
|
||||
* (or 0 for never)
|
||||
* @property {number} [restGlobalRateLimit=0] How many requests to allow sending per second (0 for unlimited, 50 for
|
||||
* the standard global limit used by Discord)
|
||||
* @property {string[]|RateLimitQueueFilter} [rejectOnRateLimit] Decides how rate limits and pre-emptive throttles
|
||||
* should be handled. If this option is an array containing the prefix of the request route (e.g. /channels to match any
|
||||
* route starting with /channels, such as /channels/222197033908436994/messages) or a function returning true, a
|
||||
* {@link RateLimitError} will be thrown. Otherwise the request will be queued for later
|
||||
* @property {number} [retryLimit=1] How many times to retry on 5XX errors
|
||||
* (Infinity for an indefinite amount of retries)
|
||||
* @property {boolean} [failIfNotExists=true] Default value for {@link ReplyMessageOptions#failIfNotExists}
|
||||
* @property {string[]} [userAgentSuffix] An array of additional bot info to be appended to the end of the required
|
||||
* [User Agent](https://discord.com/developers/docs/reference#user-agent) header
|
||||
* @property {PresenceData} [presence={}] Presence data to use upon login
|
||||
* @property {IntentsResolvable} intents Intents to enable for this connection
|
||||
* @property {number} [waitGuildTimeout=15_000] Time in milliseconds that Clients with the GUILDS intent should wait for
|
||||
* missing guilds to be received before starting the bot. If not specified, the default is 15 seconds.
|
||||
* missing guilds to be recieved before starting the bot. If not specified, the default is 15 seconds.
|
||||
* @property {SweeperOptions} [sweepers={}] Options for cache sweeping
|
||||
* @property {WebsocketOptions} [ws] Options for the WebSocket
|
||||
* @property {RESTOptions} [rest] Options for the REST manager
|
||||
* @property {Function} [jsonTransformer] A function used to transform outgoing json data
|
||||
* @property {HTTPOptions} [http] HTTP options
|
||||
*/
|
||||
|
||||
/**
|
||||
@@ -62,6 +102,26 @@ const JSONBig = require('json-bigint');
|
||||
* sent in the initial guild member list, must be between 50 and 250
|
||||
*/
|
||||
|
||||
/**
|
||||
* HTTPS Agent options.
|
||||
* @typedef {Object} AgentOptions
|
||||
* @see {@link https://nodejs.org/api/https.html#https_class_https_agent}
|
||||
* @see {@link https://nodejs.org/api/http.html#http_new_agent_options}
|
||||
*/
|
||||
|
||||
/**
|
||||
* HTTP options
|
||||
* @typedef {Object} HTTPOptions
|
||||
* @property {number} [version=9] API version to use
|
||||
* @property {AgentOptions} [agent={}] HTTPS Agent options
|
||||
* @property {string} [api='https://discord.com/api'] Base URL of the API
|
||||
* @property {string} [cdn='https://cdn.discordapp.com'] Base URL of the CDN
|
||||
* @property {string} [invite='https://discord.gg'] Base URL of invites
|
||||
* @property {string} [template='https://discord.new'] Base URL of templates
|
||||
* @property {Object} [headers] Additional headers to send for all API requests
|
||||
* @property {string} [scheduledEvent='https://discord.com/events'] Base URL of guild scheduled events
|
||||
*/
|
||||
|
||||
/**
|
||||
* Contains various utilities for client options.
|
||||
*/
|
||||
@@ -72,25 +132,28 @@ class Options extends null {
|
||||
*/
|
||||
static createDefault() {
|
||||
return {
|
||||
waitGuildTimeout: 15_000,
|
||||
shardCount: 1,
|
||||
makeCache: this.cacheWithLimits(this.defaultMakeCacheSettings),
|
||||
messageCacheLifetime: 0,
|
||||
messageSweepInterval: 0,
|
||||
invalidRequestWarningInterval: 0,
|
||||
intents: 32767,
|
||||
partials: [],
|
||||
restWsBridgeTimeout: 5_000,
|
||||
restRequestTimeout: 15_000,
|
||||
restGlobalRateLimit: 0,
|
||||
retryLimit: 1,
|
||||
restTimeOffset: 500,
|
||||
restSweepInterval: 60,
|
||||
failIfNotExists: true,
|
||||
userAgentSuffix: [],
|
||||
presence: {},
|
||||
sweepers: {},
|
||||
ws: {
|
||||
jsonTransformer: (object) => JSONBig.stringify(object),
|
||||
checkUpdate: true,
|
||||
readyStatus: false,
|
||||
waitGuildTimeout: 15_000,
|
||||
shardCount: 1,
|
||||
makeCache: this.cacheWithLimits(this.defaultMakeCacheSettings),
|
||||
messageCacheLifetime: 0,
|
||||
messageSweepInterval: 0,
|
||||
invalidRequestWarningInterval: 0,
|
||||
intents: 65535,
|
||||
partials: [],
|
||||
restWsBridgeTimeout: 5_000,
|
||||
restRequestTimeout: 15_000,
|
||||
restGlobalRateLimit: 0,
|
||||
retryLimit: 1,
|
||||
restTimeOffset: 500,
|
||||
restSweepInterval: 60,
|
||||
failIfNotExists: true,
|
||||
userAgentSuffix: [],
|
||||
presence: {},
|
||||
sweepers: {},
|
||||
ws: {
|
||||
large_threshold: 50,
|
||||
compress: false,
|
||||
properties: {
|
||||
@@ -121,6 +184,7 @@ class Options extends null {
|
||||
'X-Debug-Options': 'bugReporterEnabled',
|
||||
'X-Discord-Locale': 'en-US',
|
||||
Origin: 'https://discord.com',
|
||||
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
|
||||
},
|
||||
agent: {},
|
||||
version: 10,
|
||||
@@ -130,10 +194,7 @@ class Options extends null {
|
||||
template: 'https://discord.new',
|
||||
scheduledEvent: 'https://discord.com/events',
|
||||
},
|
||||
jsonTransformer: (object) => JSONBig.stringify(object),
|
||||
checkUpdate: true,
|
||||
readyStatus: false,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -144,14 +205,32 @@ class Options extends null {
|
||||
* If LimitedCollectionOptions are provided for a manager, it uses those settings to form a LimitedCollection.
|
||||
* @returns {CacheFactory}
|
||||
* @example
|
||||
* // Store up to 200 messages per channel and 200 members per guild, always keeping the client member.
|
||||
* // Store up to 200 messages per channel and discard archived threads if they were archived more than 4 hours ago.
|
||||
* // Note archived threads will remain in the guild and client caches with these settings
|
||||
* Options.cacheWithLimits({
|
||||
* MessageManager: 200,
|
||||
* GuildMemberManager: {
|
||||
* maxSize: 200,
|
||||
* keepOverLimit: (member) => member.id === client.user.id,
|
||||
* ThreadManager: {
|
||||
* sweepInterval: 3600,
|
||||
* sweepFilter: LimitedCollection.filterByLifetime({
|
||||
* getComparisonTimestamp: e => e.archiveTimestamp,
|
||||
* excludeFromSweep: e => !e.archived,
|
||||
* }),
|
||||
* },
|
||||
* });
|
||||
* @example
|
||||
* // Sweep messages every 5 minutes, removing messages that have not been edited or created in the last 30 minutes
|
||||
* Options.cacheWithLimits({
|
||||
* // Keep default thread sweeping behavior
|
||||
* ...Options.defaultMakeCacheSettings,
|
||||
* // Override MessageManager
|
||||
* MessageManager: {
|
||||
* sweepInterval: 300,
|
||||
* sweepFilter: LimitedCollection.filterByLifetime({
|
||||
* lifetime: 1800,
|
||||
* getComparisonTimestamp: e => e.editedTimestamp ?? e.createdTimestamp,
|
||||
* })
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
static cacheWithLimits(settings = {}) {
|
||||
const { Collection } = require('@discordjs/collection');
|
||||
@@ -169,9 +248,15 @@ class Options extends null {
|
||||
}
|
||||
return new LimitedCollection({ maxSize: setting });
|
||||
}
|
||||
/* eslint-disable-next-line eqeqeq */
|
||||
/* eslint-disable eqeqeq */
|
||||
const noSweeping =
|
||||
setting.sweepFilter == null ||
|
||||
setting.sweepInterval == null ||
|
||||
setting.sweepInterval <= 0 ||
|
||||
setting.sweepInterval === Infinity;
|
||||
const noLimit = setting.maxSize == null || setting.maxSize === Infinity;
|
||||
if (noLimit) {
|
||||
/* eslint-enable eqeqeq */
|
||||
if (noSweeping && noLimit) {
|
||||
return new Collection();
|
||||
}
|
||||
return new LimitedCollection(setting);
|
||||
@@ -201,6 +286,20 @@ class Options extends null {
|
||||
static get defaultMakeCacheSettings() {
|
||||
return {
|
||||
MessageManager: 200,
|
||||
/*
|
||||
ChannelManager: {
|
||||
sweepInterval: 3600,
|
||||
sweepFilter: require('./Util').archivedThreadSweepFilter(),
|
||||
},
|
||||
GuildChannelManager: {
|
||||
sweepInterval: 3600,
|
||||
sweepFilter: require('./Util').archivedThreadSweepFilter(),
|
||||
},
|
||||
ThreadManager: {
|
||||
sweepInterval: 3600,
|
||||
sweepFilter: require('./Util').archivedThreadSweepFilter(),
|
||||
},
|
||||
*/
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -221,8 +320,3 @@ Options.defaultSweeperSettings = {
|
||||
};
|
||||
|
||||
module.exports = Options;
|
||||
|
||||
/**
|
||||
* @external RESTOptions
|
||||
* @see {@link https://discord.js.org/#/docs/rest/main/typedef/RESTOptions}
|
||||
*/
|
||||
|
Reference in New Issue
Block a user