feat(ThreadMemberManager): allow individual members to be fetched (#6889)

Co-authored-by: ckohen <chaikohen@gmail.com>
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
This commit is contained in:
Suneet Tipirneni
2021-10-29 08:57:53 -04:00
committed by GitHub
parent aa4d05504f
commit 14716df6b6
5 changed files with 49 additions and 10 deletions

View File

@@ -17,7 +17,7 @@ jobs:
node-version: 16 node-version: 16
registry-url: https://registry.npmjs.org/ registry-url: https://registry.npmjs.org/
cache: npm cache: npm
- name: pre-release - name: pre-release
id: pre-release id: pre-release
run: | run: |

14
package-lock.json generated
View File

@@ -5,6 +5,7 @@
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "discord.js",
"version": "13.3.0-dev", "version": "13.3.0-dev",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
@@ -991,6 +992,14 @@
"npm": ">=7.0.0" "npm": ">=7.0.0"
} }
}, },
"node_modules/@discordjs/builders/node_modules/discord-api-types": {
"version": "0.24.0",
"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.24.0.tgz",
"integrity": "sha512-X0uA2a92cRjowUEXpLZIHWl4jiX1NsUpDhcEOpa1/hpO1vkaokgZ8kkPtPih9hHth5UVQ3mHBu/PpB4qjyfJ4A==",
"engines": {
"node": ">=12"
}
},
"node_modules/@discordjs/builders/node_modules/tslib": { "node_modules/@discordjs/builders/node_modules/tslib": {
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
@@ -12916,6 +12925,11 @@
"tslib": "^2.3.1" "tslib": "^2.3.1"
}, },
"dependencies": { "dependencies": {
"discord-api-types": {
"version": "0.24.0",
"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.24.0.tgz",
"integrity": "sha512-X0uA2a92cRjowUEXpLZIHWl4jiX1NsUpDhcEOpa1/hpO1vkaokgZ8kkPtPih9hHth5UVQ3mHBu/PpB4qjyfJ4A=="
},
"tslib": { "tslib": {
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",

View File

@@ -92,17 +92,32 @@ class ThreadMemberManager extends CachedManager {
return id; return id;
} }
async _fetchOne(memberId, cache, force) {
if (!force) {
const existing = this.cache.get(memberId);
if (existing) return existing;
}
const data = await this.client.api.channels(this.thread.id, 'thread-members', memberId).get();
return this._add(data, cache);
}
async _fetchMany(cache) {
const raw = await this.client.api.channels(this.thread.id, 'thread-members').get();
return raw.reduce((col, member) => col.set(member.user_id, this._add(member, cache)), new Collection());
}
/** /**
* Fetches member(s) for the thread from Discord, requires access to the `GUILD_MEMBERS` gateway intent. * Fetches member(s) for the thread from Discord, requires access to the `GUILD_MEMBERS` gateway intent.
* @param {boolean} [cache=true] Whether or not to cache the fetched members * @param {UserResolvable|boolean} [member] The member to fetch. If `undefined`, all members
* @returns {Promise<Collection<Snowflake, ThreadMember>>} * in the thread are fetched, and will be cached based on `options.cache`. If boolean, this serves
* the purpose of `options.cache`.
* @param {BaseFetchOptions} [options] Additional options for this fetch
* @returns {Promise<ThreadMember|Collection<Snowflake, ThreadMember>>}
*/ */
async fetch(cache = true) { fetch(member, { cache = true, force = false } = {}) {
const raw = await this.client.api.channels(this.thread.id, 'thread-members').get(); const id = this.resolveId(member);
return raw.reduce((col, rawMember) => { return id ? this._fetchOne(id, cache, force) : this._fetchMany(member ?? cache);
const member = this._add(rawMember, cache);
return col.set(member.id, member);
}, new Collection());
} }
} }

2
typings/index.d.ts vendored
View File

@@ -2946,6 +2946,8 @@ export class ThreadMemberManager extends CachedManager<Snowflake, ThreadMember,
private constructor(thread: ThreadChannel, iterable?: Iterable<RawThreadMemberData>); private constructor(thread: ThreadChannel, iterable?: Iterable<RawThreadMemberData>);
public thread: ThreadChannel; public thread: ThreadChannel;
public add(member: UserResolvable | '@me', reason?: string): Promise<Snowflake>; public add(member: UserResolvable | '@me', reason?: string): Promise<Snowflake>;
public fetch(member?: UserResolvable, options?: BaseFetchOptions): Promise<ThreadMember>;
/** @deprecated Use `fetch(member, options)` instead. */
public fetch(cache?: boolean): Promise<Collection<Snowflake, ThreadMember>>; public fetch(cache?: boolean): Promise<Collection<Snowflake, ThreadMember>>;
public remove(id: Snowflake | '@me', reason?: string): Promise<Snowflake>; public remove(id: Snowflake | '@me', reason?: string): Promise<Snowflake>;
} }

View File

@@ -75,6 +75,7 @@ import {
TextBasedChannels, TextBasedChannels,
TextChannel, TextChannel,
ThreadChannel, ThreadChannel,
ThreadMember,
Typing, Typing,
User, User,
VoiceChannel, VoiceChannel,
@@ -446,10 +447,17 @@ client.on('ready', async () => {
// This is to check that stuff is the right type // This is to check that stuff is the right type
declare const assertIsPromiseMember: (m: Promise<GuildMember>) => void; declare const assertIsPromiseMember: (m: Promise<GuildMember>) => void;
client.on('guildCreate', g => { client.on('guildCreate', async g => {
const channel = g.channels.cache.random(); const channel = g.channels.cache.random();
if (!channel) return; if (!channel) return;
if (channel.isThread()) {
const fetchedMember = await channel.members.fetch('12345678');
assertType<ThreadMember>(fetchedMember);
const fetchedMemberCol = await channel.members.fetch(true);
assertType<Collection<Snowflake, ThreadMember>>(fetchedMemberCol);
}
channel.setName('foo').then(updatedChannel => { channel.setName('foo').then(updatedChannel => {
console.log(`New channel name: ${updatedChannel.name}`); console.log(`New channel name: ${updatedChannel.name}`);
}); });