feat: scrape user regions
This commit is contained in:
@@ -23,4 +23,5 @@ api_implement!([
|
|||||||
"GetUserPreviewApi",
|
"GetUserPreviewApi",
|
||||||
"GetUserRatingApi",
|
"GetUserRatingApi",
|
||||||
"GetUserMusicApi",
|
"GetUserMusicApi",
|
||||||
|
"GetUserRegionApi",
|
||||||
]);
|
]);
|
||||||
|
|||||||
30
sdgb-api/src/title/model/get_user_region_api/mod.rs
Normal file
30
sdgb-api/src/title/model/get_user_region_api/mod.rs
Normal 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,
|
||||||
|
}
|
||||||
@@ -25,6 +25,9 @@ pub use get_user_rating_api::{
|
|||||||
mod get_user_music_api;
|
mod get_user_music_api;
|
||||||
pub use get_user_music_api::{GetUserMusicApi, GetUserMusicApiResp, UserMusic, UserMusicDetail};
|
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;
|
mod dxrating;
|
||||||
pub use dxrating::{
|
pub use dxrating::{
|
||||||
DataVersion,
|
DataVersion,
|
||||||
|
|||||||
1
sdgb-cli/src/cache/mod.rs
vendored
1
sdgb-cli/src/cache/mod.rs
vendored
@@ -14,6 +14,7 @@ static DATABASE: LazyLock<redb::Database> = LazyLock::new(|| {
|
|||||||
pub const PLAYERS: TableDefinition<'_, u32, Vec<u8>> = redb::TableDefinition::new("players");
|
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_B50: TableDefinition<'_, u32, Vec<u8>> = redb::TableDefinition::new("b50");
|
||||||
pub const PLAYER_RECORD: TableDefinition<'_, u32, Vec<u8>> = redb::TableDefinition::new("records");
|
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> {
|
pub fn write_txn() -> Result<WriteTransaction, redb::Error> {
|
||||||
Ok(DATABASE.begin_write()?)
|
Ok(DATABASE.begin_write()?)
|
||||||
|
|||||||
@@ -95,6 +95,16 @@ pub enum Commands {
|
|||||||
max_rating: i64,
|
max_rating: i64,
|
||||||
},
|
},
|
||||||
#[cfg(feature = "fetchall")]
|
#[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 {
|
ScrapeAllRecord {
|
||||||
#[arg(short, long, default_value_t = 5)]
|
#[arg(short, long, default_value_t = 5)]
|
||||||
concurrency: usize,
|
concurrency: usize,
|
||||||
|
|||||||
@@ -284,6 +284,30 @@ async fn main() -> Result<(), Box<dyn snafu::Error>> {
|
|||||||
)
|
)
|
||||||
.await?;
|
.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")]
|
#[cfg(feature = "fetchall")]
|
||||||
Commands::ListAllUserDump {} => {
|
Commands::ListAllUserDump {} => {
|
||||||
|
|||||||
Reference in New Issue
Block a user