874 lines
28 KiB
JavaScript
874 lines
28 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
const Permissions = {
|
||
|
General: {
|
||
|
CREATE_INSTANT_INVITE: 1 << 0,
|
||
|
KICK_MEMBERS: 1 << 1,
|
||
|
BAN_MEMBERS: 1 << 2,
|
||
|
ADMINISTRATOR: 1 << 3,
|
||
|
MANAGE_CHANNELS: 1 << 4,
|
||
|
MANAGE_GUILD: 1 << 5,
|
||
|
CHANGE_NICKNAME: 1 << 26,
|
||
|
MANAGE_NICKNAMES: 1 << 27,
|
||
|
MANAGE_ROLES: 1 << 28,
|
||
|
MANAGE_WEBHOOKS: 1 << 29,
|
||
|
MANAGE_EMOJIS: 1 << 30,
|
||
|
},
|
||
|
Text: {
|
||
|
READ_MESSAGES: 1 << 10,
|
||
|
SEND_MESSAGES: 1 << 11,
|
||
|
SEND_TTS_MESSAGES: 1 << 12,
|
||
|
MANAGE_MESSAGES: 1 << 13,
|
||
|
EMBED_LINKS: 1 << 14,
|
||
|
ATTACH_FILES: 1 << 15,
|
||
|
READ_MESSAGE_HISTORY: 1 << 16,
|
||
|
MENTION_EVERYONE: 1 << 17,
|
||
|
EXTERNAL_EMOTES: 1 << 18,
|
||
|
ADD_REACTIONS: 1 << 6,
|
||
|
},
|
||
|
Voice: {
|
||
|
CONNECT: 1 << 20,
|
||
|
SPEAK: 1 << 21,
|
||
|
MUTE_MEMBERS: 1 << 22,
|
||
|
DEAFEN_MEMBERS: 1 << 23,
|
||
|
MOVE_MEMBERS: 1 << 24,
|
||
|
USE_VAD: 1 << 25,
|
||
|
}
|
||
|
};
|
||
|
|
||
|
const ChannelGeneral = {
|
||
|
CREATE_INSTANT_INVITE: Permissions.General.CREATE_INSTANT_INVITE,
|
||
|
MANAGE_CHANNEL: Permissions.General.MANAGE_CHANNELS,
|
||
|
MANAGE_PERMISSIONS: Permissions.General.MANAGE_ROLES
|
||
|
};
|
||
|
const PermissionSpecs = {
|
||
|
Role: Permissions,
|
||
|
TextChannel: {
|
||
|
General: ChannelGeneral,
|
||
|
Text: Permissions.Text
|
||
|
},
|
||
|
VoiceChannel: {
|
||
|
General: ChannelGeneral,
|
||
|
Voice: Permissions.Voice
|
||
|
}
|
||
|
};
|
||
|
const PermissionsDefault = [
|
||
|
Permissions.General.CREATE_INSTANT_INVITE,
|
||
|
Permissions.General.CHANGE_NICKNAME,
|
||
|
Permissions.Text.READ_MESSAGES,
|
||
|
Permissions.Text.SEND_MESSAGES,
|
||
|
Permissions.Text.SEND_TTS_MESSAGES,
|
||
|
Permissions.Text.EMBED_LINKS,
|
||
|
Permissions.Text.ATTACH_FILES,
|
||
|
Permissions.Text.READ_MESSAGE_HISTORY,
|
||
|
Permissions.Text.MENTION_EVERYONE,
|
||
|
Permissions.Text.EXTERNAL_EMOTES,
|
||
|
Permissions.Text.ADD_REACTIONS,
|
||
|
Permissions.Voice.CONNECT,
|
||
|
Permissions.Voice.SPEAK,
|
||
|
Permissions.Voice.USE_VAD
|
||
|
].reduce((perms, perm) => perms | perm, 0);
|
||
|
|
||
|
const Constants = {
|
||
|
ReadyState: {
|
||
|
CONNECTING: 0,
|
||
|
OPEN: 1,
|
||
|
CLOSING: 2,
|
||
|
CLOSED: 3,
|
||
|
},
|
||
|
DiscordieState: {
|
||
|
DISCONNECTED: 0,
|
||
|
LOGGING_IN: 0,
|
||
|
LOGGED_IN: 0,
|
||
|
CONNECTING: 0,
|
||
|
CONNECTED: 0,
|
||
|
},
|
||
|
Errors: {
|
||
|
VOICE_DISCONNECTED_FROM_GATEWAY:
|
||
|
error => `Disconnected from gateway socket: ${error}`,
|
||
|
VOICE_SESSION_INVALIDATED:
|
||
|
`Session has been invalidated`,
|
||
|
VOICE_CHANGING_SERVER:
|
||
|
"Changing server",
|
||
|
VOICE_SESSION_DESCRIPTION_TIMEOUT:
|
||
|
"Failed to connect to voice: VOICE_SESSION_DESCRIPTION timed out",
|
||
|
VOICE_TRANSPORT_TIMEOUT:
|
||
|
"Voice transport timed out",
|
||
|
VOICE_KICKED_FROM_CHANNEL:
|
||
|
"Kicked from the voice channel",
|
||
|
VOICE_CONNECTED_FROM_ANOTHER_LOCATION:
|
||
|
"Connected from another location",
|
||
|
VOICE_GUILD_UNAVAILABLE:
|
||
|
"Guild unavailable",
|
||
|
VOICE_CALL_UNAVAILABLE:
|
||
|
"Call unavailable",
|
||
|
VOICE_MANUAL_DISCONNECT:
|
||
|
"Manual disconnect"
|
||
|
},
|
||
|
Events: {
|
||
|
// =============================== INTERNAL ===============================
|
||
|
GATEWAY_OPEN: 0,
|
||
|
GATEWAY_HELLO: 0,
|
||
|
GATEWAY_DISPATCH: 0,
|
||
|
GATEWAY_DISCONNECT: 0,
|
||
|
GATEWAY_UNHANDLED_MESSAGE: 0,
|
||
|
|
||
|
VOICESOCKET_OPEN: 0,
|
||
|
VOICESOCKET_DISCONNECT: 0,
|
||
|
VOICESOCKET_UNHANDLED_MESSAGE: 0,
|
||
|
|
||
|
VOICE_READY: 0,
|
||
|
VOICE_SESSION_DESCRIPTION: 0,
|
||
|
VOICE_SPEAKING: 0,
|
||
|
|
||
|
COLLECTION_READY: 0,
|
||
|
READY_TASK_FINISHED: 0,
|
||
|
|
||
|
LOADED_MORE_MESSAGES: 0,
|
||
|
LOADED_PINNED_MESSAGES: 0,
|
||
|
LOADED_GUILD_BANS: 0,
|
||
|
|
||
|
ANY_GATEWAY_READY: 0, // fires on every gateway (primary and secondary)
|
||
|
// No secondary gateways as of botapi multiserver voice release @2016-03-11
|
||
|
|
||
|
// ================================= REST =================================
|
||
|
REQUEST_AUTH_LOGIN_ERROR: 0, REQUEST_AUTH_LOGIN_SUCCESS: 0,
|
||
|
REQUEST_GATEWAY_ERROR: 0, REQUEST_GATEWAY_SUCCESS: 0,
|
||
|
|
||
|
// ================================ CUSTOM ================================
|
||
|
|
||
|
/**
|
||
|
* Emitted when login or gateway auth failed,
|
||
|
* or primary gateway socket disconnects, closing all open sockets.
|
||
|
*
|
||
|
* Not emitted if disconnected using `client.disconnect()`.
|
||
|
*
|
||
|
* Property `error` can contain following `Error` messages:
|
||
|
*
|
||
|
* - ** `"Login failed"` **
|
||
|
*
|
||
|
* Set if REST `/login` endpoint returned an error.
|
||
|
*
|
||
|
* - ** `"Could not get gateway"` **
|
||
|
*
|
||
|
* Set if REST `/gateway` endpoint returned an error.
|
||
|
*
|
||
|
* - ** `"No token specified"` **
|
||
|
*
|
||
|
* Should never fire under normal circumstances.
|
||
|
* Set if attempted to open gateway socket without token.
|
||
|
*
|
||
|
* - ** `"Heartbeat ACK did not arrive in time"` **
|
||
|
*
|
||
|
* - ** `"Failed to connect to gateway: READY timed out"` **
|
||
|
*
|
||
|
* Set if server did not return a `READY` (initialization) packet
|
||
|
* within 5 minutes.
|
||
|
*
|
||
|
* - ** `"Disconnected from primary gateway"` **
|
||
|
*
|
||
|
* Emitted for any other errors. Property `error.exception` will contain
|
||
|
* the `Number` error code from websocket.
|
||
|
*
|
||
|
* Original `Error` object or `Number` error code is stored
|
||
|
* within `DiscordieError` and can be inspected using `error.exception`.
|
||
|
* @event DISCONNECTED
|
||
|
* @property {DiscordieError} error
|
||
|
* @property {Boolean} [autoReconnect]
|
||
|
* Only present (and set to true) when auto-reconnect is enabled.
|
||
|
* @property {Number} [delay]
|
||
|
* Delay in milliseconds until next reconnect attempt.
|
||
|
* Only present when auto-reconnect is enabled.
|
||
|
*/
|
||
|
DISCONNECTED: 0,
|
||
|
|
||
|
/**
|
||
|
* Emitted when the `Discordie` instance is ready to use.
|
||
|
*
|
||
|
* All objects except unavailable guilds and offline members of large guilds
|
||
|
* (250+ members) will be in cache when this event fires.
|
||
|
*
|
||
|
* You can request offline members using `client.Users.fetchMembers()`.
|
||
|
* See documentation for `IUserCollection.fetchMembers`.
|
||
|
*
|
||
|
* > **Note: Any other events may fire before `GATEWAY_READY`.**
|
||
|
* @event GATEWAY_READY
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {Object} data - Raw event data
|
||
|
* @example
|
||
|
* var client = new Discordie();
|
||
|
* client.connect({ token: "bot_token" });
|
||
|
* client.Dispatcher.on("GATEWAY_READY", e => {
|
||
|
* // all objects except offline members of large guilds
|
||
|
* // have been cached at this point
|
||
|
* });
|
||
|
*/
|
||
|
GATEWAY_READY: 0, // fires only on primary gateway
|
||
|
|
||
|
/**
|
||
|
* Emitted after gateway connection is resumed after a disconnect.
|
||
|
*
|
||
|
* Connections can be resumable if disconnected for short period of time.
|
||
|
*
|
||
|
* Does not clear cache unlike `GATEWAY_READY`.
|
||
|
* @event GATEWAY_RESUMED
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {Object} data - Raw event data
|
||
|
*/
|
||
|
GATEWAY_RESUMED: 0,
|
||
|
|
||
|
/**
|
||
|
* Emitted when a new voice connection is fully initialized.
|
||
|
* @event VOICE_CONNECTED
|
||
|
* @property {VoiceSocket} socket
|
||
|
* @property {IVoiceConnection} voiceConnection
|
||
|
*/
|
||
|
VOICE_CONNECTED: 0,
|
||
|
/**
|
||
|
* Emitted when a voice socket disconnects.
|
||
|
*
|
||
|
* Property `error` can contain `null` or following `Error` messages:
|
||
|
*
|
||
|
* - ** `` `Disconnected from gateway socket: ${errorCode}` `` **
|
||
|
*
|
||
|
* Set when an error occured on gateway socket.
|
||
|
*
|
||
|
* - ** `"Failed to connect to voice: VOICE_SESSION_DESCRIPTION timed out"` **
|
||
|
*
|
||
|
* - ** `"Voice transport timed out"` **
|
||
|
*
|
||
|
* - ** `"Connected from another location"` **
|
||
|
*
|
||
|
* - ** `"Kicked from the voice channel"` **
|
||
|
*
|
||
|
* Set when server kicks the user from a voice channel,
|
||
|
* user accounts do not support botapi multiserver voice.
|
||
|
*
|
||
|
* - ** `"Changing server"` **
|
||
|
*
|
||
|
* - ** `"Guild unavailable"` **
|
||
|
*
|
||
|
* This event fires before `GUILD_UNAVAILABLE`.
|
||
|
*
|
||
|
* - ** `"Call unavailable"` **
|
||
|
*
|
||
|
* - ** `"Session has been invalidated"` **
|
||
|
*
|
||
|
* Set when the gateway connection could not be resumed and new
|
||
|
* session has been started. Fires for all previously active voice
|
||
|
* connections.
|
||
|
*
|
||
|
* - ** `"Manual disconnect"` **
|
||
|
*
|
||
|
* Set if `channel.leave()` or `client.disconnect()` was called.
|
||
|
* Will also be set if channel or guild gets deleted (`VOICE_DISCONNECTED`
|
||
|
* emits before `GUILD_DELETE` or `CHANNEL_DELETE` respectively).
|
||
|
*
|
||
|
* If Discord decides to change voice servers - check if `endpointAwait`
|
||
|
* is not null and contains a `Promise` which will resolve when a new
|
||
|
* connection is fully initialized (`VOICE_CONNECTED` will also fire)
|
||
|
* and reject if reconnect fails.
|
||
|
*
|
||
|
* Calls on `.join()` for channels of the same guild will return the same
|
||
|
* promise.
|
||
|
*
|
||
|
* Call `.leave()` on pending connection's channel to cancel a reconnect.
|
||
|
* Pending promise (`endpointAwait`) will be rejected with
|
||
|
* `Error` message "Cancelled".
|
||
|
*
|
||
|
* If a gateway disconnects, pending connections that belong to the gateway
|
||
|
* will be rejected with `Error` message `"Gateway disconnected"`.
|
||
|
*
|
||
|
* @event VOICE_DISCONNECTED
|
||
|
* @property {VoiceSocket} socket
|
||
|
* @property {IVoiceConnection} voiceConnection
|
||
|
* @property {Error|null} error
|
||
|
* @property {boolean} manual
|
||
|
* Indicating whether was caused by `IVoiceChannel.leave()` or
|
||
|
* `Discordie.disconnect()`, also true if channel/guild has been deleted
|
||
|
* @property {Promise<VoiceConnectionInfo, Error|Number>} endpointAwait
|
||
|
* Indicates whether there is a reconnect pending, reconnects can occur when
|
||
|
* Discord decides to move users to another voice server
|
||
|
* @example
|
||
|
* client.Dispatcher.on("VOICE_DISCONNECTED", e => {
|
||
|
* const channel = e.voiceConnection.channel;
|
||
|
* if (!channel) return console.log("Channel has been deleted");
|
||
|
*
|
||
|
* if (e.endpointAwait) {
|
||
|
* // handle reconnect instantly if it's a server-switch disconnect
|
||
|
* // transparently creates same promise as `oldChannel.join()`
|
||
|
* // see the `reconnect` function below
|
||
|
*
|
||
|
* // Note: During Discord outages it will act like the official client
|
||
|
* // and wait for an endpoint. Sometimes this can take a very
|
||
|
* // long time. To cancel pending reconnect just call leave on
|
||
|
* // the voice channel. Pending promise will reject with
|
||
|
* // `Error` message "Cancelled".
|
||
|
*
|
||
|
*
|
||
|
* e.endpointAwait
|
||
|
* .then(info => onConnected(info))
|
||
|
* .catch(err => {
|
||
|
* // server switching failed, do a regular backoff
|
||
|
* setTimeout(() => reconnect(channel), 5000);
|
||
|
* });
|
||
|
* return;
|
||
|
* }
|
||
|
*
|
||
|
* // normal disconnect
|
||
|
* setTimeout(() => reconnect(channel), 5000);
|
||
|
* });
|
||
|
* function reconnect(channel) {
|
||
|
* var channelName = channel.name;
|
||
|
* channel.join()
|
||
|
* .then(info => onConnected(info))
|
||
|
* .catch(err => console.log("Failed to connect to " + channelName));
|
||
|
* // this example will stop reconnecting after 1 attempt
|
||
|
* // you can continue trying to reconnect
|
||
|
* }
|
||
|
* function onConnected(info) {
|
||
|
* console.log("Connected to " + info.voiceConnection.channel.name);
|
||
|
* }
|
||
|
*/
|
||
|
VOICE_DISCONNECTED: 0,
|
||
|
|
||
|
/**
|
||
|
* Emitted when guild becomes unavailable.
|
||
|
* Guild is deleted from cache until another `GUILD_CREATE`.
|
||
|
* @event GUILD_UNAVAILABLE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {String} guildId
|
||
|
*/
|
||
|
GUILD_UNAVAILABLE: 0,
|
||
|
|
||
|
/**
|
||
|
* Emitted when call becomes unavailable.
|
||
|
* @event CALL_UNAVAILABLE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {String} channelId
|
||
|
*/
|
||
|
CALL_UNAVAILABLE: 0,
|
||
|
|
||
|
/**
|
||
|
* Emitted when current user is being rung in a call.
|
||
|
* @event CALL_RING
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IDirectMessageChannel} channel
|
||
|
*/
|
||
|
CALL_RING: 0,
|
||
|
|
||
|
/**
|
||
|
* Emitted when `username`, `avatar` or `discriminator` difference detected
|
||
|
* in an incoming `PRESENCE_UPDATE` event.
|
||
|
* @event PRESENCE_MEMBER_INFO_UPDATE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {Object} old - Old instance of internal User model (immutable)
|
||
|
* @property {Object} new - New instance of internal User model (immutable)
|
||
|
*/
|
||
|
PRESENCE_MEMBER_INFO_UPDATE: 0,
|
||
|
|
||
|
/**
|
||
|
* Emitted when user leaves voice channel.
|
||
|
* Fields `newChannelId`/`newGuildId` contain ids that will appear in
|
||
|
* `VOICE_CHANNEL_JOIN` event that will follow if user has moved to
|
||
|
* another channel, otherwise null.
|
||
|
* @event VOICE_CHANNEL_LEAVE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IUser} user
|
||
|
* @property {IChannel|null} channel
|
||
|
* @property {String} channelId
|
||
|
* @property {String} guildId
|
||
|
* @property {String|null} newChannelId -
|
||
|
* Next channel id if user moved to another channel
|
||
|
* @property {String|null} newGuildId -
|
||
|
* Next guild id if user moved to another channel
|
||
|
*/
|
||
|
VOICE_CHANNEL_LEAVE: 0,
|
||
|
|
||
|
/**
|
||
|
* Emitted when user joins voice channel.
|
||
|
* @event VOICE_CHANNEL_JOIN
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IUser} user
|
||
|
* @property {IChannel} channel
|
||
|
* @property {String} channelId
|
||
|
* @property {String} guildId
|
||
|
*/
|
||
|
VOICE_CHANNEL_JOIN: 0,
|
||
|
|
||
|
/**
|
||
|
* Emitted when user self mute change is detected.
|
||
|
* Manual client-side mute.
|
||
|
* @event VOICE_USER_SELF_MUTE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IUser} user
|
||
|
* @property {IChannel} channel
|
||
|
* @property {String} channelId
|
||
|
* @property {String} guildId
|
||
|
* @property {boolean} state - Current state (is self muted)
|
||
|
*/
|
||
|
VOICE_USER_SELF_MUTE: 0,
|
||
|
|
||
|
/**
|
||
|
* Emitted when user self deaf change is detected.
|
||
|
* Manual client-side deafen.
|
||
|
* @event VOICE_USER_SELF_DEAF
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IUser} user
|
||
|
* @property {IChannel} channel
|
||
|
* @property {String} channelId
|
||
|
* @property {String} guildId
|
||
|
* @property {boolean} state - Current state (is self deafened)
|
||
|
*/
|
||
|
VOICE_USER_SELF_DEAF: 0,
|
||
|
|
||
|
/**
|
||
|
* Emitted when user mute change is detected.
|
||
|
* Global server-side mute.
|
||
|
* @event VOICE_USER_MUTE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IUser} user
|
||
|
* @property {IChannel} channel
|
||
|
* @property {String} channelId
|
||
|
* @property {String} guildId
|
||
|
* @property {boolean} state - Current state (is muted globally)
|
||
|
*/
|
||
|
VOICE_USER_MUTE: 0,
|
||
|
|
||
|
/**
|
||
|
* Emitted when user deaf change is detected.
|
||
|
* Global server-side deafen.
|
||
|
* @event VOICE_USER_DEAF
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IUser} user
|
||
|
* @property {IChannel} channel
|
||
|
* @property {String} channelId
|
||
|
* @property {String} guildId
|
||
|
* @property {boolean} state - Current state (is deafened globally)
|
||
|
*/
|
||
|
VOICE_USER_DEAF: 0,
|
||
|
|
||
|
// ============================= PROXY EVENTS =============================
|
||
|
/**
|
||
|
* @event MESSAGE_CREATE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IMessage} message
|
||
|
*/
|
||
|
MESSAGE_CREATE: 0,
|
||
|
/**
|
||
|
* Emitted when user deletes their message.
|
||
|
* Contains null `message` if not cached.
|
||
|
* @event MESSAGE_DELETE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {String} channelId
|
||
|
* @property {String} messageId
|
||
|
* @property {IMessage|null} message
|
||
|
*/
|
||
|
MESSAGE_DELETE: 0,
|
||
|
/**
|
||
|
* Emitted when a bot deletes more than 1 message at once.
|
||
|
* @event MESSAGE_DELETE_BULK
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {String} channelId
|
||
|
* @property {Array<String>} messageIds
|
||
|
* @property {Array<IMessage>} messages
|
||
|
* Array of known deleted messages, can be empty
|
||
|
*/
|
||
|
MESSAGE_DELETE_BULK: 0,
|
||
|
/**
|
||
|
* Emitted when user updates their message.
|
||
|
* Contains null `message` if not cached.
|
||
|
* @event MESSAGE_UPDATE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IMessage|null} message
|
||
|
* @property {Object} data - Raw message object received from server
|
||
|
*/
|
||
|
MESSAGE_UPDATE: 0,
|
||
|
|
||
|
/**
|
||
|
* Emitted when on changes for username, avatar, status or game.
|
||
|
*
|
||
|
* Emitted multiple times for each shared guild with the local user and the
|
||
|
* user presence is for.
|
||
|
*
|
||
|
* Compare `user.status` and `user.previousStatus` to detect status changes.
|
||
|
*
|
||
|
* Games can be checked with `user.game` and `user.previousGame`
|
||
|
* (and helpers for names `user.gameName` and `user.previousGameName`)
|
||
|
* respectively.
|
||
|
*
|
||
|
* > **Note:** Property `member` will contain `IUser` instance if user
|
||
|
* > has left the `guild`.
|
||
|
*
|
||
|
* @event PRESENCE_UPDATE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IGuild} guild
|
||
|
* @property {IUser} user
|
||
|
* @property {IGuildMember|IUser} member
|
||
|
*/
|
||
|
PRESENCE_UPDATE: 0,
|
||
|
/**
|
||
|
* @event TYPING_START
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IUser} user
|
||
|
* @property {Number} timestamp - Unix timestamp
|
||
|
* @property {IChannel} channel
|
||
|
*/
|
||
|
TYPING_START: 0,
|
||
|
|
||
|
/**
|
||
|
* @event CHANNEL_CREATE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IChannel} channel
|
||
|
*/
|
||
|
CHANNEL_CREATE: 0,
|
||
|
/**
|
||
|
* @event CHANNEL_DELETE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {String} channelId
|
||
|
* @property {Object} data - Raw channel object received from server
|
||
|
*/
|
||
|
CHANNEL_DELETE: 0,
|
||
|
/**
|
||
|
* @event CHANNEL_UPDATE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IChannel} channel
|
||
|
* @property {Function} getChanges
|
||
|
* Function returning an object `{before: ..., after: ...}` containing two
|
||
|
* raw channel objects.
|
||
|
*/
|
||
|
CHANNEL_UPDATE: 0,
|
||
|
/**
|
||
|
* Emitted when a user has been added to a group dm.
|
||
|
* @event CHANNEL_RECIPIENT_ADD
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IDirectMessageChannel} channel
|
||
|
* @property {IUser} user
|
||
|
*/
|
||
|
CHANNEL_RECIPIENT_ADD: 0,
|
||
|
/**
|
||
|
* Emitted when a user has been removed or left from a group dm.
|
||
|
* @event CHANNEL_RECIPIENT_REMOVE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IDirectMessageChannel} channel
|
||
|
* @property {IUser} user
|
||
|
*/
|
||
|
CHANNEL_RECIPIENT_REMOVE: 0,
|
||
|
|
||
|
/**
|
||
|
* @event GUILD_CREATE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IGuild} guild
|
||
|
* @property {boolean} becameAvailable
|
||
|
* Indicates whether the guild has recovered from unavailable state
|
||
|
*/
|
||
|
GUILD_CREATE: 0,
|
||
|
/**
|
||
|
* @event GUILD_DELETE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {String} guildId
|
||
|
* @property {Object} data - Raw guild object received from server
|
||
|
* @property {Function} getCachedData
|
||
|
* Function returning a raw guild object or null.
|
||
|
*/
|
||
|
GUILD_DELETE: 0,
|
||
|
/**
|
||
|
* @event GUILD_UPDATE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IGuild} guild
|
||
|
* @property {Function} getChanges
|
||
|
* Function returning an object `{before: ..., after: ...}` containing two
|
||
|
* raw guild objects.
|
||
|
*/
|
||
|
GUILD_UPDATE: 0,
|
||
|
|
||
|
/**
|
||
|
* @event GUILD_MEMBER_ADD
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IGuild} guild
|
||
|
* @property {IGuildMember} member
|
||
|
*/
|
||
|
GUILD_MEMBER_ADD: 0,
|
||
|
/**
|
||
|
* Emitted when any other member of a joined guild leaves,
|
||
|
* events for self are blocked internally due to race condition between
|
||
|
* `GUILD_DELETE` and `GUILD_MEMBER_REMOVE`.
|
||
|
* @event GUILD_MEMBER_REMOVE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IGuild} guild
|
||
|
* @property {IUser} user
|
||
|
* @property {Object} data - Raw data received from server
|
||
|
* @property {Function} getCachedData
|
||
|
* Function returning a raw member object or null.
|
||
|
*/
|
||
|
GUILD_MEMBER_REMOVE: 0,
|
||
|
/**
|
||
|
* @event GUILD_MEMBER_UPDATE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IGuild} guild
|
||
|
* @property {IGuildMember} member
|
||
|
* @property {Array<IRole>} rolesAdded
|
||
|
* @property {Array<IRole>} rolesRemoved
|
||
|
* @property {String|null} previousNick
|
||
|
* @property {Function} getChanges
|
||
|
* Function returning an object `{before: ..., after: ...}` containing two
|
||
|
* raw member objects.
|
||
|
*/
|
||
|
GUILD_MEMBER_UPDATE: 0,
|
||
|
|
||
|
/**
|
||
|
* @event GUILD_BAN_ADD
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IGuild} guild
|
||
|
* @property {IUser} user
|
||
|
*/
|
||
|
GUILD_BAN_ADD: 0,
|
||
|
/**
|
||
|
* @event GUILD_BAN_REMOVE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IGuild} guild
|
||
|
* @property {IUser} user
|
||
|
*/
|
||
|
GUILD_BAN_REMOVE: 0,
|
||
|
|
||
|
/**
|
||
|
* @event GUILD_ROLE_CREATE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IGuild} guild
|
||
|
* @property {IRole} role
|
||
|
*/
|
||
|
GUILD_ROLE_CREATE: 0,
|
||
|
/**
|
||
|
* @event GUILD_ROLE_UPDATE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IGuild} guild
|
||
|
* @property {IRole} role
|
||
|
* @property {Function} getChanges
|
||
|
* Function returning an object `{before: ..., after: ...}` containing two
|
||
|
* raw role objects.
|
||
|
*/
|
||
|
GUILD_ROLE_UPDATE: 0,
|
||
|
/**
|
||
|
* @event GUILD_ROLE_DELETE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IGuild} guild
|
||
|
* @property {String} roleId
|
||
|
* @property {Function} getCachedData
|
||
|
* Function returning a raw role object or null.
|
||
|
*/
|
||
|
GUILD_ROLE_DELETE: 0,
|
||
|
|
||
|
/**
|
||
|
* @event GUILD_EMOJIS_UPDATE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IGuild} guild
|
||
|
* @property {Function} getChanges
|
||
|
* Function returning an object `{before: ..., after: ...}` containing two
|
||
|
* full emoji arrays in format provided by Discord.
|
||
|
*/
|
||
|
GUILD_EMOJIS_UPDATE: 0,
|
||
|
|
||
|
/**
|
||
|
* @event CALL_CREATE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IDirectMessageChannel} channel
|
||
|
* @property {ICall} call
|
||
|
*/
|
||
|
CALL_CREATE: 0,
|
||
|
/**
|
||
|
* @event CALL_DELETE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {String} channelId
|
||
|
* @property {Object} data - Raw object received from server
|
||
|
*/
|
||
|
CALL_DELETE: 0,
|
||
|
/**
|
||
|
* @event CALL_UPDATE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IDirectMessageChannel} channel
|
||
|
* @property {ICall} call
|
||
|
*/
|
||
|
CALL_UPDATE: 0,
|
||
|
|
||
|
/**
|
||
|
* Emitted when a webhook is updated.
|
||
|
* @event WEBHOOKS_UPDATE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IGuild} guild
|
||
|
* @property {IChannel} channel
|
||
|
* @property {Object} data - Raw object received from server
|
||
|
*/
|
||
|
WEBHOOKS_UPDATE: 0,
|
||
|
|
||
|
/**
|
||
|
* Emitted when a reaction is added to a message.
|
||
|
* @event MESSAGE_REACTION_ADD
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IUser|null} user
|
||
|
* @property {IChannel|null} channel
|
||
|
* @property {IMessage|null} message
|
||
|
* @property {Object} emoji
|
||
|
* Partial emoji `{id: String|null, name: String}`
|
||
|
* @property {Object} data - Raw object received from server
|
||
|
*/
|
||
|
MESSAGE_REACTION_ADD: 0,
|
||
|
/**
|
||
|
* Emitted when a reaction is removed from a message.
|
||
|
* @event MESSAGE_REACTION_REMOVE
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IUser|null} user
|
||
|
* @property {IChannel|null} channel
|
||
|
* @property {IMessage|null} message
|
||
|
* @property {Object} emoji
|
||
|
* Partial emoji `{id: String|null, name: String}`
|
||
|
* @property {Object} data - Raw object received from server
|
||
|
*/
|
||
|
MESSAGE_REACTION_REMOVE: 0,
|
||
|
/**
|
||
|
* Emitted when message reactions are cleared.
|
||
|
* @event MESSAGE_REACTION_REMOVE_ALL
|
||
|
* @property {GatewaySocket} socket
|
||
|
* @property {IChannel|null} channel
|
||
|
* @property {IMessage|null} message
|
||
|
* @property {Object} data - Raw object received from server
|
||
|
* @property {Function} getCachedData
|
||
|
* Function returning an array of removed reactions or null.
|
||
|
*/
|
||
|
MESSAGE_REACTION_REMOVE_ALL: 0,
|
||
|
},
|
||
|
ChannelTypes: {
|
||
|
GUILD_TEXT: 0,
|
||
|
DM: 1,
|
||
|
GUILD_VOICE: 2,
|
||
|
GROUP_DM: 3
|
||
|
},
|
||
|
MessageTypes: {
|
||
|
DEFAULT: 0,
|
||
|
RECIPIENT_ADD: 1,
|
||
|
RECIPIENT_REMOVE: 2,
|
||
|
CALL: 3,
|
||
|
CHANNEL_NAME_CHANGE: 4,
|
||
|
CHANNEL_ICON_CHANGE: 5,
|
||
|
CHANNEL_PINNED_MESSAGE: 6
|
||
|
},
|
||
|
EncryptionModes: {
|
||
|
plain: 0,
|
||
|
xsalsa20_poly1305: 0,
|
||
|
},
|
||
|
|
||
|
ME: "@me",
|
||
|
Endpoints: {
|
||
|
CDN_AVATAR: (userId, hash, format) => `/avatars/${userId}/${hash}.${format || "jpg"}`,
|
||
|
CDN_DM_ICON: (channelId, hash) => `/channel-icons/${channelId}/${hash}.jpg`,
|
||
|
CDN_GUILD_ICON: (guildId, hash) => `/icons/${guildId}/${hash}.jpg`,
|
||
|
CDN_GUILD_SPLASH: (guildId, hash) => `/splashes/${guildId}/${hash}.jpg`,
|
||
|
CDN_EMOJI: emojiId => `/emojis/${emojiId}.png`,
|
||
|
LOGIN: "/auth/login",
|
||
|
ME: "/users/@me",
|
||
|
TYPING: channelId => `/channels/${channelId}/typing`,
|
||
|
CHANNEL_PERMISSIONS: channelId => `/channels/${channelId}/permissions`,
|
||
|
CHANNEL_RECIPIENTS: channelId => `/channels/${channelId}/recipients`,
|
||
|
CHANNEL_WEBHOOKS: channelId => `/channels/${channelId}/webhooks`,
|
||
|
MESSAGES: channelId => `/channels/${channelId}/messages`,
|
||
|
PINS: channelId => `/channels/${channelId}/pins`,
|
||
|
CHANNELS: "/channels",
|
||
|
SETTINGS: "/users/@me/settings",
|
||
|
GUILD_CHANNELS: guildId => `/guilds/${guildId}/channels`,
|
||
|
GUILDS: "/guilds",
|
||
|
INSTANT_INVITES: channelId => `/channels/${channelId}/invites`,
|
||
|
CALL: channelId => `/channels/${channelId}/call`,
|
||
|
CALL_RING: channelId => `/channels/${channelId}/call/ring`,
|
||
|
CALL_STOP_RINGING: channelId => `/channels/${channelId}/call/stop-ringing`,
|
||
|
|
||
|
REACTIONS: (channelId, messageId) =>
|
||
|
`/channels/${channelId}/messages/${messageId}/reactions`,
|
||
|
REACTIONS_EMOJI: (channelId, messageId, emoji) =>
|
||
|
`/channels/${channelId}/messages/${messageId}/reactions/${emoji}`,
|
||
|
REACTION: (channelId, messageId, emoji, userId) =>
|
||
|
`/channels/${channelId}/messages/${messageId}/reactions/${emoji}/${userId}`,
|
||
|
|
||
|
USER_CHANNELS: userId => `/users/${userId}/channels`,
|
||
|
GUILD_MEMBERS: guildId => `/guilds/${guildId}/members`,
|
||
|
GUILD_BANS: guildId => `/guilds/${guildId}/bans`,
|
||
|
GUILD_ROLES: guildId => `/guilds/${guildId}/roles`,
|
||
|
GUILD_INSTANT_INVITES: guildId => `/guilds/${guildId}/invites`,
|
||
|
GUILD_EMBED: guildId => `/guilds/${guildId}/embed`,
|
||
|
GUILD_PRUNE: guildId => `/guilds/${guildId}/prune`,
|
||
|
GUILD_REGIONS: guildId => `/guilds/${guildId}/regions`,
|
||
|
GUILD_EMOJIS: guildId => `/guilds/${guildId}/emojis`,
|
||
|
GUILD_EMOJI: (guildId, emojiId) => `/guilds/${guildId}/emojis/${emojiId}`,
|
||
|
GUILD_WEBHOOKS: guildId => `/guilds/${guildId}/webhooks`,
|
||
|
WEBHOOK: webhookId => `/webhooks/${webhookId}`,
|
||
|
USERS: "/users",
|
||
|
LOGOUT: "/auth/logout",
|
||
|
REGISTER: "/auth/register",
|
||
|
INVITE: "/invite",
|
||
|
REGIONS: "/voice/regions",
|
||
|
ICE: "/voice/ice",
|
||
|
GATEWAY: "/gateway",
|
||
|
|
||
|
OAUTH2_APPLICATION: id => `/oauth2/applications/${id}`
|
||
|
},
|
||
|
API_VERSION: 6,
|
||
|
get API_ENDPOINT() {
|
||
|
return "https://discordapp.com/api/v" + this.API_VERSION;
|
||
|
},
|
||
|
CDN_ENDPOINT: "https://cdn.discordapp.com",
|
||
|
|
||
|
Permissions: Permissions,
|
||
|
PermissionsDefault: PermissionsDefault,
|
||
|
PermissionSpecs: PermissionSpecs,
|
||
|
|
||
|
StatusTypes: {
|
||
|
ONLINE: "online",
|
||
|
OFFLINE: "offline",
|
||
|
IDLE: "idle",
|
||
|
DND: "dnd",
|
||
|
INVISIBLE: "invisible"
|
||
|
},
|
||
|
|
||
|
ActivityTypes: {
|
||
|
PLAYING: 0,
|
||
|
STREAMING: 1
|
||
|
},
|
||
|
|
||
|
VerificationLevel: {
|
||
|
NONE: 0,
|
||
|
LOW: 1,
|
||
|
MEDIUM: 2,
|
||
|
HIGH: 3
|
||
|
},
|
||
|
|
||
|
MFALevels: {
|
||
|
NONE: 0,
|
||
|
ELEVATED: 1
|
||
|
},
|
||
|
|
||
|
UserNotificationSettings: {
|
||
|
ALL_MESSAGES: 0,
|
||
|
ONLY_MENTIONS: 1,
|
||
|
NO_MESSAGES: 2,
|
||
|
NULL: 3
|
||
|
},
|
||
|
|
||
|
TYPING_TIMEOUT: 10000,
|
||
|
|
||
|
BITRATE_MIN: 8000,
|
||
|
BITRATE_DEFAULT: 64000,
|
||
|
BITRATE_MAX: 96000,
|
||
|
BITRATE_MAX_VIP: 128000,
|
||
|
|
||
|
DISCORD_SAMPLE_RATE: 48000,
|
||
|
|
||
|
NON_USER_BOT_DISCRIMINATOR: "0000"
|
||
|
};
|
||
|
|
||
|
function mirror(d) { Object.keys(d).forEach((k) => d[k] = k); }
|
||
|
function enumerate(d) { let c = 0; Object.keys(d).forEach((k) => d[k] = c++); }
|
||
|
|
||
|
mirror(Constants.Events);
|
||
|
mirror(Constants.EncryptionModes);
|
||
|
mirror(Constants.DiscordieState);
|
||
|
|
||
|
module.exports = Constants;
|