diff --git a/src/structures/Guild.js b/src/structures/Guild.js
index 05b211479..dea3781c3 100644
--- a/src/structures/Guild.js
+++ b/src/structures/Guild.js
@@ -1,5 +1,6 @@
'use strict';
+const { deprecate } = require('util');
const Base = require('./Base');
const GuildAuditLogs = require('./GuildAuditLogs');
const GuildPreview = require('./GuildPreview');
@@ -7,6 +8,7 @@ const Integration = require('./Integration');
const Invite = require('./Invite');
const VoiceRegion = require('./VoiceRegion');
const Webhook = require('./Webhook');
+const { Error, TypeError } = require('../errors');
const GuildChannelManager = require('../managers/GuildChannelManager');
const GuildEmojiManager = require('../managers/GuildEmojiManager');
const GuildMemberManager = require('../managers/GuildMemberManager');
@@ -331,6 +333,15 @@ class Guild extends Base {
*/
this.vanityURLCode = data.vanity_url_code;
+ /* eslint-disable max-len */
+ /**
+ * The use count of the vanity URL code of the guild, if any
+ * You will need to fetch the guild using {@link Guild#fetchVanityCode} if you want to receive this parameter
+ * @type {?number}
+ */
+ this.vanityURLUses = null;
+ /* eslint-enable max-len */
+
/**
* The description of the guild, if any
* @type {?string}
@@ -750,6 +761,7 @@ class Guild extends Base {
* Fetches the vanity url invite code to this guild.
* Resolves with a string matching the vanity url invite code, not the full url.
* @returns {Promise}
+ * @deprecated
* @example
* // Fetch invites
* guild.fetchVanityCode()
@@ -768,6 +780,35 @@ class Guild extends Base {
.then(res => res.code);
}
+ /**
+ * An object containing information about a guild's vanity invite.
+ * @typedef {Object} Vanity
+ * @property {?string} code Vanity invite code
+ * @property {?number} uses How many times this invite has been used
+ */
+
+ /**
+ * Fetches the vanity url invite object to this guild.
+ * Resolves with an object containing the vanity url invite code and the use count
+ * @returns {Promise}
+ * @example
+ * // Fetch invite data
+ * guild.fetchVanityData()
+ * .then(res => {
+ * console.log(`Vanity URL: https://discord.gg/${res.code} with ${res.uses} uses`);
+ * })
+ * .catch(console.error);
+ */
+ async fetchVanityData() {
+ if (!this.features.includes('VANITY_URL')) {
+ throw new Error('VANITY_URL');
+ }
+ const data = await this.client.api.guilds(this.id, 'vanity-url').get();
+ this.vanityURLUses = data.uses;
+
+ return data;
+ }
+
/**
* Fetches all webhooks for the guild.
* @returns {Promise>}
@@ -1369,4 +1410,9 @@ class Guild extends Base {
}
}
+Guild.prototype.fetchVanityCode = deprecate(
+ Guild.prototype.fetchVanityCode,
+ 'Guild#fetchVanityCode: Use fetchVanityData() instead',
+);
+
module.exports = Guild;
diff --git a/typings/index.d.ts b/typings/index.d.ts
index f9b0552a7..44b10530a 100644
--- a/typings/index.d.ts
+++ b/typings/index.d.ts
@@ -638,6 +638,7 @@ declare module 'discord.js' {
public systemChannelFlags: Readonly;
public systemChannelID: Snowflake | null;
public vanityURLCode: string | null;
+ public vanityURLUses: number | null;
public verificationLevel: VerificationLevel;
public readonly verified: boolean;
public readonly voice: VoiceState | null;
@@ -660,6 +661,7 @@ declare module 'discord.js' {
public fetchInvites(): Promise>;
public fetchPreview(): Promise;
public fetchVanityCode(): Promise;
+ public fetchVanityData(): Promise<{ code: string; uses: number }>;
public fetchVoiceRegions(): Promise>;
public fetchWebhooks(): Promise>;
public iconURL(options?: ImageURLOptions & { dynamic?: boolean }): string | null;