Skip to content

Commit

Permalink
Extracted collector adding
Browse files Browse the repository at this point in the history
  • Loading branch information
coinmoles committed Dec 21, 2023
1 parent 1408172 commit 91c5291
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 27 deletions.
38 changes: 14 additions & 24 deletions src/commands/missionGive/postMission/operations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
import { postMission } from "../../../db/actions/missionActions.js"
import { Mission } from "../../../interfaces/models/Mission.js"
import { checkAssociate } from "../../utils/checks/checkAssociate.js"
import { confirmCollect, confirmFilter, confirmTimeout, createConfirmActionRow } from "../../utils/components/confirmActionRow.js"
import { createMissionModal, createMissionModalId, getMissionModalValue } from "../../utils/components/missionModal.js"
import { addConfirmCollector, confirmCollect, confirmFilter, confirmTimeout, createConfirmActionRow } from "../../utils/components/confirmActionRow.js"
import { createMissionModal, createMissionModalId, getMissionModalMission } from "../../utils/components/missionModal.js"
import { createMissionPreviewString, createMissionPreviewTitle } from "../../utils/createString/createMissionPreviewString.js"
import { errorEmbed } from "../../utils/errorEmbeds.js"
import { getQuarterDataFooter } from "../../utils/quarterData/getQuarterData.js"
Expand Down Expand Up @@ -47,20 +47,6 @@ const onCancel = (modalInteraction: ModalSubmitInteraction, target: User, missio
await modalInteraction.editReply({ embeds: [cancelEmbed.setFooter(await getQuarterDataFooter())], components: [] })
}

const addCollector = async (
modalInteraction: ModalSubmitInteraction, reply: Message<boolean> | InteractionResponse<boolean>,
target: User, mission: Mission
) => {
const collector = reply.createMessageComponentCollector({
filter: confirmFilter(commandId, modalInteraction.user),
componentType: ComponentType.Button, time: 10_000, max: 1
})

collector.on("collect", confirmCollect(commandId, modalInteraction.user,
onConfirm(modalInteraction, target, mission), onCancel(modalInteraction, target, mission)))
collector.on('end', confirmTimeout(modalInteraction));
}

export const doReply = async (interaction: ChatInputCommandInteraction, target: User, isEditing: boolean = false) => {
if (!await checkAssociate(interaction, target.id, true))
return
Expand All @@ -74,22 +60,26 @@ export const doReply = async (interaction: ChatInputCommandInteraction, target:
if (modalInteraction === null)
return

const mission = getMissionModalValue(modalInteraction, target)
const mission = getMissionModalMission(modalInteraction, target)
if (mission === undefined) {
await modalInteraction.reply("점수가 숫자가 아닙니다!")
return
}

const replyEmbed = EmbedBuilder.from(replyEmbedPrototype)
.addFields({ name: createMissionPreviewTitle(mission, target), value: createMissionPreviewString(mission, target) })
.setFooter(await getQuarterDataFooter())


const reply = await modalInteraction.reply({
embeds: [replyEmbed],
embeds: [
EmbedBuilder.from(replyEmbedPrototype)
.addFields({ name: createMissionPreviewTitle(mission, target), value: createMissionPreviewString(mission, target) })
.setFooter(await getQuarterDataFooter())
],
components: [createConfirmActionRow(commandId, modalInteraction.user)],
ephemeral: true,
fetchReply: true
});

await addCollector(modalInteraction, reply, target, mission)
await addConfirmCollector(
commandId, modalInteraction, reply,
onConfirm(modalInteraction, target, mission),
onCancel(modalInteraction, target, mission)
)
}
18 changes: 16 additions & 2 deletions src/commands/utils/components/confirmActionRow.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, CacheType, Collection, MessageActionRowComponentBuilder, ModalSubmitInteraction, User } from "discord.js";
import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, CacheType, Collection, ComponentType, InteractionResponse, Message, MessageActionRowComponentBuilder, ModalSubmitInteraction, User } from "discord.js";
import { timeoutEmbed } from "../errorEmbeds.js";

const createConfirmButtonId = (commandId: string, user: User) =>
Expand Down Expand Up @@ -33,4 +33,18 @@ export const confirmTimeout = (modalInteraction: ModalSubmitInteraction) =>
async (collected: Collection<string, ButtonInteraction<CacheType>>) => {
if (collected.size === 0)
modalInteraction.editReply({ embeds: [timeoutEmbed], components: [] })
}
}

export const addConfirmCollector = (
commandId: string, modalInteraction: ModalSubmitInteraction, reply: Message<boolean> | InteractionResponse<boolean>,
onConfirm: (buttonInteraction: ButtonInteraction) => Promise<void>,
onCancel: (buttonInteraction: ButtonInteraction) => Promise<void>
) => {
const collector = reply.createMessageComponentCollector({
filter: confirmFilter(commandId, modalInteraction.user),
componentType: ComponentType.Button, time: 10_000, max: 1
})

collector.on("collect", confirmCollect(commandId, modalInteraction.user, onConfirm, onCancel))
collector.on('end', confirmTimeout(modalInteraction));
}
2 changes: 1 addition & 1 deletion src/commands/utils/components/missionModal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ export const createMissionModal = (
.addComponents(new ActionRowBuilder<TextInputBuilder>().addComponents(missionNoteInput))
}

export const getMissionModalValue = (interaction: ModalSubmitInteraction, target: User, completed?: string[]): Mission | undefined => {
export const getMissionModalMission = (interaction: ModalSubmitInteraction, target: User, completed?: string[]): Mission | undefined => {
const category = interaction.fields.getTextInputValue(missionCategoryInputId)
const content = interaction.fields.getTextInputValue(missionContentInputId)
const note = interaction.fields.getTextInputValue(missionNoteInputId)
Expand Down

0 comments on commit 91c5291

Please sign in to comment.