示例#1
0
        public void WriteScriptToMicrocontroller(LuaScript luaScript)
        {
            Console.WriteLine($"Local lua file '{luaScript.LuaFileName}' object ID {luaScript.ObjectId} script changed.");

            if (!File.Exists(luaScript.VehicleXmlPath))
            {
                Console.WriteLine($"Target vehicle file '{luaScript.VehicleXmlPath}' not found.");
                return;
            }

            var processedScript = ProcessScript(luaScript);

            if (processedScript == null)
            {
                return;
            }

            if (!FileHelper.TryWriteFile(luaScript.MinifiedLuaPath, processedScript))
            {
                return;
            }

            var currentScript = ScriptExtractHelper.GetScriptFromXmlFile(luaScript.VehicleXmlPath, luaScript.ObjectId);

            if (currentScript == null)
            {
                Console.WriteLine($"Failed to find the Lua object with ID {luaScript.ObjectId} in vehicle file '{luaScript.VehicleXmlPath}'.");
                return;
            }

            if (currentScript == processedScript)
            {
                Console.WriteLine($"Script {luaScript.ObjectId} hasn't changed compared to the vehicle XML.");
                return;
            }

            var currentXml = FileHelper.NoTouchReadFile(luaScript.VehicleXmlPath);

            // Backup
            if (!BackupFileHelper.BackupFile(currentXml, luaScript.VehicleXmlFileName))
            {
                return;
            }

            processedScript = WebUtility.HtmlEncode(processedScript);

            var pattern = Statics.ObjectMatchPattern(luaScript.ObjectId);
            var newXml  = Regex.Replace(currentXml, pattern, "<object id=\"${id}\" script='" + processedScript + "'>");

            // Overwrite
            if (!FileHelper.TryWriteFile(luaScript.VehicleXmlPath, newXml))
            {
                return;
            }

            Console.WriteLine($"Updated vehicle {luaScript.VehicleName} XML with new script with ID {luaScript.ObjectId}.");
        }
        private void AddVehicleXmlFile(string xmlFilePath)
        {
            var luaScripts = ScriptExtractHelper.ExtractScriptsFromMicrocontrollerXml(xmlFilePath);

            foreach (var script in luaScripts)
            {
                _luaScripts.Add(script);
                _xmlToLocalLuaWriteService.WriteVehicleLuaScriptToFile(script);
            }
        }
        private void VehicleChanged(string xmlfilepath)
        {
            if (xmlfilepath == _ignoreNextVehicleUpdatePath)
            {
                _ignoreNextVehicleUpdatePath = null;
                return;
            }

            var savedVehicleScripts = ScriptExtractHelper.ExtractScriptsFromMicrocontrollerXml(xmlfilepath).ToList();

            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))
                {
                    continue;
                }

                File.Delete(deletedScript.LuaFilePath);
                File.Delete(deletedScript.MinifiedLuaPath);
            }

            foreach (var existingScript in previouslyExtractedScripts.Except(deletedScripts))
            {
                _ignoreNextLuaUpdatePaths.Add(existingScript.LuaFilePath);
                if (!_xmlToLocalLuaWriteService.WriteVehicleLuaScriptToFile(existingScript))
                {
                    _ignoreNextLuaUpdatePaths.Remove(existingScript.LuaFilePath);
                }
            }
        }
        public bool WriteVehicleLuaScriptToFile(LuaScript luaScript)
        {
            Console.WriteLine($"Extracting Lua scripts from vehicle '{luaScript.VehicleName}'");

            var vehicleXmlScript = ScriptExtractHelper.GetScriptFromXmlFile(luaScript.VehicleXmlPath, luaScript.ObjectId);
            var isMinifiedScript = vehicleXmlScript.EndsWith(Constants.MinifiedScriptSuffix);

            if (File.Exists(luaScript.LuaFilePath))
            {
                var currentLocalScript = FileHelper.NoTouchReadFile(isMinifiedScript ? luaScript.MinifiedLuaPath : luaScript.LuaFilePath);

                if (currentLocalScript == vehicleXmlScript)
                {
                    Console.WriteLine($"Nothing changed for script {luaScript.ObjectId} from vehicle {luaScript.VehicleName}.");
                    return(false);
                }

                if (isMinifiedScript)
                {
                    ConsoleHelper.WriteWarning($"Script {luaScript.ObjectId} in microcontroller {luaScript.MicrocontrollerName} in vehicle {luaScript.VehicleName} was changed, but it's a minified script. Not updating local file.");
                    return(false);
                }

                // Backup
                if (!BackupFileHelper.BackupFile(currentLocalScript, luaScript.MinifiedLuaFileName))
                {
                    return(false);
                }
            }

            Directory.CreateDirectory(Path.GetDirectoryName(luaScript.LuaFilePath));

            FileHelper.TryWriteFile(luaScript.LuaFilePath, vehicleXmlScript);
            FileHelper.TryWriteFile(luaScript.MinifiedLuaPath, vehicleXmlScript);

            Console.WriteLine($"Wrote script {luaScript.ObjectId} from vehicle {luaScript.VehicleName} to {luaScript.LuaFileName}.");

            return(true);
        }