Files
betterMcCommands/docs/05_VALIDATION_AND_CONFIRMATION.md

104 lines
4.0 KiB
Markdown

# 🛡️ Validation & Double Confirmation - betterMcCommands
La bibliothèque intègre des mécanismes pour valider les pré-requis métier et sécuriser les actions destructrices ou sensibles.
---
## 📑 Sommaire
- [1. Validation Métier au Niveau de la Commande](#1-validation-métier-au-niveau-de-la-commande)
- [2. Validation au Niveau d'un Argument](#2-validation-au-niveau-dun-argument)
- [3. Confirmation Préalable & Double Validation (`.requireConfirmation`)](#3-confirmation-préalable--double-validation-requireconfirmation)
---
## 1. Validation Métier au Niveau de la Commande
La méthode `.validate(...)` permet d'exécuter des assertions logiques avant que le gestionnaire principal ne soit appelé. Si la validation échoue, le message d'erreur est automatiquement envoyé et la commande s'interrompt.
### Exemple : Validation simple par prédicat
```java
BetterMcCommands.builder("level-reward")
.playerOnly()
// Teste si le joueur a le niveau requis
.validate(ctx -> ctx.getPlayer().getLevel() >= 10, "Vous devez posséder le niveau 10 minimum !")
.executes(ctx -> {
ctx.replySuccess("Récompense de niveau 10 réclamée !");
})
.register();
```
### Exemple : Validateur complexe (`CommandValidator`)
```java
BetterMcCommands.builder("claim")
.playerOnly()
.validate(ctx -> {
Player p = ctx.getPlayer();
if (economy.getBalance(p) < 500) {
return ValidationResult.invalid("Solde insuffisant : 500 $ requis.");
}
if (territoryManager.isProtected(p.getLocation())) {
return ValidationResult.invalid("Cette zone est déjà protégée !");
}
return ValidationResult.valid();
})
.executes(ctx -> {
ctx.replySuccess("Territoire revendiqué avec succès !");
})
.register();
```
---
## 2. Validation au Niveau d'un Argument
Vous pouvez également restreindre les valeurs acceptées par un argument :
```java
BetterMcCommands.builder("setprice")
.argument(Arguments.decimal("prix")
// Vérification personnalisée de la valeur
.validate(prix -> prix > 0, "Le prix doit être strictement supérieur à 0 !")
.validate(prix -> prix <= 1000000, "Le prix maximal autorisé est de 1 000 000 $.")
)
.executes(ctx -> {
double prix = ctx.getDouble("prix");
ctx.replySuccess("Prix configuré : <gold>" + prix + " $</gold>.");
})
.register();
```
---
## 3. Confirmation Préalable & Double Validation (`.requireConfirmation`)
Pour les commandes irréversibles (suppression de données, dissolution de guilde, réinitialisation de statistiques), activez la confirmation préalable avec `.requireConfirmation(...)` :
```java
BetterMcCommands.builder("disband")
.description("Dissout votre guilde")
.playerOnly()
// Délai de 15 secondes pour confirmer avec message d'avertissement
.requireConfirmation(Duration.ofSeconds(15), "<red><bold>ATTENTION</bold> : Cette action est irréversible ! Retapez <yellow>/disband</yellow> dans les 15 secondes pour confirmer.</red>")
.executes(context -> {
Player p = context.getPlayer();
guildManager.disbandGuild(p);
context.replySuccess("Votre guilde a été dissoute.");
})
.register();
```
### Comment fonctionne le cycle de confirmation ?
1. **1ère exécution** : L'émetteur tape `/disband`.
- La commande est suspendue.
- Une demande de confirmation temporaire est enregistrée dans le `ConfirmationManager`.
- Le message d'avertissement est envoyé au joueur.
- L'événement `CommandConfirmationRequiredEvent` est diffusé.
2. **2ème exécution (dans les 15s)** : L'émetteur retape `/disband`.
- La confirmation active est détectée et consommée.
- Le code du gestionnaire métier `.executes(...)` s'exécute normalement.
3. **Expiration** : Si le joueur ne retape pas la commande dans le délai, la confirmation expire automatiquement.
---
> 📖 **Étape suivante** : Découvrez les cooldowns et répétitions dans [06_COOLDOWNS_AND_REPEAT.md](06_COOLDOWNS_AND_REPEAT.md).