ddapi_rs/api/
ddnet.rs

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