# Konfiguracja pluginu

Plugin: [StillShop-1.0.0.jar](https://stillshop.pl/downloads/StillShop-1.0.0.jar) · Paper / Purpur / Spigot 1.20+ · Java 21. Instalacja krok po kroku: [Podłącz serwer](/pierwsze-kroki/podlacz-serwer.md).

## config.yml

Do działania wystarczą **dwie linie** z panelu (**Serwery → Dodaj serwer**). Plik `plugins/StillShop/config.yml`:

```yaml
# Klucz API serwera (zaczyna się od ssk_)
# Wskazuje Twój sklep i serwer — nie musisz podawać ID sklepu ani serwera.
api-key: "ssk_…"

# Sekret serwera (zaczyna się od sss_)
# Podpisuje każde połączenie z panelem. Panel pokazuje go tylko raz.
server-secret: "sss_…"

# Czy włączyć logi debug? Logi nie zawierają klucza API ani sekretu.
debug: false

# ── Zaawansowane ── zwykle nie trzeba tu nic zmieniać ──
endpoint: "https://stillshop.pl"
long-poll-seconds: 25
poll-interval-seconds: 10
batch-size: 50
heartbeat-seconds: 60
join-delay-ticks: 40
allow-insecure-http: false
```

!!!
Inne pluginy itemshopów wymagają osobno klucza, ID sklepu i ID serwera. W StillShop `api-key` sam wskazuje sklep i serwer, a `server-secret` podpisuje każde połączenie — dzięki temu sam klucz nie wystarczy, żeby podszyć się pod Twój serwer.
!!!

| Klucz | Domyślnie | Zakres | Opis |
| --- | --- | --- | --- |
| `api-key` | — | `ssk_…` | Klucz serwera z panelu (**Serwery**). |
| `server-secret` | — | `sss_…` | Sekret serwera z panelu. Pokazywany tylko raz. |
| `endpoint` | `https://stillshop.pl` | — | Adres panelu. Musi być `https://`. Można pominąć. |
| `long-poll-seconds` | `25` | 0–25 | Ile sekund każde zapytanie czeka na nowe zakupy — dzięki temu dostawa przychodzi w sekundę. `0` = klasyczne odpytywanie co `poll-interval-seconds`. |
| `poll-interval-seconds` | `10` | 2–300 | Odstęp między zapytaniami, gdy long-poll jest wyłączony. |
| `batch-size` | `50` | 1–100 | Ile komend pobierać naraz. |
| `heartbeat-seconds` | `60` | 15–600 | Jak często plugin wysyła liczbę graczy i swój status. |
| `join-delay-ticks` | `40` | 0–600 | Opóźnienie (w tickach, 20 = 1 s) przed wykonaniem komend dla gracza, który właśnie wszedł — żeby LuckPerms zdążył go wczytać. |
| `allow-insecure-http` | `false` | — | Tylko do testów lokalnych: pozwala na `http://`. |
| `debug` | `false` | — | Więcej logów w konsoli. |

Po każdej zmianie wpisz `stillshop reload`.

## Komendy

| Komenda | Opis |
| --- | --- |
| `/stillshop status` | Stan połączenia, ostatni kontakt z panelem, nazwa sklepu i serwera, liczba komend czekających na graczy (`Waiting for players`) i niewysłanych raportów. |
| `/stillshop reload` | Wczytuje ponownie `config.yml` i łączy się z panelem. |

Uprawnienie: `stillshop.admin` (domyślnie OP). W konsoli serwera możesz pominąć ukośnik.

### Stany połączenia

| Stan | Znaczenie |
| --- | --- |
| `CONNECTED` | Wszystko działa. |
| `STARTING` | Plugin się łączy. |
| `OFFLINE` | Brak połączenia z panelem — plugin ponawia próby (co najwyżej co 60 s). |
| `UNAUTHORIZED` | Zły `api-key` / `server-secret`, serwer odłączony w panelu albo źle ustawiony zegar serwera. |
| `BAD_SIGNATURE` | Odpowiedź nie przeszła weryfikacji podpisu (np. coś po drodze zmienia ruch). |
| `STOPPED` | Plugin wyłączony. |

## PlaceholderAPI

Gdy na serwerze jest [PlaceholderAPI](https://www.spigotmc.org/resources/placeholderapi.6245/):

| Placeholder | Wartość |
| --- | --- |
| `%stillshop_pending%` | Liczba zakupów czekających na tego gracza (np. do wyświetlenia na scoreboardzie: „Masz 2 zakupy do odebrania”). |
| `%stillshop_connected%` | `true` / `false` — czy plugin jest połączony z panelem. |

## Gracze offline i restarty

Komendy wymagające gracza online plugin zapisuje w lokalnej bazie SQLite w folderze `plugins/StillShop/`. Wykonuje je, gdy gracz wejdzie na serwer — także po restarcie. Plugin pamięta też, które komendy już wykonał, więc **ta sama komenda nigdy nie wykona się dwa razy**, nawet gdy panel dostarczy ją ponownie.

Jeśli serwer straci połączenie, wyniki wykonanych komend czekają w kolejce i zostaną wysłane do panelu po odzyskaniu połączenia.

## Bezpieczeństwo

- Plugin łączy się **tylko wychodząco** po HTTPS — nie otwierasz żadnych portów i nie potrzebujesz RCON.
- Każde zapytanie jest podpisane sekretem serwera (HMAC-SHA256) i chronione przed powtórzeniem.
- Plugin sprawdza też podpis **każdej odpowiedzi** z panelu, zanim wykona jakąkolwiek komendę — nikt po drodze nie podsunie Twojemu serwerowi własnych komend.
