diff --git a/structures/Guild.ts b/structures/Guild.ts index 33c4a2e..9cf0064 100644 --- a/structures/Guild.ts +++ b/structures/Guild.ts @@ -1,6 +1,7 @@ import type { Snowflake } from "../util/Snowflake.ts"; import type { Session } from "../session/Session.ts"; -import type { DiscordEmoji, DiscordGuild, DiscordRole } from "../vendor/external.ts"; +import type { DiscordEmoji, DiscordGuild, DiscordInviteMetadata, DiscordRole } from "../vendor/external.ts"; +import type { GetInvite } from "../util/Routes.ts"; import { DefaultMessageNotificationLevels, ExplicitContentFilterLevels, @@ -11,8 +12,8 @@ import { urlToBase64 } from "../util/urlToBase64.ts"; import { Member } from "./Member.ts"; import { BaseGuild } from "./BaseGuild.ts"; import { Role } from "./Role.ts"; -import { Emoji } from "./Emoji.ts"; import { GuildEmoji } from "./GuildEmoji.ts"; +import { Invite } from "./Invite.ts"; import { Routes } from "../util/mod.ts"; export interface CreateRole { @@ -69,7 +70,7 @@ export class Guild extends BaseGuild { roles: Role[]; emojis: GuildEmoji[]; - async createEmoji(options: CreateGuildEmoji) { + async createEmoji(options: CreateGuildEmoji): Promise { if (options.image && !options.image.startsWith("data:image/")) { options.image = await urlToBase64(options.image); } @@ -81,10 +82,10 @@ export class Guild extends BaseGuild { options, ); - return new Emoji(this.session, emoji); + return new GuildEmoji(this.session, emoji, this.id); } - async deleteEmoji(id: Snowflake, { reason }: { reason?: string } = {}) { + async deleteEmoji(id: Snowflake, { reason }: { reason?: string } = {}): Promise { await this.session.rest.runMethod( this.session.rest, "DELETE", @@ -93,7 +94,7 @@ export class Guild extends BaseGuild { ); } - async editEmoji(id: Snowflake, options: ModifyGuildEmoji) { + async editEmoji(id: Snowflake, options: ModifyGuildEmoji): Promise { const emoji = await this.session.rest.runMethod( this.session.rest, "PATCH", @@ -104,7 +105,7 @@ export class Guild extends BaseGuild { return new GuildEmoji(this.session, emoji, this.id); } - async createRole(options: CreateRole) { + async createRole(options: CreateRole): Promise { let icon: string | undefined; if (options.iconHash) { @@ -135,6 +136,28 @@ export class Guild extends BaseGuild { async deleteRole(roleId: Snowflake): Promise { await this.session.rest.runMethod(this.session.rest, "DELETE", Routes.GUILD_ROLE(this.id, roleId)); } + + // TODO: edit role + + + async deleteInvite(inviteCode: string): Promise { + await this.session.rest.runMethod( + this.session.rest, + "DELETE", + Routes.INVITE(inviteCode), + {} + ); + } + + async fetchInvite(inviteCode: string, options: GetInvite): Promise { + const inviteMetadata = await this.session.rest.runMethod( + this.session.rest, + "GET", + Routes.INVITE(inviteCode, options), + ); + + return new Invite(this.session, inviteMetadata); + } } export default Guild; diff --git a/util/Routes.ts b/util/Routes.ts index 1d2efea..73166e7 100644 --- a/util/Routes.ts +++ b/util/Routes.ts @@ -117,3 +117,21 @@ export function GUILD_EMOJIS(guildId: Snowflake) { export function GUILD_EMOJI(guildId: Snowflake, emojiId: Snowflake) { return `/guilds/${guildId}/emojis/${emojiId}`; } + +export interface GetInvite { + withCounts?: boolean; + withExpiration?: boolean; + scheduledEventId?: Snowflake; +} + +export function INVITE(inviteCode: string, options?: GetInvite) { + let url = `/invites/${inviteCode}?`; + + if (options) { + if (options.withCounts) url += `with_counts=${options.withCounts}`; + if (options.withExpiration) url += `&with_expiration=${options.withExpiration}`; + if (options.scheduledEventId) url += `&guild_scheduled_event_id=${options.scheduledEventId}`; + } + + return url; +}