feat: scrape user regions

This commit is contained in:
mokurin000
2025-08-03 19:04:16 +08:00
parent 56a36933e1
commit a1b3a8ef0e
6 changed files with 69 additions and 0 deletions

View File

@@ -23,4 +23,5 @@ api_implement!([
"GetUserPreviewApi",
"GetUserRatingApi",
"GetUserMusicApi",
"GetUserRegionApi",
]);

View File

@@ -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<u32> 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<UserRegion>,
}
#[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,
}

View File

@@ -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,

View File

@@ -14,6 +14,7 @@ static DATABASE: LazyLock<redb::Database> = LazyLock::new(|| {
pub const PLAYERS: TableDefinition<'_, u32, Vec<u8>> = redb::TableDefinition::new("players");
pub const PLAYER_B50: TableDefinition<'_, u32, Vec<u8>> = redb::TableDefinition::new("b50");
pub const PLAYER_RECORD: TableDefinition<'_, u32, Vec<u8>> = redb::TableDefinition::new("records");
pub const PLAYER_REGION: TableDefinition<'_, u32, Vec<u8>> = redb::TableDefinition::new("regions");
pub fn write_txn() -> Result<WriteTransaction, redb::Error> {
Ok(DATABASE.begin_write()?)

View File

@@ -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,

View File

@@ -284,6 +284,30 @@ async fn main() -> Result<(), Box<dyn snafu::Error>> {
)
.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<GetUserPreviewApiResp> = read_cache(PLAYERS)?;
players.retain(|p| p.player_rating >= min_rating && p.player_rating <= max_rating);
cached_concurrent_fetch::<GetUserRegionApiExt>(
players.iter().map(|p| p.user_id).collect::<Vec<u32>>(),
&client,
concurrency,
PLAYER_REGION,
)
.await?;
}
#[cfg(feature = "fetchall")]
Commands::ListAllUserDump {} => {