{"version":3,"file":"stringify.mjs","names":[],"sources":["../../src/utils/stringify.ts"],"sourcesContent":["import {\n  ApplicationCommandOptionType,\n  type CommandInteractionOption,\n  ComponentType,\n  type Interaction,\n  type ModalData,\n} from 'discord.js'\n\nconst optionTypeToString: Record<ApplicationCommandOptionType, string> = {\n  1: 'Subcommand',\n  2: 'SubcommandGroup',\n  3: 'String',\n  4: 'Integer',\n  5: 'Boolean',\n  6: 'User',\n  7: 'Channel',\n  8: 'Role',\n  9: 'Mentionable',\n  10: 'Number',\n  11: 'Attachment',\n}\n\n/**\n * Format an interaction into a string, like:\n * @example\n * // Slash commands & autocomplete\n * /command [option1<String>: value1] [option2<Integer>: value2]\n * /command sub_command [focused*<String>: value]\n * // Right click commands (message or user)\n * >command [Message (1233123123333): hello everybody my name is markiplier...]\n * >command [User (91298392100299): atorasuunva]\n * // Buttons/select menus/modals\n * [Button (custom-id)]\n * [SelectMenu (custom-id) [val1, val2, val3]]\n * [ModalSubmit (custom-id) [opt1<Checkbox>: true] [opt2<CheckboxGroup>: val1, val2] [opt3<TextInput>: some text]]\n * @param interaction The interaction to format as a string\n * @returns The interaction as a string\n */\nexport function interactionToString(interaction: Interaction): string {\n  if (interaction.isChatInputCommand() || interaction.isAutocomplete()) {\n    const name = interaction.commandName\n    const group = interaction.options.getSubcommandGroup(false) ?? ''\n    const subcommand = interaction.options.getSubcommand(false) ?? ''\n\n    const fGroup = group ? ` ${group}` : ''\n    const fSubcommand = subcommand ? ` ${subcommand}` : ''\n\n    const options = interaction.options.data.map(stringifyOption)\n    return `/${name}${fGroup}${fSubcommand} ${options.join(' ')}`\n  }\n\n  if (interaction.isUserContextMenuCommand()) {\n    return `>${interaction.commandName} [User] (${interaction.targetId}): ${interaction.targetUser.username}]`\n  }\n\n  if (interaction.isMessageContextMenuCommand()) {\n    return `>${interaction.commandName} [Message] (${\n      interaction.targetId\n    }): ${interaction.targetMessage.content.substring(0, 50)}`\n  }\n\n  if (interaction.isButton()) {\n    return `[Button] (${interaction.customId})`\n  }\n\n  if (interaction.isAnySelectMenu()) {\n    return `[SelectMenu] (${interaction.customId}) [${interaction.values.join(', ')}]`\n  }\n\n  if (interaction.isModalSubmit()) {\n    // So far, only strings exist for modal submits\n    const opts = interaction.fields.fields.map(formatModalData)\n    return `[ModalSubmit] (${interaction.customId}) ${opts.join(' ')}`\n  }\n\n  return '[Unknown interaction type]'\n}\n\nfunction formatModalData(modalData: ModalData): string {\n  switch (modalData.type) {\n    case ComponentType.CheckboxGroup: {\n      return `[${modalData.customId}<CheckboxGroup>: ${modalData.values.join(', ')}]`\n    }\n\n    case ComponentType.Checkbox: {\n      return `[${modalData.customId}<Checkbox>: ${modalData.value}]`\n    }\n\n    case ComponentType.FileUpload: {\n      return `[${modalData.customId}<FileUpload>: ${modalData.values.join(', ')}]`\n    }\n\n    case ComponentType.RadioGroup: {\n      return `[${modalData.customId}<RadioGroup>: ${modalData.value}]`\n    }\n\n    case ComponentType.SelectMenu: {\n      return `[${modalData.customId}<SelectMenu>: ${modalData.values.join(', ')}]`\n    }\n\n    case ComponentType.TextInput: {\n      return `[${modalData.customId}<TextInput>: ${modalData.value}]`\n    }\n\n    default: {\n      return `[${modalData.customId}<unknown>: ${modalData.values.join(', ')}]`\n    }\n  }\n}\n\nfunction stringifyOption(opt: CommandInteractionOption): string {\n  if (opt.type === ApplicationCommandOptionType.Subcommand) {\n    return opt.options ? opt.options.map(stringifyOption).join(' ') : ''\n  }\n\n  if (opt.type === ApplicationCommandOptionType.SubcommandGroup) {\n    return opt.options ? opt.options.map(stringifyOption).join(' ') : ''\n  }\n\n  return `[${opt.name}${opt.focused ? '*' : ''}<${optionTypeToString[opt.type]}>: ${opt.value}]`\n}\n"],"mappings":";;AAQA,MAAM,qBAAmE;CACvE,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,IAAI;CACJ,IAAI;CACL;;;;;;;;;;;;;;;;;AAkBD,SAAgB,oBAAoB,aAAkC;AACpE,KAAI,YAAY,oBAAoB,IAAI,YAAY,gBAAgB,EAAE;EACpE,MAAM,OAAO,YAAY;EACzB,MAAM,QAAQ,YAAY,QAAQ,mBAAmB,MAAM,IAAI;EAC/D,MAAM,aAAa,YAAY,QAAQ,cAAc,MAAM,IAAI;AAM/D,SAAO,IAAI,OAJI,QAAQ,IAAI,UAAU,KACjB,aAAa,IAAI,eAAe,GAGb,GADvB,YAAY,QAAQ,KAAK,IAAI,gBAAgB,CACX,KAAK,IAAI;;AAG7D,KAAI,YAAY,0BAA0B,CACxC,QAAO,IAAI,YAAY,YAAY,WAAW,YAAY,SAAS,KAAK,YAAY,WAAW,SAAS;AAG1G,KAAI,YAAY,6BAA6B,CAC3C,QAAO,IAAI,YAAY,YAAY,cACjC,YAAY,SACb,KAAK,YAAY,cAAc,QAAQ,UAAU,GAAG,GAAG;AAG1D,KAAI,YAAY,UAAU,CACxB,QAAO,aAAa,YAAY,SAAS;AAG3C,KAAI,YAAY,iBAAiB,CAC/B,QAAO,iBAAiB,YAAY,SAAS,KAAK,YAAY,OAAO,KAAK,KAAK,CAAC;AAGlF,KAAI,YAAY,eAAe,EAAE;EAE/B,MAAM,OAAO,YAAY,OAAO,OAAO,IAAI,gBAAgB;AAC3D,SAAO,kBAAkB,YAAY,SAAS,IAAI,KAAK,KAAK,IAAI;;AAGlE,QAAO;;AAGT,SAAS,gBAAgB,WAA8B;AACrD,SAAQ,UAAU,MAAlB;EACE,KAAK,cAAc,cACjB,QAAO,IAAI,UAAU,SAAS,mBAAmB,UAAU,OAAO,KAAK,KAAK,CAAC;EAG/E,KAAK,cAAc,SACjB,QAAO,IAAI,UAAU,SAAS,cAAc,UAAU,MAAM;EAG9D,KAAK,cAAc,WACjB,QAAO,IAAI,UAAU,SAAS,gBAAgB,UAAU,OAAO,KAAK,KAAK,CAAC;EAG5E,KAAK,cAAc,WACjB,QAAO,IAAI,UAAU,SAAS,gBAAgB,UAAU,MAAM;EAGhE,KAAK,cAAc,WACjB,QAAO,IAAI,UAAU,SAAS,gBAAgB,UAAU,OAAO,KAAK,KAAK,CAAC;EAG5E,KAAK,cAAc,UACjB,QAAO,IAAI,UAAU,SAAS,eAAe,UAAU,MAAM;EAG/D,QACE,QAAO,IAAI,UAAU,SAAS,aAAa,UAAU,OAAO,KAAK,KAAK,CAAC;;;AAK7E,SAAS,gBAAgB,KAAuC;AAC9D,KAAI,IAAI,SAAS,6BAA6B,WAC5C,QAAO,IAAI,UAAU,IAAI,QAAQ,IAAI,gBAAgB,CAAC,KAAK,IAAI,GAAG;AAGpE,KAAI,IAAI,SAAS,6BAA6B,gBAC5C,QAAO,IAAI,UAAU,IAAI,QAAQ,IAAI,gBAAgB,CAAC,KAAK,IAAI,GAAG;AAGpE,QAAO,IAAI,IAAI,OAAO,IAAI,UAAU,MAAM,GAAG,GAAG,mBAAmB,IAAI,MAAM,KAAK,IAAI,MAAM"}