diff --git a/packages/api-types/src/utils/routes.ts b/packages/api-types/src/utils/routes.ts index 9bdf659..adce6fd 100644 --- a/packages/api-types/src/utils/routes.ts +++ b/packages/api-types/src/utils/routes.ts @@ -73,6 +73,20 @@ export function GUILD_MEMBER(guildId: Snowflake, userId: Snowflake): string { return `/guilds/${guildId}/members/${userId}`; } +export interface ListGuildMembers { + limit?: number; + after?: string; +} + +export function GUILD_MEMBERS(guildId: Snowflake, options?: ListGuildMembers) { + let url = `/guilds/${guildId}/members?`; + + if (options?.limit) url += `limit=${options.limit}`; + if (options?.after) url += `&after=${options.after}`; + + return url; +} + /** used to ban members */ export function GUILD_BAN(guildId: Snowflake, userId: Snowflake): string { return `/guilds/${guildId}/bans/${userId}`; diff --git a/packages/core/src/structures/guilds.ts b/packages/core/src/structures/guilds.ts index 8b7fcb3..c6e8116 100644 --- a/packages/core/src/structures/guilds.ts +++ b/packages/core/src/structures/guilds.ts @@ -24,6 +24,7 @@ import { VideoQualityModes, GetBans, GetInvite, + ListGuildMembers, } from '@biscuitland/api-types'; import type { ImageFormat, ImageSize } from '../utils/util'; import { GuildFeatures, PremiumTiers } from '@biscuitland/api-types'; @@ -44,6 +45,7 @@ import { GUILD_PRUNE, GUILD_INVITES, GUILD_MEMBER, + GUILD_MEMBERS, GUILD_MEMBER_ROLE, GUILD_ROLE, GUILD_ROLES, @@ -1210,4 +1212,22 @@ export class Guild extends BaseGuild implements Model { return new GuildPreview(this.session, preview); } + + /** fetches a member */ + async fetchMember(memberId: Snowflake): Promise { + const member = await this.session.rest.get( + GUILD_MEMBER(this.id, memberId) + ); + + return new Member(this.session, member, this.id); + } + + /** fetches multiple members */ + async fetchMembers(options?: ListGuildMembers): Promise { + const members = await this.session.rest.get( + GUILD_MEMBERS(this.id, options) + ); + + return members.map((member) => new Member(this.session, member, this.id)); + } } diff --git a/packages/core/src/structures/members.ts b/packages/core/src/structures/members.ts index b49a964..058eb14 100644 --- a/packages/core/src/structures/members.ts +++ b/packages/core/src/structures/members.ts @@ -164,6 +164,12 @@ export class Member implements Model { ); } + async fetch(): Promise { + const member = await Guild.prototype.fetchMember.call({ session: this.session, id: this.guildId }, this.id); + + return member; + } + /** gets the members's guild avatar, not to be confused with Member.user.avatarURL() */ avatarURL(options: AvatarOptions): string { let url: string;