diff --git a/src/api/handlers/channel.ts b/src/api/handlers/channel.ts index 118ca4e34..25ee577cc 100644 --- a/src/api/handlers/channel.ts +++ b/src/api/handlers/channel.ts @@ -9,6 +9,7 @@ import { GetMessagesAfter, GetMessagesAround, GetMessagesBefore, + InvitePayload, MessageContent, MessageCreateOptions, Permission, @@ -19,6 +20,7 @@ import { import { endpoints } from "../../util/constants.ts"; import { botHasChannelPermissions, + botHasPermission, calculateBits, } from "../../util/permissions.ts"; import { cacheHandlers } from "../controllers/cache.ts"; @@ -301,6 +303,39 @@ export async function createInvite( return RequestManager.post(endpoints.CHANNEL_INVITES(channelID), options); } +/** Returns an invite for the given code. */ +export function getInvite(inviteCode: string) { + return RequestManager.get(endpoints.INVITE(inviteCode)) as Promise< + InvitePayload + >; +} + +/** Deletes an invite for the given code. Requires `MANAGE_CHANNELS` or `MANAGE_GUILD` permission */ +export async function deleteInvite( + channelID: string, + inviteCode: string, +) { + const hasPerm = await botHasChannelPermissions(channelID, [ + "MANAGE_CHANNELS", + ]); + + if (!hasPerm) { + const channel = await cacheHandlers.get("channels", channelID); + + const hasManageGuildPerm = await botHasPermission(channel!.guildID, [ + "MANAGE_GUILD", + ]); + + if (!hasManageGuildPerm) { + throw new Error(Errors.MISSING_MANAGE_CHANNELS); + } + } + + return RequestManager.delete(endpoints.INVITE(inviteCode)) as Promise< + InvitePayload + >; +} + /** Gets the webhooks for this channel. Requires MANAGE_WEBHOOKS */ export async function getChannelWebhooks(channelID: string) { const hasManageWebhooksPerm = await botHasChannelPermissions( diff --git a/src/api/handlers/mod.ts b/src/api/handlers/mod.ts index 41ca9c21c..06e7e2c5c 100644 --- a/src/api/handlers/mod.ts +++ b/src/api/handlers/mod.ts @@ -1,11 +1,13 @@ import { channelOverwriteHasPermission, createInvite, + deleteInvite, deleteMessages, editChannel, followChannel, getChannelInvites, getChannelWebhooks, + getInvite, getMessage, getMessages, getPins, @@ -133,6 +135,8 @@ export let handlers = { getPins, isChannelSynced, sendMessage, + getInvite, + deleteInvite, startTyping, // Gateway handler diff --git a/src/types/invite.ts b/src/types/invite.ts new file mode 100644 index 000000000..dd3789f55 --- /dev/null +++ b/src/types/invite.ts @@ -0,0 +1,28 @@ +import { Guild } from "../api/structures/mod.ts"; +import { ChannelCreatePayload } from "./channel.ts"; +import { UserPayload } from "./guild.ts"; + +/** https://discord.com/developers/docs/resources/invite#invite-object */ +export interface InvitePayload { + /** the invite code (unique ID) */ + code: string; + /** the guild this invite is for */ + guild?: Partial; + /** the channel this invite is for */ + channel: Partial; + /** the user who created the invite */ + inviter?: UserPayload; + /** the target user for this invite */ + target_user?: Partial; + /** the type of user target for this invite */ + target_user_type?: InviteTargetUserTypes; + /** approximate count of online members (only present when target_user is set) */ + approximate_presence_count?: number; + /** approximate count of total members */ + approximate_member_count: number; +} + +/** https://discord.com/developers/docs/resources/invite#invite-resource */ +export enum InviteTargetUserTypes { + STREAM = 1, +} diff --git a/src/types/mod.ts b/src/types/mod.ts index edcb4c0f4..c4128d9d8 100644 --- a/src/types/mod.ts +++ b/src/types/mod.ts @@ -6,6 +6,7 @@ export * from "./errors.ts"; export * from "./fetch.ts"; export * from "./guild.ts"; export * from "./interactions.ts"; +export * from "./invite.ts"; export * from "./member.ts"; export * from "./message.ts"; export * from "./options.ts";