snowtransfer 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +46 -0
  3. package/dist/Constants.d.ts +8 -0
  4. package/dist/Constants.js +8 -0
  5. package/dist/Endpoints.d.ts +89 -0
  6. package/dist/Endpoints.js +99 -0
  7. package/dist/Ratelimiter.d.ts +39 -0
  8. package/dist/Ratelimiter.js +69 -0
  9. package/dist/RequestHandler.d.ts +112 -0
  10. package/dist/RequestHandler.js +238 -0
  11. package/dist/SnowTransfer.d.ts +51 -0
  12. package/dist/SnowTransfer.js +56 -0
  13. package/dist/index.d.ts +4 -0
  14. package/dist/index.js +12 -0
  15. package/dist/methods/AuditLog.d.ts +45 -0
  16. package/dist/methods/AuditLog.js +35 -0
  17. package/dist/methods/Bots.d.ts +40 -0
  18. package/dist/methods/Bots.js +46 -0
  19. package/dist/methods/Channels.d.ts +749 -0
  20. package/dist/methods/Channels.js +685 -0
  21. package/dist/methods/GuildAssets.d.ts +191 -0
  22. package/dist/methods/GuildAssets.js +172 -0
  23. package/dist/methods/GuildTemplate.d.ts +57 -0
  24. package/dist/methods/GuildTemplate.js +68 -0
  25. package/dist/methods/Guilds.d.ts +733 -0
  26. package/dist/methods/Guilds.js +598 -0
  27. package/dist/methods/Interactions.d.ts +221 -0
  28. package/dist/methods/Interactions.js +262 -0
  29. package/dist/methods/Invites.d.ts +37 -0
  30. package/dist/methods/Invites.js +44 -0
  31. package/dist/methods/StageInstance.d.ts +64 -0
  32. package/dist/methods/StageInstance.js +73 -0
  33. package/dist/methods/Users.d.ts +76 -0
  34. package/dist/methods/Users.js +93 -0
  35. package/dist/methods/Voices.d.ts +21 -0
  36. package/dist/methods/Voices.js +29 -0
  37. package/dist/methods/Webhooks.d.ts +288 -0
  38. package/dist/methods/Webhooks.js +222 -0
  39. package/dist/ratelimitBuckets/LocalBucket.d.ts +58 -0
  40. package/dist/ratelimitBuckets/LocalBucket.js +77 -0
  41. package/dist/tsconfig.tsbuildinfo +1 -0
  42. package/package.json +48 -0
