mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-11 00:53:31 +01:00
* chore: consistency/prettier * chore: rebase * chore: rebase * chore: include typings * fix: include typings file in prettier lint-staged
82 lines
2.2 KiB
JavaScript
82 lines
2.2 KiB
JavaScript
'use strict';
|
|
|
|
const Collection = require('../util/Collection');
|
|
let Structures;
|
|
|
|
/**
|
|
* Manages the API methods of a data model and holds its cache.
|
|
* @abstract
|
|
*/
|
|
class BaseManager {
|
|
constructor(client, iterable, holds, cacheType = Collection, ...cacheOptions) {
|
|
if (!Structures) Structures = require('../util/Structures');
|
|
/**
|
|
* The data structure belonging to this manager
|
|
* @name BaseManager#holds
|
|
* @type {Function}
|
|
* @private
|
|
* @readonly
|
|
*/
|
|
Object.defineProperty(this, 'holds', { value: Structures.get(holds.name) || holds });
|
|
|
|
/**
|
|
* The client that instantiated this Manager
|
|
* @name BaseManager#client
|
|
* @type {Client}
|
|
* @readonly
|
|
*/
|
|
Object.defineProperty(this, 'client', { value: client });
|
|
|
|
/**
|
|
* The type of Collection of the Manager
|
|
* @type {Collection}
|
|
*/
|
|
this.cacheType = cacheType;
|
|
|
|
/**
|
|
* Holds the cache for the data model
|
|
* @type {Collection}
|
|
*/
|
|
this.cache = new cacheType(...cacheOptions);
|
|
if (iterable) for (const i of iterable) this.add(i);
|
|
}
|
|
|
|
add(data, cache = true, { id, extras = [] } = {}) {
|
|
const existing = this.cache.get(id || data.id);
|
|
if (existing && existing._patch && cache) existing._patch(data);
|
|
if (existing) return existing;
|
|
|
|
const entry = this.holds ? new this.holds(this.client, data, ...extras) : data;
|
|
if (cache) this.cache.set(id || entry.id, entry);
|
|
return entry;
|
|
}
|
|
|
|
/**
|
|
* Resolves a data entry to a data Object.
|
|
* @param {string|Object} idOrInstance The id or instance of something in this Manager
|
|
* @returns {?Object} An instance from this Manager
|
|
*/
|
|
resolve(idOrInstance) {
|
|
if (idOrInstance instanceof this.holds) return idOrInstance;
|
|
if (typeof idOrInstance === 'string') return this.cache.get(idOrInstance) || null;
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Resolves a data entry to a instance ID.
|
|
* @param {string|Object} idOrInstance The id or instance of something in this Manager
|
|
* @returns {?Snowflake}
|
|
*/
|
|
resolveID(idOrInstance) {
|
|
if (idOrInstance instanceof this.holds) return idOrInstance.id;
|
|
if (typeof idOrInstance === 'string') return idOrInstance;
|
|
return null;
|
|
}
|
|
|
|
valueOf() {
|
|
return this.cache;
|
|
}
|
|
}
|
|
|
|
module.exports = BaseManager;
|