From 3d06c9d872b2e79356f1239f7d0eb0577a4bcedf Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Sat, 12 Oct 2024 00:52:09 +0100 Subject: [PATCH] refactor: Deprecate fetching user flags (#10550) * refactor: deprecate fetching user flags * docs: fix reference Co-authored-by: Almeida * refactor: use function * refactor: name approach --------- Co-authored-by: Almeida --- packages/discord.js/src/managers/UserManager.js | 4 ++++ packages/discord.js/src/structures/User.js | 4 ++++ packages/discord.js/src/util/Util.js | 15 +++++++++++++++ packages/discord.js/typings/index.d.ts | 2 ++ packages/discord.js/typings/index.test-d.ts | 7 +++++++ 5 files changed, 32 insertions(+) diff --git a/packages/discord.js/src/managers/UserManager.js b/packages/discord.js/src/managers/UserManager.js index 18fdbfe46..d8927a0b2 100644 --- a/packages/discord.js/src/managers/UserManager.js +++ b/packages/discord.js/src/managers/UserManager.js @@ -7,6 +7,7 @@ const { GuildMember } = require('../structures/GuildMember'); const { Message } = require('../structures/Message'); const ThreadMember = require('../structures/ThreadMember'); const User = require('../structures/User'); +const { emitDeprecationWarningForUserFetchFlags } = require('../util/Util'); /** * Manages API methods for users and stores their cache. @@ -100,8 +101,11 @@ class UserManager extends CachedManager { * @param {UserResolvable} user The UserResolvable to identify * @param {BaseFetchOptions} [options] Additional options for this fetch * @returns {Promise} + * @deprecated This method is deprecated and will be removed in the next major version. + * Flags may still be retrieved via {@link UserManager#fetch}. */ async fetchFlags(user, options) { + emitDeprecationWarningForUserFetchFlags(this.constructor.name); return (await this.fetch(user, options)).flags; } diff --git a/packages/discord.js/src/structures/User.js b/packages/discord.js/src/structures/User.js index 0cda0e591..6c9849589 100644 --- a/packages/discord.js/src/structures/User.js +++ b/packages/discord.js/src/structures/User.js @@ -6,6 +6,7 @@ const { DiscordSnowflake } = require('@sapphire/snowflake'); const Base = require('./Base'); const TextBasedChannel = require('./interfaces/TextBasedChannel'); const UserFlagsBitField = require('../util/UserFlagsBitField'); +const { emitDeprecationWarningForUserFetchFlags } = require('../util/Util'); /** * Represents a user on Discord. @@ -346,8 +347,11 @@ class User extends Base { * Fetches this user's flags. * @param {boolean} [force=false] Whether to skip the cache check and request the API * @returns {Promise} + * @deprecated This method is deprecated and will be removed in the next major version. + * Flags may still be retrieved via {@link User#fetch}. */ fetchFlags(force = false) { + emitDeprecationWarningForUserFetchFlags(this.constructor.name); return this.client.users.fetchFlags(this.id, { force }); } diff --git a/packages/discord.js/src/util/Util.js b/packages/discord.js/src/util/Util.js index 1214ad71f..9a02719a6 100644 --- a/packages/discord.js/src/util/Util.js +++ b/packages/discord.js/src/util/Util.js @@ -1,6 +1,7 @@ 'use strict'; const { parse } = require('node:path'); +const process = require('node:process'); const { Collection } = require('@discordjs/collection'); const { ChannelType, RouteBases, Routes } = require('discord-api-types/v10'); const { fetch } = require('undici'); @@ -8,6 +9,8 @@ const Colors = require('./Colors'); const { DiscordjsError, DiscordjsRangeError, DiscordjsTypeError, ErrorCodes } = require('../errors'); const isObject = d => typeof d === 'object' && d !== null; +let deprecationEmittedForUserFetchFlags = false; + /** * Flatten an object. Any properties that are collections will get converted to an array of keys. * @param {Object} obj The object to flatten. @@ -499,6 +502,17 @@ function resolveSKUId(resolvable) { return null; } +/** + * Deprecation function for fetching user flags. + * @param {string} name Name of the class + * @private + */ +function emitDeprecationWarningForUserFetchFlags(name) { + if (deprecationEmittedForUserFetchFlags) return; + process.emitWarning(`${name}#fetchFlags() is deprecated. Use ${name}#fetch() instead.`); + deprecationEmittedForUserFetchFlags = true; +} + module.exports = { flatten, fetchRecommendedShardCount, @@ -518,6 +532,7 @@ module.exports = { parseWebhookURL, transformResolved, resolveSKUId, + emitDeprecationWarningForUserFetchFlags, }; // Fixes Circular diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index fc0d2b10a..a0d83d303 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -3461,6 +3461,7 @@ export class User extends Base { public displayAvatarURL(options?: ImageURLOptions): string; public equals(user: User): boolean; public fetch(force?: boolean): Promise; + /** @deprecated This method is deprecated and will be removed in the next major version. Flags may still be retrieved via {@link User.fetch} */ public fetchFlags(force?: boolean): Promise; public toString(): UserMention; } @@ -4693,6 +4694,7 @@ export class UserManager extends CachedManager public createDM(user: UserResolvable, options?: BaseFetchOptions): Promise; public deleteDM(user: UserResolvable): Promise; public fetch(user: UserResolvable, options?: BaseFetchOptions): Promise; + /** @deprecated This method is deprecated and will be removed in the next major version. Flags may still be retrieved via {@link UserManager.fetch} */ public fetchFlags(user: UserResolvable, options?: BaseFetchOptions): Promise; public send(user: UserResolvable, options: string | MessagePayload | MessageCreateOptions): Promise; } diff --git a/packages/discord.js/typings/index.test-d.ts b/packages/discord.js/typings/index.test-d.ts index 1f1b34f3a..c59e7de74 100644 --- a/packages/discord.js/typings/index.test-d.ts +++ b/packages/discord.js/typings/index.test-d.ts @@ -212,6 +212,7 @@ import { GuildScheduledEventManager, SendableChannels, PollData, + UserManager, } from '.'; import { expectAssignable, expectDeprecated, expectNotAssignable, expectNotType, expectType } from 'tsd'; import type { ContextMenuCommandBuilder, SlashCommandBuilder } from '@discordjs/builders'; @@ -1753,6 +1754,12 @@ declare const threadMemberManager: ThreadMemberManager; threadMemberManager.fetch({ withMember: false, limit: 5, after: '12345678901234567' }); } +declare const userManager: UserManager; +{ + expectDeprecated(userManager.fetchFlags('1234567890')); + expectDeprecated(user.fetchFlags()); +} + declare const typing: Typing; expectType(typing.user); if (typing.user.partial) expectType(typing.user.username);