package/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2018 DasWolke
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,46 @@
1
+ # A minimalistic rest client for the discord api
2
+
3
+ ---
4
+ [![GitHub stars](https://img.shields.io/github/stars/DasWolke/SnowTransfer.svg)](https://github.com/DasWolke/SnowTransfer/stargazers) [![Travis](https://img.shields.io/travis/DasWolke/SnowTransfer.svg)](https://github.com/DasWolke/SnowTransfer) [![npm](https://img.shields.io/npm/dm/snowtransfer.svg)](https://www.npmjs.com/package/snowtransfer) [![npm](https://img.shields.io/npm/v/snowtransfer.svg)](https://www.npmjs.com/package/snowtransfer)
5
+
6
+ Part of the WeatherStack
7
+
8
+ SnowTransfer is a small library specially made to **only** cover the REST/HTTP area of the discord api.
9
+ It makes no assumptions about the rest of your stack, therefore you can use it anywhere as long as you use node 8 or higher.
10
+
11
+ ### Some of the things that make SnowTransfer awesome:
12
+ - No requirement for other components
13
+ - Full coverage of the discord rest api
14
+ - Well documented
15
+
16
+ ### General Usecase:
17
+ SnowTransfer is not your everyday library,
18
+ especially compared to other libraries, it makes sense to use it when you:
19
+ - Want to build a microservice based bot, where casual discord libraries would not be suitable since they assume the availability of other components like a gateway or a cache
20
+ - Only need a simple rest client that can be wrapped easily.
21
+
22
+ ### Microservice Bots:
23
+ I've written a general whitepaper on the idea of microservice bots, which you can find on gist: [Microservice Bot Whitepaper](https://gist.github.com/DasWolke/c9d7dfe6a78445011162a12abd32091d)
24
+
25
+ ### Documentation:
26
+ You can find the docs at [https://daswolke.github.io/SnowTransfer/](https://daswolke.github.io/SnowTransfer/)
27
+
28
+ ### Installation:
29
+ To install SnowTransfer, make sure that you have node 8 or higher and npm installed on your computer.
30
+
31
+ Then run the following command in a terminal `npm install snowtransfer`
32
+
33
+ ## Example:
34
+ ```js
35
+ const { SnowTransfer } = require('snowtransfer');
36
+ const client = new SnowTransfer('DISCORD BOT TOKEN');
37
+ const request = async () => {
38
+ const message = await client.channel.createMessage('channel id', 'hi there');
39
+ console.log(message);
40
+ };
41
+ request().then(() => {
42
+ // message was sent to discord
43
+ }).catch(e => {
44
+ // an error occurred
45
+ });
46
+ ```
@@ -0,0 +1,8 @@
1
+ declare const _default: {
2
+ REST_API_VERSION: 9;
3
+ GET_CHANNEL_MESSAGES_MAX_RESULTS: 100;
4
+ BULK_DELETE_MESSAGES_MIN: 2;
5
+ BULK_DELETE_MESSAGES_MAX: 100;
6
+ OK_STATUS_CODES: number[];
7
+ };
8
+ export = _default;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ module.exports = {
3
+ REST_API_VERSION: 9,
4
+ GET_CHANNEL_MESSAGES_MAX_RESULTS: 100,
5
+ BULK_DELETE_MESSAGES_MIN: 2,
6
+ BULK_DELETE_MESSAGES_MAX: 100,
7
+ OK_STATUS_CODES: [200, 201, 204, 304]
8
+ };
@@ -0,0 +1,89 @@
1
+ declare const _default: {
2
+ BASE_URL: string;
3
+ BASE_HOST: string;
4
+ CDN_URL: string;
5
+ APPLICATION_COMMAND: (appID: string, cmdID: string) => string;
6
+ APPLICATION_COMMAND_PERMISSIONS: (appID: string, guildID: string, cmdID: string) => string;
7
+ APPLICATION_COMMANDS: (appID: string) => string;
8
+ APPLICATION_GUILD_COMMAND: (appID: string, guildID: string, cmdID: string) => string;
9
+ APPLICATION_GUILD_COMMANDS: (appID: string, guildID: string) => string;
10
+ CHANNEL: (chanID: string) => string;
11
+ CHANNEL_BULK_DELETE: (chanID: string) => string;
12
+ CHANNEL_INVITES: (chanID: string) => string;
13
+ CHANNEL_MESSAGE: (chanID: string, msgID: string) => string;
14
+ CHANNEL_MESSAGE_CROSSPOST: (chanID: string, msgID: string) => string;
15
+ CHANNEL_MESSAGE_REACTION: (chanID: string, msgID: string, reaction: string) => string;
16
+ CHANNEL_MESSAGE_REACTION_USER: (chanID: string, msgID: string, reaction: string, userID: string) => string;
17
+ CHANNEL_MESSAGE_REACTIONS: (chanID: string, msgID: string) => string;
18
+ CHANNEL_MESSAGE_THREADS: (chanID: string, msgID: string) => string;
19
+ CHANNEL_MESSAGES: (chanID: string) => string;
20
+ CHANNEL_PERMISSION: (chanID: string, overID: string) => string;
21
+ CHANNEL_PERMISSIONS: (chanID: string) => string;
22
+ CHANNEL_PIN: (chanID: string, msgID: string) => string;
23
+ CHANNEL_PINS: (chanID: string) => string;
24
+ CHANNEL_RECIPIENT: (groupID: string, userID: string) => string;
25
+ CHANNEL_THREADS: (chanID: string) => string;
26
+ CHANNEL_THREAD_MEMBER: (chanID: string, memberID: string) => string;
27
+ CHANNEL_THREAD_MEMBERS: (chanID: any) => string;
28
+ CHANNEL_THREADS_ARCHIVED_PRIVATE: (chanID: string) => string;
29
+ CHANNEL_THREADS_ARCHIVED_PRIVATE_USER: (chanID: string) => string;
30
+ CHANNEL_THREADS_ARCHIVED_PUBLIC: (chanID: string) => string;
31
+ CHANNEL_TYPING: (chanID: string) => string;
32
+ CHANNEL_WEBHOOKS: (chanID: string) => string;
33
+ CHANNELS: string;
34
+ GATEWAY: string;
35
+ GATEWAY_BOT: string;
36
+ GUILD: (guildID: string) => string;
37
+ GUILD_APPLICATION_COMMAND_PERMISSIONS: (appID: string, guildID: string) => string;
38
+ GUILD_AUDIT_LOGS: (guildID: string) => string;
39
+ GUILD_BAN: (guildID: string, memberID: string) => string;
40
+ GUILD_BANS: (guildID: string) => string;
41
+ GUILD_CHANNELS: (guildID: string) => string;
42
+ GUILD_EMOJI: (guildID: string, emojiID: string) => string;
43
+ GUILD_EMOJIS: (guildID: string) => string;
44
+ GUILD_INVITES: (guildID: string) => string;
45
+ GUILD_INTEGRATION: (guildID: string, integrationID: string) => string;
46
+ GUILD_INTEGRATIONS: (guildID: string) => string;
47
+ GUILD_MEMBER: (guildID: string, memberID: string) => string;
48
+ GUILD_MEMBER_NICK: (guildID: string, memberID: string) => string;
49
+ GUILD_MEMBER_ROLE: (guildID: string, memberID: string, roleID: string) => string;
50
+ GUILD_MEMBERS: (guildID: string) => string;
51
+ GUILD_MEMBERS_SEARCH: (guildID: string) => string;
52
+ GUILD_PREVIEW: (guildID: string) => string;
53
+ GUILD_PRUNE: (guildID: string) => string;
54
+ GUILD_ROLE: (guildID: string, roleID: string) => string;
55
+ GUILD_ROLES: (guildID: string) => string;
56
+ GUILD_STICKER: (guildID: string, stickerID: string) => string;
57
+ GUILD_STICKERS: (guildID: string) => string;
58
+ GUILD_TEMPLATE: (guildID: string, code: string) => string;
59
+ GUILD_THREADS_ACTIVE: (guildID: string) => string;
60
+ GUILD_TEMPLATES: (guildID: string) => string;
61
+ GUILD_VANITY: (guildID: string) => string;
62
+ GUILD_VOICE_REGIONS: (guildID: string) => string;
63
+ GUILD_VOICE_STATE_USER: (guildID: string, memberID: string) => string;
64
+ GUILD_WEBHOOKS: (guildID: string) => string;
65
+ GUILD_WELCOME_SCREEN: (guildID: string) => string;
66
+ GUILD_WIDGET: (guildID: string) => string;
67
+ GUILD_WIDGET_IMAGE: (guildID: string) => string;
68
+ GUILD_WIDGET_SETTINGS: (guildID: string) => string;
69
+ GUILDS: string;
70
+ INTERACTION_CALLBACK: (interactionID: string, token: string) => string;
71
+ INVITE: (inviteID: string) => string;
72
+ OAUTH2_APPLICATION: (appID: string) => string;
73
+ STAGE_INSTANCE_CHANNEL: (chanID: string) => string;
74
+ STAGE_INSTANCES: string;
75
+ STICKER: (stickerID: string) => string;
76
+ TEMPLATE: (code: string) => string;
77
+ USER: (userID: string) => string;
78
+ USER_CHANNELS: (userID: string) => string;
79
+ USER_GUILD: (userID: string, guildID: string) => string;
80
+ USER_GUILDS: (userID: string) => string;
81
+ USERS: string;
82
+ VOICE_REGIONS: string;
83
+ WEBHOOK: (hookID: string) => string;
84
+ WEBHOOK_TOKEN: (hookID: string, token: string) => string;
85
+ WEBHOOK_TOKEN_GITHUB: (hookID: string, token: string) => string;
86
+ WEBHOOK_TOKEN_MESSAGE: (hookID: string, token: string, msgID: string) => string;
87
+ WEBHOOK_TOKEN_SLACK: (hookID: string, token: string) => string;
88
+ };
89
+ export = _default;
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ /**
6
+ * Mostly taken from https://github.com/abalabahaha/eris/blob/master/lib/rest/Endpoints.js
7
+ *
8
+ * Removed User-only endpoints
9
+ * @private
10
+ */
11
+ const Constants_1 = __importDefault(require("./Constants"));
12
+ module.exports = {
13
+ BASE_URL: "/api/v" + Constants_1.default.REST_API_VERSION,
14
+ BASE_HOST: "https://discord.com",
15
+ CDN_URL: "https://cdn.discordapp.com",
16
+ APPLICATION_COMMAND: (appID, cmdID) => `/applications/${appID}/commands/${cmdID}`,
17
+ APPLICATION_COMMAND_PERMISSIONS: (appID, guildID, cmdID) => `/applications/${appID}/guilds/${guildID}/commands/${cmdID}/permissions`,
18
+ APPLICATION_COMMANDS: (appID) => `/applications/${appID}/commands`,
19
+ APPLICATION_GUILD_COMMAND: (appID, guildID, cmdID) => `/applications/${appID}/guilds/${guildID}/commands/${cmdID}`,
20
+ APPLICATION_GUILD_COMMANDS: (appID, guildID) => `/applications/${appID}/guilds/${guildID}/commands`,
21
+ CHANNEL: (chanID) => `/channels/${chanID}`,
22
+ CHANNEL_BULK_DELETE: (chanID) => `/channels/${chanID}/messages/bulk-delete`,
23
+ CHANNEL_INVITES: (chanID) => `/channels/${chanID}/invites`,
24
+ CHANNEL_MESSAGE: (chanID, msgID) => `/channels/${chanID}/messages/${msgID}`,
25
+ CHANNEL_MESSAGE_CROSSPOST: (chanID, msgID) => `/channels/${chanID}/messages/${msgID}/crosspost`,
26
+ CHANNEL_MESSAGE_REACTION: (chanID, msgID, reaction) => `/channels/${chanID}/messages/${msgID}/reactions/${reaction}`,
27
+ CHANNEL_MESSAGE_REACTION_USER: (chanID, msgID, reaction, userID) => `/channels/${chanID}/messages/${msgID}/reactions/${reaction}/${userID}`,
28
+ CHANNEL_MESSAGE_REACTIONS: (chanID, msgID) => `/channels/${chanID}/messages/${msgID}/reactions`,
29
+ CHANNEL_MESSAGE_THREADS: (chanID, msgID) => `/channels/${chanID}/messages/${msgID}/threads`,
30
+ CHANNEL_MESSAGES: (chanID) => `/channels/${chanID}/messages`,
31
+ CHANNEL_PERMISSION: (chanID, overID) => `/channels/${chanID}/permissions/${overID}`,
32
+ CHANNEL_PERMISSIONS: (chanID) => `/channels/${chanID}/permissions`,
33
+ CHANNEL_PIN: (chanID, msgID) => `/channels/${chanID}/pins/${msgID}`,
34
+ CHANNEL_PINS: (chanID) => `/channels/${chanID}/pins`,
35
+ CHANNEL_RECIPIENT: (groupID, userID) => `/channels/${groupID}/recipients/${userID}`,
36
+ CHANNEL_THREADS: (chanID) => `/channels/${chanID}/threads`,
37
+ CHANNEL_THREAD_MEMBER: (chanID, memberID) => `/channels/${chanID}/thread-members/${memberID}`,
38
+ CHANNEL_THREAD_MEMBERS: (chanID) => `/channels/${chanID}/thread-members`,
39
+ CHANNEL_THREADS_ARCHIVED_PRIVATE: (chanID) => `/channels/${chanID}/threads/archived/private`,
40
+ CHANNEL_THREADS_ARCHIVED_PRIVATE_USER: (chanID) => `/channels/${chanID}/users/@me/threads/archived/private`,
41
+ CHANNEL_THREADS_ARCHIVED_PUBLIC: (chanID) => `/channels/${chanID}/threads/archived/public`,
42
+ CHANNEL_TYPING: (chanID) => `/channels/${chanID}/typing`,
43
+ CHANNEL_WEBHOOKS: (chanID) => `/channels/${chanID}/webhooks`,
44
+ CHANNELS: "/channels",
45
+ GATEWAY: "/gateway",
46
+ GATEWAY_BOT: "/gateway/bot",
47
+ GUILD: (guildID) => `/guilds/${guildID}`,
48
+ GUILD_APPLICATION_COMMAND_PERMISSIONS: (appID, guildID) => `/applications/${appID}/guilds/${guildID}/commands/permissions`,
49
+ GUILD_AUDIT_LOGS: (guildID) => `/guilds/${guildID}/audit-logs`,
50
+ GUILD_BAN: (guildID, memberID) => `/guilds/${guildID}/bans/${memberID}`,
51
+ GUILD_BANS: (guildID) => `/guilds/${guildID}/bans`,
52
+ GUILD_CHANNELS: (guildID) => `/guilds/${guildID}/channels`,
53
+ GUILD_EMOJI: (guildID, emojiID) => `/guilds/${guildID}/emojis/${emojiID}`,
54
+ GUILD_EMOJIS: (guildID) => `/guilds/${guildID}/emojis`,
55
+ GUILD_INVITES: (guildID) => `/guilds/${guildID}/invites`,
56
+ GUILD_INTEGRATION: (guildID, integrationID) => `/guilds/${guildID}/integrations/${integrationID}`,
57
+ GUILD_INTEGRATIONS: (guildID) => `/guilds/${guildID}/integrations`,
58
+ GUILD_MEMBER: (guildID, memberID) => `/guilds/${guildID}/members/${memberID}`,
59
+ GUILD_MEMBER_NICK: (guildID, memberID) => `/guilds/${guildID}/members/${memberID}/nick`,
60
+ GUILD_MEMBER_ROLE: (guildID, memberID, roleID) => `/guilds/${guildID}/members/${memberID}/roles/${roleID}`,
61
+ GUILD_MEMBERS: (guildID) => `/guilds/${guildID}/members`,
62
+ GUILD_MEMBERS_SEARCH: (guildID) => `/guilds/${guildID}/members/search`,
63
+ GUILD_PREVIEW: (guildID) => `/guilds/${guildID}/preview`,
64
+ GUILD_PRUNE: (guildID) => `/guilds/${guildID}/prune`,
65
+ GUILD_ROLE: (guildID, roleID) => `/guilds/${guildID}/roles/${roleID}`,
66
+ GUILD_ROLES: (guildID) => `/guilds/${guildID}/roles`,
67
+ GUILD_STICKER: (guildID, stickerID) => `/guilds/${guildID}/stickers/${stickerID}`,
68
+ GUILD_STICKERS: (guildID) => `/guilds/${guildID}/stickers`,
69
+ GUILD_TEMPLATE: (guildID, code) => `/guilds/${guildID}/templates/${code}`,
70
+ GUILD_THREADS_ACTIVE: (guildID) => `/guilds/${guildID}/threads/active`,
71
+ GUILD_TEMPLATES: (guildID) => `/guilds/${guildID}/templates`,
72
+ GUILD_VANITY: (guildID) => `/guilds/${guildID}/vanity-url`,
73
+ GUILD_VOICE_REGIONS: (guildID) => `/guilds/${guildID}/regions`,
74
+ GUILD_VOICE_STATE_USER: (guildID, memberID) => `/guilds/${guildID}/voice-states/${memberID}`,
75
+ GUILD_WEBHOOKS: (guildID) => `/guilds/${guildID}/webhooks`,
76
+ GUILD_WELCOME_SCREEN: (guildID) => `/guilds/${guildID}/welcome-screen`,
77
+ GUILD_WIDGET: (guildID) => `/guilds/${guildID}/widget.json`,
78
+ GUILD_WIDGET_IMAGE: (guildID) => `/guilds/${guildID}/widget.png`,
79
+ GUILD_WIDGET_SETTINGS: (guildID) => `/guilds/${guildID}/widget`,
80
+ GUILDS: "/guilds",
81
+ INTERACTION_CALLBACK: (interactionID, token) => `/interactions/${interactionID}/${token}/callback`,
82
+ INVITE: (inviteID) => `/invite/${inviteID}`,
83
+ OAUTH2_APPLICATION: (appID) => `/oauth2/applications/${appID}`,
84
+ STAGE_INSTANCE_CHANNEL: (chanID) => `/stage-instances/${chanID}`,
85
+ STAGE_INSTANCES: "/stage-instances",
86
+ STICKER: (stickerID) => `/stickers/${stickerID}`,
87
+ TEMPLATE: (code) => `/guilds/templates/${code}`,
88
+ USER: (userID) => `/users/${userID}`,
89
+ USER_CHANNELS: (userID) => `/users/${userID}/channels`,
90
+ USER_GUILD: (userID, guildID) => `/users/${userID}/guilds/${guildID}`,
91
+ USER_GUILDS: (userID) => `/users/${userID}/guilds`,
92
+ USERS: "/users",
93
+ VOICE_REGIONS: "/voice/regions",
94
+ WEBHOOK: (hookID) => `/webhooks/${hookID}`,
95
+ WEBHOOK_TOKEN: (hookID, token) => `/webhooks/${hookID}/${token}`,
96
+ WEBHOOK_TOKEN_GITHUB: (hookID, token) => `/webhooks/${hookID}/${token}/github`,
97
+ WEBHOOK_TOKEN_MESSAGE: (hookID, token, msgID) => `/webhooks/${hookID}/${token}/messages/${msgID}`,
98
+ WEBHOOK_TOKEN_SLACK: (hookID, token) => `/webhooks/${hookID}/${token}/slack`,
99
+ };
@@ -0,0 +1,39 @@
1
+ /// <reference types="node" />
2
+ import LocalBucket from "./ratelimitBuckets/LocalBucket";
3
+ /**
4
+ * Ratelimiter used for handling the ratelimits imposed by the rest api
5
+ * @protected
6
+ */
7
+ declare class Ratelimiter {
8
+ buckets: {
9
+ [routeKey: string]: LocalBucket;
10
+ };
11
+ global: boolean;
12
+ globalResetAt: number;
13
+ /**
14
+ * This is an interval to constantly check Buckets which should be reset or unreferenced from the RateLimiter to be swept by the garbage collector.
15
+ * This 1 timeout is more performant as compared to potentially many more ticking timers to reset individual bucket remaining values.
16
+ *
17
+ * YOU SHOULD NEVER OVERRIDE THIS UNLESS YOU KNOW WHAT YOU'RE DOING. REQUESTS MAY POSSIBLY NEVER EXECUTE WITHOUT THIS AND/OR MEMORY MAY SLOWLY CLIMB OVER TIME.
18
+ */
19
+ protected _timeout: NodeJS.Timeout;
20
+ protected _timeoutFN: () => void;
21
+ protected _timeoutDuration: number;
22
+ constructor();
23
+ /**
24
+ * Returns a key for saving ratelimits for routes
25
+ * (Taken from https://github.com/abalabahaha/eris/blob/master/lib/rest/RequestHandler.js) -> I luv u abal <3
26
+ * @param url url to reduce to a key something like /channels/266277541646434305/messages/266277541646434305/
27
+ * @param method method of the request, usual http methods like get, etc.
28
+ * @returns reduced url: /channels/266277541646434305/messages/:id/
29
+ */
30
+ routify(url: string, method: string): string;
31
+ /**
32
+ * Queue a rest call to be executed
33
+ * @param fn function to call once the ratelimit is ready
34
+ * @param url Endpoint of the request
35
+ * @param method Http method used by the request
36
+ */
37
+ queue(fn: (bucket: import("./ratelimitBuckets/LocalBucket")) => any, url: string, method: string): void;
38
+ }
39
+ export = Ratelimiter;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ const LocalBucket_1 = __importDefault(require("./ratelimitBuckets/LocalBucket"));
6
+ /**
7
+ * Ratelimiter used for handling the ratelimits imposed by the rest api
8
+ * @protected
9
+ */
10
+ class Ratelimiter {
11
+ constructor() {
12
+ this.buckets = {};
13
+ this.global = false;
14
+ this.globalResetAt = 0;
15
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
16
+ const limiter = this;
17
+ this._timeoutFN = function () {
18
+ for (const routeKey of Object.keys(limiter.buckets)) {
19
+ const bkt = limiter.buckets[routeKey];
20
+ if (bkt.resetAt && bkt.resetAt < Date.now()) {
21
+ if (bkt.fnQueue.length)
22
+ bkt.resetRemaining();
23
+ else
24
+ delete limiter.buckets[routeKey];
25
+ }
26
+ else if (!bkt.resetAt && limiter.global && limiter.globalResetAt < Date.now()) {
27
+ if (bkt.fnQueue.length)
28
+ bkt.checkQueue();
29
+ else
30
+ delete limiter.buckets[routeKey];
31
+ }
32
+ }
33
+ };
34
+ this._timeoutDuration = 1000;
35
+ this._timeout = setInterval(() => {
36
+ limiter._timeoutFN();
37
+ }, limiter._timeoutDuration);
38
+ }
39
+ /**
40
+ * Returns a key for saving ratelimits for routes
41
+ * (Taken from https://github.com/abalabahaha/eris/blob/master/lib/rest/RequestHandler.js) -> I luv u abal <3
42
+ * @param url url to reduce to a key something like /channels/266277541646434305/messages/266277541646434305/
43
+ * @param method method of the request, usual http methods like get, etc.
44
+ * @returns reduced url: /channels/266277541646434305/messages/:id/
45
+ */
46
+ routify(url, method) {
47
+ let route = url.replace(/\/([a-z-]+)\/(?:\d+)/g, function (match, p) {
48
+ return p === "channels" || p === "guilds" || p === "webhooks" ? match : `/${p}/:id`;
49
+ }).replace(/\/reactions\/[^/]+/g, "/reactions/:id").replace(/^\/webhooks\/(\d+)\/[A-Za-z0-9-_]{64,}/, "/webhooks/$1/:token");
50
+ if (method.toUpperCase() === "DELETE" && route.endsWith("/messages/:id")) { // Delete Messsage endpoint has its own ratelimit
51
+ route = method + route;
52
+ }
53
+ return route;
54
+ }
55
+ /**
56
+ * Queue a rest call to be executed
57
+ * @param fn function to call once the ratelimit is ready
58
+ * @param url Endpoint of the request
59
+ * @param method Http method used by the request
60
+ */
61
+ queue(fn, url, method) {
62
+ const routeKey = this.routify(url, method);
63
+ if (!this.buckets[routeKey]) {
64
+ this.buckets[routeKey] = new LocalBucket_1.default(this);
65
+ }
66
+ this.buckets[routeKey].queue(fn);
67
+ }
68
+ }
69
+ module.exports = Ratelimiter;
@@ -0,0 +1,112 @@
1
+ /// <reference types="node" />
2
+ import { EventEmitter } from "events";
3
+ import c from "centra";
4
+ declare type HTTPMethod = "get" | "post" | "patch" | "head" | "put" | "delete" | "connect" | "options" | "trace";
5
+ declare class DiscordAPIError extends Error {
6
+ method: HTTPMethod;
7
+ path: string;
8
+ code: number;
9
+ httpStatus: number;
10
+ constructor(path: string, error: any, method: HTTPMethod, status: number);
11
+ static flattenErrors(obj: Record<string, any>, key?: string): string[];
12
+ }
13
+ interface HandlerEvents {
14
+ request: [string, {
15
+ endpoint: string;
16
+ method: HTTPMethod;
17
+ dataType: "json" | "multipart";
18
+ data: any;
19
+ }];
20
+ done: [string, c.Response];
21
+ requestError: [string, Error];
22
+ rateLimit: [{
23
+ timeout: number;
24
+ limit: number;
25
+ method: HTTPMethod;
26
+ path: string;
27
+ route: string;
28
+ }];
29
+ }
30
+ interface RequestHandler {
31
+ addListener<E extends keyof HandlerEvents>(event: E, listener: (...args: HandlerEvents[E]) => any): this;
32
+ emit<E extends keyof HandlerEvents>(event: E, ...args: HandlerEvents[E]): boolean;
33
+ eventNames(): Array<keyof HandlerEvents>;
34
+ listenerCount(event: keyof HandlerEvents): number;
35
+ listeners(event: keyof HandlerEvents): Array<(...args: Array<any>) => any>;
36
+ off<E extends keyof HandlerEvents>(event: E, listener: (...args: HandlerEvents[E]) => any): this;
37
+ on<E extends keyof HandlerEvents>(event: E, listener: (...args: HandlerEvents[E]) => any): this;
38
+ once<E extends keyof HandlerEvents>(event: E, listener: (...args: HandlerEvents[E]) => any): this;
39
+ prependListener<E extends keyof HandlerEvents>(event: E, listener: (...args: HandlerEvents[E]) => any): this;
40
+ prependOnceListener<E extends keyof HandlerEvents>(event: E, listener: (...args: HandlerEvents[E]) => any): this;
41
+ rawListeners(event: keyof HandlerEvents): Array<(...args: Array<any>) => any>;
42
+ removeAllListeners(event?: keyof HandlerEvents): this;
43
+ removeListener<E extends keyof HandlerEvents>(event: E, listener: (...args: HandlerEvents[E]) => any): this;
44
+ }
45
+ /**
46
+ * Request Handler class
47
+ */
48
+ declare class RequestHandler extends EventEmitter {
49
+ ratelimiter: import("./Ratelimiter");
50
+ options: {
51
+ baseHost: string;
52
+ baseURL: string;
53
+ headers: {
54
+ Authorization: string;
55
+ "User-Agent": string;
56
+ };
57
+ };
58
+ latency: number;
59
+ apiURL: string;
60
+ static DiscordAPIErrror: typeof DiscordAPIError;
61
+ /**
62
+ * Create a new request handler
63
+ * @param ratelimiter ratelimiter to use for ratelimiting requests
64
+ * @param options options
65
+ */
66
+ constructor(ratelimiter: import("./Ratelimiter"), options: {
67
+ token: string;
68
+ baseHost: string;
69
+ });
70
+ /**
71
+ * Request a route from the discord api
72
+ * @param endpoint endpoint to request
73
+ * @param method http method to use
74
+ * @param dataType type of the data being sent
75
+ * @param data data to send, if any
76
+ * @param amount amount of requests previously executed
77
+ * @returns Result of the request
78
+ */
79
+ request(endpoint: string, method: HTTPMethod, dataType?: "json" | "multipart", data?: any | undefined, amount?: number): Promise<any>;
80
+ /**
81
+ * Calculate the time difference between the local server and discord
82
+ * @param dateHeader Date header value returned by discord
83
+ * @returns Offset in milliseconds
84
+ */
85
+ private _getOffsetDateFromHeader;
86
+ /**
87
+ * Apply the received ratelimit headers to the ratelimit bucket
88
+ * @param bkt Ratelimit bucket to apply the headers to
89
+ * @param headers Http headers received from discord
90
+ * @param offsetDate Unix timestamp of the current date + offset to discord time
91
+ * @param reactions Whether to use reaction ratelimits (1/250ms)
92
+ */
93
+ private _applyRatelimitHeaders;
94
+ /**
95
+ * Execute a normal json request
96
+ * @param endpoint Endpoint to use
97
+ * @param data Data to send
98
+ * @param useParams Whether to send the data in the body or use query params
99
+ * @param amount amount of requests previously executed
100
+ * @returns Result of the request
101
+ */
102
+ private _request;
103
+ /**
104
+ * Execute a multipart/form-data request
105
+ * @param endpoint Endpoint to use
106
+ * @param method Http Method to use
107
+ * @param data data to send
108
+ * @returns Result of the request
109
+ */
110
+ private _multiPartRequest;
111
+ }
112
+ export = RequestHandler;