chip-game/Assets/Scripts/Server/SettingsApplier.cs
_sega a8b26773e8 FEAT: Рилтайм обновление настроек на сайте
1. Настройки на сайте обновляются без кнопки отправить
2. Добавлена кнопка для начисления монет через сайт(пока заглушка)
2026-01-28 13:05:48 +03:00

103 lines
3.5 KiB
C#

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<string, string> keyValuePairs,
bool assumeMissingBoolOff
)
{
List<Setting> 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<Setting> 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<string> FalseBoolSettingIds(List<Setting> settings, List<string> entry)
{
var missing = new List<string>();
foreach (Setting setting in settings)
{
if (entry.Contains(setting.Id)) continue;
missing.Add(setting.Id);
}
var boolIds = new List<string>();
foreach (string id in missing)
{
var searchResult = GetSettingById(id, settings);
if (searchResult.found && searchResult.setting.Type == SettingType.Bool)
boolIds.Add(id);
}
return boolIds;
}
}