From 081123ec608f40036f7a12a23f0070d26b13c2fe Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Thu, 18 Apr 2024 21:11:33 +0200 Subject: [PATCH] fetch game api to get necessary resources --- .../src/components/pgr_component.rs | 34 +++++ .../src/utils/kuro_prod_api.rs | 122 ++++++++++++++++++ babylonia-terminal-sdk/src/utils/mod.rs | 1 + 3 files changed, 157 insertions(+) create mode 100644 babylonia-terminal-sdk/src/components/pgr_component.rs create mode 100644 babylonia-terminal-sdk/src/utils/kuro_prod_api.rs diff --git a/babylonia-terminal-sdk/src/components/pgr_component.rs b/babylonia-terminal-sdk/src/components/pgr_component.rs new file mode 100644 index 0000000..ca20028 --- /dev/null +++ b/babylonia-terminal-sdk/src/components/pgr_component.rs @@ -0,0 +1,34 @@ +use serde::Deserialize; +use serde::Serialize; +use std::path::PathBuf; + +use super::component_downloader::ComponentDownloader; +use crate::utils::github_requester::GithubRequester; + +pub struct PGRComponent { + path: PathBuf, +} + +impl GithubRequester for PGRComponent {} + +impl ComponentDownloader for PGRComponent { + async fn install( + &self, + progress: Option>, + ) -> anyhow::Result<()> { + Self::download(self.path, progress); + } + + async fn download( + output_dir: &std::path::PathBuf, + progress: Option>, + ) -> anyhow::Result { + } + + async fn uncompress( + file: std::path::PathBuf, + new_filename: std::path::PathBuf, + ) -> anyhow::Result<()> { + todo!() + } +} diff --git a/babylonia-terminal-sdk/src/utils/kuro_prod_api.rs b/babylonia-terminal-sdk/src/utils/kuro_prod_api.rs new file mode 100644 index 0000000..3436933 --- /dev/null +++ b/babylonia-terminal-sdk/src/utils/kuro_prod_api.rs @@ -0,0 +1,122 @@ +use serde::Deserialize; +use serde::Serialize; + +// start data --------------------------------------------------------------------- + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Index { + pub default: Default, + pub hash_cache_check_acc_switch: i64, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Default { + pub cdn_list: Vec, + pub changelog: Changelog, + pub resources: String, + pub resources_base_path: String, + pub resources_diff: ResourcesDiff, + pub resources_exclude_path: Vec, + pub resources_exclude_path_need_update: Vec, + pub sample_hash_switch: i64, + pub version: String, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct CdnList { + #[serde(rename = "K1")] + pub k1: i64, + #[serde(rename = "K2")] + pub k2: i64, + #[serde(rename = "P")] + pub p: i64, + pub url: String, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Changelog { + #[serde(rename = "zh-Hans")] + pub zh_hans: String, + pub en: String, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ResourcesDiff { + pub current_game_info: CurrentGameInfo, + pub previous_game_info: PreviousGameInfo, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct CurrentGameInfo { + pub file_name: String, + pub md5: String, + pub version: String, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PreviousGameInfo { + pub file_name: String, + pub md5: String, + pub version: String, +} + +// Resources --------------------------------------------------------------------- + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Resources { + pub resource: Vec, + pub sample_hash_info: SampleHashInfo, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Resource { + pub dest: String, + pub md5: String, + pub sample_hash: String, + pub size: i64, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SampleHashInfo { + pub sample_num: i64, + pub sample_block_max_size: i64, +} + +// end data --------------------------------------------------------------------- + +static URL: &str = concat!( + "https://", + "prod", + "-alicdn", + "-gamestarter", + ".kur", + "ogame", + ".com/pcst", + "arter/pro", + "d/game/G1", + "43/4/index.json" +); + +pub async fn fetch_resources() -> anyhow::Result { + let response = reqwest::get(URL).await?; + let body = response.text().await?; + let index: Index = serde_json::from_str(&body)?; + + let resources_base_url = index.default.cdn_list.first().unwrap().url.clone(); + let resources_path_url = index.default.resources; + let resources_url = format!("{}{}", resources_base_url, resources_path_url); + + let response = reqwest::get(&resources_url).await?; + let body = response.text().await?; + Ok(serde_json::from_str::(&body)?) +} diff --git a/babylonia-terminal-sdk/src/utils/mod.rs b/babylonia-terminal-sdk/src/utils/mod.rs index 12d4bd1..baec65a 100644 --- a/babylonia-terminal-sdk/src/utils/mod.rs +++ b/babylonia-terminal-sdk/src/utils/mod.rs @@ -1 +1,2 @@ pub mod github_requester; +pub mod kuro_prod_api;