discord-slim
Advanced tools
Comparing version 2.0.0-dev.14 to 2.0.0-dev.15
/// <reference types="node" /> | ||
import { EventEmitter } from 'events'; | ||
import * as helpers from './helpers'; | ||
import { Intents, ActivityTypes, StatusTypes } from './helpers'; | ||
import { Authorization } from './request'; | ||
import { EventHandler } from './events'; | ||
import type { EventHandler } from './events'; | ||
import type { User } from './types'; | ||
@@ -28,3 +28,3 @@ export declare class Client extends EventEmitter { | ||
private _onError; | ||
Connect: (authorization: Authorization, intents?: helpers.Intents | undefined, shard?: { | ||
Connect: (authorization: Authorization, intents?: Intents | undefined, shard?: { | ||
id: number; | ||
@@ -54,6 +54,6 @@ total: number; | ||
name: string; | ||
type: helpers.ActivityTypes; | ||
type: ActivityTypes; | ||
url?: string; | ||
}[] | null; | ||
status: helpers.StatusTypes; | ||
status: StatusTypes; | ||
afk: boolean; | ||
@@ -60,0 +60,0 @@ }) => void; |
"use strict"; | ||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||
}) : (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
o[k2] = m[k]; | ||
})); | ||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||
Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||
}) : function(o, v) { | ||
o["default"] = v; | ||
}); | ||
var __importStar = (this && this.__importStar) || function (mod) { | ||
if (mod && mod.__esModule) return mod; | ||
var result = {}; | ||
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||
__setModuleDefault(result, mod); | ||
return result; | ||
}; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
@@ -28,5 +9,6 @@ return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
const events_1 = require("events"); | ||
const helpers = __importStar(require("./helpers")); | ||
const helpers_1 = require("./helpers"); | ||
const util_1 = require("./util"); | ||
const request_1 = require("./request"); | ||
const fatalCodes = [4004, 4010, 4011, 4012, 4013, 4014], dropCodes = [4007, 4009]; | ||
class Client extends events_1.EventEmitter { | ||
@@ -46,7 +28,9 @@ constructor() { | ||
const response = await util_1.SafePromise(request_1.Request('GET', '/gateway/bot', this._auth)); | ||
if (this._ws) | ||
return this.emit(ClientEvents.WARN, 'Client already connected.'); | ||
if (!response) | ||
return this.emit('fatal', 'Unable to retrieve a gateway.'); | ||
return this.emit(ClientEvents.FATAL, 'Unable to retrieve a gateway.'); | ||
if (typeof response.url != 'string') | ||
return this.emit('fatal', 'Unexpected gateway API response.'); | ||
this._ws = new ws_1.default(`${response.url}?v=${helpers.API_VERSION}`); | ||
return this.emit(ClientEvents.FATAL, 'Unexpected gateway API response.'); | ||
this._ws = new ws_1.default(`${response.url}?v=${helpers_1.API_VERSION}`); | ||
this._ws.on('message', this._onMessage); | ||
@@ -59,3 +43,3 @@ this._ws.on('close', this._onClose); | ||
return; | ||
this.emit('disconnect', code); | ||
this.emit(ClientEvents.DISCONNECT, code); | ||
this._setHeartbeatTimer(); | ||
@@ -68,59 +52,56 @@ this._ws.removeAllListeners(); | ||
this._onMessage = (data) => { | ||
if (typeof data != 'string') | ||
data = data.toString(); | ||
const intent = util_1.SafeJsonParse(data); | ||
const intent = util_1.SafeJsonParse(data.toString()); | ||
if (!intent) | ||
return; | ||
if (intent.op == 0) { | ||
if (intent.s && (intent.s > this._lastSequence)) | ||
this._lastSequence = intent.s; | ||
if (intent.t == "READY") { | ||
this._user = intent.d.user; | ||
this._sessionId = intent.d.session_id; | ||
switch (intent.op) { | ||
case 0: | ||
if (intent.s && (intent.s > this._lastSequence)) | ||
this._lastSequence = intent.s; | ||
switch (intent.t) { | ||
case "READY": | ||
this._user = intent.d.user; | ||
this._sessionId = intent.d.session_id; | ||
this.emit(ClientEvents.CONNECT); | ||
break; | ||
case "RESUMED": | ||
this.emit(ClientEvents.CONNECT); | ||
break; | ||
} | ||
this.emit(ClientEvents.INTENT, intent); | ||
this._eventHandler.emit(intent.t, intent.d); | ||
break; | ||
case 10: | ||
this._identify(); | ||
this._lastHeartbeatAck = true; | ||
this._setHeartbeatTimer(intent.d.heartbeat_interval); | ||
this._sendHeartbeat(); | ||
this.emit('connect'); | ||
} | ||
else if (intent.t == "RESUMED") { | ||
break; | ||
case 11: | ||
this._lastHeartbeatAck = true; | ||
break; | ||
case 1: | ||
this._sendHeartbeat(); | ||
this.emit('connect'); | ||
} | ||
this.emit('intent', intent); | ||
this._eventHandler.emit(intent.t, intent.d); | ||
break; | ||
case 9: | ||
this.emit(ClientEvents.WARN, `Invalid session. Resumable: ${intent.d}`); | ||
this._wsConnect(intent.d); | ||
break; | ||
case 7: | ||
this.emit(ClientEvents.WARN, 'Server forced reconnect.'); | ||
this._wsConnect(true); | ||
break; | ||
} | ||
else if (intent.op == 10) { | ||
this._identify(); | ||
this._lastHeartbeatAck = true; | ||
this._setHeartbeatTimer(intent.d.heartbeat_interval); | ||
} | ||
else if (intent.op == 11) { | ||
this._lastHeartbeatAck = true; | ||
} | ||
else if (intent.op == 1) { | ||
this._sendHeartbeat(); | ||
} | ||
else if (intent.op == 9) { | ||
this.emit('warn', `Invalid session. Resumable: ${intent.d}`); | ||
this._wsConnect(intent.d); | ||
} | ||
else if (intent.op == 7) { | ||
this.emit('warn', 'Server forced reconnect.'); | ||
this._wsConnect(true); | ||
} | ||
}; | ||
this._identify = () => { | ||
this._sessionId ? | ||
this._send(6, { | ||
token: this._auth?.authorization.token, | ||
session_id: this._sessionId, | ||
seq: this._lastSequence, | ||
}) : | ||
this._send(2, { | ||
token: this._auth?.authorization.token, | ||
properties: { $os: 'linux', $browser: 'bot', $device: 'bot' }, | ||
intents: this._intents ?? helpers.Intents.SYSTEM_ONLY, | ||
shard: this._shard, | ||
}); | ||
}; | ||
this._identify = () => this._sessionId ? | ||
this._send(6, { | ||
token: this._auth?.authorization.token, | ||
session_id: this._sessionId, | ||
seq: this._lastSequence, | ||
}) : | ||
this._send(2, { | ||
token: this._auth?.authorization.token, | ||
properties: { $os: 'linux', $browser: 'bot', $device: 'bot' }, | ||
intents: this._intents ?? helpers_1.Intents.SYSTEM, | ||
shard: this._shard, | ||
}); | ||
this._sendHeartbeat = () => { | ||
@@ -134,3 +115,3 @@ if (this._lastHeartbeatAck) { | ||
else { | ||
this.emit('warn', 'Heartbeat timeout.'); | ||
this.emit(ClientEvents.WARN, 'Heartbeat timeout.'); | ||
this._wsConnect(true); | ||
@@ -149,8 +130,7 @@ } | ||
this._wsDisconnect(code); | ||
if (code < 4000) | ||
this._wsConnect(true); | ||
else | ||
this.emit('fatal', `Fatal gateway error. Code: ${code}`); | ||
fatalCodes.includes(code) ? | ||
this.emit(ClientEvents.FATAL, `Fatal error. Code: ${code}`) : | ||
this._wsConnect(!dropCodes.includes(code)); | ||
}; | ||
this._onError = (error) => this.emit('error', error); | ||
this._onError = (error) => this.emit(ClientEvents.ERROR, error); | ||
this.Connect = (authorization, intents, shard) => { | ||
@@ -162,5 +142,3 @@ this._auth = { authorization }; | ||
}; | ||
this.Disconnect = (code) => { | ||
this._wsDisconnect(code); | ||
}; | ||
this.Disconnect = (code) => this._wsDisconnect(code); | ||
this.RequestGuildMembers = (params) => { | ||
@@ -167,0 +145,0 @@ if (!this._ws) |
/// <reference types="node" /> | ||
import { EventEmitter } from 'events'; | ||
import type * as types from './types'; | ||
import type * as helpers from './helpers'; | ||
import { TargetUserTypes } from './helpers'; | ||
export declare enum Events { | ||
@@ -143,3 +143,3 @@ READY = "READY", | ||
target_user?: types.User; | ||
target_user_type?: helpers.TargetUserTypes; | ||
target_user_type?: TargetUserTypes; | ||
temporary: boolean; | ||
@@ -146,0 +146,0 @@ uses: number; |
@@ -38,3 +38,3 @@ export declare const HOST: "https://discord.com", API: "https://discord.com/api", API_VERSION = 8, API_PATH: "https://discord.com/api/v8", CDN = "https://cdn.discordapp.com"; | ||
export declare enum Intents { | ||
SYSTEM_ONLY = 0, | ||
SYSTEM = 0, | ||
GUILDS = 1, | ||
@@ -314,1 +314,12 @@ GUILD_MEMBERS = 2, | ||
} | ||
export declare enum VoiceEncryptionModes { | ||
XSALSA20_POLY1305 = "xsalsa20_poly1305", | ||
XSALSA20_POLY1305_SUFFIX = "xsalsa20_poly1305_suffix", | ||
XSALSA20_POLY1305_LITE = "xsalsa20_poly1305_lite" | ||
} | ||
export declare enum SpeakingStates { | ||
NONE = 0, | ||
MICROPHONE = 1, | ||
SOUNDSHARE = 2, | ||
PRIORITY = 4 | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.MembershipStates = exports.OAuth2GrantTypes = exports.OAuth2Scopes = exports.InteractionResponseFlags = exports.InteractionResponseTypes = exports.InteractionTypes = exports.ApplicationCommandOptionTypes = exports.ActivityFlags = exports.WebhookTypes = exports.VisibilityTypes = exports.PremiumTypes = exports.UserFlags = exports.WidgetStyleOptions = exports.StatusTypes = exports.ActivityTypes = exports.TargetUserTypes = exports.PremiumTier = exports.IntegrationExpireBehaviors = exports.GuildFeatures = exports.SystemChannelFlags = exports.VerificationLevel = exports.MFA_Level = exports.ExplicitContentFilterLevel = exports.DefaultMessageNotificationLevel = exports.AllowedMentionTypes = exports.PermissionsOverwriteTypes = exports.MessageStickerFormatTypes = exports.MessageFlags = exports.MessageActivityTypes = exports.MessageTypes = exports.ChannelTypes = exports.AuditLogEvents = exports.Intents = exports.Permissions = exports.CDN = exports.API_PATH = exports.API_VERSION = exports.API = exports.HOST = void 0; | ||
exports.SpeakingStates = exports.VoiceEncryptionModes = exports.MembershipStates = exports.OAuth2GrantTypes = exports.OAuth2Scopes = exports.InteractionResponseFlags = exports.InteractionResponseTypes = exports.InteractionTypes = exports.ApplicationCommandOptionTypes = exports.ActivityFlags = exports.WebhookTypes = exports.VisibilityTypes = exports.PremiumTypes = exports.UserFlags = exports.WidgetStyleOptions = exports.StatusTypes = exports.ActivityTypes = exports.TargetUserTypes = exports.PremiumTier = exports.IntegrationExpireBehaviors = exports.GuildFeatures = exports.SystemChannelFlags = exports.VerificationLevel = exports.MFA_Level = exports.ExplicitContentFilterLevel = exports.DefaultMessageNotificationLevel = exports.AllowedMentionTypes = exports.PermissionsOverwriteTypes = exports.MessageStickerFormatTypes = exports.MessageFlags = exports.MessageActivityTypes = exports.MessageTypes = exports.ChannelTypes = exports.AuditLogEvents = exports.Intents = exports.Permissions = exports.CDN = exports.API_PATH = exports.API_VERSION = exports.API = exports.HOST = void 0; | ||
exports.HOST = 'https://discord.com', exports.API = `${exports.HOST}/api`, exports.API_VERSION = 8, exports.API_PATH = `${exports.API}/v${exports.API_VERSION}`, exports.CDN = 'https://cdn.discordapp.com'; | ||
@@ -42,3 +42,3 @@ exports.Permissions = { | ||
(function (Intents) { | ||
Intents[Intents["SYSTEM_ONLY"] = 0] = "SYSTEM_ONLY"; | ||
Intents[Intents["SYSTEM"] = 0] = "SYSTEM"; | ||
Intents[Intents["GUILDS"] = 1] = "GUILDS"; | ||
@@ -350,1 +350,14 @@ Intents[Intents["GUILD_MEMBERS"] = 2] = "GUILD_MEMBERS"; | ||
})(MembershipStates = exports.MembershipStates || (exports.MembershipStates = {})); | ||
var VoiceEncryptionModes; | ||
(function (VoiceEncryptionModes) { | ||
VoiceEncryptionModes["XSALSA20_POLY1305"] = "xsalsa20_poly1305"; | ||
VoiceEncryptionModes["XSALSA20_POLY1305_SUFFIX"] = "xsalsa20_poly1305_suffix"; | ||
VoiceEncryptionModes["XSALSA20_POLY1305_LITE"] = "xsalsa20_poly1305_lite"; | ||
})(VoiceEncryptionModes = exports.VoiceEncryptionModes || (exports.VoiceEncryptionModes = {})); | ||
var SpeakingStates; | ||
(function (SpeakingStates) { | ||
SpeakingStates[SpeakingStates["NONE"] = 0] = "NONE"; | ||
SpeakingStates[SpeakingStates["MICROPHONE"] = 1] = "MICROPHONE"; | ||
SpeakingStates[SpeakingStates["SOUNDSHARE"] = 2] = "SOUNDSHARE"; | ||
SpeakingStates[SpeakingStates["PRIORITY"] = 4] = "PRIORITY"; | ||
})(SpeakingStates = exports.SpeakingStates || (exports.SpeakingStates = {})); |
@@ -9,1 +9,2 @@ export { Client, ClientEvents } from './client'; | ||
export * as Tools from './tools'; | ||
export { Voice, VoiceEvents } from './voice'; |
@@ -22,3 +22,3 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.Tools = exports.Helpers = exports.Actions = exports.Events = exports.TokenTypes = exports.Authorization = exports.ClientEvents = exports.Client = void 0; | ||
exports.VoiceEvents = exports.Voice = exports.Tools = exports.Helpers = exports.Actions = exports.Events = exports.TokenTypes = exports.Authorization = exports.ClientEvents = exports.Client = void 0; | ||
var client_1 = require("./client"); | ||
@@ -35,1 +35,4 @@ Object.defineProperty(exports, "Client", { enumerable: true, get: function () { return client_1.Client; } }); | ||
exports.Tools = __importStar(require("./tools")); | ||
var voice_1 = require("./voice"); | ||
Object.defineProperty(exports, "Voice", { enumerable: true, get: function () { return voice_1.Voice; } }); | ||
Object.defineProperty(exports, "VoiceEvents", { enumerable: true, get: function () { return voice_1.VoiceEvents; } }); |
import { Permissions as Flags } from './helpers'; | ||
import { Guild, User, Application, Team } from './types'; | ||
declare type Permission = typeof Flags[keyof typeof Flags]; | ||
declare type PermissionSet = string | number | bigint; | ||
export declare const Permissions: { | ||
equals: (a: string | number | bigint, b: string | number | bigint) => boolean; | ||
combine: (permissions: (string | number | bigint)[]) => string; | ||
check: (source: string | number | bigint, permission: Permission) => boolean; | ||
has: (source: string | number | bigint, permission: Permission) => boolean; | ||
add: (source: string | number | bigint, permission: Permission) => string; | ||
remove: (source: string | number | bigint, permission: Permission) => string; | ||
equals: (a: PermissionSet, b: PermissionSet) => boolean; | ||
combine: (permissions: PermissionSet[]) => string; | ||
check: (source: PermissionSet, permission: Permission) => boolean; | ||
has: (source: PermissionSet, permission: Permission) => boolean; | ||
add: (source: PermissionSet, permission: Permission) => string; | ||
remove: (source: PermissionSet, permission: Permission) => string; | ||
}; | ||
@@ -12,0 +13,0 @@ export declare const Mentions: { |
@@ -5,3 +5,2 @@ "use strict"; | ||
const helpers_1 = require("./helpers"); | ||
const helpers_2 = require("./helpers"); | ||
exports.Permissions = { | ||
@@ -27,26 +26,26 @@ equals: (a, b) => BigInt(a) == BigInt(b), | ||
exports.CdnImages = { | ||
CustomEmoji: (emoji_id, size, ext) => `${helpers_2.CDN}/emojis/${emoji_id}${SizeExtOpt(size, ext)}`, | ||
CustomEmoji: (emoji_id, size, ext) => `${helpers_1.CDN}/emojis/${emoji_id}${SizeExtOpt(size, ext)}`, | ||
GuildIcon: (guild, size, ext) => guild.icon ? | ||
`${helpers_2.CDN}/icons/${guild.id}/${guild.icon}${SizeExtOpt(size, ext)}` : | ||
`${helpers_1.CDN}/icons/${guild.id}/${guild.icon}${SizeExtOpt(size, ext)}` : | ||
null, | ||
GuildSplash: (guild, size, ext) => guild.splash ? | ||
`${helpers_2.CDN}/splashes/${guild.id}/${guild.splash}${SizeExtOpt(size, ext)}` : | ||
`${helpers_1.CDN}/splashes/${guild.id}/${guild.splash}${SizeExtOpt(size, ext)}` : | ||
null, | ||
GuildDiscoverySplash: (guild, size, ext) => guild.discovery_splash ? | ||
`${helpers_2.CDN}/discovery-splashes/${guild.id}/${guild.discovery_splash}${SizeExtOpt(size, ext)}` : | ||
`${helpers_1.CDN}/discovery-splashes/${guild.id}/${guild.discovery_splash}${SizeExtOpt(size, ext)}` : | ||
null, | ||
GuildBanner: (guild, size, ext) => guild.banner ? | ||
`${helpers_2.CDN}/banners/${guild.id}/${guild.banner}${SizeExtOpt(size, ext)}` : | ||
`${helpers_1.CDN}/banners/${guild.id}/${guild.banner}${SizeExtOpt(size, ext)}` : | ||
null, | ||
UserAvatar: (user, size, ext) => user.avatar ? | ||
`${helpers_2.CDN}/avatars/${user.id}/${user.avatar}${SizeExtOpt(size, ext)}` : | ||
`${helpers_2.CDN}/embed/avatars/${Number(user.discriminator) % 5}.png`, | ||
`${helpers_1.CDN}/avatars/${user.id}/${user.avatar}${SizeExtOpt(size, ext)}` : | ||
`${helpers_1.CDN}/embed/avatars/${Number(user.discriminator) % 5}.png`, | ||
ApplicationIcon: (application, size, ext) => application.icon ? | ||
`${helpers_2.CDN}/app-icons/${application.id}/${application.icon}${SizeExtOpt(size, ext)}` : | ||
`${helpers_1.CDN}/app-icons/${application.id}/${application.icon}${SizeExtOpt(size, ext)}` : | ||
null, | ||
ApplicationAsset: (application, asset_id, size, ext) => `${helpers_2.CDN}/app-assets/${application.id}/${asset_id}${SizeExtOpt(size, ext)}`, | ||
AchievementIcon: (application, achievement_id, icon_hash, size, ext) => `${helpers_2.CDN}/app-assets/${application.id}/achievements/${achievement_id}/icons/${icon_hash}${SizeExtOpt(size, ext)}`, | ||
ApplicationAsset: (application, asset_id, size, ext) => `${helpers_1.CDN}/app-assets/${application.id}/${asset_id}${SizeExtOpt(size, ext)}`, | ||
AchievementIcon: (application, achievement_id, icon_hash, size, ext) => `${helpers_1.CDN}/app-assets/${application.id}/achievements/${achievement_id}/icons/${icon_hash}${SizeExtOpt(size, ext)}`, | ||
TeamIcon: (team, size, ext) => team.icon ? | ||
`${helpers_2.CDN}/team-icons/${team.id}/${team.icon}${SizeExtOpt(size, ext)}` : | ||
`${helpers_1.CDN}/team-icons/${team.id}/${team.icon}${SizeExtOpt(size, ext)}` : | ||
null, | ||
}; |
{ | ||
"name": "discord-slim", | ||
"version": "2.0.0-dev.14", | ||
"version": "2.0.0-dev.15", | ||
"description": "Lightweight Discord bot API for Node.js.", | ||
@@ -5,0 +5,0 @@ "author": "Hanabishi", |
@@ -20,2 +20,3 @@ # Discord Slim | ||
- Sharding support | ||
- Voice connection support | ||
@@ -38,3 +39,3 @@ ### Support & suggestions server | ||
```js | ||
const { Client, ClientEvents, Authorization, Events, Actions, Helpers } = require('discord-slim'); | ||
const { Client, ClientEvents, Authorization, Events, Actions, Helpers, Tools } = require('discord-slim'); | ||
@@ -64,5 +65,7 @@ // Basic setup to control client operation. | ||
// Set how many attempts to make due to the rate limit. Default: 5. | ||
// This includes the first try, so values 1 and below will be treated as "no retries". | ||
retryCount: 5, | ||
// Rate limit hit callback | ||
callback: (response, attempts) => console.log(`${response.message} Global: ${response.global}. Cooldown: ${response.retry_after} sec. Attempt: ${attempts}.`), | ||
callback: (response, attempts) => | ||
console.log(`${response.message} Global: ${response.global}. Cooldown: ${response.retry_after} sec. Attempt: ${attempts}.`), | ||
}, | ||
@@ -81,5 +84,7 @@ }); | ||
client.events.on(Events.MESSAGE_CREATE, (message) => { | ||
// Filter out own messages | ||
if(message.author.id == client.user.id) return; | ||
// Check that the message contains phrases like "hello bot" or "hi bot" | ||
if(message.content.search(/(^|\s)h(ello|i)(\s|\s.*\s)bot($|\s)/i) < 0) return; | ||
// Using both reply and mention just for demo | ||
Actions.Message.Create(message.channel_id, { | ||
@@ -99,11 +104,6 @@ content: `Hi, ${Tools.Mentions.User(message.author.id)}!`, | ||
client.UpdateStatus({ | ||
status: Helpers.StatusTypes.ONLINE, | ||
activities: [{ type: Helpers.ActivityTypes.WATCHING, name: 'YOU' }], | ||
afk: false, | ||
since: 0, | ||
activities: [ | ||
{ | ||
name: 'YOU', | ||
type: Helpers.ActivityTypes.WATCHING, | ||
} | ||
], | ||
afk: false, | ||
status: Helpers.StatusTypes.ONLINE, | ||
}); | ||
@@ -134,3 +134,3 @@ }); | ||
client.events.on(Events.INTERACTION_CREATE, (interaction) => { | ||
if(!(interaction.data && interaction.data.name == 'echo')) return; | ||
if(interaction.data?.name != 'echo') return; | ||
Actions.Application.CreateInteractionResponse(interaction.id, interaction.token, { | ||
@@ -137,0 +137,0 @@ type: Helpers.InteractionResponseTypes.CHANNEL_MESSAGE_WITH_SOURCE, |
140306
21
2902