wormhole_common/mods/spacedock/
mod.rs

1use serde::{Deserialize, Serialize};
2use std::time::Instant;
3
4use crate::models::latest::LatestSchema;
5
6use super::schema::browse::{BrowseResult, ModInfo};
7
8#[derive(Serialize, Deserialize, Debug, Clone)]
9pub struct SpaceDockAPI {
10    pub base: String,
11    pub api_base: String,
12}
13
14impl Default for SpaceDockAPI {
15    fn default() -> Self {
16        return Self::new();
17    }
18}
19
20impl SpaceDockAPI {
21    pub fn new() -> Self {
22        return Self {
23            base: SpaceDockAPI::get_default_url(),
24            api_base: SpaceDockAPI::get_default_api_url(),
25        };
26    }
27
28    pub fn get_default_api_url() -> String {
29        return "https://spacedock.info/api".to_string();
30    }
31
32    pub fn get_default_url() -> String {
33        return "https://spacedock.info".to_string();
34    }
35
36    pub async fn get_mod(&self, id: i32) -> ModInfo {
37        let uri = format!("{}/mod/{}", self.api_base, id);
38        let resp = reqwest::get(uri).await.unwrap();
39        let data = resp.json::<ModInfo>().await.unwrap();
40
41        return data.finish(false);
42    }
43
44    pub async fn get_mods(&self, page: i32, count: i32) -> BrowseResult {
45        let uri = format!("{}/browse?page={}&count={}", self.api_base, page, count);
46        let resp = reqwest::get(uri).await.unwrap();
47        let data = resp.json::<BrowseResult>().await.unwrap();
48
49        return data.finish();
50    }
51
52    pub async fn get_mods_for_game(&self, game: i32, page: i32, count: i32) -> BrowseResult {
53        let start_time = Instant::now();
54
55        let uri = format!(
56            "{}/browse?page={}&count={}&game_id={}",
57            self.api_base, page, count, game
58        );
59        let resp = reqwest::get(uri).await.unwrap();
60        let text = resp.text().await.unwrap();
61        let data = serde_json::from_str::<BrowseResult>(&text);
62
63        let elapsed = start_time.elapsed();
64        println!("API call took {:?}", elapsed);
65
66        if let Ok(data) = data {
67            return data.finish();
68        }
69
70        panic!("Found: {}", text);
71    }
72
73    pub async fn get_mod_download(&self, id: i32) -> String {
74        let uri = format!("{}/mod/{}/latest", self.api_base, id);
75        let resp = reqwest::get(uri).await.unwrap();
76        let text = resp.text().await.unwrap();
77        let data = serde_json::from_str::<LatestSchema>(&text).unwrap();
78
79        return format!("{}{}", self.base, data.download_path);
80    }
81}