summaryrefslogtreecommitdiff
path: root/node_modules/discord.js/src/structures/GuildTemplate.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/discord.js/src/structures/GuildTemplate.js')
-rw-r--r--node_modules/discord.js/src/structures/GuildTemplate.js241
1 files changed, 241 insertions, 0 deletions
diff --git a/node_modules/discord.js/src/structures/GuildTemplate.js b/node_modules/discord.js/src/structures/GuildTemplate.js
new file mode 100644
index 0000000..c1e219b
--- /dev/null
+++ b/node_modules/discord.js/src/structures/GuildTemplate.js
@@ -0,0 +1,241 @@
+'use strict';
+
+const { setTimeout, clearTimeout } = require('node:timers');
+const { RouteBases, Routes } = require('discord-api-types/v10');
+const Base = require('./Base');
+const DataResolver = require('../util/DataResolver');
+const Events = require('../util/Events');
+
+/**
+ * Represents the template for a guild.
+ * @extends {Base}
+ */
+class GuildTemplate extends Base {
+ /**
+ * A regular expression that matches guild template links.
+ * The `code` group property is present on the `exec()` result of this expression.
+ * @type {RegExp}
+ * @memberof GuildTemplate
+ */
+ static GuildTemplatesPattern = /discord(?:app)?\.(?:com\/template|new)\/(?<code>[\w-]{2,255})/i;
+
+ constructor(client, data) {
+ super(client);
+ this._patch(data);
+ }
+
+ _patch(data) {
+ if ('code' in data) {
+ /**
+ * The unique code of this template
+ * @type {string}
+ */
+ this.code = data.code;
+ }
+
+ if ('name' in data) {
+ /**
+ * The name of this template
+ * @type {string}
+ */
+ this.name = data.name;
+ }
+
+ if ('description' in data) {
+ /**
+ * The description of this template
+ * @type {?string}
+ */
+ this.description = data.description;
+ }
+
+ if ('usage_count' in data) {
+ /**
+ * The amount of times this template has been used
+ * @type {number}
+ */
+ this.usageCount = data.usage_count;
+ }
+
+ if ('creator_id' in data) {
+ /**
+ * The id of the user that created this template
+ * @type {Snowflake}
+ */
+ this.creatorId = data.creator_id;
+ }
+
+ if ('creator' in data) {
+ /**
+ * The user that created this template
+ * @type {User}
+ */
+ this.creator = this.client.users._add(data.creator);
+ }
+
+ if ('created_at' in data) {
+ /**
+ * The timestamp of when this template was created at
+ * @type {number}
+ */
+ this.createdTimestamp = Date.parse(data.created_at);
+ }
+
+ if ('updated_at' in data) {
+ /**
+ * The timestamp of when this template was last synced to the guild
+ * @type {number}
+ */
+ this.updatedTimestamp = Date.parse(data.updated_at);
+ }
+
+ if ('source_guild_id' in data) {
+ /**
+ * The id of the guild that this template belongs to
+ * @type {Snowflake}
+ */
+ this.guildId = data.source_guild_id;
+ }
+
+ if ('serialized_source_guild' in data) {
+ /**
+ * The data of the guild that this template would create
+ * @type {APIGuild}
+ */
+ this.serializedGuild = data.serialized_source_guild;
+ }
+
+ /**
+ * Whether this template has unsynced changes
+ * @type {?boolean}
+ */
+ this.unSynced = 'is_dirty' in data ? Boolean(data.is_dirty) : null;
+
+ return this;
+ }
+
+ /**
+ * Creates a guild based on this template.
+ * <warn>This is only available to bots in fewer than 10 guilds.</warn>
+ * @param {string} name The name of the guild
+ * @param {BufferResolvable|Base64Resolvable} [icon] The icon for the guild
+ * @returns {Promise<Guild>}
+ */
+ async createGuild(name, icon) {
+ const { client } = this;
+ const data = await client.rest.post(Routes.template(this.code), {
+ body: {
+ name,
+ icon: await DataResolver.resolveImage(icon),
+ },
+ });
+
+ if (client.guilds.cache.has(data.id)) return client.guilds.cache.get(data.id);
+
+ return new Promise(resolve => {
+ const resolveGuild = guild => {
+ client.off(Events.GuildCreate, handleGuild);
+ client.decrementMaxListeners();
+ resolve(guild);
+ };
+
+ const handleGuild = guild => {
+ if (guild.id === data.id) {
+ clearTimeout(timeout);
+ resolveGuild(guild);
+ }
+ };
+
+ client.incrementMaxListeners();
+ client.on(Events.GuildCreate, handleGuild);
+
+ const timeout = setTimeout(() => resolveGuild(client.guilds._add(data)), 10_000).unref();
+ });
+ }
+
+ /**
+ * Options used to edit a guild template.
+ * @typedef {Object} GuildTemplateEditOptions
+ * @property {string} [name] The name of this template
+ * @property {string} [description] The description of this template
+ */
+
+ /**
+ * Updates the metadata of this template.
+ * @param {GuildTemplateEditOptions} [options] Options for editing the template
+ * @returns {Promise<GuildTemplate>}
+ */
+ async edit({ name, description } = {}) {
+ const data = await this.client.rest.patch(Routes.guildTemplate(this.guildId, this.code), {
+ body: { name, description },
+ });
+ return this._patch(data);
+ }
+
+ /**
+ * Deletes this template.
+ * @returns {Promise<GuildTemplate>}
+ */
+ async delete() {
+ await this.client.rest.delete(Routes.guildTemplate(this.guildId, this.code));
+ return this;
+ }
+
+ /**
+ * Syncs this template to the current state of the guild.
+ * @returns {Promise<GuildTemplate>}
+ */
+ async sync() {
+ const data = await this.client.rest.put(Routes.guildTemplate(this.guildId, this.code));
+ return this._patch(data);
+ }
+
+ /**
+ * The time when this template was created at
+ * @type {Date}
+ * @readonly
+ */
+ get createdAt() {
+ return new Date(this.createdTimestamp);
+ }
+
+ /**
+ * The time when this template was last synced to the guild
+ * @type {Date}
+ * @readonly
+ */
+ get updatedAt() {
+ return new Date(this.updatedTimestamp);
+ }
+
+ /**
+ * The guild that this template belongs to
+ * @type {?Guild}
+ * @readonly
+ */
+ get guild() {
+ return this.client.guilds.resolve(this.guildId);
+ }
+
+ /**
+ * The URL of this template
+ * @type {string}
+ * @readonly
+ */
+ get url() {
+ return `${RouteBases.template}/${this.code}`;
+ }
+
+ /**
+ * When concatenated with a string, this automatically returns the template's code instead of the template object.
+ * @returns {string}
+ * @example
+ * // Logs: Template: FKvmczH2HyUf
+ * console.log(`Template: ${guildTemplate}!`);
+ */
+ toString() {
+ return this.code;
+ }
+}
+
+module.exports = GuildTemplate;