Aller au contenu principal

Services

zAuctionHouse utilise une architecture basée sur les services où chaque opération majeure possède son propre service dédié.

Vue d'Ensemble des Services

ServiceFonction
AuctionSellServiceGérer la mise en vente des objets
AuctionPurchaseServiceGérer les achats d'objets
AuctionRemoveServiceGérer la suppression d'objets
AuctionExpireServiceGérer l'expiration des objets

AuctionSellService

Gère toutes les opérations de mise en vente.

Interface

public interface AuctionSellService {

/**
* Vendre un objet.
*
* @param player Le vendeur
* @param itemStack L'objet à vendre
* @param price Le prix de vente
* @param economy L'économie à utiliser
* @return CompletableFuture avec le résultat
*/
CompletableFuture<SellResult> sell(
Player player,
ItemStack itemStack,
long price,
AuctionEconomy economy
);

/**
* Vendre un objet avec expiration personnalisée.
*
* @param player Le vendeur
* @param itemStack L'objet à vendre
* @param price Le prix de vente
* @param economy L'économie à utiliser
* @param expiration Durée d'expiration personnalisée
* @return CompletableFuture avec le résultat
*/
CompletableFuture<SellResult> sell(
Player player,
ItemStack itemStack,
long price,
AuctionEconomy economy,
Duration expiration
);

/**
* Vérifier si un joueur peut vendre un objet.
*
* @param player Le joueur
* @param itemStack L'objet
* @param price Le prix
* @param economy L'économie
* @return Résultat de validation
*/
SellValidation validate(
Player player,
ItemStack itemStack,
long price,
AuctionEconomy economy
);
}

Exemple d'Utilisation

AuctionSellService sellService = auctionPlugin.getSellService();
EconomyManager economyManager = auctionPlugin.getEconomyManager();

// Obtenir l'économie
AuctionEconomy economy = economyManager.getEconomy("vault").orElseThrow();

// Obtenir l'objet du joueur
ItemStack item = player.getInventory().getItemInMainHand();
long price = 5000;

// Valider d'abord (optionnel mais recommandé)
SellValidation validation = sellService.validate(player, item, price, economy);
if (!validation.isValid()) {
player.sendMessage("Impossible de vendre : " + validation.getReason());
return;
}

// Vendre l'objet
sellService.sell(player, item, price, economy)
.thenAccept(result -> {
Bukkit.getScheduler().runTask(plugin, () -> {
if (result.isSuccess()) {
// Retirer l'objet du joueur
player.getInventory().setItemInMainHand(null);
player.sendMessage("Mis en vente pour " + price + " !");
} else {
player.sendMessage("Échec : " + result.getMessage());
}
});
});

SellResult

public interface SellResult {
boolean isSuccess();
String getMessage();
Optional<AuctionItem> getAuctionItem();
SellFailReason getFailReason(); // NULL si succès
}

public enum SellFailReason {
NO_PERMISSION,
LIMIT_REACHED,
PRICE_TOO_LOW,
PRICE_TOO_HIGH,
ITEM_BLACKLISTED,
COOLDOWN,
CANCELLED_BY_EVENT,
DATABASE_ERROR
}

AuctionPurchaseService

Gère les achats d'objets.

Interface

public interface AuctionPurchaseService {

/**
* Acheter un objet.
*
* @param buyer Le joueur acheteur
* @param auctionItem L'objet à acheter
* @return CompletableFuture avec le résultat
*/
CompletableFuture<PurchaseResult> purchase(
Player buyer,
AuctionItem auctionItem
);

/**
* Vérifier si un joueur peut acheter un objet.
*
* @param buyer Le joueur
* @param auctionItem L'objet
* @return Résultat de validation
*/
PurchaseValidation validate(Player buyer, AuctionItem auctionItem);
}

Exemple d'Utilisation

AuctionPurchaseService purchaseService = auctionPlugin.getPurchaseService();
AuctionManager manager = auctionPlugin.getAuctionManager();

// Obtenir l'objet par ID
UUID itemId = UUID.fromString("...");
AuctionItem item = manager.getItem(itemId).orElseThrow();

// Valider
PurchaseValidation validation = purchaseService.validate(player, item);
if (!validation.isValid()) {
player.sendMessage("Impossible d'acheter : " + validation.getReason());
return;
}

// Acheter
purchaseService.purchase(player, item)
.thenAccept(result -> {
Bukkit.getScheduler().runTask(plugin, () -> {
if (result.isSuccess()) {
// Donner l'objet au joueur ou l'ajouter à récupérer
if (result.isItemGiven()) {
player.sendMessage("Acheté ! Objet ajouté à l'inventaire.");
} else {
player.sendMessage("Acheté ! Récupérez depuis /ah purchased.");
}
} else {
player.sendMessage("Échec : " + result.getMessage());
}
});
});

PurchaseResult

