mirror of
https://github.com/djibux/BoilR.git
synced 2026-09-01 14:03:42 +02:00
121 lines
3.9 KiB
Rust
121 lines
3.9 KiB
Rust
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<Vec<PathBuf>>,
|
|
pub last_restore: Option<PathBuf>,
|
|
}
|
|
|
|
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<PathBuf> {
|
|
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();
|
|
}
|
|
}
|
|
}
|
|
}
|