eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
2 lines • 4.85 kB
JavaScript
import{isNonEmptyString,isObject}from"#shared/guards.js";const DISCORD_INTERACTION_TYPE={APPLICATION_COMMAND:2,MESSAGE_COMPONENT:3,MODAL_SUBMIT:5,PING:1},DISCORD_INTERACTION_RESPONSE_TYPE={CHANNEL_MESSAGE_WITH_SOURCE:4,DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE:5,DEFERRED_UPDATE_MESSAGE:6,MODAL:9,PONG:1},DISCORD_EPHEMERAL_MESSAGE_FLAG=64;function parseDiscordInteraction(e){if(!isObject(e))return null;let t=e.type;return t===DISCORD_INTERACTION_TYPE.APPLICATION_COMMAND?parseCommandInteraction(e):t===DISCORD_INTERACTION_TYPE.MESSAGE_COMPONENT?parseComponentInteraction(e):t===DISCORD_INTERACTION_TYPE.MODAL_SUBMIT?parseModalSubmitInteraction(e):null}function commandInteractionMessage(e){let t=findOptionValue(e.options,`message`);if(typeof t==`string`&&t.trim().length>0)return t;let n=formatCommandOptions(e.options);return n?`/${e.commandName} ${n}`:`/${e.commandName}`}function formatDiscordContextBlock(e){return[`<discord_context>`,`response_medium: discord`,`response_instructions: Reply for Discord in concise Markdown. Avoid mass mentions, long tables, and messages that need more than a few short posts.`,...e.applicationId?[`application_id: ${e.applicationId}`]:[],`user_id: ${e.userId}`,...e.username?[`username: ${e.username}`]:[],`channel_id: ${e.channelId}`,...e.guildId?[`guild_id: ${e.guildId}`]:[],`interaction_id: ${e.interactionId}`,...e.commandName?[`command_name: ${e.commandName}`]:[],`</discord_context>`].join(`
`)}function parseCommandInteraction(e){let t=parseInteractionBase(e),n=isObject(e.data)?e.data:null;return!t||!n||!isNonEmptyString(n.name)?null:{...t,commandId:isNonEmptyString(n.id)?n.id:void 0,commandName:n.name,options:parseOptions(n.options),type:DISCORD_INTERACTION_TYPE.APPLICATION_COMMAND}}function parseComponentInteraction(e){let t=parseInteractionBase(e),n=isObject(e.data)?e.data:null,r=isObject(e.message)?e.message:null;if(!t||!n||!isNonEmptyString(n.custom_id))return null;let i=isNonEmptyString(r?.id)?r.id:``;return i?{...t,componentType:typeof n.component_type==`number`?n.component_type:0,customId:n.custom_id,messageId:i,type:DISCORD_INTERACTION_TYPE.MESSAGE_COMPONENT,values:Array.isArray(n.values)?n.values.filter(e=>typeof e==`string`):[]}:null}function parseModalSubmitInteraction(e){let t=parseInteractionBase(e),n=isObject(e.data)?e.data:null;if(!t||!n||!isNonEmptyString(n.custom_id))return null;let r=isObject(e.message)?e.message:null;return{...t,customId:n.custom_id,messageId:isNonEmptyString(r?.id)?r.id:void 0,textInputs:parseTextInputs(n.components),type:DISCORD_INTERACTION_TYPE.MODAL_SUBMIT}}function parseInteractionBase(e){if(!isNonEmptyString(e.id)||!isNonEmptyString(e.application_id)||!isNonEmptyString(e.channel_id)||!isNonEmptyString(e.token))return null;let t=parseInteractionUser(e);if(!t)return null;let n=isObject(e.channel)?e.channel:void 0;return{applicationId:e.application_id,channelId:e.channel_id,channelType:typeof n?.type==`number`?n.type:void 0,guildId:isNonEmptyString(e.guild_id)?e.guild_id:void 0,id:e.id,member:parseMember(e.member),raw:e,token:e.token,user:t}}function parseInteractionUser(e){return parseUser(e.user)||(parseMember(e.member)?.user??null)}function parseMember(e){if(!isObject(e))return;let t=parseUser(e.user);if(t)return{nick:isNonEmptyString(e.nick)?e.nick:void 0,roles:Array.isArray(e.roles)?e.roles.filter(e=>typeof e==`string`):[],user:t}}function parseUser(e){return!isObject(e)||!isNonEmptyString(e.id)||!isNonEmptyString(e.username)?null:{avatar:isNonEmptyString(e.avatar)?e.avatar:void 0,discriminator:isNonEmptyString(e.discriminator)?e.discriminator:void 0,globalName:isNonEmptyString(e.global_name)?e.global_name:void 0,id:e.id,isBot:e.bot===!0,username:e.username}}function parseOptions(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!isObject(n)||!isNonEmptyString(n.name))continue;let e={name:n.name,options:parseOptions(n.options),value:parseOptionValue(n.value)};t.push(e)}return t}function parseOptionValue(e){if(typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return e}function parseTextInputs(e){let t={};if(!Array.isArray(e))return t;for(let n of e)if(isObject(n)&&Array.isArray(n.components))for(let e of n.components)isObject(e)&&isNonEmptyString(e.custom_id)&&typeof e.value==`string`&&(t[e.custom_id]=e.value);return t}function findOptionValue(e,t){for(let n of e){if(n.name===t&&n.value!==void 0)return n.value;let e=findOptionValue(n.options,t);if(e!==void 0)return e}}function formatCommandOptions(e){return e.map(formatOption).filter(e=>e.length>0).join(` `)}function formatOption(e){if(e.value!==void 0)return`${e.name}:${String(e.value)}`;let t=formatCommandOptions(e.options);return t?`${e.name} ${t}`:e.name}export{DISCORD_EPHEMERAL_MESSAGE_FLAG,DISCORD_INTERACTION_RESPONSE_TYPE,DISCORD_INTERACTION_TYPE,commandInteractionMessage,formatDiscordContextBlock,parseDiscordInteraction};