public interface PurchaseResult {
boolean isSuccess();
String getMessage();
boolean isItemGiven(); // true si ajouté à l'inventaire, false si à récupérer
PurchaseFailReason getFailReason();
}

public enum PurchaseFailReason {
ITEM_NOT_FOUND,
ITEM_ALREADY_SOLD,
NOT_ENOUGH_MONEY,
OWN_ITEM,
COOLDOWN,
CANCELLED_BY_EVENT,
DATABASE_ERROR
}

AuctionRemoveService

Gère la suppression d'objets des ventes.

Interface

public interface AuctionRemoveService {

/**
* Retirer un objet en vente (retourner au vendeur).
*
* @param player Le propriétaire
* @param auctionItem L'objet à retirer
* @return CompletableFuture avec le résultat
*/
CompletableFuture<RemoveResult> removeListedItem(
Player player,
AuctionItem auctionItem
);

/**
* Récupérer un objet expiré.
*
* @param player Le propriétaire
* @param auctionItem L'objet expiré
* @return CompletableFuture avec le résultat
*/
CompletableFuture<RemoveResult> claimExpiredItem(
Player player,
AuctionItem auctionItem
);

/**
* Récupérer un objet acheté.
*
* @param player L'acheteur
* @param auctionItem L'objet acheté
* @return CompletableFuture avec le résultat
*/
CompletableFuture<RemoveResult> claimPurchasedItem(
Player player,
AuctionItem auctionItem
);

/**
* Récupérer tous les objets expirés d'un joueur.
*
* @param player Le propriétaire
* @return CompletableFuture avec le nombre d'objets récupérés
*/
CompletableFuture<Integer> claimAllExpiredItems(Player player);

/**
* Récupérer tous les objets achetés d'un joueur.
*
* @param player L'acheteur
* @return CompletableFuture avec le nombre d'objets récupérés
*/
CompletableFuture<Integer> claimAllPurchasedItems(Player player);
}

Exemple d'Utilisation

AuctionRemoveService removeService = auctionPlugin.getRemoveService();

// Retirer un objet en vente
removeService.removeListedItem(player, auctionItem)
.thenAccept(result -> {
Bukkit.getScheduler().runTask(plugin, () -> {
if (result.isSuccess()) {
player.sendMessage("Objet retiré et retourné à l'inventaire.");
}
});
});

// Récupérer tous les objets expirés
removeService.claimAllExpiredItems(player)
.thenAccept(count -> {
Bukkit.getScheduler().runTask(plugin, () -> {
player.sendMessage("Récupéré " + count + " objets expirés.");
});
});

AuctionExpireService

Gère l'expiration automatique des objets.

Interface

public interface AuctionExpireService {

/**
* Expirer manuellement un objet.
*
* @param auctionItem L'objet à expirer
* @return CompletableFuture avec le résultat
*/
CompletableFuture<Boolean> expireItem(AuctionItem auctionItem);

/**
* Expirer tous les objets d'un joueur.
*
* @param playerUuid UUID du joueur
* @return CompletableFuture avec le nombre d'objets expirés
*/
CompletableFuture<Integer> expireAllItems(UUID playerUuid);

/**
* Vérifier les objets expirés et les traiter.
* Appelé automatiquement par le plugin.
*/
void checkExpiredItems();
}

Exemple d'Utilisation (Fonction Admin)

AuctionExpireService expireService = auctionPlugin.getExpireService();

// Expirer tous les objets d'un joueur (action admin)
UUID targetUuid = Bukkit.getOfflinePlayer("NomJoueur").getUniqueId();

expireService.expireAllItems(targetUuid)
.thenAccept(count -> {
sender.sendMessage("Expiré " + count + " objets du joueur.");
});

Gestion des Erreurs

Tous les services retournent des CompletableFutures. Gérez les erreurs correctement :

sellService.sell(player, item, price, economy)
.thenAccept(result -> {
// Gérer succès/échec
})
.exceptionally(throwable -> {
// Gérer les erreurs inattendues
plugin.getLogger().severe("Erreur lors de la vente : " + throwable.getMessage());
Bukkit.getScheduler().runTask(plugin, () -> {
player.sendMessage("Une erreur est survenue. Veuillez réessayer.");
});
return null;
});

Thread Safety

Toutes les méthodes des services sont thread-safe. Les résultats sont livrés sur des threads asynchrones, utilisez donc Bukkit.getScheduler().runTask() lors de l'interaction avec l'API Bukkit :

purchaseService.purchase(player, item)
.thenAccept(result -> {
// Ceci s'exécute sur un thread asynchrone
Bukkit.getScheduler().runTask(plugin, () -> {
// Safe pour utiliser l'API Bukkit ici
player.sendMessage("...");
player.getInventory().addItem(item.getItemStack());
});
});
Copyright © 2026 GroupeZ|Build #loading...|-