StorageManager i ExtendedDataStore
listings.yml (sync) i market-data.yml (async, zapis atomowy) — oferty, outbox, historia.
Na podstawie kodu GrzybcioRynek 1.0.3 i web 0.1.0.
Dwa magazyny, dwa pliki. Oferty żyją w StorageManager. Historia, skrzynka, ulubione, alerty i oceny — w ExtendedDataStore.
StorageManager — listings.yml
Plik: plugins/GrzybcioRynek/listings.yml. Zapis synchroniczny (dataConfig.save).
Klucze YAML:
| Klucz | Zawartość |
|---|---|
listings | lista MarketListing |
next-id | następne ID (max z pliku i z ofert) |
expiry-outbox.<id> | journal zwrotów wygasłych (seller, item, price, reason) |
pending-returns.<uuid> | kolejka itemów gdy mailbox wyłączony / legacy |
pending-sales.<uuid> | powiadomienia o sprzedaży dla offline |
API
| Metoda | Działanie |
|---|---|
createListing(...) | nextId++, dodanie, save() |
removeListing(int) | usunięcie, save() |
restoreListing(listing) | przywrócenie po failu zakupu (to samo ID) |
getListing / getAllListings / getListingsBySeller | odczyt z pamięci |
returnListingToSeller(listing, reason) | ekwipunek albo mailbox |
backupListings() | kopia listings.yml.bak (REPLACE_EXISTING) |
removeExpiredListings() | pod globalLock, pomija zarezerwowane |
processExpiryOutbox() | dostarcza journal |
addPendingSaleNotification / deliverPendingSaleNotifications | powiadomienia po UUID |
deliverPendingReturns | pending-returns per-item (save przed oddaniem) |
addPendingReturnPublic jest używane, gdy mailbox.enabled: false i sprzedawca jest offline (MailboxService.deposit).
Expiry outbox
Żeby crash nie zgubił itemu: najpierw zapis expiry-outbox.<id>, potem usunięcie oferty w tym samym save(), potem processExpiryOutbox. Outbox czyści wpis przed dostarczeniem; przy online + miejscu w ekwipunku — expiry.returned, inaczej mailbox.
Timer: start + co 30 minut.
Błędy zapisu
Nie można utworzyć pliku listings.yml!
Nie można zapisać pliku listings.yml!
Nie udało się utworzyć backupu listings.yml: <msg>
Pominięto oferte #<id> - brak przedmiotu.
Nie udalo sie wczytac oferty ze starszego formatu: <msg>ExtendedDataStore — market-data.yml
Plik: plugins/GrzybcioRynek/market-data.yml. Mutacje wołają saveAsync() → runTaskAsynchronously → zsynchronizowane save().
Zapis atomowy: market-data.yml.tmp → Files.move(..., ATOMIC_MOVE), fallback zwykły move, na końcu bezpośredni data.save.
Sekcje YAML: favorites.<uuid>, mailbox.<uuid>, alerts.<uuid>, ratings, transactions.
API (wybrane)
| Metoda | Działanie |
|---|---|
toggleFavorite / removeFavoriteEverywhere | ulubione po ID oferty |
addMailbox / takeMailboxEntry / restoreMailboxEntry | skrzynka atomowo |
addAlert / removeAlert / getAllAlerts | alerty (limit price-alerts.max-per-player) |
addRating / hasRated / getAverageRating | oceny 1–5 |
addTransaction / updateTransaction / getTransaction | TX po string-ID |
getCompletedTransactions | tylko TransactionState.COMPLETED |
getBuyerHistory / getSellerHistory | posortowane malejąco po czasie |
getPriceHistory(material, nexoId, oraxenId) | tożsamość: najpierw Nexo, potem Oraxen, potem material |
pruneHistory() | usuwa COMPLETED starsze niż history.retention-days (domyślnie 30) |
flushAndSave() | synchroniczny zapis (reload) |
backup() | market-data.yml.bak |
MarketAPI.getCompletedTransactions() / getTransaction(String) czytają ten store.
Błędy zapisu
Nie można utworzyć market-data.yml
Nie można zapisać market-data.yml: <msg>
Nie udało się utworzyć backupu market-data.yml: <msg>
Pominięto transakcję: <msg>listings.yml jest kompatybilny ze starszym formatem Map. market-data.yml pojawił się w 1.0.3.