This commit is contained in:
2022-06-05 13:21:46 +03:00
parent 690b7fe5f1
commit 4fbea983da
9 changed files with 97 additions and 124 deletions

View File

@@ -1,86 +1,76 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using PluginManager.Others;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace PluginManager
{
internal class AppConfig
{
public Dictionary<string, string> ApplicationVariables { get; set; }
public List<string> ProtectedKeyWords { get; set; }
}
public static class Config
{
private static readonly Dictionary<string, string> ApplicationVariables = new();
private static readonly List<string> ConstantTokens = new() { "token" };
private static AppConfig appConfig = null;
public static void AppendToDictionary(Dictionary<string, string> dictionary)
public static bool AddValueToVariables(string key, string value, bool isReadOnly)
{
foreach (var kvp in dictionary) ApplicationVariables.TryAdd(kvp.Key, kvp.Value);
}
public static bool AddValueToVariables(string key, string value, bool constant)
{
bool req = AddValueToVariables(key, value);
if (constant) ConstantTokens.Add(key);
return req;
}
public static bool AddValueToVariables(string key, string value)
{
if (ApplicationVariables.ContainsKey(key))
{
return false;
}
ApplicationVariables.Add(key, value);
if (appConfig.ApplicationVariables.ContainsKey(key)) return false;
appConfig.ApplicationVariables.Add(key, value);
if (isReadOnly) appConfig.ProtectedKeyWords.Add(key);
SaveConfig();
return true;
}
public static string? GetValue(string key)
{
if (!ApplicationVariables.ContainsKey(key))
{
if (key != "token") Console.WriteLine("The key is not present in the dictionary");
return null;
}
return ApplicationVariables[key];
if (!appConfig.ApplicationVariables.ContainsKey(key)) return null;
return appConfig.ApplicationVariables[key];
}
public static bool SetValue(string key, string value)
{
if (!ApplicationVariables.ContainsKey(key)) return false;
if (ConstantTokens.Contains(key)) return false;
ApplicationVariables[key] = value;
if (!appConfig.ApplicationVariables.ContainsKey(key)) return false;
if (appConfig.ProtectedKeyWords.Contains(key)) return false;
appConfig.ApplicationVariables[key] = value;
SaveConfig();
return true;
}
public static bool RemoveKey(string key)
{
if (ConstantTokens.Contains(key)) return false;
ApplicationVariables.Remove(key);
appConfig.ApplicationVariables.Remove(key);
appConfig.ProtectedKeyWords.Remove(key);
return true;
}
public static async void SaveDictionary()
public static async void SaveConfig()
{
string path = Functions.dataFolder + "var.dat";
await Functions.SaveToJsonFile(path, ApplicationVariables);
await Functions.SaveToJsonFile<AppConfig>(path, appConfig);
}
public static async void LoadDictionary()
public static async Task LoadConfig()
{
string path = Functions.dataFolder + "var.dat";
var d = await Functions.ConvertFromJson<Dictionary<string, string>>(path);
ApplicationVariables.Clear();
AppendToDictionary(d);
if (File.Exists(path))
{
appConfig = await Functions.ConvertFromJson<AppConfig>(path);
Functions.WriteLogFile($"Loaded {appConfig.ApplicationVariables.Keys.Count} application variables.\nLoaded {appConfig.ProtectedKeyWords.Count} readonly variables.");
//Console.WriteLine($"Loaded {appConfig.ApplicationVariables.Count} application variables !");
}
else
appConfig = new() { ApplicationVariables = new Dictionary<string, string>(), ProtectedKeyWords = new List<string>() };
}
public static string GetKey(string value) => ApplicationVariables.Keys.FirstOrDefault(x => ApplicationVariables[x] == value);
public static bool ContainsValue(string value) => ApplicationVariables.ContainsValue(value);
public static bool ContainsKey(string key) => ApplicationVariables.ContainsKey(key);
public static string? GetKey(string value) => appConfig.ApplicationVariables.Keys.FirstOrDefault(x => appConfig.ApplicationVariables[x] == value);
public static bool ContainsValue(string value) => appConfig.ApplicationVariables.ContainsValue(value);
public static bool ContainsKey(string key) => appConfig.ApplicationVariables.ContainsKey(key);
public static Dictionary<string, string> GetAllVariables() => new Dictionary<string, string>(appConfig.ApplicationVariables);
}
}

View File

