use std::time::SystemTime; use serde_json::Value; use crate::secure; const PERSIST_TIME: u64 = 60 * 3; const PERSIST_PATH: &str = "/var/run/crab"; pub fn get_persist(user: &str) -> bool { let json = match get_terminal_config() { Some(data) => data, None => return false }; let timestamp = match json[user].as_u64() { Some(data) => data, None => return false }; return now() - timestamp < PERSIST_TIME && timestamp - 1 < now(); } pub fn set_persist(user: &str) { let mut json = match get_terminal_config() { Some(data) => data, None => serde_json::from_str("{}").unwrap() }; json[user] = Value::from(now()); let id = match get_terminal_process() { Some(data) => data, None => return }; match secure::write_file(PERSIST_PATH, &format!("{}", id), &json.to_string()) { Ok(_) => {}, Err(_) => { eprintln!("crab: An Internal Has Error") } }; } fn get_terminal_process() -> Option { let pid: i32 = match std::process::id().try_into() { Ok(data) => data, Err(_) => return None }; let pid_stat = match procinfo::pid::stat(pid) { Ok(data) => data, Err(_) => return None }; Some(pid_stat.session) } fn get_terminal_config() -> Option { let id = match get_terminal_process() { Some(data) => data, None => return None }; let data = match secure::read_file(PERSIST_PATH, &format!("{}", id)) { Some(data) => data, None => "{}".to_string() }; let json: Value = match serde_json::from_str(&data) { Ok(data) => data, Err(_) => return None }; Some(json) } fn now() -> u64 { return SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs(); }