Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: from parameter in resource#filter method #311

Merged
merged 1 commit into from
Dec 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 51 additions & 32 deletions src/cache/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,7 @@ export class Cache {
async bulkPatch(
keys: (
| readonly [
CacheFrom,
/* type */
NonGuildBased,
/* data */
Expand All @@ -286,6 +287,7 @@ export class Cache {
string,
]
| readonly [
CacheFrom,
/* type */
GuildBased | GuildRelated,
/* data */
Expand All @@ -299,7 +301,7 @@ export class Cache {
) {
const allData: [string, any][] = [];
const relationshipsData: Record<string, string[]> = {};
for (const [type, data, id, guildId] of keys) {
for (const [from, type, data, id, guildId] of keys) {
switch (type) {
case 'roles':
case 'stickers':
Expand All @@ -311,7 +313,7 @@ export class Cache {
case 'bans':
case 'messages':
{
if (!this[type]?.filter(data, id, guildId)) continue;
if (!this[type]?.filter(data, id, guildId, from)) continue;
const hashId = this[type]?.hashId(guildId!);
if (!hashId) {
continue;
Expand All @@ -329,7 +331,7 @@ export class Cache {
case 'voiceStates':
case 'members':
{
if (!this[type]?.filter(data, id, guildId)) continue;
if (!this[type]?.filter(data, id, guildId, from)) continue;
const hashId = this[type]?.hashId(guildId!);
if (!hashId) {
continue;
Expand All @@ -345,7 +347,7 @@ export class Cache {
case 'users':
case 'guilds':
{
if (!this[type]?.filter(data, id)) continue;
if (!this[type]?.filter(data, id, from)) continue;
const hashId = this[type]?.namespace;
if (!hashId) {
continue;
Expand All @@ -369,6 +371,7 @@ export class Cache {
async bulkSet(
keys: (
| readonly [
CacheFrom,
/* type */
NonGuildBased,
/* data */
Expand All @@ -377,6 +380,7 @@ export class Cache {
string,
]
| readonly [
CacheFrom,
/* type */
GuildBased | GuildRelated,
/* data */
Expand All @@ -390,7 +394,7 @@ export class Cache {
) {
const allData: [string, any][] = [];
const relationshipsData: Record<string, string[]> = {};
for (const [type, data, id, guildId] of keys) {
for (const [from, type, data, id, guildId] of keys) {
switch (type) {
case 'roles':
case 'stickers':
Expand All @@ -401,7 +405,7 @@ export class Cache {
case 'overwrites':
case 'messages':
{
if (!this[type]?.filter(data, id, guildId)) continue;
if (!this[type]?.filter(data, id, guildId, from)) continue;
const hashId = this[type]?.hashId(guildId!);
if (!hashId) {
continue;
Expand All @@ -420,7 +424,7 @@ export class Cache {
case 'voiceStates':
case 'members':
{
if (!this[type]?.filter(data, id, guildId)) continue;
if (!this[type]?.filter(data, id, guildId, from)) continue;
const hashId = this[type]?.hashId(guildId!);
if (!hashId) {
continue;
Expand All @@ -436,7 +440,7 @@ export class Cache {
case 'users':
case 'guilds':
{
if (!this[type]?.filter(data, id)) continue;
if (!this[type]?.filter(data, id, from)) continue;
const hashId = this[type]?.namespace;
if (!hashId) {
continue;
Expand Down Expand Up @@ -464,17 +468,17 @@ export class Cache {
protected async onPacketDefault(event: GatewayDispatchPayload) {
switch (event.t) {
case 'READY':
await this.users?.set(event.d.user.id, event.d.user);
await this.users?.set(CacheFrom.Gateway, event.d.user.id, event.d.user);
break;
case 'GUILD_CREATE':
case 'GUILD_UPDATE':
case 'RAW_GUILD_CREATE':
await this.guilds?.patch(event.d.id, { unavailable: false, ...event.d });
await this.guilds?.patch(CacheFrom.Gateway, event.d.id, { unavailable: false, ...event.d });
break;
case 'GUILD_DELETE':
case 'RAW_GUILD_DELETE':
if (event.d.unavailable) {
await this.guilds?.patch(event.d.id, event.d);
await this.guilds?.patch(CacheFrom.Gateway, event.d.id, event.d);
} else {
await this.guilds?.remove(event.d.id);
}
Expand All @@ -483,13 +487,18 @@ export class Cache {
case 'CHANNEL_UPDATE':
{
if ('guild_id' in event.d) {
await this.channels?.set(event.d.id, event.d.guild_id!, event.d);
await this.channels?.set(CacheFrom.Gateway, event.d.id, event.d.guild_id!, event.d);
if (event.d.permission_overwrites?.length)
await this.overwrites?.set(event.d.id, event.d.guild_id!, event.d.permission_overwrites);
await this.overwrites?.set(
CacheFrom.Gateway,
event.d.id,
event.d.guild_id!,
event.d.permission_overwrites,
);
break;
}
if (event.d.type === ChannelType.DM) {
await this.channels?.set(event.d.recipients![0]?.id, '@me', event.d);
await this.channels?.set(CacheFrom.Gateway, event.d.recipients![0]?.id, '@me', event.d);
break;
}
}
Expand All @@ -499,13 +508,13 @@ export class Cache {
break;
case 'GUILD_ROLE_CREATE':
case 'GUILD_ROLE_UPDATE':
await this.roles?.set(event.d.role.id, event.d.guild_id, event.d.role);
await this.roles?.set(CacheFrom.Gateway, event.d.role.id, event.d.guild_id, event.d.role);
break;
case 'GUILD_ROLE_DELETE':
await this.roles?.remove(event.d.role_id, event.d.guild_id);
break;
case 'GUILD_BAN_ADD':
await this.bans?.set(event.d.user.id, event.d.guild_id, event.d);
await this.bans?.set(CacheFrom.Gateway, event.d.user.id, event.d.guild_id, event.d);
break;
case 'GUILD_BAN_REMOVE':
await this.bans?.remove(event.d.user.id, event.d.guild_id);
Expand All @@ -514,6 +523,7 @@ export class Cache {
{
await this.emojis?.remove(await this.emojis?.keys(event.d.guild_id), event.d.guild_id);
await this.emojis?.set(
CacheFrom.Gateway,
event.d.emojis.map(x => [x.id!, x] as [string, APIEmoji]),
event.d.guild_id,
);
Expand All @@ -523,35 +533,36 @@ export class Cache {
{
await this.stickers?.remove(await this.stickers?.keys(event.d.guild_id), event.d.guild_id);
await this.stickers?.set(
CacheFrom.Gateway,
event.d.stickers.map(x => [x.id, x] as [string, APISticker]),
event.d.guild_id,
);
}
break;
case 'GUILD_MEMBER_ADD':
case 'GUILD_MEMBER_UPDATE':
if (event.d.user) await this.members?.set(event.d.user.id, event.d.guild_id, event.d);
if (event.d.user) await this.members?.set(CacheFrom.Gateway, event.d.user.id, event.d.guild_id, event.d);
break;
case 'GUILD_MEMBER_REMOVE':
await this.members?.remove(event.d.user.id, event.d.guild_id);
break;

case 'PRESENCE_UPDATE':
// Should update member data?
await this.presences?.set(event.d.user.id, event.d.guild_id, event.d);
await this.presences?.set(CacheFrom.Gateway, event.d.user.id, event.d.guild_id, event.d);
break;

case 'THREAD_CREATE':
case 'THREAD_UPDATE':
if (event.d.guild_id) await this.channels?.set(event.d.id, event.d.guild_id, event.d);
if (event.d.guild_id) await this.channels?.set(CacheFrom.Gateway, event.d.id, event.d.guild_id, event.d);
break;

case 'THREAD_DELETE':
await this.channels?.remove(event.d.id, event.d.guild_id);
break;

case 'USER_UPDATE':
await this.users?.set(event.d.id, event.d);
await this.users?.set(CacheFrom.Gateway, event.d.id, event.d);
break;

case 'VOICE_STATE_UPDATE':
Expand All @@ -561,15 +572,15 @@ export class Cache {
}

if (event.d.channel_id != null) {
await this.voiceStates?.set(event.d.user_id, event.d.guild_id, event.d);
await this.voiceStates?.set(CacheFrom.Gateway, event.d.user_id, event.d.guild_id, event.d);
} else {
await this.voiceStates?.remove(event.d.user_id, event.d.guild_id);
}
}
break;
case 'STAGE_INSTANCE_CREATE':
case 'STAGE_INSTANCE_UPDATE':
await this.stageInstances?.set(event.d.id, event.d.guild_id, event.d);
await this.stageInstances?.set(CacheFrom.Gateway, event.d.id, event.d.guild_id, event.d);
break;
case 'STAGE_INSTANCE_DELETE':
await this.stageInstances?.remove(event.d.id, event.d.guild_id);
Expand All @@ -578,12 +589,13 @@ export class Cache {
{
if (this.messages !== undefined) {
const data: Parameters<Cache['bulkPatch']>[0] = [
['messages', event.d, event.d.id, event.d.channel_id],
['users', event.d.author, event.d.author.id],
[CacheFrom.Gateway, 'messages', event.d, event.d.id, event.d.channel_id],
[CacheFrom.Gateway, 'users', event.d.author, event.d.author.id],
];

if (event.d.guild_id) {
if (event.d.member) data.push(['members', event.d.member, event.d.author.id, event.d.guild_id]);
if (event.d.member)
data.push([CacheFrom.Gateway, 'members', event.d.member, event.d.author.id, event.d.guild_id]);
}

await this.bulkPatch(data);
Expand All @@ -594,12 +606,13 @@ export class Cache {
{
if (this.messages !== undefined) {
const data: Parameters<Cache['bulkPatch']>[0] = [
['messages', event.d, event.d.id, event.d.channel_id],
['users', event.d.author, event.d.author.id],
[CacheFrom.Gateway, 'messages', event.d, event.d.id, event.d.channel_id],
[CacheFrom.Gateway, 'users', event.d.author, event.d.author.id],
];

if (event.d.guild_id) {
if (event.d.member) data.push(['members', event.d.member, event.d.author.id, event.d.guild_id]);
if (event.d.member)
data.push([CacheFrom.Gateway, 'members', event.d.member, event.d.author.id, event.d.guild_id]);
}

await this.bulkPatch(data);
Expand Down Expand Up @@ -674,7 +687,7 @@ export class Cache {
createUser('marcrock'),
];
for (const user of users) {
await this.users.set(user.id, user);
await this.users.set(CacheFrom.Test, user.id, user);
}
let count = 0;
if ((await this.users.values()).length !== users.length)
Expand Down Expand Up @@ -727,7 +740,7 @@ export class Cache {
for (const guildId in guildMembers) {
const members = guildMembers[guildId];
for (const member of members) {
await this.members.set(member.user.id, guildId, member);
await this.members.set(CacheFrom.Test, member.user.id, guildId, member);
}
if ((await this.members.values(guildId)).length !== members.length)
throw new Error('members.values(guildId) is not of the expected size.');
Expand Down Expand Up @@ -836,7 +849,7 @@ export class Cache {
for (const guildId in guildChannels) {
const channels = guildChannels[guildId];
for (const channel of channels) {
await this.channels.set(channel.id, guildId, channel);
await this.channels.set(CacheFrom.Test, channel.id, guildId, channel);
}
if ((await this.channels.values(guildId)).length !== channels.length)
throw new Error('channels.values(guildId) is not of the expected size');
Expand Down Expand Up @@ -905,7 +918,7 @@ export class Cache {
for (const guildId in guildOverwrites) {
const bulkOverwrites = guildOverwrites[guildId];
for (const overwrites of bulkOverwrites) {
await this.overwrites.set(overwrites[0].channel_id, guildId, overwrites);
await this.overwrites.set(CacheFrom.Test, overwrites[0].channel_id, guildId, overwrites);
}
if ((await this.overwrites.values(guildId)).length !== bulkOverwrites.length)
throw new Error('overwrites.values(channelId) is not of the expected size');
Expand Down Expand Up @@ -956,3 +969,9 @@ export class Cache {
this.__logger__!.info('the overwrites cache seems to be alright.');
}
}

export enum CacheFrom {
Gateway = 1,
Rest,
Test,
}
4 changes: 2 additions & 2 deletions src/cache/resources/bans.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { ReturnCache } from '../..';
import type { CacheFrom, ReturnCache } from '../..';
import { type GuildBanStructure, Transformers } from '../../client/transformers';
import { fakePromise } from '../../common';
import type { APIBan, GatewayGuildBanModifyDispatchData } from '../../types';
Expand All @@ -7,7 +7,7 @@ export class Bans extends GuildBasedResource<any, GatewayGuildBanModifyDispatchD
namespace = 'ban';

//@ts-expect-error
filter(data: APIBan, id: string, guild_id: string) {
filter(data: APIBan, id: string, guild_id: string, from: CacheFrom) {
return true;
}

Expand Down
4 changes: 2 additions & 2 deletions src/cache/resources/channels.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { fakePromise } from '../../common';
import { type AllChannels, channelFrom } from '../../structures';
import type { APIChannel } from '../../types';
import type { ReturnCache } from '../index';
import type { CacheFrom, ReturnCache } from '../index';
import { GuildRelatedResource } from './default/guild-related';

export class Channels extends GuildRelatedResource<any, APIChannel> {
namespace = 'channel';

//@ts-expect-error
filter(data: APIChannel, id: string, guild_id: string) {
filter(data: APIChannel, id: string, guild_id: string, from: CacheFrom) {
return true;
}

Expand Down
16 changes: 8 additions & 8 deletions src/cache/resources/default/base.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { UsingClient } from '../../../commands';
import { fakePromise } from '../../../common';
import type { GatewayIntentBits } from '../../../types';
import type { Cache, ReturnCache } from '../../index';
import type { Cache, CacheFrom, ReturnCache } from '../../index';

export class BaseResource<T = any, S = any> {
namespace = 'base';
Expand All @@ -12,7 +12,7 @@ export class BaseResource<T = any, S = any> {
) {}

//@ts-expect-error
filter(data: any, id: string) {
filter(data: any, id: string, from: CacheFrom) {
return true;
}

Expand All @@ -27,9 +27,9 @@ export class BaseResource<T = any, S = any> {
return;
}

setIfNI(intent: keyof typeof GatewayIntentBits, id: string, data: S) {
setIfNI(from: CacheFrom, intent: keyof typeof GatewayIntentBits, id: string, data: S) {
if (!this.cache.hasIntent(intent)) {
return this.set(id, data);
return this.set(from, id, data);
}
}

Expand All @@ -41,13 +41,13 @@ export class BaseResource<T = any, S = any> {
return fakePromise(this.adapter.bulkGet(ids.map(id => this.hashId(id)))).then(x => x.filter(y => y));
}

set(id: string, data: S) {
if (!this.filter(data, id)) return;
set(from: CacheFrom, id: string, data: S) {
if (!this.filter(data, id, from)) return;
return fakePromise(this.addToRelationship(id)).then(() => this.adapter.set(this.hashId(id), data));
}

patch(id: string, data: S) {
if (!this.filter(data, id)) return;
patch(from: CacheFrom, id: string, data: S) {
if (!this.filter(data, id, from)) return;
return fakePromise(this.addToRelationship(id)).then(() => this.adapter.patch(this.hashId(id), data));
}

Expand Down
Loading
Loading