Skip to main content
pl.itemshop:sdk to oficjalne SDK Javy (17+, java.net.http; jedyna zależność to Gson, który mają już Paper i Spigot). Moduł pl.itemshop:sdk-kotlin dodaje funkcje suspend i Flow. Każda metoda ma wariant blokujący i nieblokujący (…Async → CompletableFuture).

Instalacja

build.gradle.kts

Plugin Paper — asynchronicznie

Zapytania HTTP idą na wątkach HttpClient; na główny wątek serwera wracasz schedulerem Bukkita. Nigdy nie wołaj metod blokujących (list(), create()…) z głównego wątku — tylko …Async.
Kasa z gry (np. link w GUI):
checkout().create… sam uzupełnia consents.legalVersion z profilu sklepu i zawsze wysyła Idempotency-Key, więc ponowienie po zerwanym połączeniu nie utworzy drugiego zamówienia. Koszyk mieści 1–20 pozycji (powtarzaj .item(...)); dwie lub więcej tworzą jedną grupę płatności. Po powrocie z bramki odczytasz zamówienie przez Storefront.returnedOrderFromReturnUrl(url) (?itemshop_order=<numer>&itemshop_key=<klucz> → ReturnedOrder(number, key)), poczekasz na płatność przez orders().awaitPaymentByNumberAsync(number, key, Duration.ofSeconds(3)), a treść cyfrową odbierzesz przez orders().deliveryAsync(number, key). W Kotlinie statusByNumber, delivery i awaitPaymentByNumber są suspend. Wersje po id (orderIdFromReturnUrl, awaitPaymentAsync) obsługują wyłącznie zamówienia sprzed 3.0.

Shadow i relokacja

Wątki HttpClient są demonami — nie blokują wyłączenia serwera. Własny Executor (.executor(...)) dostaje też callbacki async i opóźnienia retry.

Kotlin (coroutines)

Anulowanie korutyny anuluje żądanie HTTP. Na Paperze wróć na główny wątek przez Bukkit.getScheduler().runTask(plugin) { … }.

Klient API (z kluczem)

Serwisy generowane: shops, servers, products, paymentMethods, paymentErrors, blacklist, discounts, vouchers, stats, uploads, orders. Ręczne: site() (pliki, draft, rewizje, upload, buildy, wdrożenia, diff), templates(), workspace(), agents(), skills(). Tokeny Workspace wymagają sesji panelu — kluczem API dostaniesz 401/403. Endpoint bez typowanej metody: client.request("GET", "/api/v2/…", null). Modele (pl.itemshop.sdk.model.*) to rekordy z builderami; null nie jest wysyłany.

Błędy

Każdy błąd to niekontrolowany ItemShopException z code() (kod backendu, np. LEGAL_CONSENT_REQUIRED, albo SDK: BAD_REQUEST, UNAUTHORIZED, FORBIDDEN, NOT_FOUND, CONFLICT, VALIDATION_FAILED, RATE_LIMITED, SERVER_ERROR, NETWORK_ERROR, TIMEOUT, ABORTED…), status(), details(), retryAfter() i body(). Podklasy do łapania: BadRequestException (400/413/422), AuthenticationException (401), PermissionDeniedException (403), NotFoundException (404), ConflictException (409), RateLimitException (429), ServerException (5xx), ApiConnectionException (sieć, timeout, anulowanie). W CompletableFuture błąd przychodzi jako przyczyna CompletionException.

Retry, timeouty, idempotencja

2 ponowienia, backoff 300 ms·2ⁿ (maks. 5 s) z jitterem, Retry-After zastępuje opóźnienie. GET/HEAD i żądania z Idempotency-Key (orders().create, checkout().create) są ponawiane po błędach sieci, timeoutach i 408/425/429/500/502/503/504; pozostałe tylko po 429. timeout(...) ogranicza jedną próbę (domyślnie 30 s). Przerwanie wątku czekającego na wynik anuluje żądanie (ABORTED).

Webhooki

Backend nie wysyła podpisanych webhooków do właścicieli sklepów (powiadomienia idą na Discord — zob. Webhooki), więc SDK nie ma weryfikatora podpisów. Do realizacji zamówień w grze służy protokół pluginu.

Storefront API

Endpointy pod spodem SDK.

Protokół pluginu

Realizacja zamówień w czasie rzeczywistym.