From e43cf8877f8f0a478884e1ffa1ea702b59e861d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Sackers?= Date: Sat, 18 May 2019 14:02:53 +0200 Subject: [PATCH] WIP - Bi-directional Lua Update --- .../Helpers/ScriptExtractHelper.cs | 29 ++++++++++----- src/StormworksLuaExtract/Models/LuaScript.cs | 13 +++---- src/StormworksLuaExtract/Models/Statics.cs | 2 +- src/StormworksLuaExtract/Program.cs | 2 +- .../Services/ApplicationService.cs | 36 +++++++++++++------ .../Services/LocalLuaToXmlWriteService.cs | 23 ++++++------ ...atchService.cs => VehiclesWatchService.cs} | 17 +++++++-- .../Services/XmlToLocalLuaWriteService.cs | 22 ++++++------ 8 files changed, 89 insertions(+), 55 deletions(-) rename src/StormworksLuaExtract/Services/{MicrocontrollersWatchService.cs => VehiclesWatchService.cs} (64%) diff --git a/src/StormworksLuaExtract/Helpers/ScriptExtractHelper.cs b/src/StormworksLuaExtract/Helpers/ScriptExtractHelper.cs index 2d874cd..9cb6f43 100644 --- a/src/StormworksLuaExtract/Helpers/ScriptExtractHelper.cs +++ b/src/StormworksLuaExtract/Helpers/ScriptExtractHelper.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Net; using System.Text.RegularExpressions; using StormworksLuaExtract.Models; @@ -23,18 +24,28 @@ public static IEnumerable ExtractScriptsFromMicrocontrollerXml(string var matches = Regex.Matches(xml, Statics.ObjectMatchPattern()); foreach (Match match in matches) { - var element = match.Groups["element"].Value; - - // The script is printed twice in the XML, once under a ().AsSelf(); - builder.RegisterType().AsSelf(); + builder.RegisterType().AsSelf(); builder.RegisterType().AsSelf(); builder.RegisterType().AsSelf(); diff --git a/src/StormworksLuaExtract/Services/ApplicationService.cs b/src/StormworksLuaExtract/Services/ApplicationService.cs index 42830c1..22b7fac 100644 --- a/src/StormworksLuaExtract/Services/ApplicationService.cs +++ b/src/StormworksLuaExtract/Services/ApplicationService.cs @@ -10,26 +10,29 @@ namespace StormworksLuaExtract.Services { public class ApplicationService { - private readonly MicrocontrollersWatchService _microcontrollersWatchService; + private readonly VehiclesWatchService _vehiclesWatchService; private readonly LocalLuaToXmlWriteService _localLuaToXmlWriteService; private readonly XmlToLocalLuaWriteService _xmlToLocalLuaWriteService; private readonly List _luaScripts = new List(); + private string _ignoreNextVehicleUpdatePath; + public ApplicationService( - MicrocontrollersWatchService microcontrollersWatchService, + VehiclesWatchService vehiclesWatchService, LocalLuaToXmlWriteService localLuaToXmlWriteService, XmlToLocalLuaWriteService xmlToLocalLuaWriteService) { - _microcontrollersWatchService = microcontrollersWatchService; + _vehiclesWatchService = vehiclesWatchService; _localLuaToXmlWriteService = localLuaToXmlWriteService; _xmlToLocalLuaWriteService = xmlToLocalLuaWriteService; - _microcontrollersWatchService.MicrocontrollerAdded += MicrocontrollerAdded; - _microcontrollersWatchService.MicrocontrollerDeleted += MicrocontrollerDeleted; + _vehiclesWatchService.MicrocontrollerAdded += VehicleAdded; + _vehiclesWatchService.MicrocontrollerDeleted += VehicleDeleted; + _vehiclesWatchService.MicrocontrollerChanged += VehicleChanged; } public void Run() { - _microcontrollersWatchService.StartWatching(); + _vehiclesWatchService.StartWatching(); if (!Directory.Exists(Statics.MicrocontrollerPath)) { @@ -60,11 +63,22 @@ private void WriteExistingMicrocontrollerScripts() AddMicrocontrollerXmlFile(xmlFilePath); } - private void MicrocontrollerAdded(string xmlfilepath) => + private void VehicleAdded(string xmlfilepath) => AddMicrocontrollerXmlFile(xmlfilepath); - private void MicrocontrollerDeleted(string xmlfilepath) => - _luaScripts.Where(s => s.MicrocontrollerXmlPath == xmlfilepath).ToList().ForEach(s => _luaScripts.Remove(s)); + private void VehicleChanged(string xmlfilepath) + { + if (xmlfilepath == _ignoreNextVehicleUpdatePath) + { + _ignoreNextVehicleUpdatePath = null; + return; + } + + _luaScripts.Where(s => s.VehicleXmlPath == xmlfilepath).ToList().ForEach(s => _xmlToLocalLuaWriteService.WriteVehicleLuaScriptToFile(s)); + } + + private void VehicleDeleted(string xmlfilepath) => + _luaScripts.Where(s => s.VehicleXmlPath == xmlfilepath).ToList().ForEach(s => _luaScripts.Remove(s)); private void AddMicrocontrollerXmlFile(string xmlFilePath) { @@ -72,7 +86,7 @@ private void AddMicrocontrollerXmlFile(string xmlFilePath) foreach (var script in xmlFileScripts) { _luaScripts.Add(script); - _xmlToLocalLuaWriteService.WriteMicrocontrollerLuaScriptsToFiles(script); + _xmlToLocalLuaWriteService.WriteVehicleLuaScriptToFile(script); } } @@ -86,6 +100,8 @@ private async void LocalLuaFileChanged(object sender, FileSystemEventArgs e) Console.WriteLine($"Lua file '{e.Name}' changed."); + _ignoreNextVehicleUpdatePath = luaScript.VehicleXmlPath; + _localLuaToXmlWriteService.WriteScriptToMicrocontroller(luaScript); } } diff --git a/src/StormworksLuaExtract/Services/LocalLuaToXmlWriteService.cs b/src/StormworksLuaExtract/Services/LocalLuaToXmlWriteService.cs index 29d9926..42603e3 100644 --- a/src/StormworksLuaExtract/Services/LocalLuaToXmlWriteService.cs +++ b/src/StormworksLuaExtract/Services/LocalLuaToXmlWriteService.cs @@ -1,6 +1,5 @@ using System; using System.IO; -using System.Linq; using System.Net; using System.Text.RegularExpressions; using StormworksLuaExtract.Helpers; @@ -14,9 +13,9 @@ public void WriteScriptToMicrocontroller(LuaScript luaScript) { Console.WriteLine($"Local lua file '{luaScript.LuaFilePath}' object ID {luaScript.ObjectId} script changed."); - if (!File.Exists(luaScript.MicrocontrollerXmlPath)) + if (!File.Exists(luaScript.VehicleXmlPath)) { - Console.WriteLine($"Target microprocessor file '{luaScript.MicrocontrollerXmlPath}' not found."); + Console.WriteLine($"Target vehicle file '{luaScript.VehicleXmlPath}' not found."); return; } @@ -26,25 +25,23 @@ public void WriteScriptToMicrocontroller(LuaScript luaScript) newScript = WebUtility.HtmlEncode(newScript); - var currentScripts = ScriptExtractHelper.ExtractScriptsFromMicrocontrollerXml(luaScript.MicrocontrollerXmlPath).ToList(); - var currentScript = currentScripts.FirstOrDefault(s => s.ObjectId == luaScript.ObjectId); - + var currentScript = ScriptExtractHelper.GetScriptFromXmlFile(luaScript.VehicleXmlPath, luaScript.ObjectId); if (currentScript == null) { - Console.WriteLine($"Failed to find the Lua object with ID {luaScript.ObjectId} in microprocessor file '{luaScript.MicrocontrollerXmlPath}'."); + Console.WriteLine($"Failed to find the Lua object with ID {luaScript.ObjectId} in vehicle file '{luaScript.VehicleXmlPath}'."); return; } - if (currentScript.Script == newScript) + if (currentScript == newScript) { - Console.WriteLine($"Script {luaScript.ObjectId} hasn't changed compared to the microcontroller XML."); + Console.WriteLine($"Script {luaScript.ObjectId} hasn't changed compared to the vehicle XML."); return; } - var currentXml = FileHelper.NoTouchReadFile(luaScript.MicrocontrollerXmlPath); + var currentXml = FileHelper.NoTouchReadFile(luaScript.VehicleXmlPath); // Backup - var backupFilePath = Path.Join(Statics.LocalBackupDirectory, $"{luaScript.MicrocontrollerName} {DateTime.Now:yyyy-MM-dd HH-mm-ss}.xml"); + var backupFilePath = Path.Join(Statics.LocalBackupDirectory, $"{luaScript.VehicleName} {DateTime.Now:yyyy-MM-dd HH-mm-ss}.xml"); if (!FileHelper.TryWriteFile(backupFilePath, currentXml)) return; @@ -54,10 +51,10 @@ public void WriteScriptToMicrocontroller(LuaScript luaScript) var newXml = Regex.Replace(currentXml, pattern, "<${element} id=\"${id}\" script='" + newScript + "'>"); // Overwrite - if (!FileHelper.TryWriteFile(luaScript.MicrocontrollerXmlPath, newXml)) + if (!FileHelper.TryWriteFile(luaScript.VehicleXmlPath, newXml)) return; - Console.WriteLine($"Updated microcontroller {luaScript.MicrocontrollerName} XML with new script with ID {luaScript.ObjectId}."); + Console.WriteLine($"Updated vehicle {luaScript.VehicleName} XML with new script with ID {luaScript.ObjectId}."); } } } diff --git a/src/StormworksLuaExtract/Services/MicrocontrollersWatchService.cs b/src/StormworksLuaExtract/Services/VehiclesWatchService.cs similarity index 64% rename from src/StormworksLuaExtract/Services/MicrocontrollersWatchService.cs rename to src/StormworksLuaExtract/Services/VehiclesWatchService.cs index 3c4c849..0dd0925 100644 --- a/src/StormworksLuaExtract/Services/MicrocontrollersWatchService.cs +++ b/src/StormworksLuaExtract/Services/VehiclesWatchService.cs @@ -6,17 +6,19 @@ namespace StormworksLuaExtract.Services { - public class MicrocontrollersWatchService + public class VehiclesWatchService { public delegate void MicrocontrollerChangedHandler(string xmlFilePath); public event MicrocontrollerChangedHandler MicrocontrollerAdded; public event MicrocontrollerChangedHandler MicrocontrollerDeleted; + public event MicrocontrollerChangedHandler MicrocontrollerChanged; public void StartWatching() { var processorsXmlWatcher = new BufferedFileSystemWatcher(Statics.MicrocontrollerPath, "*.xml"); processorsXmlWatcher.Created += MicrocontrollerXmlFileAdded; + processorsXmlWatcher.Changed += MicrocontrollerXmlFileChanged; processorsXmlWatcher.Deleted += MicrocontrollerXmlFileDeleted; } @@ -24,14 +26,23 @@ private async void MicrocontrollerXmlFileAdded(object sender, FileSystemEventArg { await Task.Delay(Constants.ReadWriteTimeoutInMilliseconds); - Console.WriteLine($"Microcontroller XML file created: {e.Name}"); + Console.WriteLine($"Vehicle XML file created: {e.Name}"); MicrocontrollerAdded?.Invoke(e.FullPath); } + private async void MicrocontrollerXmlFileChanged(object sender, FileSystemEventArgs e) + { + await Task.Delay(Constants.ReadWriteTimeoutInMilliseconds); + + Console.WriteLine($"Microcontroller XML file changed: {e.Name}"); + + MicrocontrollerChanged?.Invoke(e.FullPath); + } + private void MicrocontrollerXmlFileDeleted(object sender, FileSystemEventArgs e) { - Console.WriteLine($"Microcontroller XML file deleted: {e.Name}"); + Console.WriteLine($"Vehicle XML file deleted: {e.Name}"); MicrocontrollerDeleted?.Invoke(e.FullPath); } diff --git a/src/StormworksLuaExtract/Services/XmlToLocalLuaWriteService.cs b/src/StormworksLuaExtract/Services/XmlToLocalLuaWriteService.cs index e305b73..0256314 100644 --- a/src/StormworksLuaExtract/Services/XmlToLocalLuaWriteService.cs +++ b/src/StormworksLuaExtract/Services/XmlToLocalLuaWriteService.cs @@ -7,32 +7,34 @@ namespace StormworksLuaExtract.Services { public class XmlToLocalLuaWriteService { - public void WriteMicrocontrollerLuaScriptsToFiles(LuaScript luaScript) + public void WriteVehicleLuaScriptToFile(LuaScript luaScript) { - Console.WriteLine($"Extracting Lua scripts from microcontroller '{luaScript.MicrocontrollerXmlPath}'"); - + Console.WriteLine($"Extracting Lua scripts from vehicle '{luaScript.VehicleXmlPath}'"); + + var vehicleXmlScript = ScriptExtractHelper.GetScriptFromXmlFile(luaScript.VehicleXmlPath, luaScript.ObjectId); + if (File.Exists(luaScript.LuaFilePath)) { - var currentScript = FileHelper.NoTouchReadFile(luaScript.LuaFilePath); + var currentLocalScript = FileHelper.NoTouchReadFile(luaScript.LuaFilePath); - if (currentScript == luaScript.Script) + if (currentLocalScript == vehicleXmlScript) { - Console.WriteLine($"Nothing changed for script {luaScript.ObjectId} from microcontroller {luaScript.MicrocontrollerName}."); + Console.WriteLine($"Nothing changed for script {luaScript.ObjectId} from vehicle {luaScript.VehicleName}."); return; } // Backup - var backupFilePath = Path.Join(Statics.LocalBackupDirectory, $"{luaScript.MicrocontrollerName}_{luaScript.ObjectId} {DateTime.Now:yyyy-MM-dd HH-mm-ss}.lua"); - if (!FileHelper.TryWriteFile(backupFilePath, currentScript)) + 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}"); } - FileHelper.TryWriteFile(luaScript.LuaFilePath, luaScript.Script); + FileHelper.TryWriteFile(luaScript.LuaFilePath, vehicleXmlScript); - Console.WriteLine($"Wrote script {luaScript.ObjectId} from microcontroller {luaScript.MicrocontrollerName} to {luaScript.LuaFilePath}."); + Console.WriteLine($"Wrote script {luaScript.ObjectId} from vehicle {luaScript.VehicleName} to {luaScript.LuaFilePath}."); } } }