valkyrie-api-types/utils/v9.ts
2024-09-12 19:14:45 +12:00

177 lines
6.2 KiB
TypeScript

import {
APIApplicationCommandDMInteraction,
APIApplicationCommandGuildInteraction,
APIApplicationCommandInteraction,
APIButtonComponent,
APIButtonComponentWithCustomId,
APIButtonComponentWithURL,
APIChatInputApplicationCommandInteraction,
APIContextMenuInteraction,
APIDMInteraction,
APIGuildInteraction,
APIInteraction,
APIMessageComponentButtonInteraction,
APIMessageComponentDMInteraction,
APIMessageComponentGuildInteraction,
APIMessageComponentInteraction,
APIMessageComponentSelectMenuInteraction,
ApplicationCommandType,
ButtonStyle,
ComponentType,
InteractionType,
} from '../payloads/v9/index';
// Interactions
/**
* A type-guard check for DM interactions
* @param interaction The interaction to check against
* @returns A boolean that indicates if the interaction was received in a DM channel
*/
export function isDMInteraction(interaction: APIInteraction): interaction is APIDMInteraction {
return Reflect.has(interaction, 'user');
}
/**
* A type-guard check for guild interactions
* @param interaction The interaction to check against
* @returns A boolean that indicates if the interaction was received in a guild
*/
export function isGuildInteraction(interaction: APIInteraction): interaction is APIGuildInteraction {
return Reflect.has(interaction, 'guild_id');
}
// ApplicationCommandInteractions
/**
* A type-guard check for DM application command interactions
* @param interaction The application command interaction to check against
* @returns A boolean that indicates if the application command interaction was received in a DM channel
*/
export function isApplicationCommandDMInteraction(
interaction: APIApplicationCommandInteraction,
): interaction is APIApplicationCommandDMInteraction {
return isDMInteraction(interaction);
}
/**
* A type-guard check for guild application command interactions
* @param interaction The interaction to check against
* @returns A boolean that indicates if the application command interaction was received in a guild
*/
export function isApplicationCommandGuildInteraction(
interaction: APIApplicationCommandInteraction,
): interaction is APIApplicationCommandGuildInteraction {
return isGuildInteraction(interaction);
}
// MessageComponentInteractions
/**
* A type-guard check for DM message component interactions
* @param interaction The message component interaction to check against
* @returns A boolean that indicates if the message component interaction was received in a DM channel
*/
export function isMessageComponentDMInteraction(
interaction: APIMessageComponentInteraction,
): interaction is APIMessageComponentDMInteraction {
return isDMInteraction(interaction);
}
/**
* A type-guard check for guild message component interactions
* @param interaction The interaction to check against
* @returns A boolean that indicates if the message component interaction was received in a guild
*/
export function isMessageComponentGuildInteraction(
interaction: APIMessageComponentInteraction,
): interaction is APIMessageComponentGuildInteraction {
return isGuildInteraction(interaction);
}
// Buttons
/**
* A type-guard check for buttons that have a `url` attached to them.
* @param component The button to check against
* @returns A boolean that indicates if the button has a `url` attached to it
*/
export function isLinkButton(component: APIButtonComponent): component is APIButtonComponentWithURL {
return component.style === ButtonStyle.Link;
}
/**
* A type-guard check for buttons that have a `custom_id` attached to them.
* @param button The button to check against
* @returns A boolean that indicates if the button has a `custom_id` attached to it
*/
export function isInteractionButton(component: APIButtonComponent): component is APIButtonComponentWithCustomId {
return component.style !== ButtonStyle.Link;
}
// Message Components
/**
* A type-guard check for message component interactions
* @param interaction The interaction to check against
* @returns A boolean that indicates if the interaction is a message component
*/
export function isMessageComponentInteraction(
interaction: APIInteraction,
): interaction is APIMessageComponentInteraction {
return interaction.type === InteractionType.MessageComponent;
}
/**
* A type-guard check for button message component interactions
* @param interaction The message component interaction to check against
* @returns A boolean that indicates if the message component is a button
*/
export function isMessageComponentButtonInteraction(
interaction: APIMessageComponentInteraction,
): interaction is APIMessageComponentButtonInteraction {
return interaction.data.component_type === ComponentType.Button;
}
/**
* A type-guard check for select menu message component interactions
* @param interaction The message component interaction to check against
* @returns A boolean that indicates if the message component is a select menu
*/
export function isMessageComponentSelectMenuInteraction(
interaction: APIMessageComponentInteraction,
): interaction is APIMessageComponentSelectMenuInteraction {
return [
ComponentType.StringSelect,
ComponentType.UserSelect,
ComponentType.RoleSelect,
ComponentType.MentionableSelect,
ComponentType.ChannelSelect,
].includes(interaction.data.component_type);
}
// Application Commands
/**
* A type-guard check for chat input application commands.
* @param interaction The interaction to check against
* @returns A boolean that indicates if the interaction is a chat input application command
*/
export function isChatInputApplicationCommandInteraction(
interaction: APIApplicationCommandInteraction,
): interaction is APIChatInputApplicationCommandInteraction {
return interaction.data.type === ApplicationCommandType.ChatInput;
}
/**
* A type-guard check for context menu application commands.
* @param interaction The interaction to check against
* @returns A boolean that indicates if the interaction is a context menu application command
*/
export function isContextMenuApplicationCommandInteraction(
interaction: APIApplicationCommandInteraction,
): interaction is APIContextMenuInteraction {
return (
interaction.data.type === ApplicationCommandType.Message || interaction.data.type === ApplicationCommandType.User
);
}