From ad346d45589eb2e129bd0edc4df634ef25d91188 Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Fri, 11 Oct 2024 14:29:14 +0100 Subject: [PATCH 1/3] refactor: deprecate `reason` on thread member add and remove --- .../src/managers/ThreadMemberManager.js | 26 +++++++++++++++++++ .../discord.js/src/structures/ThreadMember.js | 1 + packages/discord.js/typings/index.d.ts | 8 ++++++ packages/discord.js/typings/index.test-d.ts | 16 +++++++++++- 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/packages/discord.js/src/managers/ThreadMemberManager.js b/packages/discord.js/src/managers/ThreadMemberManager.js index e4ae5bf7d49e..e7e7382f3532 100644 --- a/packages/discord.js/src/managers/ThreadMemberManager.js +++ b/packages/discord.js/src/managers/ThreadMemberManager.js @@ -1,5 +1,6 @@ 'use strict'; +const process = require('node:process'); const { Collection } = require('@discordjs/collection'); const { makeURLSearchParams } = require('@discordjs/rest'); const { Routes } = require('discord-api-types/v10'); @@ -7,6 +8,9 @@ const CachedManager = require('./CachedManager'); const { DiscordjsTypeError, ErrorCodes } = require('../errors'); const ThreadMember = require('../structures/ThreadMember'); +let deprecationEmittedForAdd = false; +let deprecationEmittedForRemove = false; + /** * Manages API methods for GuildMembers and stores their cache. * @extends {CachedManager} @@ -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,20 @@ 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 && !deprecationEmittedForRemove) { + process.emitWarning( + // eslint-disable-next-line max-len + 'The reason parameter of ThreadMemberManager#remove() is deprecated as Discord does not parse them. It will be removed in the next major version.', + 'DeprecationWarning', + ); + + deprecationEmittedForRemove = true; + } + 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..9af7e2abdd13 100644 --- a/packages/discord.js/src/structures/ThreadMember.js +++ b/packages/discord.js/src/structures/ThreadMember.js @@ -102,6 +102,7 @@ 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) { diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index a0d83d303fe6..0817586456c5 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -3397,6 +3397,8 @@ export class ThreadMember extends Base public thread: AnyThreadChannel; public get user(): User | null; public get partial(): false; + public remove(): Promise; + /** @deprecated The `reason` parameter is deprecated as Discord does not parse them. */ public remove(reason?: string): Promise; } @@ -4671,6 +4673,9 @@ export class ThreadMemberManager extends CachedManager); public thread: AnyThreadChannel; public get me(): ThreadMember | null; + + 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; public fetch( @@ -4685,6 +4690,9 @@ export class ThreadMemberManager extends CachedManager>; public fetchMe(options?: BaseFetchOptions): Promise; + + 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; } 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; From 294741d4e0402b60e307abcb6377732ec39f3539 Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Fri, 11 Oct 2024 14:55:14 +0100 Subject: [PATCH 2/3] chore: address TSLint errors --- packages/discord.js/typings/index.d.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index 0817586456c5..8f7da19e47bc 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -3397,9 +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; @@ -4674,9 +4676,11 @@ export class ThreadMemberManager extends CachedManager; /** @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 }), @@ -4691,9 +4695,11 @@ 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 { From 654fe1f37c5aadecf73863ddba183a7b4309a785 Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Fri, 11 Oct 2024 15:38:49 +0100 Subject: [PATCH 3/3] refactor: use function --- .../src/managers/ThreadMemberManager.js | 12 +++--------- .../discord.js/src/structures/ThreadMember.js | 5 +++++ packages/discord.js/src/util/Util.js | 17 +++++++++++++++++ 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/packages/discord.js/src/managers/ThreadMemberManager.js b/packages/discord.js/src/managers/ThreadMemberManager.js index e7e7382f3532..e7c0d656db9e 100644 --- a/packages/discord.js/src/managers/ThreadMemberManager.js +++ b/packages/discord.js/src/managers/ThreadMemberManager.js @@ -7,9 +7,9 @@ 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; -let deprecationEmittedForRemove = false; /** * Manages API methods for GuildMembers and stores their cache. @@ -124,14 +124,8 @@ class ThreadMemberManager extends CachedManager { * @returns {Promise} */ async remove(member, reason) { - if (reason !== undefined && !deprecationEmittedForRemove) { - process.emitWarning( - // eslint-disable-next-line max-len - 'The reason parameter of ThreadMemberManager#remove() is deprecated as Discord does not parse them. It will be removed in the next major version.', - 'DeprecationWarning', - ); - - deprecationEmittedForRemove = true; + if (reason !== undefined) { + emitDeprecationWarningForRemoveThreadMember(this.constructor.name); } const id = member === '@me' ? member : this.client.users.resolveId(member); diff --git a/packages/discord.js/src/structures/ThreadMember.js b/packages/discord.js/src/structures/ThreadMember.js index 9af7e2abdd13..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. @@ -106,6 +107,10 @@ class ThreadMember extends Base { * @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