1use std::io::Write;
2
3use anyhow::Result;
4use config::Config;
5
6use crate::steam::{kill_steam, launch_steam, modify_registry_file};
7
8pub mod config;
9pub mod steam;
10
11#[allow(dead_code)]
12fn main() -> Result<()> {
13 let mut config: Config = Config::load()?;
14 let res = show_menu(&mut config)?;
15
16 match res {
17 MenuSelector::Account(username) => {
18 println!("Selected steam user: {}", username);
19 println!("Killing all steam processes...");
20 kill_steam();
21 println!("Steam killed! Modyfing registry.vdf...");
22
23 modify_registry_file(username)?;
24
25 println!("Registry file modified! Starting steam...");
26 launch_steam(config.steam_command.as_str())?;
27 }
28 MenuSelector::AddNew => {
29 print_no_newline("Enter new username: ")?;
30
31 let mut username = String::new();
32 std::io::stdin().read_line(&mut username)?;
33
34 config.add_account(username.trim().to_string())?;
35 println!("Added account: {}!", username.trim());
36
37 main()?;
38 }
39 MenuSelector::Remove => {
40 print_no_newline("Enter number of account to remove: ")?;
41
42 let mut remove_index = String::new();
43 std::io::stdin().read_line(&mut remove_index)?;
44
45 let remove_index: usize = remove_index.trim().parse()?;
46
47 println!("Removed account: {}!", config.accounts[remove_index - 1]);
48 config.remove_account_index(remove_index - 1)?;
49
50 main()?;
51 }
52 _ => {}
53 }
54
55 Ok(())
56}
57
58fn print_no_newline(line: &str) -> Result<()> {
59 print!("{}", line);
60 std::io::stdout().flush()?;
61
62 Ok(())
63}
64
65enum MenuSelector {
66 Account(String),
67 Remove,
68 AddNew,
69 None,
70}
71
72fn show_menu(config: &mut Config) -> Result<MenuSelector> {
73 let accounts: &Vec<String> = &config.accounts;
74
75 for acc in 0..accounts.len() {
76 println!("{}. {}", acc + 1, accounts[acc]);
77 }
78
79 println!("\nn. Add new");
80 println!("d. Remove");
81 println!("q. Exit");
82
83 let mut menu_input = String::new();
84 std::io::stdin().read_line(&mut menu_input)?;
85
86 match menu_input.trim() {
87 "n" => {
88 return Ok(MenuSelector::AddNew);
89 }
90 "q" => {
91 return Ok(MenuSelector::None);
92 }
93 "d" => {
94 return Ok(MenuSelector::Remove);
95 }
96 _ => {}
97 }
98
99 let account_index: usize = menu_input.trim().parse()?;
100 if account_index - 1 < accounts.len() {
101 return Ok(MenuSelector::Account(
102 accounts[account_index - 1].to_string(),
103 ));
104 }
105
106 return Ok(MenuSelector::None);
107}