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

@@ -15,6 +15,7 @@ cache = ["dep:redb"]
[dependencies]
sdgb-api = { workspace = true, features = ["bincode"] }
spdlog-rs = { workspace = true }
snafu = { workspace = true }
serde_json = { workspace = true }
@@ -25,10 +26,6 @@ compio = { workspace = true, features = ["macros"], optional = true }
nyquest-preset = { version = "0.2.0", features = ["async"] }
palc = { version = "0.0.1", features = ["derive"] }
spdlog-rs = { version = "0.4.3", default-features = false, features = [
"level-info",
"release-level-info",
] }
futures-util = "0.3.31"
redb = { version = "2.6.1", optional = true }
ctrlc = { version = "3.4.7", features = ["termination"] }

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(())