import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, EmbedBuilder, InteractionCollector, ModalBuilder, StringSelectMenuInteraction, TextInputBuilder, TextInputStyle } from 'discord.js'; import { ICurrentItemFilter } from '../../utils/types'; import crypto from "node:crypto" import { SubmitSchema } from '../../models/submitSchema'; import { formatItem } from '../formatting/formatItem'; import { formatResults } from '../formatting/formatResults'; import { UserSchema } from '../../models/userSchema'; import config from '../../utils/config'; import { isValidUTF8 } from '../formatting/isValidUTF8'; export async function handleSubmit( interaction: ButtonInteraction, currentItems: ICurrentItemFilter[], userSchema: InstanceType, collector: InteractionCollector | StringSelectMenuInteraction<"cached">>, ): Promise | undefined> { try { const timestamp = Date.now() const comboInput = new TextInputBuilder().setCustomId(`input-${interaction.user.id}`).setLabel('Combo:').setPlaceholder('Put here the combo').setStyle(TextInputStyle.Paragraph).setRequired(true).setMaxLength(500) const row = new ActionRowBuilder().addComponents(comboInput) const modal = new ModalBuilder().setTitle('Combo').addComponents(row).setCustomId(`modal-${interaction.user.id}-${timestamp}`) await interaction.showModal(modal) const modalSubmit = await interaction.awaitModalSubmit({ filter: (i) => i.customId === `modal-${i.user.id}-${timestamp}`, time: 600_000, }).catch(() => {return}) if (!modalSubmit) { return; } const combo = modalSubmit.components[0].components[0].value console.log(combo) const customId = "#" + (crypto.randomBytes(2).toString("hex").toUpperCase() + (await SubmitSchema.find()).length); if (!isValidUTF8(combo)) { console.error(`Invalid utf-8 ${interaction.user.id}`) return; } if (!combo) return; const newCombo = new SubmitSchema({ fruit: currentItems.find(item => item.type === 'fruit')?.value, sword: currentItems.find(item => item.type === 'sword')?.value, fightingStyle: currentItems.find(item => item.type === 'fighting')?.value, gun: currentItems.find(item => item.type === 'gun')?.value, combo: combo, status: 'pending', authorId: interaction.user.id, guildId: interaction.guild!.id, suggestionId: customId, upVotes: [], downVotes: [], }); console.log(newCombo) userSchema.lastSubmitUsage = Date.now() userSchema.submitionsSent++ if (userSchema.submitionsSent < userSchema.submitionsApproved) { userSchema.submitionsSent = userSchema.submitionsApproved + 1 } await userSchema.save() const test = await newCombo.save().catch((e) => {console.log('Cannot save combo in handleSubmit.ts - 73');console.log(e)}); console.log(test) const submitChannel = await interaction.guild!.channels.fetch('1279086402612498524') if (!submitChannel?.isTextBased()) { throw 'Submit channel is not text based.' } const approve = new ButtonBuilder().setCustomId(`submit-approve-${customId}`).setLabel('Approve').setEmoji('✔️').setStyle(ButtonStyle.Secondary); const reject = new ButtonBuilder().setCustomId(`submit-reject-${customId}`).setLabel('Reject').setEmoji('✖️').setStyle(ButtonStyle.Secondary); const edit = new ButtonBuilder().setCustomId(`submit-edit-${customId}`).setLabel('Edit').setEmoji('✏️').setStyle(ButtonStyle.Secondary); const warn = new ButtonBuilder().setCustomId(`submit-warn-${customId}`).setLabel('Warn').setEmoji('⚠️').setStyle(ButtonStyle.Secondary); const verify = new ButtonBuilder().setCustomId(`submit-verify-${customId}`).setLabel('Verify').setEmoji('✅').setStyle(ButtonStyle.Secondary); const like = new ButtonBuilder().setCustomId(`submit-like-${customId}`).setLabel('Like').setEmoji("👍" as any).setStyle(ButtonStyle.Success); const dislike = new ButtonBuilder().setCustomId(`submit-dislike-${customId}`).setLabel('Dislike').setEmoji("👎" as any).setStyle(ButtonStyle.Danger); const search = new ButtonBuilder().setCustomId(`submit-search-${customId}`).setLabel('Search').setEmoji("🔎" as any).setStyle(ButtonStyle.Primary); const likeRow = new ActionRowBuilder().addComponents(like, dislike, search) const modRow = new ActionRowBuilder().addComponents(approve, reject, edit, warn, verify) const embed = new EmbedBuilder() .setTitle(`⌛ Pending | Combo: ${customId}`) .setDescription(`👤 **Verified:** \`${userSchema.verified?.modId ? `✅ Yes` : `❌ No`}\`\n📤 **Submitions:**\n> ⭐ Total: \`${userSchema.submitionsSent}\`\n> ✅ Approved: \`${userSchema.submitionsApproved}\`\n> ❌ Rejected: \`${userSchema.submitionsRejected}\``) .setFields({name: '🍎Items', value: currentItems.filter((item) => item.value !== undefined).map((item) => formatItem(item)).join('\n')}, {name: `💣 Combo ${customId}:`, value: `${combo}`}, {name: `⠀`, value: `${formatResults([], [])}`}) .setColor(config.color) await submitChannel.send({components: [modRow, likeRow], embeds: [embed]}) modalSubmit.deferUpdate() return newCombo } catch (err) { console.error("Error saving combo:", err); await interaction.editReply({ content: 'There was an error while saving the combo. Please try again later.', components: [], embeds: [] }); } }