use std::path::{Path, PathBuf}; use chrono::Local; use egui::ScrollArea; use crate::{ config::get_backups_flder, steam::{get_shortcuts_paths, SteamSettings}, }; use super::MyEguiApp; #[derive(Default)] pub struct BackupState { pub available_backups: Option>, pub last_restore: Option, } impl MyEguiApp { pub fn render_backup(&mut self, ui: &mut egui::Ui) { ui.heading("Backups"); ui.label("Here you can restore backed up shortcuts files"); ui.label("Click a backup to restore it, your current shortcuts will be backed up first"); ui.add_space(15.0); if let Some(last_restore) = self.backup_state.last_restore.as_ref() { ui.heading(format!("Last restored {:?}", last_restore)); } if ui.button("Click here to create a new backup").clicked() { backup_shortcuts(&self.settings.steam); self.backup_state.available_backups = None; } let available_backups = self .backup_state .available_backups .get_or_insert_with(load_backups); if available_backups.is_empty() { ui.label("No backups found, they will be created every time you run import"); } else { ScrollArea::vertical() .stick_to_right(true) .auto_shrink([false, true]) .show(ui, |ui| { for backup_path in available_backups { if ui .button(backup_path.to_string_lossy().to_string()) .clicked() { //Restore backup_shortcuts(&self.settings.steam); if restore_backup(&self.settings.steam, backup_path.as_path()) { self.backup_state.last_restore = Some(backup_path.clone()); } } } }); } } } pub fn restore_backup(steam_settings: &SteamSettings, shortcut_path: &Path) -> bool { let file_name = shortcut_path.file_name().unwrap(); let paths = get_shortcuts_paths(steam_settings); if let Ok(paths) = paths { for user in paths { if let Some(user_shortcut_path) = user.shortcut_path { if file_name.to_string_lossy().starts_with(&user.user_id) { std::fs::copy(shortcut_path, Path::new(&user_shortcut_path)).unwrap(); println!("Restored shortcut to path : {}", user_shortcut_path); return true; } } } } false } pub fn load_backups() -> Vec { let backup_folder = get_backups_flder(); let files = std::fs::read_dir(&backup_folder); let mut result = vec![]; if let Ok(files) = files { for file in files.flatten() { if file .path() .extension() .unwrap_or_default() .to_string_lossy() == "vdf" { result.push(file.path().to_path_buf()); } } } result.sort(); result.reverse(); result } pub fn backup_shortcuts(steam_settings: &SteamSettings) { let backup_folder = get_backups_flder(); let paths = get_shortcuts_paths(steam_settings); let date = Local::now(); let date_string = date.format("%Y-%m-%d-%H-%M-%S"); if let Ok(user_infos) = paths { for user_info in user_infos { if let Some(shortcut_path) = user_info.shortcut_path { let new_path = backup_folder.join(format!( "{}-{}-shortcuts.vdf", user_info.user_id, date_string )); println!("Backed up shortcut at: {:?}", new_path); std::fs::copy(&shortcut_path, &new_path).unwrap(); } } } }