mirror of
https://github.com/tiramisulabs/seyfert.git
synced 2025-07-01 20:46:08 +00:00
225 lines
6.2 KiB
TypeScript
225 lines
6.2 KiB
TypeScript
import type { Cache, ReturnCache } from '..';
|
|
import { type GuildStructure, Transformers } from '../../client/transformers';
|
|
import { fakePromise } from '../../common';
|
|
import type { APIGuild, GatewayGuildCreateDispatchData } from '../../types';
|
|
import { BaseResource } from './default/base';
|
|
|
|
export class Guilds extends BaseResource<any, APIGuild | GatewayGuildCreateDispatchData> {
|
|
namespace = 'guild';
|
|
|
|
//@ts-expect-error
|
|
filter(data: APIGuild, id: string) {
|
|
return true;
|
|
}
|
|
|
|
override get(id: string): ReturnCache<GuildStructure<'cached'> | undefined> {
|
|
return fakePromise(super.get(id)).then(guild =>
|
|
guild ? Transformers.Guild<'cached'>(this.client, guild) : undefined,
|
|
);
|
|
}
|
|
|
|
raw(id: string): ReturnCache<APIGuild | undefined> {
|
|
return super.get(id);
|
|
}
|
|
|
|
override bulk(ids: string[]): ReturnCache<GuildStructure<'cached'>[]> {
|
|
return fakePromise(super.bulk(ids) as APIGuild[]).then(guilds =>
|
|
guilds.map(x => Transformers.Guild<'cached'>(this.client, x)),
|
|
);
|
|
}
|
|
|
|
bulkRaw(ids: string[]): ReturnCache<APIGuild[]> {
|
|
return super.bulk(ids);
|
|
}
|
|
|
|
override values(): ReturnCache<GuildStructure<'cached'>[]> {
|
|
return fakePromise(super.values() as APIGuild[]).then(guilds =>
|
|
guilds.map(x => Transformers.Guild<'cached'>(this.client, x)),
|
|
);
|
|
}
|
|
|
|
valuesRaw(): ReturnCache<APIGuild[]> {
|
|
return super.values();
|
|
}
|
|
|
|
override async remove(id: string) {
|
|
const keysChannels = this.cache.channels?.keys(id) ?? [];
|
|
await this.cache.adapter.bulkRemove(
|
|
(
|
|
await Promise.all([
|
|
this.cache.members?.keys(id) ?? [],
|
|
this.cache.roles?.keys(id) ?? [],
|
|
keysChannels,
|
|
this.cache.emojis?.keys(id) ?? [],
|
|
this.cache.stickers?.keys(id) ?? [],
|
|
this.cache.voiceStates?.keys(id) ?? [],
|
|
this.cache.presences?.keys(id) ?? [],
|
|
this.cache.threads?.keys(id) ?? [],
|
|
this.cache.stageInstances?.keys(id) ?? [],
|
|
this.cache.bans?.keys(id) ?? [],
|
|
])
|
|
).flat(),
|
|
);
|
|
|
|
if (this.cache.messages && this.cache.channels) {
|
|
const keysMessages: string[] = [];
|
|
for (const i of keysChannels) {
|
|
const channelId = i.slice(this.cache.channels.namespace.length + 1);
|
|
const messages = await this.cache.messages.keys(channelId);
|
|
keysMessages.push(...messages);
|
|
}
|
|
if (keysMessages.length) await this.cache.adapter.bulkRemove(keysMessages);
|
|
}
|
|
|
|
await this.cache.adapter.removeRelationship(
|
|
[
|
|
this.cache.members?.hashId(id),
|
|
this.cache.roles?.hashId(id),
|
|
this.cache.channels?.hashId(id),
|
|
this.cache.emojis?.hashId(id),
|
|
this.cache.stickers?.hashId(id),
|
|
this.cache.voiceStates?.hashId(id),
|
|
this.cache.presences?.hashId(id),
|
|
this.cache.threads?.hashId(id),
|
|
this.cache.stageInstances?.hashId(id),
|
|
].filter(Boolean) as string[],
|
|
);
|
|
|
|
await super.remove(id);
|
|
}
|
|
|
|
override async set(id: string, data: any) {
|
|
const bulkData: Parameters<Cache['bulkSet']>[0] = [];
|
|
|
|
for (const member of data.members ?? []) {
|
|
if (!member.user?.id) {
|
|
continue;
|
|
}
|
|
bulkData.push(['members', member, member.user.id, id]);
|
|
bulkData.push(['users', member.user, member.user.id]);
|
|
}
|
|
|
|
for (const role of data.roles ?? []) {
|
|
bulkData.push(['roles', role, role.id, id]);
|
|
}
|
|
|
|
for (const channel of data.channels ?? []) {
|
|
bulkData.push(['channels', channel, channel.id, id]);
|
|
if (channel.permission_overwrites?.length)
|
|
bulkData.push(['overwrites', channel.permission_overwrites, channel.id, id]);
|
|
}
|
|
|
|
for (const emoji of data.emojis ?? []) {
|
|
bulkData.push(['emojis', emoji, emoji.id, id]);
|
|
}
|
|
|
|
for (const sticker of data.stickers ?? []) {
|
|
bulkData.push(['stickers', sticker, sticker.id, id]);
|
|
}
|
|
|
|
for (const voiceState of data.voice_states ?? []) {
|
|
bulkData.push(['voiceStates', voiceState, voiceState.user_id, id]);
|
|
}
|
|
|
|
for (const presence of data.presences ?? []) {
|
|
bulkData.push(['presences', presence, presence.user.id, id]);
|
|
}
|
|
|
|
for (const thread of data.threads ?? []) {
|
|
bulkData.push(['threads', thread, thread.id, id]);
|
|
}
|
|
|
|
for (const instance of data.stage_instances ?? []) {
|
|
bulkData.push(['stageInstances', instance, instance.id, id]);
|
|
}
|
|
|
|
const {
|
|
voice_states,
|
|
members,
|
|
channels,
|
|
threads,
|
|
presences,
|
|
stage_instances,
|
|
guild_scheduled_events,
|
|
roles,
|
|
emojis,
|
|
stickers,
|
|
guild_hashes,
|
|
...guild
|
|
} = data;
|
|
|
|
bulkData.push(['guilds', guild, id]);
|
|
|
|
await this.cache.bulkSet(bulkData);
|
|
}
|
|
|
|
override async patch(id: string, data: any) {
|
|
const bulkData: Parameters<Cache['bulkPatch']>[0] = [];
|
|
|
|
for (const member of data.members ?? []) {
|
|
if (!member.user?.id) {
|
|
continue;
|
|
}
|
|
bulkData.push(['members', member, member.user.id, id]);
|
|
bulkData.push(['users', member.user, member.user.id]);
|
|
}
|
|
|
|
for (const role of data.roles ?? []) {
|
|
bulkData.push(['roles', role, role.id, id]);
|
|
}
|
|
|
|
for (const channel of data.channels ?? []) {
|
|
bulkData.push(['channels', channel, channel.id, id]);
|
|
}
|
|
|
|
for (const channel of data.channels ?? []) {
|
|
if (channel.permission_overwrites?.length) {
|
|
bulkData.push(['overwrites', channel.permission_overwrites, channel.id, id]);
|
|
}
|
|
}
|
|
|
|
for (const emoji of data.emojis ?? []) {
|
|
bulkData.push(['emojis', emoji, emoji.id, id]);
|
|
}
|
|
|
|
for (const sticker of data.stickers ?? []) {
|
|
bulkData.push(['stickers', sticker, sticker.id, id]);
|
|
}
|
|
|
|
for (const voiceState of data.voice_states ?? []) {
|
|
bulkData.push(['voiceStates', voiceState, voiceState.user_id, id]);
|
|
}
|
|
|
|
for (const presence of data.presences ?? []) {
|
|
bulkData.push(['presences', presence, presence.user.id, id]);
|
|
}
|
|
|
|
for (const thread of data.threads ?? []) {
|
|
bulkData.push(['threads', thread, thread.id, id]);
|
|
}
|
|
|
|
for (const instance of data.stage_instances ?? []) {
|
|
bulkData.push(['stageInstances', instance, instance.id, id]);
|
|
}
|
|
|
|
const {
|
|
voice_states,
|
|
members,
|
|
channels,
|
|
threads,
|
|
presences,
|
|
stage_instances,
|
|
guild_scheduled_events,
|
|
roles,
|
|
emojis,
|
|
stickers,
|
|
guild_hashes,
|
|
...guild
|
|
} = data;
|
|
|
|
bulkData.push(['guilds', guild, id]);
|
|
|
|
await this.cache.bulkPatch(bulkData);
|
|
}
|
|
}
|