perf: optimize members cache

This commit is contained in:
MARCROCK22 2025-04-23 20:58:23 -04:00
parent ce3d75121d
commit f03eb57ed5
2 changed files with 28 additions and 14 deletions

View File

@ -18,7 +18,7 @@ export class Guilds extends BaseResource<any, APIGuild | GatewayGuildCreateDispa
); );
} }
raw(id: string): ReturnCache<APIGuild | undefined> { raw(id: string): ReturnCache<(APIGuild & { member_count?: number }) | undefined> {
return super.get(id); return super.get(id);
} }
@ -28,7 +28,7 @@ export class Guilds extends BaseResource<any, APIGuild | GatewayGuildCreateDispa
); );
} }
bulkRaw(ids: string[]): ReturnCache<APIGuild[]> { bulkRaw(ids: string[]): ReturnCache<(APIGuild & { member_count?: number })[]> {
return super.bulk(ids); return super.bulk(ids);
} }
@ -38,7 +38,7 @@ export class Guilds extends BaseResource<any, APIGuild | GatewayGuildCreateDispa
); );
} }
valuesRaw(): ReturnCache<APIGuild[]> { valuesRaw(): ReturnCache<(APIGuild & { member_count?: number })[]> {
return super.values(); return super.values();
} }

View File

@ -1,7 +1,7 @@
import type { CacheFrom, ReturnCache } from '../..'; import type { CacheFrom, ReturnCache } from '../..';
import { type GuildMemberStructure, Transformers } from '../../client/transformers'; import { type GuildMemberStructure, Transformers } from '../../client/transformers';
import { fakePromise } from '../../common'; import { fakePromise } from '../../common';
import type { APIGuildMember } from '../../types'; import type { APIGuildMember, APIUser } from '../../types';
import { GuildBasedResource } from './default/guild-based'; import { GuildBasedResource } from './default/guild-based';
export class Members extends GuildBasedResource<any, APIGuildMember> { export class Members extends GuildBasedResource<any, APIGuildMember> {
namespace = 'member'; namespace = 'member';
@ -39,14 +39,21 @@ export class Members extends GuildBasedResource<any, APIGuildMember> {
override bulk(ids: string[], guild: string): ReturnCache<GuildMemberStructure[]> { override bulk(ids: string[], guild: string): ReturnCache<GuildMemberStructure[]> {
return fakePromise(super.bulk(ids, guild)).then(members => return fakePromise(super.bulk(ids, guild)).then(members =>
fakePromise(this.client.cache.users?.bulkRaw(ids)).then(users => fakePromise(this.client.cache.users?.bulkRaw(ids)).then(users => {
members if (!users) return [];
let usersRecord: null | Partial<Record<string, APIUser>> = {};
for (const user of users) {
usersRecord[user.id] = user;
}
const result = members
.map(rawMember => { .map(rawMember => {
const user = users?.find(x => x.id === rawMember.id); const user = usersRecord![rawMember.id];
return user ? Transformers.GuildMember(this.client, rawMember, user, guild) : undefined; return user ? Transformers.GuildMember(this.client, rawMember, user, guild) : undefined;
}) })
.filter(x => x !== undefined), .filter(x => x !== undefined);
), usersRecord = null;
return result;
}),
); );
} }
@ -56,14 +63,21 @@ export class Members extends GuildBasedResource<any, APIGuildMember> {
override values(guild: string): ReturnCache<GuildMemberStructure[]> { override values(guild: string): ReturnCache<GuildMemberStructure[]> {
return fakePromise(super.values(guild)).then(members => return fakePromise(super.values(guild)).then(members =>
fakePromise(this.client.cache.users?.valuesRaw()).then(users => fakePromise(this.client.cache.users?.bulkRaw(members.map(member => member.id))).then(users => {
members if (!users) return [];
let usersRecord: null | Partial<Record<string, APIUser>> = {};
for (const user of users) {
usersRecord[user.id] = user;
}
const result = members
.map(rawMember => { .map(rawMember => {
const user = users?.find(x => x.id === rawMember.id); const user = usersRecord![rawMember.id];
return user ? Transformers.GuildMember(this.client, rawMember, user, rawMember.guild_id) : undefined; return user ? Transformers.GuildMember(this.client, rawMember, user, rawMember.guild_id) : undefined;
}) })
.filter(x => x !== undefined), .filter(x => x !== undefined);
), usersRecord = null;
return result;
}),
); );
} }