From 72e0c994547f2a9c99b320870e14d7f1643f3851 Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Sat, 12 Oct 2024 00:57:14 +0100 Subject: [PATCH] refactor: Deprecate `reason` parameter on adding and removing thread members (#10551) * refactor: deprecate `reason` on thread member add and remove * chore: address TSLint errors * refactor: use function --- .../src/managers/ThreadMemberManager.js | 20 +++++++++++++++++++ .../discord.js/src/structures/ThreadMember.js | 6 ++++++ packages/discord.js/src/util/Util.js | 17 ++++++++++++++++ packages/discord.js/typings/index.d.ts | 14 +++++++++++++ packages/discord.js/typings/index.test-d.ts | 16 ++++++++++++++- 5 files changed, 72 insertions(+), 1 deletion(-) diff --git a/packages/discord.js/src/managers/ThreadMemberManager.js b/packages/discord.js/src/managers/ThreadMemberManager.js index e4ae5bf7d49e..e7c0d656db9e 100644 --- a/packages/discord.js/src/managers/ThreadMemberManager.js +++ b/packages/discord.js/src/managers/ThreadMemberManager.js @@ -1,11 +1,15 @@ 'use strict'; +const process = require('node:process'); const { Collection } = require('@discordjs/collection'); const { makeURLSearchParams } = require('@discordjs/rest'); const { Routes } = require('discord-api-types/v10'); const CachedManager = require('./CachedManager'); const { DiscordjsTypeError, ErrorCodes } = require('../errors'); const ThreadMember = require('../structures/ThreadMember'); +const { emitDeprecationWarningForRemoveThreadMember } = require('../util/Util'); + +let deprecationEmittedForAdd = false; /** * Manages API methods for GuildMembers and stores their cache. @@ -92,9 +96,20 @@ class ThreadMemberManager extends CachedManager { * Adds a member to the thread. * @param {UserResolvable|'@me'} member The member to add * @param {string} [reason] The reason for adding this member + * This parameter is **deprecated**. Reasons cannot be used. * @returns {Promise} */ async add(member, reason) { + if (reason !== undefined && !deprecationEmittedForAdd) { + process.emitWarning( + // eslint-disable-next-line max-len + 'The reason parameter of ThreadMemberManager#add() is deprecated as Discord does not parse them. It will be removed in the next major version.', + 'DeprecationWarning', + ); + + deprecationEmittedForAdd = true; + } + const id = member === '@me' ? member : this.client.users.resolveId(member); if (!id) throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'member', 'UserResolvable'); await this.client.rest.put(Routes.threadMembers(this.thread.id, id), { reason }); @@ -105,9 +120,14 @@ class ThreadMemberManager extends CachedManager { * Remove a user from the thread. * @param {UserResolvable|'@me'} member The member to remove * @param {string} [reason] The reason for removing this member from the thread + * This parameter is **deprecated**. Reasons cannot be used. * @returns {Promise} */ async remove(member, reason) { + if (reason !== undefined) { + emitDeprecationWarningForRemoveThreadMember(this.constructor.name); + } + const id = member === '@me' ? member : this.client.users.resolveId(member); if (!id) throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'member', 'UserResolvable'); await this.client.rest.delete(Routes.threadMembers(this.thread.id, id), { reason }); diff --git a/packages/discord.js/src/structures/ThreadMember.js b/packages/discord.js/src/structures/ThreadMember.js index 1df5f7071f6f..c89041c262f2 100644 --- a/packages/discord.js/src/structures/ThreadMember.js +++ b/packages/discord.js/src/structures/ThreadMember.js @@ -2,6 +2,7 @@ const Base = require('./Base'); const ThreadMemberFlagsBitField = require('../util/ThreadMemberFlagsBitField'); +const { emitDeprecationWarningForRemoveThreadMember } = require('../util/Util'); /** * Represents a Member for a Thread. @@ -102,9 +103,14 @@ class ThreadMember extends Base { /** * Removes this member from the thread. * @param {string} [reason] Reason for removing the member + * This parameter is **deprecated**. Reasons cannot be used. * @returns {Promise} */ async remove(reason) { + if (reason !== undefined) { + emitDeprecationWarningForRemoveThreadMember(this.constructor.name); + } + await this.thread.members.remove(this.id, reason); return this; } diff --git a/packages/discord.js/src/util/Util.js b/packages/discord.js/src/util/Util.js index 9a02719a63b3..08d214286ec9 100644 --- a/packages/discord.js/src/util/Util.js +++ b/packages/discord.js/src/util/Util.js @@ -10,6 +10,7 @@ const { DiscordjsError, DiscordjsRangeError, DiscordjsTypeError, ErrorCodes } = const isObject = d => typeof d === 'object' && d !== null; let deprecationEmittedForUserFetchFlags = false; +let deprecationEmittedForRemoveThreadMember = false; /** * Flatten an object. Any properties that are collections will get converted to an array of keys. @@ -513,6 +514,21 @@ function emitDeprecationWarningForUserFetchFlags(name) { deprecationEmittedForUserFetchFlags = true; } +/** + * Deprecation function for the reason parameter of removing thread members. + * @param {string} name Name of the class + * @private + */ +function emitDeprecationWarningForRemoveThreadMember(name) { + if (deprecationEmittedForRemoveThreadMember) return; + + process.emitWarning( + `The reason parameter of ${name}#remove() is deprecated as Discord does not parse them. It will be removed in the next major version.`, + ); + + deprecationEmittedForRemoveThreadMember = true; +} + module.exports = { flatten, fetchRecommendedShardCount, @@ -533,6 +549,7 @@ module.exports = { transformResolved, resolveSKUId, emitDeprecationWarningForUserFetchFlags, + emitDeprecationWarningForRemoveThreadMember, }; // Fixes Circular diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index a0d83d303fe6..8f7da19e47bc 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -3397,7 +3397,11 @@ export class ThreadMember extends Base public thread: AnyThreadChannel; public get user(): User | null; public get partial(): false; + /* tslint:disable:unified-signatures */ + public remove(): Promise; + /** @deprecated The `reason` parameter is deprecated as Discord does not parse them. */ public remove(reason?: string): Promise; + /* tslint:enable:unified-signatures */ } export type ThreadMemberFlagsString = keyof typeof ThreadMemberFlags; @@ -4671,7 +4675,12 @@ export class ThreadMemberManager extends CachedManager); public thread: AnyThreadChannel; public get me(): ThreadMember | null; + + /* tslint:disable:unified-signatures */ + public add(member: UserResolvable | '@me'): Promise; + /** @deprecated The `reason` parameter is deprecated as Discord does not parse them. */ public add(member: UserResolvable | '@me', reason?: string): Promise; + /* tslint:enable:unified-signatures */ public fetch( options: ThreadMember | ((FetchThreadMemberOptions & { withMember: true }) | { member: ThreadMember }), @@ -4685,7 +4694,12 @@ export class ThreadMemberManager extends CachedManager>; public fetchMe(options?: BaseFetchOptions): Promise; + + /* tslint:disable:unified-signatures */ + public remove(member: UserResolvable | '@me'): Promise; + /** @deprecated The `reason` parameter is deprecated as Discord does not parse them. */ public remove(member: UserResolvable | '@me', reason?: string): Promise; + /* tslint:enable:unified-signatures */ } export class UserManager extends CachedManager { diff --git a/packages/discord.js/typings/index.test-d.ts b/packages/discord.js/typings/index.test-d.ts index c59e7de74a96..07444ec3db32 100644 --- a/packages/discord.js/typings/index.test-d.ts +++ b/packages/discord.js/typings/index.test-d.ts @@ -214,7 +214,14 @@ import { PollData, UserManager, } from '.'; -import { expectAssignable, expectDeprecated, expectNotAssignable, expectNotType, expectType } from 'tsd'; +import { + expectAssignable, + expectDeprecated, + expectNotAssignable, + expectNotDeprecated, + expectNotType, + expectType, +} from 'tsd'; import type { ContextMenuCommandBuilder, SlashCommandBuilder } from '@discordjs/builders'; import { ReadonlyCollection } from '@discordjs/collection'; @@ -1752,6 +1759,13 @@ declare const threadMemberManager: ThreadMemberManager; threadMemberManager.fetch({ cache: true, force: false }); // @ts-expect-error `withMember` needs to be `true` to receive paginated results. threadMemberManager.fetch({ withMember: false, limit: 5, after: '12345678901234567' }); + + expectNotDeprecated(threadMemberManager.add('1234678')); + expectDeprecated(threadMemberManager.add('1234678', 'reason')); + expectNotDeprecated(threadMemberManager.remove('1234678')); + expectDeprecated(threadMemberManager.remove('1234678', 'reason')); + expectNotDeprecated(threadMemberWithGuildMember.remove()); + expectDeprecated(threadMemberWithGuildMember.remove('reason')); } declare const userManager: UserManager;