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.
- package/LICENSE.md +21 -0
- package/README.md +46 -0
- package/dist/Constants.d.ts +8 -0
- package/dist/Constants.js +8 -0
- package/dist/Endpoints.d.ts +89 -0
- package/dist/Endpoints.js +99 -0
- package/dist/Ratelimiter.d.ts +39 -0
- package/dist/Ratelimiter.js +69 -0
- package/dist/RequestHandler.d.ts +112 -0
- package/dist/RequestHandler.js +238 -0
- package/dist/SnowTransfer.d.ts +51 -0
- package/dist/SnowTransfer.js +56 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +12 -0
- package/dist/methods/AuditLog.d.ts +45 -0
- package/dist/methods/AuditLog.js +35 -0
- package/dist/methods/Bots.d.ts +40 -0
- package/dist/methods/Bots.js +46 -0
- package/dist/methods/Channels.d.ts +749 -0
- package/dist/methods/Channels.js +685 -0
- package/dist/methods/GuildAssets.d.ts +191 -0
- package/dist/methods/GuildAssets.js +172 -0
- package/dist/methods/GuildTemplate.d.ts +57 -0
- package/dist/methods/GuildTemplate.js +68 -0
- package/dist/methods/Guilds.d.ts +733 -0
- package/dist/methods/Guilds.js +598 -0
- package/dist/methods/Interactions.d.ts +221 -0
- package/dist/methods/Interactions.js +262 -0
- package/dist/methods/Invites.d.ts +37 -0
- package/dist/methods/Invites.js +44 -0
- package/dist/methods/StageInstance.d.ts +64 -0
- package/dist/methods/StageInstance.js +73 -0
- package/dist/methods/Users.d.ts +76 -0
- package/dist/methods/Users.js +93 -0
- package/dist/methods/Voices.d.ts +21 -0
- package/dist/methods/Voices.js +29 -0
- package/dist/methods/Webhooks.d.ts +288 -0
- package/dist/methods/Webhooks.js +222 -0
- package/dist/ratelimitBuckets/LocalBucket.d.ts +58 -0
- package/dist/ratelimitBuckets/LocalBucket.js +77 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- 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
|
+
[](https://github.com/DasWolke/SnowTransfer/stargazers) [](https://github.com/DasWolke/SnowTransfer) [](https://www.npmjs.com/package/snowtransfer) [](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,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;
|