wormhole_common/mods/spacedock/
mod.rs1use 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}