using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Linq; using UnityEngine; public static class SettingsApplier { public static (bool OK, string log) ApplySettings( Dictionary keyValuePairs, bool assumeMissingBoolOff ) { List settings = SettingsManager.Container.Settings; foreach (var kv in keyValuePairs) { var searchResult = GetSettingById(kv.Key, settings); if (searchResult.found) InjectNewValueToSetting(kv.Value, searchResult.setting); } // ВАЖНО: // - true: старое поведение для submit формы — то чего нет в POST, считаем false. // - false: новое поведение для realtime — ничего не трогаем кроме пришедшего id. if (assumeMissingBoolOff) { foreach (string id in FalseBoolSettingIds(settings, keyValuePairs.Keys.ToList())) { InjectNewValueToSetting("off", GetSettingById(id, settings).setting); } } return (OK: true, log: ""); } private static (bool found, Setting setting) GetSettingById(string settingId, List settings) { Setting setting = settings.Find(s => s.Id == settingId); if (setting != null) return (found: true, setting); else return (found: false, setting); } private static void InjectNewValueToSetting(string newValue, Setting setting) { if (setting == null) return; if (setting.Type == SettingType.String) { if (setting.AllowedValues.Contains(newValue)) setting.StringValue = newValue; else Debug.Log($"{setting.Id}: недопустимое значение \"{newValue}\""); } else if (setting.Type == SettingType.Float) { if (!float.TryParse(newValue, NumberStyles.Float, CultureInfo.InvariantCulture, out float value)) { Debug.Log($"{setting.Id}: ошибка парсинга float \"{newValue}\""); return; } if (value <= setting.FloatMax && value >= setting.FloatMin) setting.FloatValue = value; else Debug.Log($"{setting.Id}: float вне диапазона \"{newValue}\""); } else if (setting.Type == SettingType.Bool) { setting.BoolValue = (newValue == "on" || newValue == "true" || newValue == "1"); } else if (setting.Type == SettingType.Int) { if (int.TryParse(newValue, out int iv)) setting.IntValue = iv; else Debug.Log($"{setting.Id}: ошибка парсинга int \"{newValue}\""); } } private static List FalseBoolSettingIds(List settings, List entry) { var missing = new List(); foreach (Setting setting in settings) { if (entry.Contains(setting.Id)) continue; missing.Add(setting.Id); } var boolIds = new List(); foreach (string id in missing) { var searchResult = GetSettingById(id, settings); if (searchResult.found && searchResult.setting.Type == SettingType.Bool) boolIds.Add(id); } return boolIds; } }