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:
Carson McManus 2021-08-01 12:37:37 -04:00 committed by GitHub
commit c17a17e1b8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 13 deletions

View file

@ -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."

View file

@ -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);
}
}