using System; using System.IO; using System.IO.Compression; using System.Linq; using Omegasis.SaveBackup.Framework; using StardewModdingAPI; using StardewModdingAPI.Events; namespace Omegasis.SaveBackup { /// The mod entry point. public class SaveBackup : Mod { /********* ** Properties *********/ /// The folder path containing the game's app data. private static readonly string AppDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "StardewValley"); /// The folder path containing the game's saves. private static readonly string SavesPath = Path.Combine(SaveBackup.AppDataPath, "Saves"); /// The folder path containing backups of the save before the player starts playing. private static readonly string PrePlayBackupsPath = Path.Combine(SaveBackup.AppDataPath, "Backed_Up_Saves", "Pre_Play_Saves"); /// The folder path containing nightly backups of the save. private static readonly string NightlyBackupsPath = Path.Combine(SaveBackup.AppDataPath, "Backed_Up_Saves", "Nightly_InGame_Saves"); /// The mod configuration. private ModConfig Config; /********* ** Public methods *********/ /// The mod entry point, called after the mod is first loaded. /// Provides simplified APIs for writing mods. public override void Entry(IModHelper helper) { this.Config = helper.ReadConfig(); this.BackupSaves(SaveBackup.PrePlayBackupsPath); SaveEvents.BeforeSave += this.SaveEvents_BeforeSave; } /********* ** Private methods *********/ /// The method invoked before the save is updated. /// The event sender. /// The event data. private void SaveEvents_BeforeSave(object sender, EventArgs e) { this.BackupSaves(SaveBackup.NightlyBackupsPath); } /// Back up saves to the specified folder. /// The folder path in which to generate saves. private void BackupSaves(string folderPath) { // back up saves Directory.CreateDirectory(folderPath); ZipFile.CreateFromDirectory(SaveBackup.SavesPath, Path.Combine(folderPath, $"backup-{DateTime.Now:yyyyMMdd'-'HHmmss}.zip")); // delete old backups new DirectoryInfo(folderPath) .EnumerateFiles() .OrderByDescending(f => f.CreationTime) .Skip(this.Config.SaveCount) .ToList() .ForEach(file => file.Delete()); } } }