[feat] read video config is ok
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
use crate::steam;
|
||||
use crate::tool::*;
|
||||
use crate::vdf::preset;
|
||||
use crate::vdf::preset::VideoConfig;
|
||||
use crate::wrap_err;
|
||||
use anyhow::Result;
|
||||
|
||||
@@ -81,6 +82,31 @@ pub fn set_auto_login_user(user: &str) -> Result<String, String> {
|
||||
Ok(format!("Set auto login user to {}", user))
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn get_cs2_video_config(steam_dir: &str, steam_id32: u32) -> Result<VideoConfig, String> {
|
||||
let p = format!(
|
||||
"{}/userdata/{}/730/local/cfg/cs2_video.txt",
|
||||
steam_dir, steam_id32
|
||||
);
|
||||
let video = preset::get_cs2_video(p.as_str()).map_err(|e| e.to_string())?;
|
||||
Ok(video)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn set_cs2_video_config(
|
||||
steam_dir: &str,
|
||||
steam_id32: u32,
|
||||
video_config: VideoConfig,
|
||||
) -> Result<(), String> {
|
||||
let p = format!(
|
||||
"{}/userdata/{}/730/local/cfg/cs2_video.txt",
|
||||
steam_dir, steam_id32
|
||||
);
|
||||
preset::set_cs2_video(p.as_str(), video_config).map_err(|e| e.to_string())?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn check_path(path: &str) -> Result<bool, String> {
|
||||
Ok(std::path::Path::new(&path).exists())
|
||||
|
||||
@@ -129,6 +129,8 @@ fn main() {
|
||||
cmds::set_powerplan,
|
||||
cmds::get_steam_users,
|
||||
cmds::set_auto_login_user,
|
||||
cmds::get_cs2_video_config,
|
||||
cmds::set_cs2_video_config,
|
||||
cmds::check_path,
|
||||
on_button_clicked
|
||||
])
|
||||
|
||||
@@ -18,7 +18,7 @@ pub fn kill(name: &str) -> String {
|
||||
|
||||
pub fn run_steam() -> std::io::Result<std::process::Output> {
|
||||
#[cfg(target_os = "windows")]
|
||||
Command::new("cmd")
|
||||
return Command::new("cmd")
|
||||
.args(&["/C", "start", "steam://run"])
|
||||
.creation_flags(CREATE_NO_WINDOW)
|
||||
.output();
|
||||
|
||||
@@ -48,55 +48,55 @@ pub fn to_vdf(json_data: &str) -> String {
|
||||
}
|
||||
|
||||
fn build_vdf(json_value: &serde_json::Value, vdf_data: &mut String, indent_level: usize) {
|
||||
match json_value {
|
||||
serde_json::Value::Object(obj) => {
|
||||
for (key, value) in obj {
|
||||
vdf_data.push_str(&"\t".repeat(indent_level));
|
||||
vdf_data.push_str(&format!("\"{}\"\n", key));
|
||||
vdf_data.push_str(&"\t".repeat(indent_level));
|
||||
vdf_data.push_str("{\n");
|
||||
build_vdf(value, vdf_data, indent_level + 1);
|
||||
vdf_data.push_str(&"\t".repeat(indent_level));
|
||||
vdf_data.push_str("}\n");
|
||||
}
|
||||
}
|
||||
serde_json::Value::String(s) => {
|
||||
vdf_data.push_str(&"\t".repeat(indent_level));
|
||||
vdf_data.push_str(&format!("\"{}\"\t\t\"{}\"\n", s, s));
|
||||
}
|
||||
_ => {
|
||||
vdf_data.push_str(&"\t".repeat(indent_level));
|
||||
vdf_data.push_str(&format!("\"{}\"\t\t\"{}\"\n", json_value, json_value));
|
||||
}
|
||||
}
|
||||
match json_value {
|
||||
serde_json::Value::Object(obj) => {
|
||||
for (key, value) in obj {
|
||||
vdf_data.push_str(&"\t".repeat(indent_level));
|
||||
vdf_data.push_str(&format!("\"{}\"\n", key));
|
||||
vdf_data.push_str(&"\t".repeat(indent_level));
|
||||
vdf_data.push_str("{\n");
|
||||
build_vdf(value, vdf_data, indent_level + 1);
|
||||
vdf_data.push_str(&"\t".repeat(indent_level));
|
||||
vdf_data.push_str("}\n");
|
||||
}
|
||||
}
|
||||
serde_json::Value::String(s) => {
|
||||
vdf_data.push_str(&"\t".repeat(indent_level));
|
||||
vdf_data.push_str(&format!("\"{}\"\t\t\"{}\"\n", s, s));
|
||||
}
|
||||
_ => {
|
||||
vdf_data.push_str(&"\t".repeat(indent_level));
|
||||
vdf_data.push_str(&format!("\"{}\"\t\t\"{}\"\n", json_value, json_value));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
static VDF_DATA: &str = r#"\"users\"
|
||||
static VDF_DATA: &str = r#""users"
|
||||
{
|
||||
\"76561198315078806\"
|
||||
"76561198315078806"
|
||||
{
|
||||
\"AccountName\" \"_jerry_dota2\"
|
||||
\"PersonaName\" \"Rop紫(已黑化)\"
|
||||
\"RememberPassword\" \"1\"
|
||||
\"WantsOfflineMode\" \"0\"
|
||||
\"SkipOfflineModeWarning\" \"0\"
|
||||
\"AllowAutoLogin\" \"1\"
|
||||
\"MostRecent\" \"1\"
|
||||
\"Timestamp\" \"1742706884\"
|
||||
"AccountName" "_jerry_dota2"
|
||||
"PersonaName" "Rop紫(已黑化)"
|
||||
"RememberPassword" "1"
|
||||
"WantsOfflineMode" "0"
|
||||
"SkipOfflineModeWarning" "0"
|
||||
"AllowAutoLogin" "1"
|
||||
"MostRecent" "1"
|
||||
"Timestamp" "1742706884"
|
||||
}
|
||||
\"76561198107125441\"
|
||||
"76561198107125441"
|
||||
{
|
||||
\"AccountName\" \"_im_ai_\"
|
||||
\"PersonaName\" \"Buongiorno\"
|
||||
\"RememberPassword\" \"1\"
|
||||
\"WantsOfflineMode\" \"0\"
|
||||
\"SkipOfflineModeWarning\" \"0\"
|
||||
\"AllowAutoLogin\" \"1\"
|
||||
\"MostRecent\" \"0\"
|
||||
\"Timestamp\" \"1739093763\"
|
||||
"AccountName" "_im_ai_"
|
||||
"PersonaName" "Buongiorno"
|
||||
"RememberPassword" "1"
|
||||
"WantsOfflineMode" "0"
|
||||
"SkipOfflineModeWarning" "0"
|
||||
"AllowAutoLogin" "1"
|
||||
"MostRecent" "0"
|
||||
"Timestamp" "1739093763"
|
||||
}
|
||||
}
|
||||
"#;
|
||||
|
||||
@@ -49,35 +49,74 @@ pub struct VideoConfig {
|
||||
version: String,
|
||||
vendor_id: String,
|
||||
device_id: String,
|
||||
setting_cpu_level: String,
|
||||
setting_gpu_mem_level: String,
|
||||
setting_gpu_level: String,
|
||||
setting_knowndevice: String,
|
||||
setting_defaultres: String,
|
||||
setting_defaultresheight: String,
|
||||
setting_refreshrate_numerator: String,
|
||||
setting_refreshrate_denominator: String,
|
||||
setting_fullscreen: String,
|
||||
setting_coop_fullscreen: String,
|
||||
setting_nowindowborder: String,
|
||||
setting_mat_vsync: String,
|
||||
setting_fullscreen_min_on_focus_loss: String,
|
||||
setting_high_dpi: String,
|
||||
cpu_level: String,
|
||||
gpu_mem_level: String,
|
||||
gpu_level: String,
|
||||
knowndevice: String,
|
||||
defaultres: String,
|
||||
defaultresheight: String,
|
||||
refreshrate_numerator: String,
|
||||
refreshrate_denominator: String,
|
||||
fullscreen: String,
|
||||
coop_fullscreen: String,
|
||||
nowindowborder: String,
|
||||
mat_vsync: String,
|
||||
fullscreen_min_on_focus_loss: String,
|
||||
high_dpi: String,
|
||||
auto_config: String,
|
||||
setting_shaderquality: String,
|
||||
setting_r_texturefilteringquality: String,
|
||||
setting_msaa_samples: String,
|
||||
setting_r_csgo_cmaa_enable: String,
|
||||
setting_videocfg_shadow_quality: String,
|
||||
setting_videocfg_dynamic_shadows: String,
|
||||
setting_videocfg_texture_detail: String,
|
||||
setting_videocfg_particle_detail: String,
|
||||
setting_videocfg_ao_detail: String,
|
||||
setting_videocfg_hdr_detail: String,
|
||||
setting_videocfg_fsr_detail: String,
|
||||
setting_monitor_index: String,
|
||||
setting_r_low_latency: String,
|
||||
setting_aspectratiomode: String,
|
||||
shaderquality: String,
|
||||
r_texturefilteringquality: String,
|
||||
msaa_samples: String,
|
||||
r_csgo_cmaa_enable: String,
|
||||
videocfg_shadow_quality: String,
|
||||
videocfg_dynamic_shadows: String,
|
||||
videocfg_texture_detail: String,
|
||||
videocfg_particle_detail: String,
|
||||
videocfg_ao_detail: String,
|
||||
videocfg_hdr_detail: String,
|
||||
videocfg_fsr_detail: String,
|
||||
monitor_index: String,
|
||||
r_low_latency: String,
|
||||
aspectratiomode: String,
|
||||
}
|
||||
|
||||
impl Default for VideoConfig {
|
||||
fn default() -> Self {
|
||||
VideoConfig {
|
||||
version: String::new(),
|
||||
vendor_id: String::new(),
|
||||
device_id: String::new(),
|
||||
cpu_level: String::new(),
|
||||
gpu_mem_level: String::new(),
|
||||
gpu_level: String::new(),
|
||||
knowndevice: String::new(),
|
||||
defaultres: String::new(),
|
||||
defaultresheight: String::new(),
|
||||
refreshrate_numerator: String::new(),
|
||||
refreshrate_denominator: String::new(),
|
||||
fullscreen: String::new(),
|
||||
coop_fullscreen: String::new(),
|
||||
nowindowborder: String::new(),
|
||||
mat_vsync: String::new(),
|
||||
fullscreen_min_on_focus_loss: String::new(),
|
||||
high_dpi: String::new(),
|
||||
auto_config: String::new(),
|
||||
shaderquality: String::new(),
|
||||
r_texturefilteringquality: String::new(),
|
||||
msaa_samples: String::new(),
|
||||
r_csgo_cmaa_enable: String::new(),
|
||||
videocfg_shadow_quality: String::new(),
|
||||
videocfg_dynamic_shadows: String::new(),
|
||||
videocfg_texture_detail: String::new(),
|
||||
videocfg_particle_detail: String::new(),
|
||||
videocfg_ao_detail: String::new(),
|
||||
videocfg_hdr_detail: String::new(),
|
||||
videocfg_fsr_detail: String::new(),
|
||||
monitor_index: String::new(),
|
||||
r_low_latency: String::new(),
|
||||
aspectratiomode: String::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn parse_login_users(steam_dir: &str) -> Result<Vec<LoginUser>> {
|
||||
@@ -306,16 +345,234 @@ fn read_avatar(steam_dir: &str, steam_id64: &str) -> Option<String> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_cs2_video(file_path: &str) -> Result<HashMap<String, String>> {
|
||||
let data = fs::read_to_string(file_path)?;
|
||||
pub fn get_cs2_video(file_path: &str) -> Result<VideoConfig> {
|
||||
// TODO: no kv
|
||||
let data = fs::read_to_string(file_path)?;
|
||||
let json_data = super::parse::to_json(&data);
|
||||
let kv: HashMap<String, String> = serde_json::from_str(&json_data)?;
|
||||
Ok(kv)
|
||||
let video_config = VideoConfig {
|
||||
version: kv.get("version").unwrap_or(&"".to_string()).to_string(),
|
||||
vendor_id: kv.get("vendor_id").unwrap_or(&"".to_string()).to_string(),
|
||||
device_id: kv.get("device_id").unwrap_or(&"".to_string()).to_string(),
|
||||
cpu_level: kv
|
||||
.get("setting.cpu_level")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
gpu_mem_level: kv
|
||||
.get("setting.gpu_mem_level")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
gpu_level: kv
|
||||
.get("setting.gpu_level")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
knowndevice: kv
|
||||
.get("setting.knowndevice")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
defaultres: kv
|
||||
.get("setting.defaultres")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
defaultresheight: kv
|
||||
.get("setting.defaultresheight")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
refreshrate_numerator: kv
|
||||
.get("setting.refreshrate_numerator")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
refreshrate_denominator: kv
|
||||
.get("setting.refreshrate_denominator")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
fullscreen: kv
|
||||
.get("setting.fullscreen")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
coop_fullscreen: kv
|
||||
.get("setting.coop_fullscreen")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
nowindowborder: kv
|
||||
.get("setting.nowindowborder")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
mat_vsync: kv
|
||||
.get("setting.mat_vsync")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
fullscreen_min_on_focus_loss: kv
|
||||
.get("setting.fullscreen_min_on_focus_loss")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
high_dpi: kv
|
||||
.get("setting.high_dpi")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
auto_config: kv.get("auto_config").unwrap_or(&"".to_string()).to_string(),
|
||||
shaderquality: kv
|
||||
.get("setting.shaderquality")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
r_texturefilteringquality: kv
|
||||
.get("setting.r_texturefilteringquality")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
msaa_samples: kv
|
||||
.get("setting.msaa_samples")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
r_csgo_cmaa_enable: kv
|
||||
.get("setting.r_csgo_cmaa_enable")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
videocfg_shadow_quality: kv
|
||||
.get("setting.videocfg_shadow_quality")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
videocfg_dynamic_shadows: kv
|
||||
.get("setting.videocfg_dynamic_shadows")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
videocfg_texture_detail: kv
|
||||
.get("setting.videocfg_texture_detail")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
videocfg_particle_detail: kv
|
||||
.get("setting.videocfg_particle_detail")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
videocfg_ao_detail: kv
|
||||
.get("setting.videocfg_ao_detail")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
videocfg_hdr_detail: kv
|
||||
.get("setting.videocfg_hdr_detail")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
videocfg_fsr_detail: kv
|
||||
.get("setting.videocfg_fsr_detail")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
monitor_index: kv
|
||||
.get("setting.monitor_index")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
r_low_latency: kv
|
||||
.get("setting.r_low_latency")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
aspectratiomode: kv
|
||||
.get("setting.aspectratiomode")
|
||||
.unwrap_or(&"".to_string())
|
||||
.to_string(),
|
||||
};
|
||||
Ok(video_config)
|
||||
}
|
||||
|
||||
pub fn set_cs2_video(file_path: &str, data: HashMap<String, String>) -> Result<()> {
|
||||
let json_data = serde_json::to_string(&data)?;
|
||||
pub fn set_cs2_video(file_path: &str, data: VideoConfig) -> Result<()> {
|
||||
// TODO: no kv
|
||||
let mut kv = HashMap::new();
|
||||
kv.insert("version".to_string(), data.version);
|
||||
kv.insert("vendor_id".to_string(), data.vendor_id);
|
||||
kv.insert("device_id".to_string(), data.device_id);
|
||||
kv.insert("setting.cpu_level".to_string(), data.cpu_level);
|
||||
kv.insert(
|
||||
"setting.gpu_mem_level".to_string(),
|
||||
data.gpu_mem_level,
|
||||
);
|
||||
kv.insert("setting.gpu_level".to_string(), data.gpu_level);
|
||||
kv.insert("setting.knowndevice".to_string(), data.knowndevice);
|
||||
kv.insert("setting.defaultres".to_string(), data.defaultres);
|
||||
kv.insert(
|
||||
"setting.defaultresheight".to_string(),
|
||||
data.defaultresheight,
|
||||
);
|
||||
kv.insert(
|
||||
"setting.refreshrate_numerator".to_string(),
|
||||
data.refreshrate_numerator,
|
||||
);
|
||||
kv.insert(
|
||||
"setting.refreshrate_denominator".to_string(),
|
||||
data.refreshrate_denominator,
|
||||
);
|
||||
kv.insert("setting.fullscreen".to_string(), data.fullscreen);
|
||||
kv.insert(
|
||||
"setting.coop_fullscreen".to_string(),
|
||||
data.coop_fullscreen,
|
||||
);
|
||||
kv.insert(
|
||||
"setting.nowindowborder".to_string(),
|
||||
data.nowindowborder,
|
||||
);
|
||||
kv.insert("setting.mat_vsync".to_string(), data.mat_vsync);
|
||||
kv.insert(
|
||||
"setting.fullscreen_min_on_focus_loss".to_string(),
|
||||
data.fullscreen_min_on_focus_loss,
|
||||
);
|
||||
kv.insert("setting.high_dpi".to_string(), data.high_dpi);
|
||||
kv.insert("auto_config".to_string(), data.auto_config);
|
||||
kv.insert(
|
||||
"setting.shaderquality".to_string(),
|
||||
data.shaderquality,
|
||||
);
|
||||
kv.insert(
|
||||
"setting.r_texturefilteringquality".to_string(),
|
||||
data.r_texturefilteringquality,
|
||||
);
|
||||
kv.insert(
|
||||
"setting.msaa_samples".to_string(),
|
||||
data.msaa_samples,
|
||||
);
|
||||
kv.insert(
|
||||
"setting.r_csgo_cmaa_enable".to_string(),
|
||||
data.r_csgo_cmaa_enable,
|
||||
);
|
||||
kv.insert(
|
||||
"setting.videocfg_shadow_quality".to_string(),
|
||||
data.videocfg_shadow_quality,
|
||||
);
|
||||
kv.insert(
|
||||
"setting.videocfg_dynamic_shadows".to_string(),
|
||||
data.videocfg_dynamic_shadows,
|
||||
);
|
||||
kv.insert(
|
||||
"setting.videocfg_texture_detail".to_string(),
|
||||
data.videocfg_texture_detail,
|
||||
);
|
||||
kv.insert(
|
||||
"setting.videocfg_particle_detail".to_string(),
|
||||
data.videocfg_particle_detail,
|
||||
);
|
||||
kv.insert(
|
||||
"setting.videocfg_ao_detail".to_string(),
|
||||
data.videocfg_ao_detail,
|
||||
);
|
||||
kv.insert(
|
||||
"setting.videocfg_hdr_detail".to_string(),
|
||||
data.videocfg_hdr_detail,
|
||||
);
|
||||
kv.insert(
|
||||
"setting.videocfg_fsr_detail".to_string(),
|
||||
data.videocfg_fsr_detail,
|
||||
);
|
||||
kv.insert(
|
||||
"setting.monitor_index".to_string(),
|
||||
data.monitor_index,
|
||||
);
|
||||
kv.insert(
|
||||
"setting.r_low_latency".to_string(),
|
||||
data.r_low_latency,
|
||||
);
|
||||
kv.insert(
|
||||
"setting.aspectratiomode".to_string(),
|
||||
data.aspectratiomode,
|
||||
);
|
||||
|
||||
let json_data = serde_json::to_string(&kv)?;
|
||||
let vdf_data = super::parse::to_vdf(&json_data);
|
||||
// println!("{}", vdf_data);
|
||||
fs::write(file_path, vdf_data)?;
|
||||
Ok(())
|
||||
}
|
||||
@@ -332,14 +589,17 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_get_cs2_video() {
|
||||
let video_config = get_cs2_video("src-tauri/src/vdf/tests/cs2_video.txt").unwrap();
|
||||
let manifest_dir = env!("CARGO_MANIFEST_DIR");
|
||||
let file_path = format!("{}/src/vdf/tests/cs2_video.txt", manifest_dir);
|
||||
let video_config = get_cs2_video(&file_path).unwrap();
|
||||
println!("{:?}", video_config);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_set_cs2_video() {
|
||||
let mut video_config = HashMap::new();
|
||||
video_config.insert("setting.fullscreen".to_string(), "0".to_string());
|
||||
set_cs2_video("temp/cs2_video.txt", video_config).unwrap();
|
||||
let manifest_dir = env!("CARGO_MANIFEST_DIR");
|
||||
let file_path = format!("{}/temp/cs2_video.txt", manifest_dir);
|
||||
let video_config = VideoConfig::default();
|
||||
set_cs2_video(&file_path, video_config).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user