(interaction, client)
| 75 | }; |
| 76 | |
| 77 | async function warningDeleteModalHandler(interaction, client) { |
| 78 | try { |
| 79 | const [, targetUserId, originalModeratorId] = interaction.customId.split(':'); |
| 80 | |
| 81 | if (interaction.user.id !== originalModeratorId) { |
| 82 | return await replyUserError(interaction, { type: ErrorTypes.PERMISSION, message: 'Only the original moderator can delete warnings.' }); |
| 83 | } |
| 84 | |
| 85 | const warningNumberInput = interaction.fields.getTextInputValue('warning_number'); |
| 86 | const warningNumber = parseInt(warningNumberInput.replace('#', '').trim(), 10); |
| 87 | |
| 88 | if (isNaN(warningNumber) || warningNumber < 1) { |
| 89 | return await replyUserError(interaction, { type: ErrorTypes.VALIDATION, message: 'Please enter a valid warning number (e.g., 1, 2, 3).' }); |
| 90 | } |
| 91 | |
| 92 | const deferSuccess = await InteractionHelper.safeDefer(interaction); |
| 93 | if (!deferSuccess) return; |
| 94 | |
| 95 | const guildId = interaction.guildId; |
| 96 | const warnings = await WarningService.getWarnings(guildId, targetUserId); |
| 97 | |
| 98 | if (warningNumber > warnings.length) { |
| 99 | return await replyUserError(interaction, { type: ErrorTypes.USER_INPUT, message: 'Warning #${warningNumber} does not exist. This user only has ${warnings.length} warning(s).' }); |
| 100 | } |
| 101 | |
| 102 | const warningToDelete = warnings[warningNumber - 1]; |
| 103 | const result = await WarningService.removeWarning(guildId, targetUserId, warningToDelete.id); |
| 104 | |
| 105 | if (!result.success) { |
| 106 | throw new Error(result.error || 'Failed to delete warning'); |
| 107 | } |
| 108 | |
| 109 | const targetUser = await client.users.fetch(targetUserId).catch(() => null); |
| 110 | const targetName = targetUser ? targetUser.username : 'the user'; |
| 111 | |
| 112 | logger.info(`[MODERATION] Warning deleted for ${targetUserId} in ${guildId} by ${interaction.user.id}`, { |
| 113 | warningId: warningToDelete.id, |
| 114 | reason: warningToDelete.reason, |
| 115 | warningNumber |
| 116 | }); |
| 117 | |
| 118 | await interaction.editReply({ |
| 119 | embeds: [successEmbed('✅ Warning Deleted', `Warning #${warningNumber} for **${targetName}** has been deleted.\n\n**Reason was:** ${warningToDelete.reason.substring(0, 100)}`)] |
| 120 | }); |
| 121 | } catch (error) { |
| 122 | logger.error('Warning delete modal handler error:', error); |
| 123 | await replyUserError(interaction, { type: ErrorTypes.UNKNOWN, message: 'Failed to delete warning.' }); |
| 124 | } |
| 125 | } |
| 126 | |
| 127 | async function warningClearConfirmModalHandler(interaction, client) { |
| 128 | try { |
nothing calls this directly
no test coverage detected