UNPKG

oceanic.js

Version:

A NodeJS library for interfacing with Discord.

262 lines 24 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); /** @module Client */ const RESTManager_1 = tslib_1.__importDefault(require("./rest/RESTManager")); const TypedCollection_1 = tslib_1.__importDefault(require("./util/TypedCollection")); const PrivateChannel_1 = tslib_1.__importDefault(require("./structures/PrivateChannel")); const GroupChannel_1 = tslib_1.__importDefault(require("./structures/GroupChannel")); const User_1 = tslib_1.__importDefault(require("./structures/User")); const Guild_1 = tslib_1.__importDefault(require("./structures/Guild")); const TypedEmitter_1 = tslib_1.__importDefault(require("./util/TypedEmitter")); const ShardManager_1 = tslib_1.__importDefault(require("./gateway/ShardManager")); const UnavailableGuild_1 = tslib_1.__importDefault(require("./structures/UnavailableGuild")); const Util_1 = tslib_1.__importDefault(require("./util/Util")); const Errors_1 = require("./util/Errors"); const node_util_1 = require("node:util"); // @ts-ignore let DiscordJSVoice; try { DiscordJSVoice = require("@discordjs/voice"); } catch { } /* eslint-enable @typescript-eslint/ban-ts-comment, @typescript-eslint/no-redundant-type-constituents, @typescript-eslint/no-var-requires, @typescript-eslint/no-unsafe-assignment, unicorn/prefer-module */ /** The primary class for interfacing with Discord. See {@link ClientEvents | Client Events} for a list of events. */ class Client extends TypedEmitter_1.default { _application; _user; /** A key-value mapping of channel IDs to guild IDs. In most cases, every channel listed here should be cached in their respective guild's {@link Guild#channels | channels collection}. */ channelGuildMap = new Map(); groupChannels; guildShardMap = new Map(); guilds; options; privateChannels; ready; rest; shards; startTime = 0; /** A key-value mapping of thread IDs to guild IDs. In most cases, every channel listed here should be cached in their respective guild's {@link Guild#threads | threads collection}. */ threadGuildMap = new Map(); unavailableGuilds; users; util; voiceAdapters = new Map(); /** * @constructor * @param options The options to create the client with. */ constructor(options) { super(); this.util = new Util_1.default(this); const disableCache = options?.disableCache === true || options?.disableCache === "no-warning"; const colZero = { auditLogEntries: 0, autoModerationRules: 0, channels: 0, emojis: 0, groupChannels: 0, guilds: 0, guildThreads: 0, integrations: 0, invites: 0, members: 0, messages: 0, privateChannels: 0, roles: 0, scheduledEvents: 0, soundboardSounds: 0, stageInstances: 0, stickers: 0, unavailableGuilds: 0, users: 0, voiceMembers: 0, voiceStates: 0 }; this.options = { allowedMentions: options?.allowedMentions ?? { everyone: false, repliedUser: false, users: true, roles: true }, auth: options?.auth ?? null, collectionLimits: disableCache ? colZero : { auditLogEntries: this.util._setLimit(options?.collectionLimits?.auditLogEntries, 50), autoModerationRules: this.util._setLimit(options?.collectionLimits?.autoModerationRules, Infinity), channels: this.util._setLimit(options?.collectionLimits?.channels, Infinity), emojis: this.util._setLimit(options?.collectionLimits?.emojis, Infinity), groupChannels: options?.collectionLimits?.groupChannels ?? 10, guilds: options?.collectionLimits?.guilds ?? Infinity, guildThreads: this.util._setLimit(options?.collectionLimits?.guildThreads, Infinity), integrations: this.util._setLimit(options?.collectionLimits?.integrations, Infinity), invites: this.util._setLimit(options?.collectionLimits?.invites, Infinity), members: this.util._setLimit(options?.collectionLimits?.members, Infinity), messages: this.util._setLimit(options?.collectionLimits?.messages, 100), privateChannels: options?.collectionLimits?.privateChannels ?? 25, roles: this.util._setLimit(options?.collectionLimits?.roles, Infinity), scheduledEvents: this.util._setLimit(options?.collectionLimits?.scheduledEvents, Infinity), soundboardSounds: this.util._setLimit(options?.collectionLimits?.soundboardSounds, Infinity), stageInstances: this.util._setLimit(options?.collectionLimits?.stageInstances, Infinity), stickers: this.util._setLimit(options?.collectionLimits?.stickers, Infinity), unavailableGuilds: options?.collectionLimits?.unavailableGuilds ?? Infinity, users: options?.collectionLimits?.users ?? Infinity, voiceMembers: this.util._setLimit(options?.collectionLimits?.voiceMembers, Infinity), voiceStates: this.util._setLimit(options?.collectionLimits?.voiceStates, Infinity) }, defaultImageFormat: options?.defaultImageFormat ?? "png", defaultImageSize: options?.defaultImageSize ?? 4096, disableMemberLimitScaling: options?.disableMemberLimitScaling ?? false, restMode: false, disableCache }; if (options?.disableCache === true) { process.emitWarning("Enabling the disableCache option is not recommended. This will break many aspects of the library, as it is not designed to function without cache.", { code: "OCEANIC_CACHE_DISABLED", detail: "Set the disableCache option to the literal string \"no-warning\" to disable this warning." }); } if (disableCache && options?.collectionLimits !== undefined && !(0, node_util_1.isDeepStrictEqual)(options.collectionLimits, colZero)) { process.emitWarning("Providing the collectionsLimit option when the disableCache option has been enabled is redundant. Any provided values will be ignored.", { code: "OCEANIC_COLLECTIONS_LIMIT_WITH_CACHE_DISABLED", detail: "Remove the collectionsLimit option, or zero out all of the possible options to disable this warning." }); } this.groupChannels = new TypedCollection_1.default(GroupChannel_1.default, this, this.options.collectionLimits.groupChannels); this.guilds = new TypedCollection_1.default(Guild_1.default, this, this.options.collectionLimits.guilds); this.privateChannels = new TypedCollection_1.default(PrivateChannel_1.default, this, this.options.collectionLimits.privateChannels); this.ready = false; this.rest = new RESTManager_1.default(this, options?.rest); this.shards = new ShardManager_1.default(this, options?.gateway); this.unavailableGuilds = new TypedCollection_1.default(UnavailableGuild_1.default, this, this.options.collectionLimits.unavailableGuilds); this.users = new TypedCollection_1.default(User_1.default, this, this.options.collectionLimits.users); } /** The client's partial application. This will throw an error if not using a gateway connection or no shard is READY. If using a client for rest only, consider enabling rest mode. */ get application() { if (this._application) { return this._application; } else { throw new Errors_1.UncachedError(`${this.constructor.name}#application is not present if not using a gateway connection or no shard is READY. Consider making sure you have connected your client, or enable rest mode.`); } } get uptime() { return this.startTime ? Date.now() - this.startTime : 0; } /** The client's user. This will throw an error if not using a gateway connection or no shard is READY. If using a client for rest only, consider enabling rest mode. */ get user() { if (this._user) { return this._user; } else { throw new Errors_1.UncachedError(`${this.constructor.name}#user is not present if not using a gateway connection or no shard is READY. Consider making sure you have connected your client, or enable rest mode.`); } } /** The active voice connections of this client. */ get voiceConnections() { if (!DiscordJSVoice) { throw new Errors_1.DependencyError("Voice is only supported with @discordjs/voice installed."); } // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access return DiscordJSVoice.getVoiceConnections(); } /** Connect the client to Discord. */ async connect() { if (this.options.restMode) { throw new TypeError("Rest mode has been enabled on this client. You cannot connect to the gateway."); } if (!this.options.auth || !this.options.auth.startsWith("Bot ")) { throw new TypeError("You must provide a bot token to connect. Make sure it has been prefixed with `Bot `."); } await this.shards.connect(); } /** * Disconnect all shards. * @param reconnect If shards should be reconnected. Defaults to {@link Types/Gateway~GatewayOptions#autoReconnect | GatewayOptions#autoReconnect} */ disconnect(reconnect = this.shards.options.autoReconnect) { return this.shards.disconnect(reconnect); } /** * Edit the client's status across all shards. * @param status The status. * @param activities An array of activities. */ async editStatus(status, activities = []) { for (const [, shard] of this.shards) await shard.editStatus(status, activities); } /** * Get a channel from an ID. This will return undefined if the channel is not cached. * @param channelID The id of the channel. */ getChannel(channelID) { if (this.channelGuildMap.has(channelID)) { return this.guilds.get(this.channelGuildMap.get(channelID))?.channels.get(channelID); } else if (this.threadGuildMap.has(channelID)) { return this.guilds.get(this.threadGuildMap.get(channelID))?.threads.get(channelID); } return (this.privateChannels.get(channelID) ?? this.groupChannels.get(channelID)); } /** * Get a helper instance that can be used with a specific access token. * @param accessToken The access token. Must be prefixed with `Bearer `. */ getOAuthHelper(accessToken) { return this.rest.oauth.getHelper(accessToken); } /** * Get a voice connection. * @param guildID The ID of the guild the voice channel belongs to. */ getVoiceConnection(guildID) { if (!DiscordJSVoice) { throw new Errors_1.DependencyError("Voice is only supported with @discordjs/voice installed."); } // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call return DiscordJSVoice.getVoiceConnection(guildID); } /** * Join a voice channel. * @param options The options to join the channel with. * */ joinVoiceChannel(options) { if (!DiscordJSVoice) { throw new Errors_1.DependencyError("Voice is only supported with @discordjs/voice installed."); } // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access return DiscordJSVoice.joinVoiceChannel({ channelId: options.channelID, guildId: options.guildID, debug: options.debug, // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment adapterCreator: options.voiceAdapterCreator, selfDeaf: options.selfDeaf, selfMute: options.selfMute }); } /** * Leave a voice channel. * @param guildID The ID of the guild the voice channel belongs to. */ leaveVoiceChannel(guildID) { // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access return this.getVoiceConnection(guildID)?.destroy(); } /** * Initialize this client for rest only use. Currently, this sets both the `application` and `user` properties (if not already present), as would happen with a gateway connection. * @param fakeReady If the client should emit a ready event. Defaults to true. */ async restMode(fakeReady = true) { this._application ??= await this.rest.applications.getCurrent(); this._user ??= await this.rest.oauth.getCurrentUser(); this.options.restMode = true; if (fakeReady) { this.emit("ready"); } return this; } } exports.default = Client; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL0NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxQkFBcUI7QUFDckIsNkVBQTZDO0FBQzdDLHFGQUFxRDtBQUNyRCx5RkFBeUQ7QUFDekQscUZBQXFEO0FBQ3JELHFFQUFxQztBQUNyQyx1RUFBdUM7QUFLdkMsK0VBQStDO0FBRS9DLGtGQUFrRDtBQUVsRCw2RkFBNkQ7QUFFN0QsK0RBQStCO0FBRy9CLDBDQUErRDtBQU0vRCx5Q0FBOEM7QUFFOUMsYUFBYTtBQUNiLElBQUksY0FBNkQsQ0FBQztBQUNsRSxJQUFJLENBQUM7SUFDRCxjQUFjLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDakQsQ0FBQztBQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUM7QUFDViw0TUFBNE07QUFFNU0scUhBQXFIO0FBQ3JILE1BQXFCLE1BQThDLFNBQVEsc0JBQWU7SUFDOUUsWUFBWSxDQUFxQjtJQUNqQyxLQUFLLENBQWdCO0lBQzdCLDJMQUEyTDtJQUMzTCxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDNUMsYUFBYSxDQUFpRDtJQUM5RCxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDMUMsTUFBTSxDQUFxRDtJQUMzRCxPQUFPLENBQXdCO0lBQy9CLGVBQWUsQ0FBcUQ7SUFDcEUsS0FBSyxDQUFVO0lBQ2YsSUFBSSxDQUFjO0lBQ2xCLE1BQU0sQ0FBZTtJQUNyQixTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2Qsd0xBQXdMO0lBQ3hMLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUMzQyxpQkFBaUIsQ0FBeUQ7SUFDMUUsS0FBSyxDQUFpQztJQUN0QyxJQUFJLENBQU87SUFDWCxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQStDLENBQUM7SUFDdkU7OztPQUdHO0lBQ0gsWUFBWSxPQUF1QjtRQUMvQixLQUFLLEVBQUUs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