lichess_api/model/board/stream/
game.rs

1use crate::model::{Clock, Room, Speed, Variant};
2use serde::{Deserialize, Serialize};
3use serde_with::skip_serializing_none;
4
5#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
6#[serde(rename_all = "lowercase")]
7pub enum GameColor {
8    White,
9    Black,
10}
11
12#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
13#[serde(rename_all = "camelCase")]
14pub enum GameStatusName {
15    Created,
16    Started,
17    Aborted,
18    Mate,
19    Resign,
20    Stalemate,
21    Timeout,
22    Draw,
23    Outoftime,
24    Cheat,
25    NoStart,
26    UnknownFinish,
27    VariantEnd,
28}
29
30#[derive(Default, Clone, Debug, Serialize)]
31pub struct GetQuery;
32
33pub type GetRequest = crate::model::Request<GetQuery>;
34
35impl GetRequest {
36    pub fn new(game_id: &str) -> Self {
37        Self::get(format!("/api/board/game/stream/{game_id}"), None, None)
38    }
39}
40
41impl<S: AsRef<str>> From<S> for GetRequest {
42    fn from(s: S) -> Self {
43        Self::new(s.as_ref())
44    }
45}
46
47#[skip_serializing_none]
48#[derive(Clone, Debug, Deserialize, Serialize)]
49#[serde(tag = "type")]
50#[serde(rename_all = "camelCase")]
51pub enum Event {
52    GameFull {
53        #[serde(flatten)]
54        game_full: GameFullEvent,
55    },
56    GameState {
57        #[serde(flatten)]
58        game_state: GameStateEvent,
59    },
60    ChatLine {
61        #[serde(flatten)]
62        chat_line: ChatLineEvent,
63    },
64    OpponentGone {
65        #[serde(flatten)]
66        opponent_gone: OpponentGoneEvent,
67    },
68}
69
70#[skip_serializing_none]
71#[derive(Clone, Debug, Deserialize, Serialize)]
72#[serde(rename_all = "camelCase")]
73pub struct GameFullEvent {
74    pub id: String,
75    pub variant: Variant,
76    pub rated: bool,
77    pub clock: Option<Clock>,
78    pub speed: Speed,
79    pub perf: Perf,
80    pub created_at: u64,
81    pub white: GameEventPlayer,
82    pub black: GameEventPlayer,
83    pub initial_fen: Option<String>,
84    pub state: Option<GameStateEvent>,
85    pub tournament_id: Option<String>,
86}
87
88#[skip_serializing_none]
89#[derive(Clone, Debug, Deserialize, Serialize)]
90#[serde(rename_all = "camelCase")]
91pub struct GameStateEvent {
92    // Will always be gameState, but needed to avoid cycles.
93    pub r#type: Option<String>,
94    pub moves: String,
95    pub wtime: u64,
96    pub btime: u64,
97    pub winc: u64,
98    pub binc: u64,
99    pub status: GameStatusName,
100    pub winner: Option<GameColor>,
101    pub wdraw: Option<bool>,
102    pub bdraw: Option<bool>,
103    pub wtakeback: Option<bool>,
104    pub btakeback: Option<bool>,
105}
106
107#[skip_serializing_none]
108#[derive(Clone, Debug, Deserialize, Serialize)]
109#[serde(rename_all = "camelCase")]
110pub struct ChatLineEvent {
111    pub room: Room,
112    pub username: String,
113    pub text: String,
114}
115
116#[skip_serializing_none]
117#[derive(Clone, Debug, Deserialize, Serialize)]
118#[serde(rename_all = "camelCase")]
119pub struct OpponentGoneEvent {
120    pub gone: bool,
121    pub claim_win_in_seconds: Option<u32>,
122}
123
124#[derive(Clone, Debug, Deserialize, Serialize)]
125#[serde(rename_all = "camelCase")]
126pub struct GameEventPlayer {
127    pub id: String,
128    pub name: String,
129    #[serde(skip_serializing_if = "Option::is_none")]
130    pub ai_level: Option<u32>,
131    #[serde(skip_serializing_if = "Option::is_none")]
132    pub title: Option<String>,
133    #[serde(skip_serializing_if = "Option::is_none")]
134    pub rating: Option<u32>,
135    #[serde(skip_serializing_if = "Option::is_none")]
136    pub provisional: Option<bool>,
137}
138
139#[derive(Clone, Debug, Serialize, Deserialize)]
140pub struct Perf {
141    pub name: String,
142}