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