Don't abuse the API in resolveUser/resolveMember

This commit is contained in:
Dragory 2019-05-02 18:25:25 +03:00
parent d776eb1710
commit a84fb87324

View file

@ -530,6 +530,9 @@ export class UnknownUser {
} }
} }
const unknownUsers = new Set();
const unknownMembers = new Set();
export async function resolveUser(bot: Client, value: string): Promise<User | UnknownUser> { export async function resolveUser(bot: Client, value: string): Promise<User | UnknownUser> {
if (value == null || typeof value !== "string") { if (value == null || typeof value !== "string") {
return new UnknownUser(); return new UnknownUser();
@ -565,11 +568,18 @@ export async function resolveUser(bot: Client, value: string): Promise<User | Un
const cachedUser = bot.users.find(u => u.id === userId); const cachedUser = bot.users.find(u => u.id === userId);
if (cachedUser) return cachedUser; if (cachedUser) return cachedUser;
// try { // We only fetch the user from the API if we haven't tried it before:
// const freshUser = await bot.getRESTUser(userId); // - If the user was found, the bot has them in its cache
// bot.users.add(freshUser, bot); // - If the user was not found, they'll be in unknownUsers
// return freshUser; if (!unknownUsers.has(userId)) {
// } catch (e) {} // tslint:disable-line try {
const freshUser = await bot.getRESTUser(userId);
bot.users.add(freshUser, bot);
return freshUser;
} catch (e) {} // tslint:disable-line
unknownUsers.add(userId);
}
return new UnknownUser({ id: userId }); return new UnknownUser({ id: userId });
} }
@ -582,14 +592,22 @@ export async function resolveMember(bot: Client, guild: Guild, value: string): P
// See if we have the member cached... // See if we have the member cached...
let member = guild.members.get(user.id); let member = guild.members.get(user.id);
// If not, fetch it from the API // We only fetch the member from the API if we haven't tried it before:
// if (!member) { // - If the member was found, the bot has them in the guild's member cache
// try { // - If the member was not found, they'll be in unknownMembers
// member = await bot.getRESTGuildMember(guild.id, user.id); const unknownKey = `${guild.id}-${user.id}`;
// member.id = user.id; if (!unknownMembers.has(unknownKey)) {
// member.guild = guild; // If not, fetch it from the API
// } catch (e) {} // tslint:disable-line if (!member) {
// } try {
member = await bot.getRESTGuildMember(guild.id, user.id);
member.id = user.id;
member.guild = guild;
} catch (e) {} // tslint:disable-line
}
if (!member) unknownMembers.add(unknownKey);
}
return member; return member;
} }