Stáhni a spusť: jednosouborová binárka pro Linux, uvnitř Python, Flask, šablony i styly. Staví se ./build.sh v kontejneru na AlmaLinux 8, protože binárka slinkovaná proti glibc z Fedory 44 by nešla spustit nikde se starším systémem. Databáze tím dostává dvě různá místa. Ze zdrojáků zůstává dice.db v pracovním adresáři, ať se dá mít víc sad vedle sebe. Z binárky jde do ~/.local/share/kostky/ — binárka se rozbaluje do dočasného adresáře a pouští se odkudkoli, takže relativní cesta by databázi rozsypala po disku. DICE_DB přebije obojí. Server teď cestu k databázi vypisuje při startu, ať se na ni nemusí ptát. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
149 lines
4.5 KiB
Markdown
149 lines
4.5 KiB
Markdown
# Počitadlo v kostkách
|
|
|
|
Doprovod k fyzickým kostkám: **telefon zapisuje skóre, notebook ukazuje
|
|
zápisník** a hry se pamatují mezi večery.
|
|
|
|
Hráči se napříč hrami poznávají podle jména — Adam ze středečního večera je
|
|
ten samý Adam jako z minulého měsíce. Žádné účty, žádná hesla.
|
|
|
|
## Spuštění
|
|
|
|
Stáhni binárku z [releases](https://gitea.spacilovi.eu/david-spacil/dice-counter/releases)
|
|
a spusť ji:
|
|
|
|
```bash
|
|
chmod +x kostky
|
|
./kostky
|
|
```
|
|
|
|
Nic se neinstaluje — Python, Flask i šablony jsou uvnitř. Zatím jen pro Linux
|
|
na x86-64; postavené proti glibc 2.28, takže jede na všem od RHEL 8,
|
|
Debianu 10 a Ubuntu 20.04 výš.
|
|
|
|
Ze zdrojáků to je stejně krátké:
|
|
|
|
```bash
|
|
uv run web.py
|
|
```
|
|
|
|
Závislosti si skript nese v hlavičce (PEP 723) a `uv` je obstará sám.
|
|
|
|
Server vypíše všechny adresy, na kterých je dostupný:
|
|
|
|
```
|
|
Počitadlo je dostupné na:
|
|
→ http://10.186.234.182:8000 místní síť
|
|
http://100.91.0.24:8000 přes Tailscale
|
|
http://172.17.0.1:8000 virtuální síť
|
|
```
|
|
|
|
Na notebooku otevři `/board`, naskenuj QR kód telefonem a hraj. Tabule
|
|
zobrazuje i zbylé adresy — když jedna nefunguje, zkus další. Zastavuje se
|
|
`Ctrl+C`.
|
|
|
|
| Proměnná | K čemu je | Výchozí |
|
|
|---|---|---|
|
|
| `DICE_DB` | soubor s databází | podle způsobu spuštění, viz níž |
|
|
| `DICE_PORT` | port | `8000` |
|
|
| `DICE_HOST` | pevná adresa; vypne hledání | hledá se za běhu |
|
|
|
|
## Kde jsou data
|
|
|
|
Jeden soubor SQLite. Založí se sám při prvním načtení stránky, cestu k němu
|
|
server vypíše při startu.
|
|
|
|
| Spuštěno | Databáze |
|
|
|---|---|
|
|
| binárkou | `~/.local/share/kostky/dice.db` |
|
|
| ze zdrojáků | `dice.db` v pracovním adresáři |
|
|
|
|
Binárka se při každém spuštění rozbaluje do dočasného adresáře a pouští se
|
|
odkudkoli, takže relativní cesta by databázi rozsypala po disku — proto
|
|
napevno domovský adresář. Ze zdrojáků zůstává relativní, ať se dá mít víc
|
|
sad vedle sebe.
|
|
|
|
Zálohovat i stěhovat jde prostým zkopírováním souboru; `DICE_DB` si ho
|
|
najde kdekoli.
|
|
|
|
Počítá se s domácí sítí — appka nemá přihlašování a kdokoli na stejné WiFi
|
|
může zapisovat.
|
|
|
|
## Když se telefon nepřipojí
|
|
|
|
Adresy se hledají při každém načtení tabule, takže přechod z domácí WiFi na
|
|
hotspot a zpátky si tabule pohlídá sama a načte se znovu.
|
|
|
|
Zbývají tři důvody, proč se telefon nedostane na notebook:
|
|
|
|
- **Telefon je na mobilních datech**, notebook na WiFi. Různé sítě, nepotkají
|
|
se. Připoj telefon na stejnou WiFi, nebo notebook na hotspot telefonu —
|
|
to funguje taky.
|
|
- **Zapnutý hotspot na telefonu shodil jeho WiFi.** Většina Androidů to dělá.
|
|
Pak je řešením připojit na ten hotspot i notebook.
|
|
- **VPN nebo Tailscale exit node na telefonu** posílá veškerý provoz mimo
|
|
místní síť. V Tailscale to řeší přepínač „Allow local network access";
|
|
případně použij tailnet adresu notebooku, ta funguje odkudkoli.
|
|
|
|
## Pravidla
|
|
|
|
Skóre se zadává ručně po tazích, hází se doopravdy. Tři nulové tahy za sebou
|
|
vynulují hráči skóre; indikátor `x` / `xx` ukazuje, jak blízko k tomu je.
|
|
Vítěz se vyhlašuje až po dokončeném kole, aby měli všichni stejný počet tahů —
|
|
při remíze na prvním místě se hraje dál.
|
|
|
|
## Co kde je
|
|
|
|
| Soubor | Role |
|
|
|---|---|
|
|
| `core.py` | pravidla hry, žádný vstup ani výstup |
|
|
| `net.py` | hledání adres, na kterých je počitadlo dostupné |
|
|
| `storage.py` | SQLite: hráči, hry, tahy |
|
|
| `stats.py` | síň slávy a kariérní statistiky |
|
|
| `web.py` | Flask aplikace |
|
|
| `dice.py` | totéž v terminálu, bez ukládání |
|
|
| `build.sh`, `kostky.spec` | stavba binárky |
|
|
|
|
Terminálová verze zůstává funkční jako záloha:
|
|
|
|
```bash
|
|
uv run dice.py
|
|
```
|
|
|
|
## Bez uv
|
|
|
|
Když `uv` po ruce není, jde to postaru:
|
|
|
|
```bash
|
|
python -m venv .venv
|
|
.venv/bin/pip install -r requirements.txt
|
|
.venv/bin/python web.py
|
|
```
|
|
|
|
Na Fedoře stačí i systémové balíčky, pak se nemusí řešit vůbec nic:
|
|
|
|
```bash
|
|
sudo dnf install python3-flask python3-qrcode python3-tabulate
|
|
python3 web.py
|
|
```
|
|
|
|
## Vlastní binárka
|
|
|
|
```bash
|
|
./build.sh
|
|
```
|
|
|
|
Staví se v kontejneru (podman nebo docker) na AlmaLinux 8, ne na hostiteli.
|
|
Binárka slinkovaná proti glibc z Fedory 44 by nešla spustit nikde se starším
|
|
systémem — glibc drží zpětnou kompatibilitu, ne dopřednou. Výsledek je
|
|
v `dist/kostky`.
|
|
|
|
Terminálová verze součástí binárky není; ta se pouští ze zdrojáků.
|
|
|
|
## Testy
|
|
|
|
```bash
|
|
uv run --with-requirements requirements.txt --no-project pytest
|
|
```
|
|
|
|
Nebo z připraveného prostředí prostě `pytest`.
|