ddapi_rs/api/ddnet.rs
1use crate::api::DDApi;
2use crate::scheme::ddnet::prelude::*;
3use anyhow::Result;
4use std::future::Future;
5
6#[allow(dead_code)]
7pub trait DDnetApi {
8 fn master(&self) -> impl Future<Output = Result<Master>> + Send;
9 fn skins(&self) -> impl Future<Output = Result<DDSkins>> + Send;
10 fn custom_master(&self, master: MasterServer) -> impl Future<Output = Result<Master>> + Send;
11 fn player(&self, player: &str) -> impl Future<Output = Result<Player>> + Send;
12 fn query(&self, player: &str) -> impl Future<Output = Result<Vec<Query>>> + Send;
13 fn query_map(&self, player: &str) -> impl Future<Output = Result<Vec<QueryMap>>> + Send;
14 fn query_mapper(&self, player: &str) -> impl Future<Output = Result<Vec<QueryMapper>>> + Send;
15 fn map(&self, map: &str) -> impl Future<Output = Result<Map>> + Send;
16 fn releases_map(&self) -> impl Future<Output = Result<Vec<ReleasesMaps>>> + Send;
17 fn status(&self) -> impl Future<Output = Result<Status>> + Send;
18 fn latest_finish(&self) -> impl Future<Output = Result<Vec<LatestFinishes>>> + Send;
19 fn latest_finish_with_latest(
20 &self,
21 latest: usize,
22 ) -> impl Future<Output = Result<Vec<LatestFinishes>>> + Send;
23}
24
25impl DDnetApi for DDApi {
26 /// Fetches server list from the default master server
27 ///
28 /// Returns a list of game servers from the primary master server (master1.ddnet.org).
29 ///
30 /// # Examples
31 ///
32 /// ```rust,ignore
33 /// use ddapi_rs::prelude::*;
34 ///
35 /// let api = DDApi::new();
36 /// let master = api.master().await?;
37 /// println!("Found {} servers", master.servers.len());
38 /// ```
39 async fn master(&self) -> Result<Master> {
40 self.custom_master(MasterServer::One).await
41 }
42
43 /// # Examples
44 ///
45 /// ```rust,ignore
46 /// use ddapi_rs::prelude::*;
47 /// use ddapi_rs::prelude::ddnet::*;
48 ///
49 /// let api = DDApi::new();
50 /// let skins: DDSkins = api.skins().await?;
51 /// println!("Found {} available skins", skins.skins.len());
52 /// for skin in skins.skins {
53 /// println!("Skin: {} by {}", skin.name, skin.creator);
54 /// }
55 /// ```
56 async fn skins(&self) -> Result<DDSkins> {
57 self._generator(&DDSkins::api()).await
58 }
59
60 /// Fetches server list from a specific master server
61 ///
62 /// Allows selecting which master server to query. DDNet has multiple
63 /// master servers for redundancy and load distribution.
64 ///
65 /// # Arguments
66 ///
67 /// * `master` - The master server to query (`MasterServer::One`, `MasterServer::Two`, etc.)
68 ///
69 /// # Examples
70 ///
71 /// ```rust,ignore
72 /// use ddapi_rs::prelude::*;
73 /// use ddapi_rs::prelude::ddnet::*;
74 ///
75 /// let api = DDApi::new();
76 /// // Use secondary master server as fallback
77 /// let master = api.custom_master(MasterServer::Two).await?;
78 /// ```
79 async fn custom_master(&self, master: MasterServer) -> Result<Master> {
80 self._generator_no_cache(&Master::api(master)).await
81 }
82
83 /// # Examples
84 ///
85 /// ```rust,ignore
86 /// use ddapi_rs::prelude::*;
87 /// use ddapi_rs::prelude::ddnet::*;
88 ///
89 /// let api = DDApi::new();
90 /// let player: Player = api.player("nameless tee").await?;
91 /// println!("{}: {}", player.player, player.points.points.unwrap_or(0));
92 /// ```
93 async fn player(&self, player: &str) -> Result<Player> {
94 self._generator(&Player::api(player)).await
95 }
96
97 /// # Examples
98 ///
99 /// ```rust,ignore
100 /// use ddapi_rs::prelude::*;
101 /// use ddapi_rs::prelude::ddnet::*;
102 ///
103 /// let api = DDApi::new();
104 /// let query: Vec<Query> = api.query("nameless tee").await?;
105 /// for player in &query {
106 /// println!("{}: {}", player.name, player.points);
107 /// }
108 /// ```
109 async fn query(&self, player: &str) -> Result<Vec<Query>> {
110 self._generator(&Query::api(player)).await
111 }
112
113 /// # Examples
114 ///
115 /// ```rust,ignore
116 /// use ddapi_rs::prelude::*;
117 /// use ddapi_rs::prelude::ddnet::*;
118 ///
119 /// let api = DDApi::new();
120 /// let query: Vec<QueryMap> = api.query_map("multi").await?;
121 /// for map in &query {
122 /// println!("{}: {} | {}", map.name, map.mapper, map.r#type);
123 /// }
124 /// ```
125 async fn query_map(&self, map: &str) -> Result<Vec<QueryMap>> {
126 self._generator(&QueryMap::api(map)).await
127 }
128
129 /// # Examples
130 ///
131 /// ```rust,ignore
132 /// use ddapi_rs::prelude::*;
133 /// use ddapi_rs::prelude::ddnet::*;
134 ///
135 /// let api = DDApi::new();
136 /// let query: Vec<QueryMapper> = api.query_mapper("Ao").await?;
137 /// for player in &query {
138 /// println!("{}: {}", player.mapper, player.num_maps);
139 /// }
140 /// ```
141 async fn query_mapper(&self, player: &str) -> Result<Vec<QueryMapper>> {
142 self._generator(&QueryMapper::api(player)).await
143 }
144
145 /// # Examples
146 ///
147 /// ```rust,ignore
148 /// use ddapi_rs::prelude::*;
149 /// use ddapi_rs::prelude::ddnet::*;
150 ///
151 /// let api = DDApi::new();
152 /// let map: Map = api.map("Fox").await?;
153 /// println!("{}: {}", map.mapper, map.web_preview);
154 /// ```
155 async fn map(&self, map: &str) -> Result<Map> {
156 self._generator(&Map::api(map)).await
157 }
158
159 /// # Examples
160 ///
161 /// ```rust,ignore
162 /// use ddapi_rs::prelude::*;
163 /// use ddapi_rs::prelude::ddnet::*;
164 ///
165 /// let api = DDApi::new();
166 /// let maps: Vec<ReleasesMaps> = api.releases_map().await?;
167 /// for map in &maps {
168 /// println!("{}: {} | {}", map.name, map.mapper, map.r#type);
169 /// }
170 /// ```
171 async fn releases_map(&self) -> Result<Vec<ReleasesMaps>> {
172 self._generator_no_cache(&ReleasesMaps::api()).await
173 }
174
175 /// # Examples
176 ///
177 /// ```rust,ignore
178 /// use ddapi_rs::prelude::*;
179 /// use ddapi_rs::prelude::ddnet::*;
180 ///
181 /// let api = DDApi::new();
182 /// let status: Status = api.status().await?;
183 /// for data in &status.servers {
184 /// println!("{}: {} | {}", data.name, data.location, data.host);
185 /// }
186 /// ```
187 async fn status(&self) -> Result<Status> {
188 self._generator_no_cache(&Status::api()).await
189 }
190
191 async fn latest_finish(&self) -> Result<Vec<LatestFinishes>> {
192 self.latest_finish_with_latest(0).await
193 }
194
195 async fn latest_finish_with_latest(&self, latest: usize) -> Result<Vec<LatestFinishes>> {
196 self._generator_no_cache(&LatestFinishes::api(latest)).await
197 }
198}