lichess_api/model/board/stream/
events.rs1use 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#[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>, username: String,
108 ai: u32,
109 },
110}
111
112#[derive(Clone, Debug, Deserialize, Serialize)]
113pub struct ChallengeCanceledJson {
114 pub id: String,
115}