lichess_api/model/board/stream/
events.rs

1use crate::model::challenges::{ChallengeDeclinedJson, ChallengeJson};
2use crate::model::{Color, GameCompat, Speed, Variant};
3use serde::{Deserialize, Serialize};
4use serde_with::skip_serializing_none;
5
6#[derive(Default, Clone, Debug, Serialize)]
7pub struct GetQuery;
8
9pub type GetRequest = crate::model::Request<GetQuery>;
10
11impl GetRequest {
12    pub fn new() -> Self {
13        Self::get("/api/stream/event", None, None)
14    }
15}
16
17impl Default for GetRequest {
18    fn default() -> Self {
19        Self::new()
20    }
21}
22
23// Response structs.
24
25#[derive(Clone, Debug, Deserialize, Serialize)]
26pub struct Event {
27    #[serde(flatten)]
28    pub event: EventData,
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub compat: Option<GameCompat>,
31}
32
33#[derive(Clone, Debug, Deserialize, Serialize)]
34#[serde(tag = "type")]
35#[serde(rename_all = "camelCase")]
36pub enum EventData {
37    Challenge { challenge: ChallengeJson },
38    ChallengeCanceled { challenge: ChallengeJson },
39    ChallengeDeclined { challenge: ChallengeDeclinedJson },
40    GameStart { game: GameEventInfo },
41    GameFinish { game: GameEventInfo },
42}
43
44#[skip_serializing_none]
45#[derive(Clone, Debug, Deserialize, Serialize)]
46#[serde(rename_all = "camelCase")]
47pub struct GameEventInfo {
48    pub full_id: String,
49    pub game_id: String,
50    pub fen: String,
51    pub color: Color,
52    pub last_move: String,
53    pub source: Source,
54    pub status: GameStatus,
55    pub variant: Variant,
56    pub speed: Speed,
57    pub perf: String,
58    pub rated: bool,
59    pub has_moved: bool,
60    pub opponent: GameEventOpponent,
61    pub is_my_turn: bool,
62    pub seconds_left: Option<u64>,
63    pub tournament_id: Option<String>,
64    pub compat: Option<GameCompat>,
65    pub winner: Option<String>,
66    pub rating_diff: Option<i32>,
67    pub id: String,
68}
69
70#[derive(Clone, Debug, Deserialize, Serialize)]
71pub struct GameStatus {
72    pub id: u32,
73    pub name: String,
74}
75
76#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
77#[serde(rename_all = "camelCase")]
78pub enum Source {
79    Lobby,
80    Friend,
81    Ai,
82    Api,
83    Tournament,
84    Position,
85    Import,
86    Importlive,
87    Simul,
88    Relay,
89    Pool,
90    Swiss,
91    Arena,
92}
93
94#[derive(Clone, Debug, Serialize, Deserialize)]
95#[serde(untagged)]
96#[serde(rename_all_fields = "camelCase")]
97pub enum GameEventOpponent {
98    Player {
99        id: String,
100        username: String,
101        rating: u32,
102        #[serde(skip_serializing_if = "Option::is_none")]
103        rating_diff: Option<i32>,
104    },
105    AI {
106        id: Option<String>, // Always null for AI
107        username: String,
108        ai: u32,
109    },
110}
111
112#[derive(Clone, Debug, Deserialize, Serialize)]
113pub struct ChallengeCanceledJson {
114    pub id: String,
115}