diff --git a/src/StormworksLuaExtract/Helpers/BackupFileHelper.cs b/src/StormworksLuaExtract/Helpers/BackupFileHelper.cs new file mode 100644 index 0000000..6186e49 --- /dev/null +++ b/src/StormworksLuaExtract/Helpers/BackupFileHelper.cs @@ -0,0 +1,21 @@ +using System; +using System.IO; +using StormworksLuaExtract.Models; + +namespace StormworksLuaExtract.Helpers +{ + public static class BackupFileHelper + { + public static bool BackupFile(string originalContent, string originalFileName) + { + var backupFileName = $"{Path.GetFileNameWithoutExtension(originalFileName)} {DateTime.Now:yyyy-MM-dd HH-mm-ss}{Path.GetExtension(originalFileName)}"; + var backupFilePath = Path.Join(Statics.LocalBackupDirectory, backupFileName); + var success = FileHelper.TryWriteFile(backupFilePath, originalContent); + + if (success) + Console.WriteLine($"Wrote backup to {backupFilePath}"); + + return success; + } + } +} diff --git a/src/StormworksLuaExtract/Models/Constants.cs b/src/StormworksLuaExtract/Models/Constants.cs index e85a229..37271ec 100644 --- a/src/StormworksLuaExtract/Models/Constants.cs +++ b/src/StormworksLuaExtract/Models/Constants.cs @@ -2,6 +2,6 @@ { public static class Constants { - public const int ReadWriteTimeoutInMilliseconds = 2000; + public const int ReadWriteTimeoutInMilliseconds = 1000; } } diff --git a/src/StormworksLuaExtract/Models/LuaScript.cs b/src/StormworksLuaExtract/Models/LuaScript.cs index 27f626c..538c888 100644 --- a/src/StormworksLuaExtract/Models/LuaScript.cs +++ b/src/StormworksLuaExtract/Models/LuaScript.cs @@ -7,19 +7,19 @@ public class LuaScript { public string VehicleXmlPath { get; } + public string VehicleName => Path.GetFileNameWithoutExtension(VehicleXmlPath); + public string LuaFilePath { get; } - public string ObjectId { get; } + public string LuaFileName => Path.GetFileName(LuaFilePath); - public string VehicleName { get; } + public string ObjectId { get; } public LuaScript(string vehicleXmlPath, string luaFilePath, string objectId) { VehicleXmlPath = vehicleXmlPath; LuaFilePath = luaFilePath; ObjectId = objectId; - - VehicleName = VehicleXmlPath.Split(Path.DirectorySeparatorChar).Last().Replace(".xml", string.Empty); } } } \ No newline at end of file diff --git a/src/StormworksLuaExtract/Models/Statics.cs b/src/StormworksLuaExtract/Models/Statics.cs index 38a8df0..c20514e 100644 --- a/src/StormworksLuaExtract/Models/Statics.cs +++ b/src/StormworksLuaExtract/Models/Statics.cs @@ -5,7 +5,7 @@ namespace StormworksLuaExtract.Models { public static class Statics { - public static readonly string MicrocontrollerPath = @"C:\Users\renes\Desktop\Test";//Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Stormworks\data\vehicles"); + public static readonly string MicrocontrollerPath = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Stormworks\data\vehicles"); public static readonly string LocalEditDirectory = Path.GetFullPath(@".\Workspace"); public static readonly string LocalBackupDirectory = Path.GetFullPath(@".\Backup"); diff --git a/src/StormworksLuaExtract/Services/ApplicationService.cs b/src/StormworksLuaExtract/Services/ApplicationService.cs index 22b7fac..bb65764 100644 --- a/src/StormworksLuaExtract/Services/ApplicationService.cs +++ b/src/StormworksLuaExtract/Services/ApplicationService.cs @@ -14,6 +14,7 @@ public class ApplicationService private readonly LocalLuaToXmlWriteService _localLuaToXmlWriteService; private readonly XmlToLocalLuaWriteService _xmlToLocalLuaWriteService; private readonly List _luaScripts = new List(); + private readonly List _ignoreNextLuaUpdatePaths = new List(); private string _ignoreNextVehicleUpdatePath; @@ -60,11 +61,14 @@ public void Run() private void WriteExistingMicrocontrollerScripts() { foreach (var xmlFilePath in Directory.GetFiles(Statics.MicrocontrollerPath, "*.xml")) - AddMicrocontrollerXmlFile(xmlFilePath); + AddVehicleXmlFile(xmlFilePath); } private void VehicleAdded(string xmlfilepath) => - AddMicrocontrollerXmlFile(xmlfilepath); + AddVehicleXmlFile(xmlfilepath); + + private void VehicleDeleted(string xmlfilepath) => + _luaScripts.Where(s => s.VehicleXmlPath == xmlfilepath).ToList().ForEach(s => _luaScripts.Remove(s)); private void VehicleChanged(string xmlfilepath) { @@ -74,16 +78,39 @@ private void VehicleChanged(string xmlfilepath) return; } - _luaScripts.Where(s => s.VehicleXmlPath == xmlfilepath).ToList().ForEach(s => _xmlToLocalLuaWriteService.WriteVehicleLuaScriptToFile(s)); - } + var savedVehicleScripts = ScriptExtractHelper.ExtractScriptsFromMicrocontrollerXml(xmlfilepath).ToList(); - private void VehicleDeleted(string xmlfilepath) => - _luaScripts.Where(s => s.VehicleXmlPath == xmlfilepath).ToList().ForEach(s => _luaScripts.Remove(s)); + var previouslyExtractedScripts = _luaScripts.Where(ls => ls.VehicleXmlPath == xmlfilepath).ToList(); + var newScripts = savedVehicleScripts.Where(vs => previouslyExtractedScripts.All(nvs => nvs.ObjectId != vs.ObjectId)); + var deletedScripts = previouslyExtractedScripts.Where(vs => savedVehicleScripts.All(nvs => nvs.ObjectId != vs.ObjectId)).ToList(); + + foreach (var newScript in newScripts) + { + _luaScripts.Add(newScript); + _ignoreNextLuaUpdatePaths.Add(newScript.LuaFilePath); + _xmlToLocalLuaWriteService.WriteVehicleLuaScriptToFile(newScript); + } + + foreach (var deletedScript in deletedScripts) + { + _luaScripts.Remove(deletedScript); + var deletedScriptContent = FileHelper.NoTouchReadFile(deletedScript.LuaFilePath); + if (BackupFileHelper.BackupFile(deletedScriptContent, deletedScript.LuaFileName)) + File.Delete(deletedScript.LuaFilePath); + } + + foreach (var existingScript in previouslyExtractedScripts.Except(deletedScripts)) + { + _ignoreNextLuaUpdatePaths.Add(existingScript.LuaFilePath); + if (!_xmlToLocalLuaWriteService.WriteVehicleLuaScriptToFile(existingScript)) + _ignoreNextLuaUpdatePaths.Remove(existingScript.LuaFilePath); + } + } - private void AddMicrocontrollerXmlFile(string xmlFilePath) + private void AddVehicleXmlFile(string xmlFilePath) { - var xmlFileScripts = ScriptExtractHelper.ExtractScriptsFromMicrocontrollerXml(xmlFilePath); - foreach (var script in xmlFileScripts) + var luaScripts = ScriptExtractHelper.ExtractScriptsFromMicrocontrollerXml(xmlFilePath); + foreach (var script in luaScripts) { _luaScripts.Add(script); _xmlToLocalLuaWriteService.WriteVehicleLuaScriptToFile(script); @@ -92,6 +119,12 @@ private void AddMicrocontrollerXmlFile(string xmlFilePath) private async void LocalLuaFileChanged(object sender, FileSystemEventArgs e) { + if (_ignoreNextLuaUpdatePaths.Contains(e.FullPath)) + { + _ignoreNextLuaUpdatePaths.Remove(e.FullPath); + return; + } + var luaScript = _luaScripts.FirstOrDefault(ls => ls.LuaFilePath == e.FullPath); if (luaScript == null) return; diff --git a/src/StormworksLuaExtract/Services/LocalLuaToXmlWriteService.cs b/src/StormworksLuaExtract/Services/LocalLuaToXmlWriteService.cs index 42603e3..91dbc44 100644 --- a/src/StormworksLuaExtract/Services/LocalLuaToXmlWriteService.cs +++ b/src/StormworksLuaExtract/Services/LocalLuaToXmlWriteService.cs @@ -41,14 +41,11 @@ public void WriteScriptToMicrocontroller(LuaScript luaScript) var currentXml = FileHelper.NoTouchReadFile(luaScript.VehicleXmlPath); // Backup - var backupFilePath = Path.Join(Statics.LocalBackupDirectory, $"{luaScript.VehicleName} {DateTime.Now:yyyy-MM-dd HH-mm-ss}.xml"); - if (!FileHelper.TryWriteFile(backupFilePath, currentXml)) + if (!BackupFileHelper.BackupFile(currentXml, luaScript.VehicleName)) return; - Console.WriteLine($"Wrote backup to {backupFilePath}"); - var pattern = Statics.ObjectMatchPattern(luaScript.ObjectId); - var newXml = Regex.Replace(currentXml, pattern, "<${element} id=\"${id}\" script='" + newScript + "'>"); + var newXml = Regex.Replace(currentXml, pattern, ""); // Overwrite if (!FileHelper.TryWriteFile(luaScript.VehicleXmlPath, newXml)) diff --git a/src/StormworksLuaExtract/Services/XmlToLocalLuaWriteService.cs b/src/StormworksLuaExtract/Services/XmlToLocalLuaWriteService.cs index 0256314..f8bac9b 100644 --- a/src/StormworksLuaExtract/Services/XmlToLocalLuaWriteService.cs +++ b/src/StormworksLuaExtract/Services/XmlToLocalLuaWriteService.cs @@ -7,7 +7,7 @@ namespace StormworksLuaExtract.Services { public class XmlToLocalLuaWriteService { - public void WriteVehicleLuaScriptToFile(LuaScript luaScript) + public bool WriteVehicleLuaScriptToFile(LuaScript luaScript) { Console.WriteLine($"Extracting Lua scripts from vehicle '{luaScript.VehicleXmlPath}'"); @@ -20,21 +20,19 @@ public void WriteVehicleLuaScriptToFile(LuaScript luaScript) if (currentLocalScript == vehicleXmlScript) { Console.WriteLine($"Nothing changed for script {luaScript.ObjectId} from vehicle {luaScript.VehicleName}."); - return; + return false; } // Backup - var backupFilePath = Path.Join(Statics.LocalBackupDirectory, $"{luaScript.VehicleName}_{luaScript.ObjectId} {DateTime.Now:yyyy-MM-dd HH-mm-ss}.lua"); - if (!FileHelper.TryWriteFile(backupFilePath, currentLocalScript)) - return; - - Console.WriteLine($"Wrote backup to {backupFilePath}"); + if (!BackupFileHelper.BackupFile($"{luaScript.VehicleName}_{luaScript.ObjectId}", luaScript.VehicleName)) + return false; } - - + FileHelper.TryWriteFile(luaScript.LuaFilePath, vehicleXmlScript); Console.WriteLine($"Wrote script {luaScript.ObjectId} from vehicle {luaScript.VehicleName} to {luaScript.LuaFilePath}."); + + return true; } } }