Skip to main content

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}