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;