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ątkachHttpClient; 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.
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
HttpClient są demonami — nie blokują wyłączenia serwera. Własny Executor (.executor(...)) dostaje też callbacki async i opóźnienia retry.
Kotlin (coroutines)
Bukkit.getScheduler().runTask(plugin) { … }.
Klient API (z kluczem)
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 niekontrolowanyItemShopException 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.