import type { APIGuildMember } from 'discord-api-types/v10'; import type { ReturnCache } from '../..'; import { fakePromise } from '../../common'; import { GuildMember } from '../../structures'; import { GuildBasedResource } from './default/guild-based'; export class Members extends GuildBasedResource { namespace = 'member'; //@ts-expect-error filter(data: APIGuildMember, id: string, guild_id: string) { return true; } override parse(data: any, key: string, guild_id: string) { const { user, ...rest } = super.parse(data, data.user?.id ?? key, guild_id); return rest; } override get(id: string, guild: string): ReturnCache { return fakePromise(super.get(id, guild)).then(rawMember => fakePromise(this.client.cache.users?.get(id)).then(user => rawMember && user ? new GuildMember(this.client, rawMember, user, guild) : undefined, ), ); } override bulk(ids: string[], guild: string): ReturnCache { return fakePromise(super.bulk(ids, guild)).then(members => fakePromise(this.client.cache.users?.bulk(ids)).then( users => members .map(rawMember => { const user = users?.find(x => x.id === rawMember.id); return user ? new GuildMember(this.client, rawMember, user, guild) : undefined; }) .filter(Boolean) as GuildMember[], ), ); } override values(guild: string): ReturnCache { return fakePromise(super.values(guild)).then(members => fakePromise(this.client.cache.users?.values()).then( users => members .map(rawMember => { const user = users?.find(x => x.id === rawMember.id); return user ? new GuildMember(this.client, rawMember, user, rawMember.guild_id) : undefined; }) .filter(Boolean) as GuildMember[], ), ); } override async set(memberId: string, guildId: string, data: any): Promise; override async set(memberId_dataArray: [string, any][], guildId: string): Promise; override async set(__keys: string | [string, any][], guild: string, data?: any) { const keys: [string, any][] = Array.isArray(__keys) ? __keys : [[__keys, data]]; const bulkData: (['members', any, string, string] | ['users', any, string])[] = []; for (const [id, value] of keys) { if (value.user) { bulkData.push(['members', value, id, guild]); bulkData.push(['users', value.user, id]); } } await this.cache.bulkSet(bulkData); } }