1use serde::{Deserialize, Serialize};
2
3#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
4#[serde(rename_all = "camelCase")]
5pub struct Manifest {
6 pub required: bool,
7 pub hash: String,
8}
9
10#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
11#[serde(rename_all = "camelCase")]
12pub struct Nwsync {
13 pub manifests: Vec<Manifest>,
14 pub url: String,
15}
16
17#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
18#[serde(rename_all = "camelCase")]
19pub struct Server {
20 #[serde(rename = "first_seen")]
21 pub first_seen: i64,
22 #[serde(rename = "last_advertisement")]
23 pub last_advertisement: i64,
24 #[serde(rename = "session_name")]
25 pub session_name: String,
26 #[serde(rename = "module_name")]
27 pub module_name: String,
28 #[serde(rename = "module_description")]
29 pub module_description: String,
30 pub passworded: bool,
31 #[serde(rename = "min_level")]
32 pub min_level: i64,
33 #[serde(rename = "max_level")]
34 pub max_level: i64,
35 #[serde(rename = "current_players")]
36 pub current_players: i64,
37 #[serde(rename = "max_players")]
38 pub max_players: i64,
39 pub build: String,
40 pub rev: i64,
41 pub pvp: i64,
42 pub servervault: bool,
43 pub elc: bool,
44 pub ilr: bool,
45 #[serde(rename = "one_party")]
46 pub one_party: bool,
47 #[serde(rename = "player_pause")]
48 pub player_pause: bool,
49 pub os: i64,
50 pub language: i64,
51 #[serde(rename = "game_type")]
52 pub game_type: i64,
53 pub latency: i64,
54 pub host: String,
55 pub port: i64,
56 #[serde(rename = "kx_pk")]
57 pub kx_pk: Option<String>,
58 #[serde(rename = "sign_pk")]
59 pub sign_pk: Option<String>,
60 pub nwsync: Option<Nwsync>,
61 pub connecthint: Option<String>,
62}
63
64#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
65#[serde(rename_all = "camelCase")]
66pub struct Me {
67 pub address: String,
68 pub servers: Vec<Server>,
69}
70
71pub async fn get_my_servers() -> Result<Me, reqwest::Error> {
72 let resp = reqwest::get("https://api.nwn.beamdog.net/v1/me").await?.json::<Me>().await?;
73 Ok(resp)
74}
75
76pub async fn get_servers() -> Result<Vec<Server>, reqwest::Error> {
77 let resp = reqwest::get("https://api.nwn.beamdog.net/v1/servers").await?
78 .json::<Vec<Server>>()
79 .await?;
80 Ok(resp)
81}
82
83pub async fn get_servers_by_public_key(public_key: String) -> Result<Vec<Server>, reqwest::Error> {
84 let url = format!("https://api.nwn.beamdog.net/v1/servers/{}", public_key);
85 let resp = reqwest::get(url).await?.json::<Vec<Server>>().await?;
86 Ok(resp)
87}
88
89pub async fn get_servers_by_ip_and_port(ip: String,
90 port: i32)
91 -> Result<Vec<Server>, reqwest::Error> {
92 let url = format!("https://api.nwn.beamdog.net/v1/servers/{}/{}", ip, port);
93 let resp = reqwest::get(url).await?.json::<Vec<Server>>().await?;
94 Ok(resp)
95}