diff --git a/sdgb-api/src/title/methods/api_ext/mod.rs b/sdgb-api/src/title/methods/api_ext/mod.rs index fd4cfd2..e574518 100644 --- a/sdgb-api/src/title/methods/api_ext/mod.rs +++ b/sdgb-api/src/title/methods/api_ext/mod.rs @@ -23,4 +23,5 @@ api_implement!([ "GetUserPreviewApi", "GetUserRatingApi", "GetUserMusicApi", + "GetUserRegionApi", ]); diff --git a/sdgb-api/src/title/model/get_user_region_api/mod.rs b/sdgb-api/src/title/model/get_user_region_api/mod.rs new file mode 100644 index 0000000..393c851 --- /dev/null +++ b/sdgb-api/src/title/model/get_user_region_api/mod.rs @@ -0,0 +1,30 @@ +use bincode::{Decode, Encode}; +use serde::{Deserialize, Serialize}; + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct GetUserRegionApi { + pub user_id: u32, +} + +impl From for GetUserRegionApi { + fn from(user_id: u32) -> Self { + Self { user_id } + } +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, Encode, Decode)] +#[serde(rename_all = "camelCase")] +pub struct GetUserRegionApiResp { + pub user_id: i64, + pub length: i64, + pub user_region_list: Vec, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, Encode, Decode)] +#[serde(rename_all = "camelCase")] +pub struct UserRegion { + pub region_id: i64, + pub play_count: i64, + pub created: String, +} diff --git a/sdgb-api/src/title/model/mod.rs b/sdgb-api/src/title/model/mod.rs index d0d2388..079d20a 100644 --- a/sdgb-api/src/title/model/mod.rs +++ b/sdgb-api/src/title/model/mod.rs @@ -25,6 +25,9 @@ pub use get_user_rating_api::{ mod get_user_music_api; pub use get_user_music_api::{GetUserMusicApi, GetUserMusicApiResp, UserMusic, UserMusicDetail}; +mod get_user_region_api; +pub use get_user_region_api::{GetUserRegionApi, GetUserRegionApiResp, UserRegion}; + mod dxrating; pub use dxrating::{ DataVersion, diff --git a/sdgb-cli/src/cache/mod.rs b/sdgb-cli/src/cache/mod.rs index 8488d26..313db70 100644 --- a/sdgb-cli/src/cache/mod.rs +++ b/sdgb-cli/src/cache/mod.rs @@ -14,6 +14,7 @@ static DATABASE: LazyLock = LazyLock::new(|| { pub const PLAYERS: TableDefinition<'_, u32, Vec> = redb::TableDefinition::new("players"); pub const PLAYER_B50: TableDefinition<'_, u32, Vec> = redb::TableDefinition::new("b50"); pub const PLAYER_RECORD: TableDefinition<'_, u32, Vec> = redb::TableDefinition::new("records"); +pub const PLAYER_REGION: TableDefinition<'_, u32, Vec> = redb::TableDefinition::new("regions"); pub fn write_txn() -> Result { Ok(DATABASE.begin_write()?) diff --git a/sdgb-cli/src/commands.rs b/sdgb-cli/src/commands.rs index 2f13253..1a2f832 100644 --- a/sdgb-cli/src/commands.rs +++ b/sdgb-cli/src/commands.rs @@ -95,6 +95,16 @@ pub enum Commands { max_rating: i64, }, #[cfg(feature = "fetchall")] + ScrapeAllRegion { + #[arg(short, long, default_value_t = 5)] + concurrency: usize, + + #[arg(long, default_value_t = 1000)] + min_rating: i64, + #[arg(long, default_value_t = 16500)] + max_rating: i64, + }, + #[cfg(feature = "fetchall")] ScrapeAllRecord { #[arg(short, long, default_value_t = 5)] concurrency: usize, diff --git a/sdgb-cli/src/main.rs b/sdgb-cli/src/main.rs index 918d9d2..314f824 100644 --- a/sdgb-cli/src/main.rs +++ b/sdgb-cli/src/main.rs @@ -284,6 +284,30 @@ async fn main() -> Result<(), Box> { ) .await?; } + #[cfg(feature = "fetchall")] + Commands::ScrapeAllRegion { + concurrency, + min_rating, + max_rating, + } => { + use sdgb_api::title::methods::GetUserRegionApiExt; + + use crate::{ + cache::{PLAYER_REGION, PLAYERS}, + utils::helpers::{cached_concurrent_fetch, read_cache}, + }; + + let mut players: Vec = read_cache(PLAYERS)?; + players.retain(|p| p.player_rating >= min_rating && p.player_rating <= max_rating); + + cached_concurrent_fetch::( + players.iter().map(|p| p.user_id).collect::>(), + &client, + concurrency, + PLAYER_REGION, + ) + .await?; + } #[cfg(feature = "fetchall")] Commands::ListAllUserDump {} => {