6.3 KiB
6.3 KiB
Knightly — Rendszerterv (végleges architektúra)
Ez a dokumentum a Knightly sakkprojekt végleges rendszertervét írja le. A terv a korábban megosztott draw.io diagramon alapul, és fejlesztésre kész, technikai + működési leírást egyaránt tartalmaz.
Tartalom
- Összefoglaló célok
- Fő komponensek és szerepek
- Kommunikációs modell (WebSocket)
- Üzenetsémák (JSON) — szabványosított formátumok
- Matchmaking és meccskezelés
- Játékfolyamat (lifecycle)
- Engine integráció és validáció
- UI–Server–Engine adatáramlás
- Hálózat, üzemeltetés és deployment
- Biztonság és jogosultságok
- Naplózás, hibakezelés és monitoring
- Tesztelés és CI/CD integráció
- Üzemeltetési kézikönyv (runbook)
- Fejlesztési roadmap és ajánlott következő lépések
- Mellékletek — fontos konfigurációk, environment változók
1. Összefoglaló célok
- Kisméretű, LAN-on vagy interneten keresztül futtatható sakk-szerver tervezése.
- Stabil WebSocket alapú kommunikáció a UI (Rust) és a Server (Rust) között.
- Egyszerű, megbízható matchmaking (sorbaállás) és 1v1 meccskezelés.
- A szerver felel a meccsek létrehozásáért, a játék állapotáért és az engine-nek továbbított validálásért.
- A rendszer skálázható alapokra épül, később központi (cloud) hosztolásra bővíthető.
2. Fő komponensek és szerepek
2.1 UI (Client)
- Nyelv: Rust (egységes platform). Desktop UI (pl. egui/Tauri/SDL stb.).
- Feladatai: felhasználói interakció, önálló render, locale input, kliens-oldali lépésellenőrzés előzetes vizsgálata, WebSocket kapcsolat kezelése.
- Kommunikáció: WebSocket (ws:// vagy wss://) a szerverrel.
2.2 Server
- Nyelv: Rust, aszinkron (
tokio), WebSocket támogatás (tokio-tungstenitevagyaxum+tokio-tungstenite). - Feladatai: kapcsolatok kezelése, matchmaking, meccsek életciklusa, üzenetek továbbítása, engine-hez való kommunikáció a lépések ellenőrzésére és szerepeltetésére.
- Állapot: memória alapú strukturák (
players,waiting_queue,matches), opcionális perzisztencia (logok, ranglista) később.
2.3 Engine
- Feladat: sakk-szabályok végrehajtása, lépések validálása, legális lépések listázása, opció: AI játékos.
- Integrációs lehetőségek:
- könyvtárként (Rust crate) közvetlenül a szerveren belül, vagy
- külön folyamatként (stdin/stdout) vagy helyi RPC (Unix socket), illetve
- távoli szolgáltatás (gRPC/HTTP) később.
3. Kommunikációs modell (WebSocket)
- Egy porton fut a WS szerver (pl.
0.0.0.0:8080). Nem szükséges több port. - Minden kliens egyedi WebSocket kapcsolatot nyit. A szerver minden kapcsolatot azonosít (UUID vagy generált client id).
- A szerver tartja a
tx(küldő) csatornát minden csatlakozott játékoshoz, így onnan tud üzenetet küldeni. - Az üzenetek JSON formátumban érkeznek és mennek (text frames). Binary nem szükséges a kezdetekkor.
Kapcsolódási lépések:
- UI csatlakozik →
Joinüzenet (felhasználónév). - Szerver visszaad
Welcome(player id) vagyError. - Keresés vagy hosting esetén a UI küld
FindMatchvagyHostLocalparancsot. - Szerver párosít és
MatchFoundüzenetet küld mindkét félnek, tartalmazza az ellenfél metaadatait és ki kezd.
4. Üzenetsémák (JSON)
Az alábbiak a tervezett, szabványosított JSON üzenettípusok. Nem pszeudokód — egyszerű, pontos séma.
4.1 Client -> Server
Join
{ "type": "join", "username": "Alice" }
FindMatch(sorbaállás)
{ "type": "find_match", "mode": "1v1" }
HostLocal(ha a kliens hostolni akarja a lokális meccset)
{ "type": "host_local", "port": 9001 }
Move(lépés beküldése)
{ "type": "move", "from": "e2", "to": "e4", "promotion": null }
RequestLegalMoves
{ "type": "legal_moves", "fen": "..." }
Resign/OfferDraw/Chat— hasonló egyszerű objektumok.
4.2 Server -> Client
Welcome
{ "type": "welcome", "player_id": "<uuid>" }
MatchFound
{ "type": "match_found", "match_id": "<uuid>", "opponent": {"id":"...","name":"Bob"}, "color": "white" }
OpponentMove
{ "type": "opponent_move", "from": "e2", "to": "e4", "promotion": null }
MoveResult(valid/invalid, updated FEN, clocks)
{ "type": "move_result", "valid": true, "fen": "...", "turn": "black" }
LegalMovesResponse
{ "type": "legal_moves", "moves": ["e2e4","d2d4"] }
Error/Info/GameEnd
5. Matchmaking és meccskezelés
- Várólista (FIFO): a
waiting_queue(VecDeque<Uuid>) tartja a FindMatch-előket. - Automatikus párosítás: ha legalább két játékos van a várólistában, a szerver párba állítja őket és létrehoz egy
Matchstruct-ot. - Match struct tartalma:
match_id,white_id,black_id,fen(kezdőállás),move_history,clocks. - Szereposztás: véletlenszerű (érme dobás szerű) döntés vagy rang alapján.
- Állapotkezelés: a szerver az egyetlen egységes állapotgazda; minden új lépés a szerveren kerül ellenőrzésre és csak ha valid, akkor broadcastolásra.
Különleges esetek:
- Ha egyik fél kilép a meccs közben → szerver értesíti az ellenfelet, meccs státusza
abortedvagywin_by_disconnect. - Reconnect: ha a kliens újracsatlakozik, a szerver match-id alapján visszaállíthatja a játékot (ha ezt implementáljuk).
6. Játékfolyamat (lifecycle)
- Csatlakozás: client küld
join, szerver visszaadwelcome. - Keresés vagy hostolás: client küld
find_matchvagyhost_local. - Párosítás: szerver párosít, küld
match_foundmindkét félnek. - Kezdés: szerver küld kezdő FEN-t és azt, ki a fehér.
- Lépés küldése: player A küld
moveüzenetet. - Validálás: szerver lekéri a félellenőrzést az engine-től (vagy saját szabályellenőrzés), ha valid → update
fen, appendmove_history, küldmove_resultésopponent_movea másik félnek. - Végállapot: ha matt/döntetlen/timeout → szerver
game_endés törli match-t, kerül a statisztikákba. - Utak a menübe: a játékosokat visszairányítjuk a főmenübe, match eltávolítva.