From 639c709b819a5f7f4da49b2830f84661533eb5b2 Mon Sep 17 00:00:00 2001 From: Gryffon Bellish Date: Tue, 23 Jun 2020 16:02:34 -0400 Subject: [PATCH 1/6] src: move fetch to list, and use ws in fetch --- src/lib/caching/stores/GuildMemberStore.ts | 65 ++++++++++++++++++++-- 1 file changed, 60 insertions(+), 5 deletions(-) diff --git a/src/lib/caching/stores/GuildMemberStore.ts b/src/lib/caching/stores/GuildMemberStore.ts index a00c4dc1c..73863c398 100644 --- a/src/lib/caching/stores/GuildMemberStore.ts +++ b/src/lib/caching/stores/GuildMemberStore.ts @@ -3,6 +3,8 @@ import { Cache } from '@klasa/cache'; import { DataStore } from './base/DataStore'; import { extender } from '../../util/Extender'; import { Routes, RequestOptions } from '@klasa/rest'; +import { RequestGuildMembers, OpCodes, GuildMembersChunkDispatch } from '@klasa/ws'; +import { EventIterator } from '@klasa/event-iterator'; import type { APIUserData, APIGuildMemberData } from '@klasa/dapi-types'; import type { Client } from '../../client/Client'; @@ -67,8 +69,8 @@ export class GuildMemberStore extends DataStore { /** * Returns up to 1000 {@link GuildMember members}. * @since 0.0.1 - * @param userID The {@link User user} ID to fetch. - * @see https://discord.com/developers/docs/resources/guild#list-guild-members + * @param options The {@link GuildMemberStoreFetchOptions options} used to fetch. + * @see https://discord.com/developers/docs/topics/gateway#request-guild-members */ public fetch(options?: GuildMemberStoreFetchOptions): Promise>; public async fetch(idOrOptions?: string | GuildMemberStoreFetchOptions): Promise> { @@ -80,13 +82,58 @@ export class GuildMemberStore extends DataStore { return this._add(member); } - const entries = await this.client.api.get(Routes.guildMembers(this.guild.id), { data: idOrOptions }) as APIGuildMemberData[]; + if (typeof idOrOptions === 'undefined') idOrOptions = {}; + + let { query = '', userIDs, presences, limit = 0, nonce = Date.now().toString(16) } = idOrOptions; + + const options: RequestGuildMembers = { + op: OpCodes.REQUEST_GUILD_MEMBERS, + d: { + guild_id: this.guild.id, + query, + user_ids: userIDs, + presences, + limit, + // This is ignored until the send options for RequestGuildMembers are fixed. + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + nonce + } + } + + this.guild.shard.send(options); + + let i = 0; + const cache = new Cache(); + for await (const [{ d }] of new EventIterator<[GuildMembersChunkDispatch]>(this.client.ws, 'GUILD_MEMBERS_CHUNK', { + filter: ([{ d }]): boolean => d.nonce === nonce && d.guild_id === this.guild.id + })) { + if (i === d.chunk_count) break; + i++; + for (const rawMember of d.members) { + const member = this._add(rawMember); + cache.set(member.id, member); + } + } + + return cache; + } + + /** + * Returns up to 1000 {@link GuildMember members}. + * @since 0.0.3 + * @param options The {@link GuildMemberStoreListOptions options} used to fetch. + * @see https://discord.com/developers/docs/resources/guild#list-guild-members + */ + public async list(options: GuildMemberStoreListOptions): Promise> { + const entries = await this.client.api.get(Routes.guildMembers(this.guild.id), { data: options }) as APIGuildMemberData[]; const cache = new Cache(); for (const entry of entries) { const member = this._add(entry); cache.set(member.id, member); } + return cache; } @@ -168,11 +215,11 @@ export interface GuildMemberStoreAddData { } /** - * The options for {@link GuildMemberStore#fetch}. + * The options for {@link GuildMemberStore#list}. * @since 0.0.1 * @see https://discord.com/developers/docs/resources/guild#list-guild-members-query-string-params */ -export interface GuildMemberStoreFetchOptions { +export interface GuildMemberStoreListOptions { /** * Max number of members to return (1-1000). * @since 0.0.1 @@ -185,3 +232,11 @@ export interface GuildMemberStoreFetchOptions { */ after?: string; } + +export interface GuildMemberStoreFetchOptions { + query?: string; + limit?: number; + presences?: boolean; + userIDs?: string | string[]; + nonce?: string; +} From 8ef120a803b22315d6dcb515758bfb7e0bd3b25d Mon Sep 17 00:00:00 2001 From: Gryffon Bellish Date: Tue, 23 Jun 2020 16:12:44 -0400 Subject: [PATCH 2/6] src: add GuildMemberStore#search --- src/lib/caching/stores/GuildMemberStore.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/lib/caching/stores/GuildMemberStore.ts b/src/lib/caching/stores/GuildMemberStore.ts index 73863c398..c04ce2c75 100644 --- a/src/lib/caching/stores/GuildMemberStore.ts +++ b/src/lib/caching/stores/GuildMemberStore.ts @@ -119,6 +119,21 @@ export class GuildMemberStore extends DataStore { return cache; } + /** + * TBD + * @param options + */ + public async search(data: GuildMemberStoreSearchOptions): Promise> { + const members = await this.client.api.get(Routes.guildMembersSearch(this.guild.id), {data}) as APIGuildMemberData[]; + const cache = new Cache(); + for (const rawMember of members) { + const member = this._add(rawMember); + cache.set(member.id, member); + } + + return cache; + } + /** * Returns up to 1000 {@link GuildMember members}. * @since 0.0.3 @@ -240,3 +255,8 @@ export interface GuildMemberStoreFetchOptions { userIDs?: string | string[]; nonce?: string; } + +export interface GuildMemberStoreSearchOptions { + query: string; + limit?: number; +} \ No newline at end of file From ae6b88e44f6a607916f4035004c74c04c0a7ab1f Mon Sep 17 00:00:00 2001 From: Gryffon Bellish Date: Tue, 23 Jun 2020 16:22:33 -0400 Subject: [PATCH 3/6] lint: fix lint --- src/lib/caching/stores/GuildMemberStore.ts | 16 ++++++++++------ test/Application.ts | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/lib/caching/stores/GuildMemberStore.ts b/src/lib/caching/stores/GuildMemberStore.ts index c04ce2c75..4ed3c6f78 100644 --- a/src/lib/caching/stores/GuildMemberStore.ts +++ b/src/lib/caching/stores/GuildMemberStore.ts @@ -84,13 +84,16 @@ export class GuildMemberStore extends DataStore { if (typeof idOrOptions === 'undefined') idOrOptions = {}; - let { query = '', userIDs, presences, limit = 0, nonce = Date.now().toString(16) } = idOrOptions; + const { query = '', userIDs, presences, limit = 0, nonce = Date.now().toString(16) } = idOrOptions; + /* eslint-disable id-length */ const options: RequestGuildMembers = { op: OpCodes.REQUEST_GUILD_MEMBERS, d: { + // eslint-disable-next-line @typescript-eslint/camelcase guild_id: this.guild.id, query, + // eslint-disable-next-line @typescript-eslint/camelcase user_ids: userIDs, presences, limit, @@ -99,14 +102,14 @@ export class GuildMemberStore extends DataStore { // @ts-expect-error nonce } - } + }; this.guild.shard.send(options); let i = 0; const cache = new Cache(); for await (const [{ d }] of new EventIterator<[GuildMembersChunkDispatch]>(this.client.ws, 'GUILD_MEMBERS_CHUNK', { - filter: ([{ d }]): boolean => d.nonce === nonce && d.guild_id === this.guild.id + filter: ([{ d: data }]): boolean => data.nonce === nonce && data.guild_id === this.guild.id })) { if (i === d.chunk_count) break; i++; @@ -115,16 +118,17 @@ export class GuildMemberStore extends DataStore { cache.set(member.id, member); } } + /* eslint-enable id-length */ return cache; } /** * TBD - * @param options + * @param options */ public async search(data: GuildMemberStoreSearchOptions): Promise> { - const members = await this.client.api.get(Routes.guildMembersSearch(this.guild.id), {data}) as APIGuildMemberData[]; + const members = await this.client.api.get(Routes.guildMembersSearch(this.guild.id), { data }) as APIGuildMemberData[]; const cache = new Cache(); for (const rawMember of members) { const member = this._add(rawMember); @@ -259,4 +263,4 @@ export interface GuildMemberStoreFetchOptions { export interface GuildMemberStoreSearchOptions { query: string; limit?: number; -} \ No newline at end of file +} diff --git a/test/Application.ts b/test/Application.ts index c918ac636..8f773d706 100644 --- a/test/Application.ts +++ b/test/Application.ts @@ -105,6 +105,6 @@ ava('fetch application', async (test): Promise => { // Test guild availability test.is(application.guild, null); - const guild = client.guilds['_add'](rawGuild); + const guild = client.guilds._add(rawGuild); test.is(application.guild, guild); }); From a6ddd14c39aa1c8ba8c1b721d4b732ffcc12b5aa Mon Sep 17 00:00:00 2001 From: Gryffon Bellish Date: Tue, 23 Jun 2020 16:43:34 -0400 Subject: [PATCH 4/6] src: return a ProxyCache instead of a new Cache --- src/lib/caching/stores/GuildMemberStore.ts | 23 +++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/lib/caching/stores/GuildMemberStore.ts b/src/lib/caching/stores/GuildMemberStore.ts index 4ed3c6f78..779c6c397 100644 --- a/src/lib/caching/stores/GuildMemberStore.ts +++ b/src/lib/caching/stores/GuildMemberStore.ts @@ -1,5 +1,5 @@ /* eslint-disable no-dupe-class-members */ -import { Cache } from '@klasa/cache'; +import { ProxyCache } from '@klasa/cache'; import { DataStore } from './base/DataStore'; import { extender } from '../../util/Extender'; import { Routes, RequestOptions } from '@klasa/rest'; @@ -72,8 +72,8 @@ export class GuildMemberStore extends DataStore { * @param options The {@link GuildMemberStoreFetchOptions options} used to fetch. * @see https://discord.com/developers/docs/topics/gateway#request-guild-members */ - public fetch(options?: GuildMemberStoreFetchOptions): Promise>; - public async fetch(idOrOptions?: string | GuildMemberStoreFetchOptions): Promise> { + public fetch(options?: GuildMemberStoreFetchOptions): Promise>; + public async fetch(idOrOptions?: string | GuildMemberStoreFetchOptions): Promise> { if (typeof idOrOptions === 'string') { const previous = this.get(idOrOptions); if (previous) return previous; @@ -107,7 +107,8 @@ export class GuildMemberStore extends DataStore { this.guild.shard.send(options); let i = 0; - const cache = new Cache(); + // const cache = new Cache(); + const cache = new ProxyCache(this); for await (const [{ d }] of new EventIterator<[GuildMembersChunkDispatch]>(this.client.ws, 'GUILD_MEMBERS_CHUNK', { filter: ([{ d: data }]): boolean => data.nonce === nonce && data.guild_id === this.guild.id })) { @@ -115,7 +116,7 @@ export class GuildMemberStore extends DataStore { i++; for (const rawMember of d.members) { const member = this._add(rawMember); - cache.set(member.id, member); + cache.set(member.id); } } /* eslint-enable id-length */ @@ -127,12 +128,12 @@ export class GuildMemberStore extends DataStore { * TBD * @param options */ - public async search(data: GuildMemberStoreSearchOptions): Promise> { + public async search(data: GuildMemberStoreSearchOptions): Promise> { const members = await this.client.api.get(Routes.guildMembersSearch(this.guild.id), { data }) as APIGuildMemberData[]; - const cache = new Cache(); + const cache = new ProxyCache(this); for (const rawMember of members) { const member = this._add(rawMember); - cache.set(member.id, member); + cache.set(member.id); } return cache; @@ -144,13 +145,13 @@ export class GuildMemberStore extends DataStore { * @param options The {@link GuildMemberStoreListOptions options} used to fetch. * @see https://discord.com/developers/docs/resources/guild#list-guild-members */ - public async list(options: GuildMemberStoreListOptions): Promise> { + public async list(options: GuildMemberStoreListOptions): Promise> { const entries = await this.client.api.get(Routes.guildMembers(this.guild.id), { data: options }) as APIGuildMemberData[]; - const cache = new Cache(); + const cache = new ProxyCache(this); for (const entry of entries) { const member = this._add(entry); - cache.set(member.id, member); + cache.set(member.id); } return cache; From 28ae23eadd089e230c13ad820d104ca311863b9a Mon Sep 17 00:00:00 2001 From: Gryffon Bellish Date: Fri, 17 Jul 2020 15:35:17 -0400 Subject: [PATCH 5/6] git: fix merge conflict --- src/lib/caching/stores/GuildMemberStore.ts | 1 - test/Application.ts | 4 ---- 2 files changed, 5 deletions(-) diff --git a/src/lib/caching/stores/GuildMemberStore.ts b/src/lib/caching/stores/GuildMemberStore.ts index 1ae2081ce..6b648f9ad 100644 --- a/src/lib/caching/stores/GuildMemberStore.ts +++ b/src/lib/caching/stores/GuildMemberStore.ts @@ -93,7 +93,6 @@ export class GuildMemberStore extends DataStore { // eslint-disable-next-line @typescript-eslint/camelcase guild_id: this.guild.id, query, - // eslint-disable-next-line @typescript-eslint/camelcase user_ids: userIDs, presences, limit, diff --git a/test/Application.ts b/test/Application.ts index 4026d6cb6..876ddd38d 100644 --- a/test/Application.ts +++ b/test/Application.ts @@ -109,11 +109,7 @@ ava('fetch application', async (test): Promise => { // Test guild availability test.is(application.guild, null); -<<<<<<< HEAD - const guild = client.guilds._add(rawGuild); -======= // eslint-disable-next-line dot-notation const guild = client.guilds['_add'](rawGuild); ->>>>>>> e3a7d6af3ec15599b16786598687af5c624af3ba test.is(application.guild, guild); }); From 55cc9b374bde7e2e4ce50e0bb73f3c7deef1d72a Mon Sep 17 00:00:00 2001 From: Gryffon Bellish Date: Mon, 20 Jul 2020 19:01:10 -0400 Subject: [PATCH 6/6] now I fixed lint --- src/lib/caching/stores/GuildMemberStore.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lib/caching/stores/GuildMemberStore.ts b/src/lib/caching/stores/GuildMemberStore.ts index 6b648f9ad..970ed9281 100644 --- a/src/lib/caching/stores/GuildMemberStore.ts +++ b/src/lib/caching/stores/GuildMemberStore.ts @@ -90,10 +90,11 @@ export class GuildMemberStore extends DataStore { const options: RequestGuildMembers = { op: OpCodes.REQUEST_GUILD_MEMBERS, d: { - // eslint-disable-next-line @typescript-eslint/camelcase + /* eslint-disable camelcase */ guild_id: this.guild.id, - query, user_ids: userIDs, + /* eslint-enable camelcase */ + query, presences, limit, nonce