sea-battle-vr/Assets/Scripts/Settings/SettingsManager.cs

168 lines
5.4 KiB
C#

using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
using UnityEngine.Events;
public class SettingsManager : MonoBehaviour
{
public static SettingsManager instance;
private static string SETTINGS_FILE_PATH => Path.Combine(Application.persistentDataPath, "GameSettings.json");
public static SettingsContainer Container;
public static UnityEvent OnSettingsChanged;
public static void Initialize() //добавить инициализацию в менеджера в парвильное место в порядке
{
OnSettingsChanged = new UnityEvent();
Container = LoadContainerAuto();
OnSettingsChanged?.Invoke();
}
public static void ChangeSetting(Setting setting, int direction)
{
bool changed = setting.ChangeValue(direction);
if (changed)
{
SaveContainerToFile();
OnSettingsChanged?.Invoke();
}
}
//Геттеры возможно будут статикой
public static bool GetBool(string id, bool _default)
{
var setting = Container.TryGetSetting(id);
if (setting != null)
{
if (setting.Type != Setting.SettingType.Bool) Debug.LogWarning($"Тип настройки {id} не соответсвует bool");
return setting.BoolValue;
}
else
{
return _default;
}
}
public static int GetInt(string id, int _default)
{
var setting = Container.TryGetSetting(id);
if (setting != null)
{
if (setting.Type != Setting.SettingType.Int) Debug.LogWarning($"Тип настройки {id} не соответсвует int");
return setting.IntValue;
}
else
{
return _default;
}
}
public static float GetFloat(string id, float _default)
{
var setting = Container.TryGetSetting(id);
if (setting != null)
{
if (setting.Type != Setting.SettingType.Float) Debug.LogWarning($"Тип настройки {id} не соответсвует float");
return setting.FloatValue;
}
else
{
return _default;
}
}
public static string GetString(string id, string _default)
{
var setting = Container.TryGetSetting(id);
if (setting != null)
{
if (setting.Type != Setting.SettingType.String) Debug.LogWarning($"Тип настройки {id} не соответсвует string");
return setting.StringValue;
}
else
{
return _default;
}
}
private static string GetSettingsHash(List<Setting> settings)
{
StringBuilder sb = new();
foreach (Setting setting in settings)
{
sb.Append(setting.Id);
sb.Append(setting.Alias);
//sb.Append(setting.Group);
sb.Append(setting.Type);
}
byte[] inputBytes = Encoding.UTF8.GetBytes(sb.ToString());
using MD5 md5 = MD5.Create();
byte[] hashBytes = md5.ComputeHash(inputBytes);
return Encoding.UTF8.GetString(hashBytes);
}
public static void SaveContainerToFile()
{
SettingDataWrapper dataWrapper = new SettingDataWrapper(Container.Settings);
string json = JsonUtility.ToJson(dataWrapper);
string jsonEnc = CryptoUtil.EncryptJson(json, "RR_SeTtInGs");
File.WriteAllText(SETTINGS_FILE_PATH, jsonEnc);
}
private static void SaveContainerToFile(SettingsContainer container)
{
SettingDataWrapper dataWrapper = new SettingDataWrapper(container.Settings);
string json = JsonUtility.ToJson(dataWrapper, true);
string jsonEnc = CryptoUtil.EncryptJson(json, "RR_SeTtInGs");
File.WriteAllText(SETTINGS_FILE_PATH, jsonEnc);
}
//private static SettingsContainer GetContainerFromDefault()
//{
// SettingsContainer container = new SettingsContainer(GetDefaultSettings());
// SaveContainerToFile(container);
// return container;
//}
private static SettingsContainer GetContainerFromFile()
{
string jsonEnc = File.ReadAllText(SETTINGS_FILE_PATH);
string json = CryptoUtil.DecryptJson(jsonEnc, "RR_SeTtInGs");
SettingDataWrapper dataWrapper = JsonUtility.FromJson<SettingDataWrapper>(json);
SettingsContainer container = new SettingsContainer(dataWrapper);
return container;
}
private static SettingsContainer LoadContainerAuto()
{
bool shouldLoadDefault = !SettingsFileExists() || !IsSavedSettingsValid();
//return shouldLoadDefault ? GetContainerFromDefault() : GetContainerFromFile();
return GetContainerFromFile();
}
private static bool SettingsFileExists()
{
if (!File.Exists(SETTINGS_FILE_PATH))
{
Debug.LogWarning($"Файл не найден по пути: {SETTINGS_FILE_PATH}");
return false;
}
return true;
}
private static bool IsSavedSettingsValid()
{
string savedHash = GetSettingsHash(GetContainerFromFile().Settings);
//string defaultHash = GetSettingsHash(GetDefaultSettings());
string defaultHash = "asd";
bool valid = string.Equals(savedHash, defaultHash);
return valid;
}
}