GrzybcioRynek

Transactions

Pełny cykl MarketManager.buyItem — stany, rollback i stringi błędów.

Kompatybilne z: GrzybcioRynek 1.0.3Minecraft 26.2Web 0.1.0

Na podstawie kodu GrzybcioRynek 1.0.3 i web 0.1.0.

Zakup jest tylko w GUI: Detail (slot 11) → Confirm. Nie ma /market buy. Płatność: Vault po UUID. Klasa: MarketManager.buyItem. Transakcja: MarketTransaction (UUID string).

transactions.logging: true loguje kroki na konsolę serwera.

Stany (TransactionState)

CREATED → LISTING_RESERVED → MONEY_WITHDRAWN → SELLER_PAID → ITEM_DELIVERED → COMPLETED ↘ ROLLED_BACK ↘ FAILED
StanZnaczenie
CREATEDObiekt TX utworzony, oferta jeszcze w magazynie
LISTING_RESERVEDOferta zdjęta z rynku (removeListing)
MONEY_WITHDRAWNPobrano cenę od kupującego
SELLER_PAIDWpłacono sprzedawcy price - fee
ITEM_DELIVEREDItem dodany do ekwipunku / overflow do skrzynki
COMPLETEDZapisane w market-data.yml; historia, oceny, refund
ROLLED_BACKCofnięcie albo admin refund
FAILEDBłąd z polem error

Cykl zakupu

  1. Rezerwacja IDreservedListings.add(listingId). Drugi kupujący: buy.listing-locked.
  2. Walidacja (pod globalLock):
    • oferta istnieje — inaczej buy.not-available
    • nie własna — buy.own-listing
    • AntiAbuseManager.canPurchase
    • cena skończona i > 0
    • VaultHook.has(buyer, price)buy.not-enough-money
    • recreateItem nie jest AIRbuy.not-available
    • InventoryUtil.canFitbuy.inventory-full
  3. TX UUID, stan CREATED.
  4. Usunięcie oferty → LISTING_RESERVED. Błąd: LISTING_REMOVE_FAILED. Ulubione tego ID czyszczone.
  5. withdraw kupującego → MONEY_WITHDRAWN. Błąd: WITHDRAW_FAILED, restore oferty.
  6. deposit sprzedawcy (price - fee) → SELLER_PAID. Błąd: SELLER_DEPOSIT_FAILED, zwrot kasy kupującemu, restore oferty.
  7. Prowizja na market-fee.sink-account jeśli niepuste. Nieudany sink = warning w logu, transakcja nie pada.
  8. addItem kupującemu; reszta → mailbox purchase-overflowITEM_DELIVERED.
  9. COMPLETED, addTransaction (zawsze, niezależnie od history.enabled), markPurchased, buy.success, powiadomienie sprzedawcy (buy.seller-notified / pending-sales gdy offline).
  10. TransactionCompletedEvent. Gdy ratings.enabled — prompt oceny na czacie.
  11. finally: zdjęcie rezerwacji ID.

Rollback (rollbackBuy)

Wywoływany przy wyjątku, gdy TX nie jest jeszcze committed.

Stan w momencie wyjątkuDziałanie
ITEM_DELIVERED lub COMPLETEDZostaw jako COMPLETED, zapisz TX. Nie cofaj kasy (unik mintu + itemu).
SELLER_PAIDClaw-back od sprzedawcy, zwrot kupującemu, restore oferty → ROLLED_BACK. Jeśli claw-back padnie: ROLLBACK_SELLER_WITHDRAW_FAILED, bez zwrotu kupującemu.
MONEY_WITHDRAWNZwrot kupującemu + restore oferty → ROLLED_BACK
LISTING_RESERVEDRestore oferty → ROLLED_BACK
InnyEXCEPTION_AFTER_<STATE>FAILED
Wyjątek w rollbackuROLLBACK_FAILED:<msg>

Stringi błędów (transaction.error)

StringKiedy
LISTING_REMOVE_FAILEDNie udało się zdjąć oferty
WITHDRAW_FAILEDVault nie pobrał kasy kupującego
SELLER_DEPOSIT_FAILEDVault nie wpłacił sprzedawcy
ROLLBACK_SELLER_WITHDRAW_FAILEDClaw-back sprzedawcy nieudany
ROLLBACK_FAILED:<msg>Wyjątek w rollbacku
EXCEPTION_AFTER_<STATE>Wyjątek w nieobsłużonym stanie
REFUND:<timestamp>Admin /market admin refund (potem stan ROLLED_BACK)

Admin refund

/market admin refund <tx-id> [reclaim] — tylko COMPLETED bez wcześniejszego REFUND:.

  • Pobiera od sprzedawcy sellerReceived (albo nic, gdy 0).
  • Wpłaca kupującemu tę kwotę (albo pełne price, gdy sellerReceived było 0).
  • Opcja reclaim: próbuje zabrać item kupującemu (jeśli online) i wrzuca kopię do skrzynki sprzedawcy z powodem admin-refund.

Historia vs flaga

Każda zakończona TX jest zapisywana zawsze. history.enabled wyłącza tylko komendę /market history. history.retention-days usuwa wyłącznie rekordy w stanie COMPLETED starsze niż próg. ROLLED_BACK / FAILED zostają.

Czego nie ma

  • Komendy kupna.
  • Częściowego zakupu stacka.
  • Fallbacku Vault po nicku — depozyt po UUID.