todo: fix UserData decryption

This commit is contained in:
mokurin000
2025-07-31 01:13:00 +08:00
parent c4860b812b
commit 1943b5b1f6
10 changed files with 216 additions and 23 deletions

View File

@@ -36,6 +36,10 @@ pub enum Commands {
#[arg(short, long)]
user_id: u32,
},
Userdata {
#[arg(short, long)]
user_id: u32,
},
ListAllUser,

View File

@@ -7,6 +7,7 @@ use std::{
use futures_util::StreamExt;
use nyquest_preset::nyquest::ClientBuilder;
use palc::Parser;
use spdlog::{Level, LevelFilter::MoreSevereEqual};
use sdgb_api::{
ApiError,
@@ -16,8 +17,8 @@ use sdgb_api::{
MaiVersionExt, Sdgb1_40, Sdgb1_50,
methods::APIMethod,
model::{
GetUserPreviewApi, GetUserPreviewApiResp, Ping, PingResp, UserLogoutApi,
UserLogoutApiResp,
GetUserDataApi, GetUserDataApiResp, GetUserPreviewApi, GetUserPreviewApiResp, Ping,
PingResp, UserLoginApi, UserLoginApiResp, UserLogoutApi, UserLogoutApiResp,
},
},
};
@@ -36,6 +37,12 @@ static EARLY_QUIT: AtomicBool = AtomicBool::new(false);
async fn main() -> Result<(), Box<dyn snafu::Error>> {
nyquest_preset::register();
if cfg!(debug_assertions) {
spdlog::default_logger().set_level_filter(MoreSevereEqual(Level::Debug));
} else {
spdlog::default_logger().set_level_filter(MoreSevereEqual(Level::Info));
}
ctrlc::set_handler(|| {
warn!("received early-quit request! will abort soon");
EARLY_QUIT.store(true, Ordering::Relaxed);
@@ -45,6 +52,7 @@ async fn main() -> Result<(), Box<dyn snafu::Error>> {
let client = ClientBuilder::default().build_async().await?;
// TODO: refactor via enum_dispatch
match cmd.command {
commands::Commands::Logout { user_id } => {
let logout: UserLogoutApiResp = Sdgb1_50::request(
@@ -193,6 +201,76 @@ async fn main() -> Result<(), Box<dyn snafu::Error>> {
.open("players.json")?;
serde_json::to_writer_pretty(output, &players)?;
}
commands::Commands::Userdata { user_id } => {
let login = UserLoginApi::new(user_id);
let date_time = login.date_time;
let Ok(login_resp): Result<UserLoginApiResp, _> =
Sdgb1_50::request(&client, APIMethod::UserLoginApi, user_id, login).await
else {
let logout_resp: UserLogoutApiResp = Sdgb1_50::request(
&client,
APIMethod::UserLogoutApi,
user_id,
UserLogoutApi {
user_id,
date_time,
..Default::default()
},
)
.await?;
info!("logout: {logout_resp:?}");
return Ok(());
};
match login_resp.return_code {
1 => info!("login succeed"),
100 => {
error!("user already logged");
return Ok(());
}
102 => {
error!("QRCode expired");
return Ok(());
}
103 => {
error!("Unregistered userId");
return Ok(());
}
e @ _ => {
error!("unknown login error: {e}");
return Ok(());
}
}
match Sdgb1_50::request::<_, GetUserDataApiResp>(
&client,
APIMethod::GetUserDataApi,
user_id,
GetUserDataApi { user_id },
)
.await
{
Ok(_) => {}
Err(e) => {
error!("failed to get userdata: {e}");
}
}
let logout_resp: UserLogoutApiResp = Sdgb1_50::request(
&client,
APIMethod::UserLogoutApi,
user_id,
UserLogoutApi {
user_id,
date_time,
..Default::default()
},
)
.await?;
info!("logout: {logout_resp:?}");
}
}
Ok(())