Skip to content

Commit 01c8d77

Browse files
committed
🍻 feat: now we have members manager
1 parent 93b5b06 commit 01c8d77

File tree

9 files changed

+151
-7
lines changed

9 files changed

+151
-7
lines changed

core/src/rest/http_client.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export interface RequestOptions {
1717
bucket?: string;
1818
body?: unknown;
1919
headers?: Record<string, string>;
20-
query?: Record<string, string>;
20+
query?: Record<string, string | undefined>;
2121
reason?: string;
2222
}
2323

@@ -176,7 +176,9 @@ export class HTTPClient implements HTTPClientOptions {
176176
}
177177
}
178178

179-
const query = new URLSearchParams(options?.query).toString();
179+
const query = new URLSearchParams(
180+
options?.query as Record<string, string>,
181+
).toString();
180182

181183
const abortController = new AbortController();
182184
const timeoutID = setTimeout(() => {

framework/src/client/mod.ts

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { GuildsManager } from "../managers/guilds.ts";
1111
import { UsersManager } from "../managers/users.ts";
1212
import { RolesManager } from "../managers/roles.ts";
1313
import { EmojisManager } from "../managers/emojis.ts";
14+
import { MembersManager } from "../managers/members.ts";
1415
import { User } from "../structures/mod.ts";
1516

1617
export interface ClientOptions extends APIManagerOptions {
@@ -27,6 +28,7 @@ export class Client extends EventEmitter<ClientEvents> {
2728
users = new UsersManager(this);
2829
roles = new RolesManager(this);
2930
emojis = new EmojisManager(this);
31+
members = new MembersManager(this);
3032

3133
constructor(token: string, options: ClientOptions = {}) {
3234
super();

framework/src/managers/base.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,16 @@ export class BaseManager<P, T> {
1313
_get(key: string): P | undefined {
1414
return this.cache.get(key);
1515
}
16-
_fetch(_key: string, ..._: string[]): Promise<P | undefined> {
16+
// deno-lint-ignore no-explicit-any
17+
_fetch(_key: string, ..._: any[]): Promise<P | undefined> {
1718
throw new Error("Not implemented");
1819
}
1920

2021
get(_key: string): T | undefined {
2122
throw new Error("Not implemented");
2223
}
23-
fetch(_key: string, ..._: string[]): Promise<T | undefined> {
24+
// deno-lint-ignore no-explicit-any
25+
fetch(_key: string, ..._: any[]): Promise<T | undefined> {
2426
throw new Error("Not implemented");
2527
}
2628

@@ -32,6 +34,10 @@ export class BaseManager<P, T> {
3234
return this.cache.delete(key);
3335
}
3436

37+
has(key: string): boolean {
38+
return this.cache.has(key);
39+
}
40+
3541
async resolve(key: string): Promise<T | undefined> {
3642
return this.get(key) ?? await this.fetch(key);
3743
}
+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import type { GuildMemberPayload } from "../../../types/mod.ts";
2+
import type { Collection } from "../cache/mod.ts";
3+
import type { Client } from "../client/mod.ts";
4+
import { Member } from "../structures/guilds/member.ts";
5+
import { BaseManager } from "./base.ts";
6+
7+
export class GuildMembersManager
8+
extends BaseManager<GuildMemberPayload, Member> {
9+
guildID: string;
10+
11+
constructor(
12+
client: Client,
13+
guildID: string,
14+
cache: Collection<string, GuildMemberPayload>,
15+
) {
16+
super(client);
17+
this.guildID = guildID;
18+
this.cache = cache;
19+
}
20+
21+
get(id: string) {
22+
const cached = this._get(id);
23+
if (!cached) return;
24+
return new Member(this.client, cached);
25+
}
26+
27+
async fetch(id: string) {
28+
try {
29+
const payload = await this._fetch(id);
30+
if (!payload) return;
31+
return new Member(this.client, payload);
32+
} catch (_err) {
33+
return;
34+
}
35+
}
36+
37+
async _fetch(
38+
id: string,
39+
): Promise<GuildMemberPayload | undefined> {
40+
try {
41+
const resp: GuildMemberPayload | undefined = await this.client.rest.get(
42+
`/guilds/${this.guildID}/members/${id}`,
43+
);
44+
if (!resp) return;
45+
this.set(id, resp);
46+
return resp;
47+
} catch (_err) {
48+
return;
49+
}
50+
}
51+
}

framework/src/managers/guilds.ts

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export class GuildsManager extends BaseManager<LightGuildPayload, Guild> {
3535
channels: undefined,
3636
roles: undefined,
3737
emojis: undefined,
38+
members: undefined,
3839
};
3940
this.cache.set(key, lightGuild);
4041
}

framework/src/managers/members.ts

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import type { GuildMemberPayload } from "../../../types/mod.ts";
2+
import { Collection } from "../cache/mod.ts";
3+
import type { Client } from "../client/mod.ts";
4+
import { BaseManager } from "./base.ts";
5+
import { GuildMembersManager } from "./guildMembers.ts";
6+
7+
export class MembersManager extends BaseManager<
8+
Collection<string, GuildMemberPayload>,
9+
GuildMembersManager
10+
> {
11+
constructor(client: Client) {
12+
super(client);
13+
}
14+
15+
_fill(guildID: string, payloads: GuildMemberPayload[]) {
16+
if (!this.has(guildID)) {
17+
this.set(guildID, new Collection());
18+
}
19+
for (const payload of payloads) {
20+
if (payload.user === undefined) continue;
21+
this.get(guildID)!.set(payload.user.id, payload);
22+
}
23+
}
24+
25+
async _fetch(
26+
guildID: string,
27+
options?: {
28+
limit?: number;
29+
after?: string;
30+
},
31+
): Promise<Collection<string, GuildMemberPayload> | undefined> {
32+
try {
33+
const resp: GuildMemberPayload[] | undefined = await this.client.rest.get(
34+
`/guilds/${guildID}/members`,
35+
{
36+
query: options
37+
? { limit: options.limit?.toString(), after: options.after }
38+
: {},
39+
},
40+
);
41+
if (!resp) return;
42+
this._fill(guildID, resp);
43+
return this._get(guildID)!;
44+
} catch (_err) {
45+
return;
46+
}
47+
}
48+
49+
get(
50+
id: string,
51+
) {
52+
if (!this.has(id)) {
53+
this.set(id, new Collection());
54+
}
55+
const cached = this._get(id)!;
56+
return new GuildMembersManager(this.client, id, cached);
57+
}
58+
59+
async fetch(
60+
guildID: string,
61+
options?: {
62+
limit?: number;
63+
after?: string;
64+
},
65+
) {
66+
try {
67+
const collection = await this._fetch(guildID, options);
68+
if (!collection) return;
69+
return new GuildMembersManager(this.client, guildID, collection);
70+
} catch (_err) {
71+
return;
72+
}
73+
}
74+
}

framework/src/structures/guilds/guild.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ import { LightGuildPayload } from "../../../types/guild.ts";
1313
import { Client } from "../../client/mod.ts";
1414
import { GuildChannelsManager } from "../../managers/guildChannels.ts";
1515
import { GuildEmojisManager } from "../../managers/guildEmojis.ts";
16+
import { GuildMembersManager } from "../../managers/guildMembers.ts";
1617
import { GuildRolesManager } from "../../managers/guildRoles.ts";
1718
import { UnavailableGuild } from "./unavaliable.ts";
1819

1920
export class Guild extends UnavailableGuild {
2021
roles: GuildRolesManager;
2122
emojis: GuildEmojisManager;
23+
members: GuildMembersManager;
2224
channels: GuildChannelsManager;
2325
constructor(client: Client, payload: LightGuildPayload) {
2426
// TODO: think about fill methods
@@ -39,6 +41,10 @@ export class Guild extends UnavailableGuild {
3941
if (payload.channels) {
4042
this.channels._fill(payload.channels);
4143
}
44+
this.members = client.members.get(payload.id);
45+
if (payload.members) {
46+
client.members._fill(payload.id, payload.members);
47+
}
4248
}
4349

4450
get name(): string {
@@ -119,9 +125,6 @@ export class Guild extends UnavailableGuild {
119125
// get voiceStates(): string[] {
120126
// return this.payload.voice_states;
121127
// }
122-
// get members(): string[] {
123-
// return this.payload.members;
124-
// }
125128
// get threads(): string[] {
126129
// return this.payload.threads;
127130
// }
+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export * from "./guild.ts";
2+
export * from "./member.ts";
3+
export * from "./role.ts";
4+
export * from "./unavaliable.ts";

framework/src/structures/mod.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export * from "./channels/mod.ts";
22
export * from "./messages/mod.ts";
33
export * from "./users/mod.ts";
4+
export * from "./guilds/mod.ts";

0 commit comments

Comments
 (0)