Merge pull request #76 from dyc3/shared-refs
change `accounts` to type `Vec<Arc<Mutex<SteamGuardAccount>>>` to make sure state stays in one place in memory
This commit is contained in:
commit
c17a17e1b8
2 changed files with 15 additions and 13 deletions
|
@ -1,8 +1,9 @@
|
|||
use log::*;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::fs::File;
|
||||
use std::io::{BufReader, Write};
|
||||
use std::path::Path;
|
||||
use std::sync::{Arc, Mutex};
|
||||
use std::{cell::Cell, fs::File};
|
||||
use steamguard::SteamGuardAccount;
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
|
@ -17,7 +18,7 @@ pub struct Manifest {
|
|||
pub auto_confirm_trades: bool,
|
||||
|
||||
#[serde(skip)]
|
||||
pub accounts: Vec<SteamGuardAccount>,
|
||||
pub accounts: Vec<Arc<Mutex<SteamGuardAccount>>>,
|
||||
#[serde(skip)]
|
||||
folder: String, // I wanted to use a Path here, but it was too hard to make it work...
|
||||
}
|
||||
|
@ -48,21 +49,21 @@ impl Manifest {
|
|||
let file = File::open(path)?;
|
||||
let reader = BufReader::new(file);
|
||||
let account: SteamGuardAccount = serde_json::from_reader(reader)?;
|
||||
self.accounts.push(account);
|
||||
self.accounts.push(Arc::new(Mutex::new(account)));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn add_account(&mut self, account: &SteamGuardAccount) {
|
||||
pub fn add_account(&mut self, account: SteamGuardAccount) {
|
||||
debug!("adding account to manifest: {}", account.account_name);
|
||||
let steamid = account.session.clone().unwrap().steam_id;
|
||||
self.accounts.push(account.clone());
|
||||
self.entries.push(ManifestEntry {
|
||||
filename: format!("{}.maFile", account.account_name),
|
||||
filename: format!("{}.maFile", &account.account_name),
|
||||
steam_id: steamid,
|
||||
encryption_iv: None,
|
||||
encryption_salt: None,
|
||||
});
|
||||
self.accounts.push(Arc::new(Mutex::new(account)));
|
||||
}
|
||||
|
||||
pub fn save(&self) -> anyhow::Result<()> {
|
||||
|
@ -72,7 +73,7 @@ impl Manifest {
|
|||
);
|
||||
for (entry, account) in self.entries.iter().zip(&self.accounts) {
|
||||
debug!("saving {}", entry.filename);
|
||||
let serialized = serde_json::to_string(&account)?;
|
||||
let serialized = serde_json::to_string(account.as_ref())?;
|
||||
ensure!(
|
||||
serialized.len() > 2,
|
||||
"Something extra weird happened and the account was serialized into nothing."
|
||||
|
|
13
src/main.rs
13
src/main.rs
|
@ -6,6 +6,7 @@ use std::collections::HashSet;
|
|||
use std::{
|
||||
io::{stdin, stdout, Write},
|
||||
path::Path,
|
||||
sync::{Arc, Mutex},
|
||||
};
|
||||
use steamguard::{steamapi, Confirmation, ConfirmationType, SteamGuardAccount};
|
||||
use termion::{
|
||||
|
@ -122,12 +123,12 @@ fn main() {
|
|||
if matches.is_present("setup") {
|
||||
info!("setup");
|
||||
let mut linker = accountlinker::AccountLinker::new();
|
||||
do_login(&mut linker.account);
|
||||
// do_login(&mut linker.account);
|
||||
// linker.link(linker.account.session.expect("no login session"));
|
||||
return;
|
||||
}
|
||||
|
||||
let mut selected_accounts: Vec<SteamGuardAccount> = vec![];
|
||||
let mut selected_accounts: Vec<Arc<Mutex<SteamGuardAccount>>> = vec![];
|
||||
if matches.is_present("all") {
|
||||
// manifest.accounts.iter().map(|a| selected_accounts.push(a.b));
|
||||
for account in &manifest.accounts {
|
||||
|
@ -139,7 +140,7 @@ fn main() {
|
|||
selected_accounts.push(account.clone());
|
||||
break;
|
||||
}
|
||||
if matches.value_of("username").unwrap() == account.account_name {
|
||||
if matches.value_of("username").unwrap() == account.lock().unwrap().account_name {
|
||||
selected_accounts.push(account.clone());
|
||||
break;
|
||||
}
|
||||
|
@ -150,14 +151,14 @@ fn main() {
|
|||
"selected accounts: {:?}",
|
||||
selected_accounts
|
||||
.iter()
|
||||
.map(|a| a.account_name.clone())
|
||||
.map(|a| a.lock().unwrap().account_name.clone())
|
||||
.collect::<Vec<String>>()
|
||||
);
|
||||
|
||||
if let Some(trade_matches) = matches.subcommand_matches("trade") {
|
||||
info!("trade");
|
||||
for a in selected_accounts.iter_mut() {
|
||||
let mut account = a; // why is this necessary?
|
||||
let mut account = a.lock().unwrap();
|
||||
|
||||
info!("Checking for trade confirmations");
|
||||
let confirmations: Vec<Confirmation>;
|
||||
|
@ -205,7 +206,7 @@ fn main() {
|
|||
let server_time = steamapi::get_server_time();
|
||||
for account in selected_accounts {
|
||||
trace!("{:?}", account);
|
||||
let code = account.generate_code(server_time);
|
||||
let code = account.lock().unwrap().generate_code(server_time);
|
||||
println!("{}", code);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue