This repository has been archived on 2026-01-20. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
SessionZero-Client/SessionZero/AppSettings.cs

322 lines
9.8 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using Avalonia.Media;
using Cogwheel;
namespace SessionZero;
public class AppSettings
{
public string SettingsFilePath { get; set; } = "";
public Dictionary<string, AppSetting> Settings { get; set; } = new();
public AppSetting CreateSetting(string settingName, Type settingType)
{
return new AppSetting(settingName, settingType);
}
public void AddSetting(AppSetting setting)
{
if (!Settings.TryAdd(setting.SettingName, setting))
{
COGWHEEL.LogError($"Cannot add setting: '{setting.SettingName}'. Setting already exists.");
}
}
public AppSetting? GetSetting(string settingName)
{
if (!Settings.TryGetValue(settingName, out var setting))
{
COGWHEEL.LogError($"Cannot get setting: '{settingName}'. Setting does not exist.");
return null;
}
return setting;
}
public void RemoveSetting(string settingName)
{
if (!Settings.Remove(settingName))
{
COGWHEEL.LogError($"Cannot remove setting: '{settingName}. It may not exist.");
}
}
public bool SetSettingValue<T>(string settingName, T value)
{
if (Settings.TryGetValue(settingName, out var setting))
{
return setting.SetValue(value);
}
COGWHEEL.LogError($"Cannot set setting: '{settingName}'. Setting does not exist.");
return false;
}
public bool SetSettingValue(string settingName, string value)
{
if (Settings.TryGetValue(settingName, out var setting))
{
return setting.SetValue(value);
}
COGWHEEL.LogError($"Cannot set setting: '{settingName}'. Setting does not exist.");
return false;
}
public T? GetValue<T>(string settingName)
{
if (Settings.TryGetValue(settingName, out var setting))
{
return setting.GetValue<T>();
}
return default;
}
public string GetValueAsString(string settingName)
{
if (!Settings.TryGetValue(settingName, out var setting) || setting == null)
{
COGWHEEL.LogError($"Cannot get setting '{settingName}'. Setting does not exist.");
return string.Empty;
}
var type = setting.SettingType;
try
{
var method = typeof(AppSetting).GetMethod(nameof(AppSetting.GetValue))!;
var generic = method.MakeGenericMethod(type);
var valueObj = generic.Invoke(setting, null);
if (valueObj == null)
return string.Empty;
if (type == typeof(string))
return (string)valueObj;
if (type.IsPrimitive || type.IsEnum || type == typeof(decimal))
return Convert.ToString(valueObj) ?? string.Empty;
return valueObj.ToString() ?? string.Empty;
}
catch (Exception ex)
{
COGWHEEL.LogError($"Failed to get setting '{settingName}' as string: {ex.Message}");
return string.Empty;
}
}
public void SaveToFile() {}
public void LoadFromFile() {}
}
public class AppSetting(string settingName, Type settingType)
{
public string SettingName { get; } = settingName;
public Type SettingType { get; } = settingType;
private object? _settingValue;
public T GetValue<T>()
{
if (typeof(T) != SettingType)
{
COGWHEEL.LogError($"Cannot get value of setting '{SettingName}': Setting is type '{SettingType.Name}' but GetValue was called with type '{typeof(T).Name}'.'");
}
return _settingValue is null ? default! : (T)_settingValue;
}
public bool SetValue<T>(T value)
{
if (typeof(T) != SettingType)
{
COGWHEEL.LogError($"Cannot set value of setting '{SettingName}': Setting is type '{SettingType.Name}' but SetValue was called with type '{typeof(T).Name}'.'");
return false;
}
_settingValue = value!;
return true;
}
public bool SetValue(object? value)
{
if (value == null)
{
_settingValue = null;
return true;
}
if (SettingType.IsInstanceOfType(value))
{
_settingValue = value;
return true;
}
try
{
var converted = Convert.ChangeType(value, SettingType);
_settingValue = converted;
return true;
}
catch
{
COGWHEEL.LogError($"Cannot convert value '{value}' to {SettingType.Name} for setting '{SettingName}'.");
return false;
}
}
public bool SetValue(string valueString)
{
try
{
object? parsedValue = null;
if (SettingType == typeof(string))
{
parsedValue = valueString;
}
else if (SettingType == typeof(int))
{
if (!int.TryParse(valueString, out var i))
{
COGWHEEL.LogError($"Cannot parse '{valueString}' as int for setting '{SettingName}'.");
return false;
}
parsedValue = i;
}
else if (SettingType == typeof(float))
{
if (!float.TryParse(valueString, out var f))
{
COGWHEEL.LogError($"Cannot parse '{valueString}' as float for setting '{SettingName}'.");
return false;
}
parsedValue = f;
}
else if (SettingType == typeof(bool))
{
if (!bool.TryParse(valueString, out var b))
{
COGWHEEL.LogError($"Cannot parse '{valueString}' as bool for setting '{SettingName}'.");
return false;
}
parsedValue = b;
}
else
{
COGWHEEL.LogError(
$"Unsupported setting type '{SettingType.Name}' in SetValue(string) for setting '{SettingName}'.");
return false;
}
_settingValue = parsedValue;
return true;
}
catch (Exception ex)
{
COGWHEEL.LogError($"Failed to set setting '{SettingName}' to '{valueString}': {ex.Message}");
return false;
}
}
}
static class AppSettingsCommands
{
[Command(Name = "setsetting")]
public static void SetSetting(string settingName, string value)
{
if (AppManager.Settings.SetSettingValue(settingName, value))
{
COGWHEEL.Log($"Setting '{settingName}' set to '{value}'.");
}
}
[Command(Name = "getsetting")]
public static void GetSetting(string settingName)
{
var value = AppManager.Settings.GetValueAsString(settingName);
COGWHEEL.Log($"Setting '{settingName}' value is: ({AppManager.Settings.GetSetting(settingName)?.SettingType.Name}){value}.");
}
[Command(Name = "listsettings")]
public static void ListSettings(string settingName = "")
{
var outputString = $"-- Settings --\n";
if (string.IsNullOrEmpty(settingName))
{
foreach (var setting in AppManager.Settings.Settings)
{
outputString +=
$"{setting.Value.SettingName}: {setting.Value.SettingType.Name} = {AppManager.Settings.GetValueAsString(setting.Key)}\n";
}
AppManager.ConsoleControl.Log(outputString, Colors.CadetBlue);
}
else
{
COGWHEEL.LogWarning($"Searching for settings is not implemented yet.");
}
}
// TODO: Go update Cogwheel to accept array arguments somehow
// [Command(Name = "setting")]
// public static void SettingCommand(string[] args)
// {
// if (args.Length == 0)
// {
// COGWHEEL.LogError("No arguments supplied. Usage: 'setting <action>'");
// }
//
// var action = args[0];
// List<string> actionArgs = new();
// for (int i = 1; i < args.Length; i++)
// {
// actionArgs.Add(args[i]);
// }
//
// switch (action)
// {
// case "set":
// if (actionArgs.Count == 2)
// {
// var settingName = args[0];
// var settingValue = args[1];
//
// if (AppManager.Settings.SetSettingValue(settingName, settingValue))
// {
// COGWHEEL.Log($"Setting '{settingName}' successfully set to '{settingValue}'.");
// }
// }
// else
// {
// COGWHEEL.LogError($"Invalid number of arguments for '{action}'. Usage: 'setting set <settingName> <settingValue>'");
// }
// break;
// case "get":
// if (actionArgs.Count == 1)
// {
// var val = AppManager.Settings.GetValueAsString(args[0]);
// COGWHEEL.Log($"Value of Setting '{args[0]}' is '{val}'.");
// }
// else
// {
// COGWHEEL.LogError($"Invalid number of arguments for '{action}'. Usage: 'setting get <settingName>'");
// }
// break;
// case "add":
// break;
// case "remove":
// break;
// default:
// COGWHEEL.LogError($"Unknown argument '{action}' for 'setting' command. Options are 'set, get, add, remove'.");
// break;
// }
// }
}