# /vote: všechny hlasovací weby na jednom místě

> Kdy se každý hlasovací web znovu otevře hráči, kolik hlasů má, jak daleko je další odměna, připomínka v chatu a ukazatel party, který svítí jen když má. Novinka v 0.3.

Source: https://stygion.eu/cs/docs/keystone/vote-command
Updated: 2026-10-25

Novinka v 0.3. `/vote` dřív vypsal odkazy. Teď odpoví na to, co hráč opravdu chce vědět: **kde můžu hlasovat hned, kolik mám hlasů a kolik zbývá do další odměny.** Všechno níž je nastavení v `votes.toml` (a v Nastavení a na obrazovce **Votes** v editoru); nic není přibité k jednomu serveru ani k jednomu hlasovacímu webu.

## Co vidí hráč

```
» Hlasuj pro server:
   » hlasuj teď | Czech-Craft - https://czech-craft.eu/server/vy/vote/
   » za 1 h 12 min | Minecraft-list.cz - https://...
   » asi za 23 h 5 min | minecraft-mp.com - https://...
Všechny weby na jedné stránce: https://example.com/vote
Právě teď můžeš hlasovat na 1 z 7 webů.
Tvoje hlasy: 3 dnes, 41 celkem, 4 dny v řadě.
Odměna za sérii 7 dní v řadě: zbývají 3 dny.
Tento měsíc: 11 hlasů - na odměňované místo (první 3) ti zbývá 4. /vote top
Hlasovací párty: 12 z 25 - zbývá 13.
```

Každá adresa je odkaz, na který jde kliknout. Čas s „asi“ je odhad; bez něj ho řekl přímo hlasovací web.

## Jak se weby popíšou: `votes.lists`

Jeden řádek na web, části oddělené ` | `:

```
service=Czech-Craft.eu | name=Czech-Craft | link=https://czech-craft.eu/server/vy/vote/ | every=2h | check=https://czech-craft.eu/api/server/vy/player/{player}/next_vote/ | path=next_vote | tz=Europe/Prague
service=Minecraft-MP.com | name=minecraft-mp.com | link=https://minecraft-mp.com/server/123/vote/ | every=24h
```

- `service` (povinné) je jméno, které web posílá s hlasem, přesně jako v `votes.services`.
- `name` a `link` čte a klikne hráč.
- `every` je, jak dlouho web nechá hráče čekat.
- `check` a `path` jsou volitelné: **https** adresa, na které web odpoví, *kdy může tenhle hráč hlasovat příště*, a kde v jeho JSON odpovědi je čas (`next_vote`, `[0].nextPossibleVote`, `data.next`). Doplní se `{player}`, `{year}` a `{month}`. Čas může být sekundy nebo milisekundy od roku 1970, ISO čas, nebo `2026-10-24 13:34:51` v pásmu `tz` (výchozí `votes.time-zone`).
- `{key:name}` v `check` vezme klíč ze souboru `lists.keys` ve složce hlasů. Dva řádky na klíč: `name=klíč` a `name.host=api.example.com`. **Klíč se pošle jen na host, který je napsaný vedle něj**: dosadí se jen do https adresy s přesně tímhle hostem (nikdy do samotného hostu), jinak se nepoužije a log to řekne. Klíče se nikdy nepíšou do nastavení, takže je nevidí editor, API ani asistent, a kdo smí měnit nastavení, nepošle klíč na vlastní server.

**Odkud se čas bere.** Když web odpoví, platí jeho odpověď. Když takovou adresu nemá, nejede, je pomalý (`votes.lists-timeout`, výchozí 4 vteřiny) nebo odpoví nečitelně, Keystone odhadne: **poslední hlas, který tenhle server od webu dostal, plus `every`** (bez `every` interval, kterým `votes.site-cooldown` počítá hlasy). Web, který selhal, se 45 vteřin nevolá, aby mrtvý web nezpomaloval `/vote` všem. Žádný čas není v kódu.

