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
| Stan | Znaczenie |
|---|---|
CREATED | Obiekt TX utworzony, oferta jeszcze w magazynie |
LISTING_RESERVED | Oferta zdjęta z rynku (removeListing) |
MONEY_WITHDRAWN | Pobrano cenę od kupującego |
SELLER_PAID | Wpłacono sprzedawcy price - fee |
ITEM_DELIVERED | Item dodany do ekwipunku / overflow do skrzynki |
COMPLETED | Zapisane w market-data.yml; historia, oceny, refund |
ROLLED_BACK | Cofnięcie albo admin refund |
FAILED | Błąd z polem error |
Cykl zakupu
- Rezerwacja ID —
reservedListings.add(listingId). Drugi kupujący:buy.listing-locked. - 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-moneyrecreateItemnie jestAIR—buy.not-availableInventoryUtil.canFit—buy.inventory-full
- oferta istnieje — inaczej
- TX UUID, stan
CREATED. - Usunięcie oferty →
LISTING_RESERVED. Błąd:LISTING_REMOVE_FAILED. Ulubione tego ID czyszczone. withdrawkupującego →MONEY_WITHDRAWN. Błąd:WITHDRAW_FAILED, restore oferty.depositsprzedawcy (price - fee) →SELLER_PAID. Błąd:SELLER_DEPOSIT_FAILED, zwrot kasy kupującemu, restore oferty.- Prowizja na
market-fee.sink-accountjeśli niepuste. Nieudany sink = warning w logu, transakcja nie pada. addItemkupującemu; reszta → mailboxpurchase-overflow→ITEM_DELIVERED.COMPLETED,addTransaction(zawsze, niezależnie odhistory.enabled),markPurchased,buy.success, powiadomienie sprzedawcy (buy.seller-notified/pending-salesgdy offline).TransactionCompletedEvent. Gdyratings.enabled— prompt oceny na czacie.finally: zdjęcie rezerwacji ID.
Rollback (rollbackBuy)
Wywoływany przy wyjątku, gdy TX nie jest jeszcze committed.
| Stan w momencie wyjątku | Działanie |
|---|---|
ITEM_DELIVERED lub COMPLETED | Zostaw jako COMPLETED, zapisz TX. Nie cofaj kasy (unik mintu + itemu). |
SELLER_PAID | Claw-back od sprzedawcy, zwrot kupującemu, restore oferty → ROLLED_BACK. Jeśli claw-back padnie: ROLLBACK_SELLER_WITHDRAW_FAILED, bez zwrotu kupującemu. |
MONEY_WITHDRAWN | Zwrot kupującemu + restore oferty → ROLLED_BACK |
LISTING_RESERVED | Restore oferty → ROLLED_BACK |
| Inny | EXCEPTION_AFTER_<STATE> → FAILED |
| Wyjątek w rollbacku | ROLLBACK_FAILED:<msg> |
Stringi błędów (transaction.error)
| String | Kiedy |
|---|---|
LISTING_REMOVE_FAILED | Nie udało się zdjąć oferty |
WITHDRAW_FAILED | Vault nie pobrał kasy kupującego |
SELLER_DEPOSIT_FAILED | Vault nie wpłacił sprzedawcy |
ROLLBACK_SELLER_WITHDRAW_FAILED | Claw-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, gdysellerReceivedbyło 0). - Opcja
reclaim: próbuje zabrać item kupującemu (jeśli online) i wrzuca kopię do skrzynki sprzedawcy z powodemadmin-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.