mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-16 03:23:29 +01:00
feat(GuildMemberManager): nonce and chunk_count for _fetchMany (#4130)
Co-Authored-By: izexi <43889168+izexi@users.noreply.github.com>
This commit is contained in:
@@ -17,6 +17,14 @@ module.exports = (client, { d: data }) => {
|
|||||||
* @event Client#guildMembersChunk
|
* @event Client#guildMembersChunk
|
||||||
* @param {Collection<Snowflake, GuildMember>} members The members in the chunk
|
* @param {Collection<Snowflake, GuildMember>} members The members in the chunk
|
||||||
* @param {Guild} guild The guild related to the member chunk
|
* @param {Guild} guild The guild related to the member chunk
|
||||||
|
* @param {Object} chunk Properties of the received chunk
|
||||||
|
* @param {number} chunk.index Index of the received chunk
|
||||||
|
* @param {number} chunk.count Number of chunks the client should receive
|
||||||
|
* @param {?string} chunk.nonce Nonce for this chunk
|
||||||
*/
|
*/
|
||||||
client.emit(Events.GUILD_MEMBERS_CHUNK, members, guild);
|
client.emit(Events.GUILD_MEMBERS_CHUNK, members, guild, {
|
||||||
|
count: data.chunk_count,
|
||||||
|
index: data.chunk_index,
|
||||||
|
nonce: data.nonce,
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -99,6 +99,8 @@ const Messages = {
|
|||||||
|
|
||||||
DELETE_GROUP_DM_CHANNEL: "Bots don't have access to Group DM Channels and cannot delete them",
|
DELETE_GROUP_DM_CHANNEL: "Bots don't have access to Group DM Channels and cannot delete them",
|
||||||
FETCH_GROUP_DM_CHANNEL: "Bots don't have access to Group DM Channels and cannot fetch them",
|
FETCH_GROUP_DM_CHANNEL: "Bots don't have access to Group DM Channels and cannot fetch them",
|
||||||
|
|
||||||
|
MEMBER_FETCH_NONCE_LENGTH: 'Nonce length must not exceed 32 characters.',
|
||||||
};
|
};
|
||||||
|
|
||||||
for (const [name, message] of Object.entries(Messages)) register(name, message);
|
for (const [name, message] of Object.entries(Messages)) register(name, message);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const BaseManager = require('./BaseManager');
|
const BaseManager = require('./BaseManager');
|
||||||
const { Error, TypeError } = require('../errors');
|
const { Error, TypeError, RangeError } = require('../errors');
|
||||||
const GuildMember = require('../structures/GuildMember');
|
const GuildMember = require('../structures/GuildMember');
|
||||||
const Collection = require('../util/Collection');
|
const Collection = require('../util/Collection');
|
||||||
const { Events, OPCodes } = require('../util/Constants');
|
const { Events, OPCodes } = require('../util/Constants');
|
||||||
@@ -77,6 +77,7 @@ class GuildMemberManager extends BaseManager {
|
|||||||
* @property {number} [limit=0] Maximum number of members to request
|
* @property {number} [limit=0] Maximum number of members to request
|
||||||
* @property {boolean} [withPresences=false] Whether or not to include the presences
|
* @property {boolean} [withPresences=false] Whether or not to include the presences
|
||||||
* @property {number} [time=120e3] Timeout for receipt of members
|
* @property {number} [time=120e3] Timeout for receipt of members
|
||||||
|
* @property {?string} nonce Nonce for this request (32 characters max - default to base 16 now timestamp)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -224,13 +225,21 @@ class GuildMemberManager extends BaseManager {
|
|||||||
.then(data => this.add(data, cache));
|
.then(data => this.add(data, cache));
|
||||||
}
|
}
|
||||||
|
|
||||||
_fetchMany({ limit = 0, withPresences: presences = false, user: user_ids, query, time = 120e3 } = {}) {
|
_fetchMany({
|
||||||
|
limit = 0,
|
||||||
|
withPresences: presences = false,
|
||||||
|
user: user_ids,
|
||||||
|
query,
|
||||||
|
time = 120e3,
|
||||||
|
nonce = Date.now().toString(16),
|
||||||
|
} = {}) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
if (this.guild.memberCount === this.cache.size && !query && !limit && !presences && !user_ids) {
|
if (this.guild.memberCount === this.cache.size && !query && !limit && !presences && !user_ids) {
|
||||||
resolve(this.cache);
|
resolve(this.cache);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!query && !user_ids) query = '';
|
if (!query && !user_ids) query = '';
|
||||||
|
if (nonce.length > 32) throw new RangeError('MEMBER_FETCH_NONCE_LENGTH');
|
||||||
this.guild.shard.send({
|
this.guild.shard.send({
|
||||||
op: OPCodes.REQUEST_GUILD_MEMBERS,
|
op: OPCodes.REQUEST_GUILD_MEMBERS,
|
||||||
d: {
|
d: {
|
||||||
@@ -238,21 +247,25 @@ class GuildMemberManager extends BaseManager {
|
|||||||
presences,
|
presences,
|
||||||
user_ids,
|
user_ids,
|
||||||
query,
|
query,
|
||||||
|
nonce,
|
||||||
limit,
|
limit,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
const fetchedMembers = new Collection();
|
const fetchedMembers = new Collection();
|
||||||
const option = query || limit || presences || user_ids;
|
const option = query || limit || presences || user_ids;
|
||||||
const handler = (members, guild) => {
|
let i = 0;
|
||||||
if (guild.id !== this.guild.id) return;
|
const handler = (members, _, chunk) => {
|
||||||
timeout.refresh();
|
timeout.refresh();
|
||||||
|
if (chunk.nonce !== nonce) return;
|
||||||
|
i++;
|
||||||
for (const member of members.values()) {
|
for (const member of members.values()) {
|
||||||
if (option) fetchedMembers.set(member.id, member);
|
if (option) fetchedMembers.set(member.id, member);
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
this.guild.memberCount <= this.cache.size ||
|
this.guild.memberCount <= this.cache.size ||
|
||||||
(option && members.size < 1000) ||
|
(option && members.size < 1000) ||
|
||||||
(limit && fetchedMembers.size >= limit)
|
(limit && fetchedMembers.size >= limit) ||
|
||||||
|
i === chunk.count
|
||||||
) {
|
) {
|
||||||
this.guild.client.removeListener(Events.GUILD_MEMBERS_CHUNK, handler);
|
this.guild.client.removeListener(Events.GUILD_MEMBERS_CHUNK, handler);
|
||||||
let fetched = option ? fetchedMembers : this.cache;
|
let fetched = option ? fetchedMembers : this.cache;
|
||||||
|
|||||||
7
typings/index.d.ts
vendored
7
typings/index.d.ts
vendored
@@ -2200,7 +2200,11 @@ declare module 'discord.js' {
|
|||||||
guildMemberAdd: [GuildMember | PartialGuildMember];
|
guildMemberAdd: [GuildMember | PartialGuildMember];
|
||||||
guildMemberAvailable: [GuildMember | PartialGuildMember];
|
guildMemberAvailable: [GuildMember | PartialGuildMember];
|
||||||
guildMemberRemove: [GuildMember | PartialGuildMember];
|
guildMemberRemove: [GuildMember | PartialGuildMember];
|
||||||
guildMembersChunk: [Collection<Snowflake, GuildMember | PartialGuildMember>, Guild];
|
guildMembersChunk: [
|
||||||
|
Collection<Snowflake, GuildMember | PartialGuildMember>,
|
||||||
|
Guild,
|
||||||
|
{ count: number; index: number; nonce: string | undefined },
|
||||||
|
];
|
||||||
guildMemberSpeaking: [GuildMember | PartialGuildMember, Readonly<Speaking>];
|
guildMemberSpeaking: [GuildMember | PartialGuildMember, Readonly<Speaking>];
|
||||||
guildMemberUpdate: [GuildMember | PartialGuildMember, GuildMember | PartialGuildMember];
|
guildMemberUpdate: [GuildMember | PartialGuildMember, GuildMember | PartialGuildMember];
|
||||||
guildUpdate: [Guild, Guild];
|
guildUpdate: [Guild, Guild];
|
||||||
@@ -2390,6 +2394,7 @@ declare module 'discord.js' {
|
|||||||
limit?: number;
|
limit?: number;
|
||||||
withPresences?: boolean;
|
withPresences?: boolean;
|
||||||
time?: number;
|
time?: number;
|
||||||
|
nonce?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface FileOptions {
|
interface FileOptions {
|
||||||
|
|||||||
Reference in New Issue
Block a user