# Discord

> Chat oběma směry, účty ověřené kódem ze hry, role a bany držené v souladu a konzole zrcadlená tam, kde na ni vidíš.

Source: https://stygion.eu/cs/docs/keystone/discord
Updated: 2026-10-10

Všechno tady je `discord.toml`, nebo obrazovka Settings v panelu.

## Jak to rozmluvit

1. Udělej si bota na `discord.com/developers` a dej mu intenty **Message
   Content** a **Server Members** — bez prvního vidí bot prázdné zprávy a do hry
   se nevrátí nic.
2. `/keystone set discord.token <token>` a
   `/keystone set discord.server <id serveru>`.
3. `/keystone set discord.chat-channel <id kanálu>` — místnost, se kterou hra
   mluví.
4. Pozvi ho s právem číst, psát a spravovat webhooky v tom kanálu.

Token je tajemství a Keystone maskuje příkaz, kterým se nastavuje, z logů i z
konzole. Pořád se ale zapíše do `discord.toml`, takže ten soubor není něco, co
se publikuje.

## Chat

| Nastavení | Co dělá |
|---|---|
| `game-to-discord` | Co se řekne ve hře, objeví se na Discordu. |
| `discord-to-game` | A obráceně. |
| `speak-as-players` | Každý hráč mluví pod svým jménem a obličejem, přes webhook, místo aby všechno chodilo jako bot. |
| `avatar` | Odkud se bere obličej. Výchozí je veřejný renderer hlav podle jména. |
| `joins-and-leaves` | I příchody a odchody. |
| `topic` / `topic-every` | Popisek kanálu nese, kdo je na serveru, a obnovuje se na časovač. |
| `queue` | Kolik zpráv podržet, když je Discord nedostupný, aby výpadek nesnědl konverzaci. |

**Se zapnutými [kanály chatu](/docs/keystone/chat-channels)** (0.2.1) může mít každý herní kanál vlastní Discord kanál (`discord=<id kanálu>`, nebo `discord=main` pro `chat-channel`): řádka jde jen do Discord kanálu svého kanálu a zpráva z Discordu jen do svého kanálu, jen hráčům, kteří ho smějí číst. Kanál bez Discordu hru neopustí. Bota pozvi do každého uvedeného kanálu s právem číst, psát a spravovat webhooky.

## Propojení účtu

Ve hře:

```
/discord link      # dá ti kód
/discord status    # jestli jsi propojený a s kým
/discord unlink    # zpátky
```

Na Discordu pak **`/link <kód>`** — jako slash příkaz, takže se ten kód nikdy
nestane zprávou, kterou by bylo potřeba mazat, a odpověď vidíš jen ty. Žádná
webovka, žádný e-mail.

**Nebo tlačítko v místnosti, do které nikdo nesmí psát (0.2.1).** `/discord panel
<id kanálu>` (`keystone.discord.panel`, personál) pošle do discordového kanálu
panel s tlačítkem **Link account**. Tlačítko otevře formulář, který vidí jen ten,
kdo na něj klikl; kód, který do něj napíše, se utratí přesně jako u `/link` —
stejné kontroly, stejná odpověď, stejný limit účtů. Ten kanál nastav všem jen ke
čtení: Discord bere slash příkazy spolu s právem Send Messages a kód vložený jako
obyčejná zpráva může kdokoli přečíst, dokud ho někdo nesmaže. Id tlačítka je
pevné (`keystone:link`), takže funguje i panel, který pod stejným botem pošle
jiný nástroj. `/link` zůstává pro místnosti, kam lidé psát smějí.

- `link.required-to-join` z toho udělá bránu: nepropojenému hráči se ukáže
  zpráva `screens.not-linked` s jeho kódem, pozvánkou a tím, jak dlouho kód
  platí, a dovnitř ho to nepustí, dokud to neudělá.
- `link.accounts-per-user` je, kolik herních účtů smí mít jeden Discord účet.
- `link.rename-nickname` ho na Discordu přejmenuje na jméno, pod kterým hraje.
- `link.code-lasts` je, jak dlouho má smysl kód psát.
- `link.invite` je pozvánka, kterou ta obrazovka ukáže.

**A k čemu je to dobré i mimo hru:** propojení je na serveru, který není v online
režimu, jediný důkaz totožnosti, který existuje — vzniklo zevnitř hry pod tím
jménem a potvrdil ho účet, který hra nerozdává. Proto se na něj dá ptát přes
API: `GET /v1/discord/links?discord=<id>` se scopem `players.read` řekne, které
herní účty ten člověk drží. Tak se e-shop dozví, komu koupenou věc doručit,
místo aby věřil jménu napsanému do formuláře.

## Role a bany v souladu

- `roles.follow` spáruje discordovou roli se skupinou v Keystone, oběma směry:
  dáš někomu roli a dostane skupinu.
- `ban.game-to-discord` a `ban.discord-to-game` přenesou ban. Vypnuté ve výchozím
  stavu, protože je to rozhodnutí, ne pohodlí — a `ban.who-may` říká, čí bany na
  Discordu smí dosáhnout do hry. Viz [moderace](/docs/keystone/moderation).

## Konzole tam, kde na ni vidíš

`console.channel` zrcadlí log serveru do discordové místnosti, po dávkách každých
`console.every`, aby se vytížený server dal číst a nebyl to proud vody.
`console.levels` vybere, co má cenu zrcadlit, `console.ignoring` zahodí řádky,
kterých máš plné zuby. `console.most-lines` omezí jednu dávku.

**Kdo vidí do té místnosti, čte log tvého serveru.** Dej ji někam, kam vidí jen
tvůj tým.

## Upozornění

`alerts.channel` je místo, kde Keystone řekne, že je něco špatně — TPS pod
`operations.alerts.tps-below`, paměť nad `operations.alerts.memory-above-percent`,
drženo po `must-last` a pak ticho po `quiet-for`, aby se z jedné špatné minuty
nestalo čtyřicet zpráv. `alerts.ping-role` je, kdo se má vzbudit.
`alerts.runs-channel` je, kam padají hotové zátěžové testy.

**Stav serveru.** `status-channel` řekne, že server je nahoře, jde dolů, nebo se
za tolik minut restartuje (jednou za restart, ne při každém varování). Výchozí
`"chat"` je kanál, kde jsou hráči (kanál chat mostu); id kanálu pošle stav
jinam, prázdné nikam. Věty jsou jazykové klíče `discord.news.up`, `.down` a
`.restart`, které si server může přepsat. `news-channel` se už nečte — kanál
novinek je na novinky.

Seznam kanálů a rolí se čte nejvýš jednou za půl minuty (`discord.names-every`),
ať se jednou změnou deseti kanálů nespotřebuje desetiminutový limit Discordu,
sdílený s ostatním, co ten bot dělá.

## Otázka „jsi to ty?"

Když je zapnuté `accounts.ask-on-discord`, dostane propojený hráč při připojení
soukromou zprávu s tím, kdo se připojuje a odkud, a dvěma tlačítky. Podrobně na
stránce [Účty](/docs/keystone/accounts).

## Tickety na Discordu

`tickets.category` a `tickets.roles` dají soukromé kanály ticketů do kategorie a pustí k nim tvoje role. Zbytek je na [stránce o ticketech](/docs/keystone/tickets).