**Co opouští server a kam smí.** Jen když napíšeš `check`: jméno hráče v adrese, kterou jsi napsal, na web, který jsi uvedl, když ten hráč napíše `/vote` (odpovědi se pamatují až minutu; připomínka v chatu neposílá nic). Bez `check` se nikam nic neposílá. Používá se jen https a jen **veřejné** adresy: jméno, které míří na tenhle stroj, soukromou síť, link-local adresu (i adresu metadat v cloudu), carrier-grade NAT nebo unique-local IPv6, se odmítne dřív, než se cokoli pošle, takže se nastavením nedá dosáhnout na to, co vidí jen tenhle stroj. Přesměrování se nesledují, odpověď se čte nejvýš do 64 KiB a co web odpověděl, se nikomu neukazuje: editor a API dostanou jen čas (nebo že je odhadnutý).

S prázdným `votes.lists` vypíše `/vote` řádky z `votes.sites` jako dřív.

## Stránka

`votes.page` je jeden odkaz na stránku se všemi weby, třeba hlasovací stránka tvého webu. `/vote` ji vypíše pod weby.

## Hlasy, série a měsíc

- **Dnes / celkem / série** jdou ze stejné tabulky, kterou čtou pravidla hlasů, takže číslo, které hráč vidí, je to, se kterým se počítá.
- **Odměna za sérii**: nejbližší řádek `votes.streaks` nad hráčovou sérií a kolik dní zbývá.
- **Měsíc**: hráčovo místo a hlasy, a s `votes.top.rewards` kolik hlasů ještě chybí na poslední odměňované místo. `/vote top` ukáže žebříček.

## Připomínka v chatu

`votes.remind.chat` (výchozí zapnuto): hráči, který někde může hlasovat, napíše *„Právě teď můžeš hlasovat na 5 ze 7 webů“*, nejvýš jednou za `votes.remind.chat-every` (výchozí 3 hodiny), první `votes.remind.chat-after-join` (výchozí 3 minuty) po připojení. Kontroluje se každých pět minut a používá jen to, co server už ví, takže žádnému webu nic neposílá. Hráč ji vypne **`/vote remind chat off`** (a zapne `/vote remind chat on`). `/vote remind on` je druhá připomínka, soukromá zpráva na Discordu.

## Ukazatel party

Boss bar, který počítá posledních pár hlasů do cíle party, dřív visel na obrazovce pořád. Teď se ukáže na `votes.party.bar-for` (výchozí 20 vteřin) po hlasu, který ho pohnul, a zmizí. `0s` vrátí staré chování: svítí, dokud je počet v rozmezí `votes.party.bar-from` od cíle.

## V editoru a v API

Obrazovka **Votes** vypíše weby a u hráče, kterého vyhledáš, kdy se mu který otevře. `GET /v1/votes/lists` (scope `players.read`) vrací totéž, s `?player=` pro jednoho hráče.

**Každý hlas na tvou vlastní hlasovací stránku** (`votes.report.*`, vypnuté, dokud to nenastavíš): `report.url` je https adresa, na kterou se posílá JSON (POST) – `{"type":"vote","server","player","list","at"}` za každý přijatý hlas a `{"type":"lists","server","lists":[…]}` každých `report.every` (5 minut, jen když se něco změnilo) se seznamem hlasovacích webů a čekáním – pro celou hlasovací stránku na tvém webu nebo pro bota. `report.key` jde jako Bearer token, `report.server` je jméno tohoto serveru v reportech (klíč světa, třeba `mc`; prázdné neposílá žádné). Adresy uvnitř sítě se odmítnou, pokud majitel nezapne `report.allow-local`; nastavit cokoli z toho smí jen majitel.

Texty jsou v jazykových souborech: `votes.where.*`, `votes.list.*` a `votes.remind.chat*`; upravíš je na obrazovce Languages v editoru.