@@ -203,12 +203,12 @@ namespace PluginManager.Items
if (args.Length < 3) return;
string in1 = args[1];
if (!Config.ContainsKey(in1))
Config.AddValueToVariables(in1, Functions.MergeStrings(args, 2));
Config.AddValueToVariables(in1, Functions.MergeStrings(args, 2), false);
else
Config.SetValue(in1, Functions.MergeStrings(args, 2));
Console.WriteLine($"Updated config file with the following command: {in1} => {Config.GetValue(in1)}");
Config.SaveDictionary();
Config.SaveConfig();
}
);
@@ -216,7 +216,20 @@ namespace PluginManager.Items
{
if (args.Length < 2) return;
Config.RemoveKey(args[1]);
Config.SaveDictionary();
Config.SaveConfig();
}
);
AddCommand("vars", "Display all variables", () =>
{
var d = Config.GetAllVariables();
List<string[]> data = new List<string[]>();
data.Add(new string[] { "-", "-" });
data.Add(new string[] { "Key", "Value" });
data.Add(new string[] { "-", "-" });
foreach (var kvp in d) data.Add(new string[] { kvp.Key, kvp.Value });
data.Add(new string[] { "-", "-" });
Console_Utilities.FormatAndAlignTable(data);
}
);
@@ -224,7 +237,7 @@ namespace PluginManager.Items
{
await client.StopAsync();
await client.DisposeAsync();
Config.SaveDictionary();
Config.SaveConfig();
Environment.Exit(0);
}
);

View File

@@ -71,9 +71,9 @@ namespace PluginManager.Others
/// <param name="data">The List of arrays of strings that represent the rows.</param>
public static void FormatAndAlignTable(List<string[]> data)
{
char tableLine = '-';
char tableLine = '-';
char tableCross = '+';
char tableWall = '|';
char tableWall = '|';
int[] len = new int[data[0].Length];
foreach (var line in data)

View File

@@ -97,31 +97,6 @@ namespace PluginManager.Others
File.AppendAllText(errPath, ErrMessage + " \n");
}
/// <summary>
/// Write to settings file
/// </summary>
/// <param name="file">The settings file path</param>
/// <param name="Code">The Key value of the setting</param>
/// <param name="newValue">The new value of the settings</param>
/// <param name="separator">The separator between the key and the value</param>
public static void WriteToSettings(string file, string Code, string newValue, char separator)
{
string[] lines = File.ReadAllLines(file);
File.Delete(file);
bool ok = false;
foreach (var line in lines)
if (line.StartsWith(Code))
{
File.AppendAllText(file, Code + separator + newValue + "\n");
ok = true;
}
else
File.AppendAllText(file, line + "\n");
if (!ok) File.AppendAllText(file, Code + separator + newValue + "\n");
}
/// <summary>
/// Merge one array of strings into one string
/// </summary>
@@ -161,29 +136,6 @@ namespace PluginManager.Others
return command.Arguments;
}
/// <summary>
/// Write setting
/// </summary>
/// <param name="SettingName">The full path to the setting</param>
/// <param name="NewValue">The new Value</param>
public static void WriteToSettingsFast(string SettingName, string NewValue)
{
string path = dataFolder; // Resources/
string[] args = SettingName.Split('.');
int len = args.Length;
if (len < 2) return;
for (int i = 0; i < len - 2; i++) path += args[i] + "/";
path += args[len - 2] + ".txt";
WriteToSettings(path, args[len - 1].Replace('_', ' '), NewValue, '=');
}
/// <summary>
/// Copy one Stream to another <see langword="async"/>
/// </summary>
@@ -253,6 +205,11 @@ namespace PluginManager.Others
}
/// <summary>
/// Convert Bytes to highest measurement unit possible
/// </summary>
/// <param name="bytes">The amount of bytes</param>
/// <returns></returns>
public static (double, string) ConvertBytes(long bytes)
{
if (bytes < 1024) return (bytes, "B");
@@ -262,12 +219,25 @@ namespace PluginManager.Others
}
/// <summary>
/// Save to JSON file
/// </summary>
/// <typeparam name="T">The class type</typeparam>
/// <param name="file">The file path</param>
/// <param name="Data">The values</param>
/// <returns></returns>
public static async Task SaveToJsonFile<T>(string file, T Data)
{
string jsonText = JsonSerializer.Serialize(Data, typeof(T), new JsonSerializerOptions() { WriteIndented = true });
string jsonText = JsonSerializer.Serialize(Data, typeof(T), new JsonSerializerOptions { WriteIndented = true });
await File.WriteAllTextAsync(file, jsonText);
}
/// <summary>
/// Convert json text or file to some kind of data
/// </summary>
/// <typeparam name="T">The data type</typeparam>
/// <param name="input">The file or json text</param>
/// <returns></returns>
public static async Task<T> ConvertFromJson<T>(string input)
{
Stream text;