com.guru.unity.sdk.core/Runtime/GuruRemote/Runtime/RemoteConfigModel.cs

187 lines
5.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Guru
{
[Serializable]
internal class RemoteConfigModel
{
private static float SaveInterval = 2f;
private const string SaveKey = "comr.guru.remote.model.save";
public Dictionary<string, string> configs;
public long last_modified = 0;
private float _lastSavedTime = 0;
/// <summary>
/// 创建或加载
/// </summary>
/// <returns></returns>
public static RemoteConfigModel LoadOrCreate()
{
RemoteConfigModel model = null;
if (PlayerPrefs.HasKey(SaveKey))
{
string json = LoadStringValue(SaveKey);
model = JsonParser.ToObject<RemoteConfigModel>(json);
}
if (model == null) model = new RemoteConfigModel();
return model;
}
/// <summary>
/// 默认赋值数据
/// </summary>
private Dictionary<string, string> _defConfigs;
/// <summary>
/// 加载数据
/// </summary>
/// <param name="key"></param>
/// <param name="defaultValue"></param>
/// <returns></returns>
private static string LoadStringValue(string key, string defaultValue = "")
{
if (PlayerPrefs.HasKey(key))
{
return PlayerPrefs.GetString(key, defaultValue);
}
return defaultValue;
}
/// <summary>
/// 保存数据
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
private static void SaveToPlayerPrefs(string key, string value)
{
PlayerPrefs.SetString(key, value);
}
/// <summary>
/// 初始化
/// </summary>
public RemoteConfigModel()
{
_defConfigs = new Dictionary<string, string>(20);
configs = new Dictionary<string, string>(20);
}
/// <summary>
/// 是否有数据
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool HasKey(string key) => configs.ContainsKey(key);
/// <summary>
/// 保存数据
/// </summary>
/// <param name="forceSave"></param>
public void Save(bool forceSave = false)
{
if (forceSave || (Time.realtimeSinceStartup - _lastSavedTime > SaveInterval))
{
_lastSavedTime = Time.realtimeSinceStartup;
last_modified = TimeUtil.GetCurrentTimeStamp();
SaveToPlayerPrefs(SaveKey, JsonParser.ToJson(this));
}
}
/// <summary>
/// 设置默认值
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public void SetDefaultConfig(string key, string value)
{
_defConfigs[key] = value;
if (!HasKey(key))
{
SetConfigValue(key, value);
}
}
/// <summary>
/// 设置当前值
/// </summary>
/// <param name="key"></param>
/// <param name="config"></param>
public void SetDefaultConfig<T>(string key, T config) where T : IRemoteConfig<T>
{
var json = config.ToJson();
SetDefaultConfig(key, json);
}
/// <summary>
/// 获取配置对象
/// </summary>
/// <param name="key"></param>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public T Get<T>(string key) where T : IRemoteConfig<T>
{
string json = "";
if (HasKey(key))
{
json = configs[key];
}
else if (_defConfigs.TryGetValue(key, out var defValue))
{
json = defValue;
}
if (!string.IsNullOrEmpty(json))
{
return JsonParser.ToObject<T>(json);
}
Log.E(RemoteConfigManager.Tag, $" --- Remote Key {key} has never been registered.");
return default(T);
}
/// <summary>
/// 设置对象值
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <typeparam name="T"></typeparam>
internal void SetConfigValue(string key, string value)
{
configs[key] = value;
Save();
}
/// <summary>
/// 更新所有的配置
/// </summary>
/// <param name="updates"></param>
public void UpdateConfigs(Dictionary<string, string> updates)
{
string key, value;
for (int i = 0; i < updates.Keys.Count; i++)
{
key = updates.Keys.ElementAt(i);
value = updates.Values.ElementAt(i);
if (!HasKey(key) || configs[key] != value)
{
// New Key or Value Changed
configs[key] = value;
}
}
Save(true); // 直接保存
}
}
}