pub mod language;
pub mod user;
use crate::registry::steam::get_steam_active_user_id_by_registry;
use crate::utils::hex::extract_last_field;
use crate::vdf::{VdfValue, get_steam_local_config_vdf_path_by_user_id};
pub fn steam_is_running_state_by_registry() -> bool {
match get_steam_active_user_id_by_registry() {
Some(user_id) => user_id != "0",
None => false,
}
}
pub fn get_launch_options_vdf_paths_by_game_id(steam_game_id: usize) -> Vec<String> {
let paths = vec![
"UserLocalConfigStore".to_string(),
"Software".to_string(),
"Valve".to_string(),
"Steam".to_string(),
"apps".to_string(),
steam_game_id.to_string(),
"LaunchOptions".to_string(),
];
paths
}
pub fn get_userappconfig_vdf_paths_by_game_id(steam_game_id: usize) -> Vec<String> {
let paths = vec![
"UserLocalConfigStore".to_string(),
"UserAppConfig".to_string(),
steam_game_id.to_string(),
];
paths
}
pub fn get_steam_game_launch_options(
steam_user_id: usize,
steam_game_id: usize,
) -> Result<String, String> {
match VdfValue::load_localconfig_vdf_by_user_id(steam_user_id) {
Ok(vdf) => match vdf.get_by_path(&get_launch_options_vdf_paths_by_game_id(steam_game_id)) {
Some(value) => match value.as_string() {
Some(config_store) => Ok(config_store.to_string()),
None => Err(format!(
"Steam game launch options not a string user:{} \tgame_id:{}",
steam_user_id, steam_game_id,
)),
},
None => Err(format!(
"launch_options Steam game config store get value user:{} \tgame_id:{} ",
steam_user_id, steam_game_id,
)),
},
Err(e) => Err(format!("Steam game launch options doesn't exist {}", e)),
}
}
pub fn set_steam_game_launch_options<T: AsRef<str>>(
steam_user_id: usize,
steam_game_id: usize,
launch_options: T,
) -> Result<(), String> {
let launch_options = launch_options.as_ref();
match get_steam_local_config_vdf_path_by_user_id(steam_user_id) {
Some(local_config_path) => match VdfValue::load_from_file(&local_config_path) {
Ok(mut vdf) => {
let paths = get_launch_options_vdf_paths_by_game_id(steam_game_id);
match vdf.set_value_by_path(&paths, launch_options.to_string()) {
Ok(()) => match vdf.write_to_file(local_config_path) {
Ok(_) => {
println!(
"write launch_options success user_id:{} game_id:{} launch_options:\"{}\"",
steam_user_id, steam_game_id, launch_options
);
Ok(())
}
Err(_) => Err(format!(
"Write game launch options failed user_id:{} game_id:{}",
steam_user_id, steam_game_id
)),
},
Err(e) => Err(format!(
"set_value_by_path Steam game launch options doesn't exist {}",
e
)),
}
}
Err(e) => Err(format!(
"set_steam_game_launch_options Steam game launch options doesn't exist {}",
e
)),
},
None => Err(format!(
"set_steam_game_launch_options user_id:{} not find",
steam_user_id
)),
}
}
pub fn get_steam_game_language(
steam_user_id: usize,
steam_game_id: usize,
) -> Result<String, String> {
match VdfValue::load_localconfig_vdf_by_user_id(steam_user_id) {
Ok(vdf) => match vdf.get_by_path(&get_userappconfig_vdf_paths_by_game_id(steam_game_id)) {
Some(value) => match value.as_string() {
Some(config_store) => {
let bytes = hex::decode(config_store).map_err(|e| {
format!(
"Steam game language hex decode failed user:{} game_id:{}: {:?}",
steam_user_id, steam_game_id, e
)
})?;
match extract_last_field(&bytes) {
Some(last_field) => Ok(last_field.to_string()),
None => Err("extract_last_field not find".to_string()),
}
}
None => Err(format!(
"Steam game language not a string user:{} \tgame_id:{}",
steam_user_id, steam_game_id,
)),
},
None => Err(format!(
"language Steam game config store get value user:{} \tgame_id:{}",
steam_user_id, steam_game_id,
)),
},
Err(e) => Err(format!("Steam game language doesn't exist {}", e)),
}
}
pub fn get_steam_game_library_folder_by_game_id(steam_game_id: usize) -> Result<String, String> {
let steam_game_string = steam_game_id.to_string();
match VdfValue::load_libraryfolders_vdf() {
Ok(vdf) => match vdf.get_by_path(&vec!["libraryfolders"]) {
Some(library_folders) => {
match library_folders.as_object() {
Some(library) => {
for (_, value) in library {
match value.get("apps") {
Some(apps) => {
match apps.as_object() {
Some(apps) => {
for (app_id, _) in apps {
if *app_id == steam_game_string {
return if let Some(path_value) =
value.get_value("path")
{
Ok(path_value.to_string())
} else {
Err("Steam game libraryfolders.vdf path 'libraryfolders' doesn't exist".to_string())
};
}
}
}
None => {
println!("apps 信息错拉!!??\t{:?}", apps)
}
}
}
None => {}
}
}
Err(format!("folders not find {}", steam_game_id))
}
None => Err(
"Steam game libraryfolders.vdf path 'libraryfolders' doesn't exist"
.to_string(),
),
}
}
None => Err("Steam game libraryfolders.vdf doesn't exist".to_string()),
},
Err(e) => Err(format!("Steam game library folder doesn't exist {}", e)),
}
}
#[cfg(test)]
mod tests_steam {
use crate::steam::get_steam_game_library_folder_by_game_id;
#[test]
fn test_library_folder() {
let pa = get_steam_game_library_folder_by_game_id(114);
println!("{:?}", pa);
}
}