Moved items and reimplemented SettingsDictionary.cs

This commit is contained in:
2023-08-01 21:28:44 +03:00
parent 7107b17f19
commit b4f5e40f12
18 changed files with 268 additions and 273 deletions

View File

@@ -18,7 +18,7 @@ public class Exit : ICommandAction
if (args is null || args.Length == 0) if (args is null || args.Length == 0)
{ {
Config.Logger.Log("Exiting...", "Exit", isInternal: false); Config.Logger.Log("Exiting...", "Exit", isInternal: false);
await Config.Data.Save(); await Config.AppSettings.SaveToFile();
await Config.Logger.SaveToFile(); await Config.Logger.SaveToFile();
Environment.Exit(0); Environment.Exit(0);
} }

View File

@@ -34,7 +34,8 @@ public class Help : ICommandAction
items.Add(new[] { "-", "-", "-" }); items.Add(new[] { "-", "-", "-" });
Utilities.Utilities.FormatAndAlignTable(items, Utilities.Utilities.FormatAndAlignTable(items,
TableFormat.CENTER_EACH_COLUMN_BASED); TableFormat.CENTER_EACH_COLUMN_BASED
);
return; return;
} }
@@ -55,6 +56,7 @@ public class Help : ICommandAction
}; };
Utilities.Utilities.FormatAndAlignTable(actionData, Utilities.Utilities.FormatAndAlignTable(actionData,
TableFormat.CENTER_EACH_COLUMN_BASED); TableFormat.CENTER_EACH_COLUMN_BASED
);
} }
} }

View File

@@ -75,7 +75,8 @@ public class Plugin : ICommandAction
Console.WriteLine("An error occured while loading: " + name); Console.WriteLine("An error occured while loading: " + name);
else else
Console.WriteLine("[CMD] Failed to load command : " + name + " because " + Console.WriteLine("[CMD] Failed to load command : " + name + " because " +
exception!.Message); exception!.Message
);
} }
Console.ForegroundColor = cc; Console.ForegroundColor = cc;
@@ -113,7 +114,8 @@ public class Plugin : ICommandAction
{ {
Console.ForegroundColor = ConsoleColor.Red; Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("[SLASH] Failed to load command : " + name + " because " + Console.WriteLine("[SLASH] Failed to load command : " + name + " because " +
exception!.Message); exception!.Message
);
} }
Console.ForegroundColor = cc; Console.ForegroundColor = cc;

View File

@@ -75,10 +75,11 @@ internal class Help : DBCommand
{ {
var embedBuilder = new EmbedBuilder(); var embedBuilder = new EmbedBuilder();
var cmd = PluginLoader.Commands.Find(p => p.Command == command || var cmd = PluginLoader.Commands.Find(p => p.Command == command ||
(p.Aliases is not null && p.Aliases.Contains(command))); p.Aliases is not null && p.Aliases.Contains(command)
);
if (cmd == null) return null; if (cmd == null) return null;
embedBuilder.AddField("Usage", Config.Data["prefix"] + cmd.Usage); embedBuilder.AddField("Usage", Config.AppSettings["prefix"] + cmd.Usage);
embedBuilder.AddField("Description", cmd.Description); embedBuilder.AddField("Description", cmd.Description);
if (cmd.Aliases is null) if (cmd.Aliases is null)
return embedBuilder; return embedBuilder;

View File

@@ -14,7 +14,8 @@ public class Entry
static Assembly LoadFromSameFolder(object sender, ResolveEventArgs args) static Assembly LoadFromSameFolder(object sender, ResolveEventArgs args)
{ {
var folderPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), var folderPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
"./Libraries"); "./Libraries"
);
var assemblyPath = Path.Combine(folderPath, new AssemblyName(args.Name).Name + ".dll"); var assemblyPath = Path.Combine(folderPath, new AssemblyName(args.Name).Name + ".dll");
if (!File.Exists(assemblyPath)) return null; if (!File.Exists(assemblyPath)) return null;
var assembly = Assembly.LoadFrom(assemblyPath); var assembly = Assembly.LoadFrom(assemblyPath);

View File

@@ -15,30 +15,30 @@ public static class Installer
Console.WriteLine("The following information will be stored in the config.json file in the ./Data/Resources folder. You can change it later from there."); Console.WriteLine("The following information will be stored in the config.json file in the ./Data/Resources folder. You can change it later from there.");
Console.WriteLine("The bot token is required to run the bot. You can get it from the Discord Developer Portal. (https://discord.com/developers/applications)"); Console.WriteLine("The bot token is required to run the bot. You can get it from the Discord Developer Portal. (https://discord.com/developers/applications)");
if (!Config.Data.ContainsKey("token")) if (!Config.AppSettings.ContainsKey("token"))
{ {
Console.WriteLine("Please enter the bot token :"); Console.WriteLine("Please enter the bot token :");
var token = Console.ReadLine(); var token = Console.ReadLine();
Config.Data.Add("token", token); Config.AppSettings.Add("token", token);
} }
if (!Config.Data.ContainsKey("prefix")) if (!Config.AppSettings.ContainsKey("prefix"))
{ {
Console.WriteLine("Please enter the bot prefix :"); Console.WriteLine("Please enter the bot prefix :");
var prefix = Console.ReadLine(); var prefix = Console.ReadLine();
Config.Data.Add("prefix", prefix); Config.AppSettings.Add("prefix", prefix);
} }
if (!Config.Data.ContainsKey("ServerID")) if (!Config.AppSettings.ContainsKey("ServerID"))
{ {
Console.WriteLine("Please enter the Server ID :"); Console.WriteLine("Please enter the Server ID :");
var serverId = Console.ReadLine(); var serverId = Console.ReadLine();
Config.Data.Add("ServerID", serverId); Config.AppSettings.Add("ServerID", serverId);
} }
Config.Logger.Log("Config Saved", "Installer", isInternal: true); Config.Logger.Log("Config Saved", "Installer", isInternal: true);
Config.Data.Save(); Config.AppSettings.SaveToFile();
Console.WriteLine("Config saved !"); Console.WriteLine("Config saved !");
} }
@@ -94,7 +94,8 @@ public static class Installer
""LinuxBot"": """", ""LinuxBot"": """",
""WindowsLauncher"": """", ""WindowsLauncher"": """",
} }
".Replace(" ", "")); ".Replace(" ", "")
);
Environment.Exit(0); Environment.Exit(0);
} }
} }

View File

@@ -15,7 +15,7 @@ namespace DiscordBot;
public class Program public class Program
{ {
public static Json<string, string> URLs; public static SettingsDictionary<string, string> URLs;
public static InternalActionManager internalActionManager; public static InternalActionManager internalActionManager;
/// <summary> /// <summary>
@@ -26,12 +26,12 @@ public class Program
{ {
PreLoadComponents(args).Wait(); PreLoadComponents(args).Wait();
if (!Data.ContainsKey("ServerID") || !Data.ContainsKey("token") || if (!AppSettings.ContainsKey("ServerID") || !AppSettings.ContainsKey("token") ||
Data["token"] == null || AppSettings["token"] == null ||
(Data["token"]?.Length != 70 && Data["token"]?.Length != 59) || AppSettings["token"]?.Length != 70 && AppSettings["token"]?.Length != 59 ||
!Data.ContainsKey("prefix") || Data["prefix"] == null || !AppSettings.ContainsKey("prefix") || AppSettings["prefix"] == null ||
Data["prefix"]?.Length != 1 || AppSettings["prefix"]?.Length != 1 ||
(args.Length == 1 && args[0] == "/reset")) args.Length == 1 && args[0] == "/reset")
Installer.GenerateStartupConfig(); Installer.GenerateStartupConfig();
HandleInput(args.ToList()).Wait(); HandleInput(args.ToList()).Wait();
@@ -49,9 +49,9 @@ public class Program
while (true) while (true)
{ {
string cmd = Console.ReadLine(); var cmd = Console.ReadLine();
string[] args = cmd.Split(' '); var args = cmd.Split(' ');
string command = args[0]; var command = args[0];
args = args.Skip(1).ToArray(); args = args.Skip(1).ToArray();
if (args.Length == 0) if (args.Length == 0)
args = null; args = null;
@@ -76,19 +76,22 @@ public class Program
Console.WriteLine(message); Console.WriteLine(message);
Console.WriteLine( Console.WriteLine(
$"Running on version: {Assembly.GetExecutingAssembly().GetName().Version}"); $"Running on version: {Assembly.GetExecutingAssembly().GetName().Version}"
Console.WriteLine($"Git URL: {Data["GitURL"]}"); );
Console.WriteLine($"Git URL: {AppSettings["GitURL"]}");
Utilities.Utilities.WriteColorText( Utilities.Utilities.WriteColorText(
"&rRemember to close the bot using the ShutDown command (&ysd&r) or some settings won't be saved\n"); "&rRemember to close the bot using the ShutDown command (&ysd&r) or some settings won't be saved\n"
);
Console.ForegroundColor = ConsoleColor.White; Console.ForegroundColor = ConsoleColor.White;
if (Data.ContainsKey("LaunchMessage")) if (AppSettings.ContainsKey("LaunchMessage"))
Utilities.Utilities.WriteColorText(Data["LaunchMessage"]); Utilities.Utilities.WriteColorText(AppSettings["LaunchMessage"]);
Utilities.Utilities.WriteColorText( Utilities.Utilities.WriteColorText(
"Please note that the bot saves a backup save file every time you are using the shudown command (&ysd&c)"); "Please note that the bot saves a backup save file every time you are using the shudown command (&ysd&c)"
);
Console.WriteLine("Running on " + Functions.GetOperatingSystem()); Console.WriteLine("Running on " + Functions.GetOperatingSystem());
Console.WriteLine("============================ LOG ============================"); Console.WriteLine("============================ LOG ============================");
@@ -98,11 +101,11 @@ public class Program
var token = ""; var token = "";
#if DEBUG #if DEBUG
if (File.Exists("./Data/Resources/token.txt")) token = File.ReadAllText("./Data/Resources/token.txt"); if (File.Exists("./Data/Resources/token.txt")) token = File.ReadAllText("./Data/Resources/token.txt");
else token = Data["token"]; else token = AppSettings["token"];
#else #else
token = Config.Data["token"]; token = Config.Data["token"];
#endif #endif
var prefix = Data["prefix"]; var prefix = AppSettings["prefix"];
var discordbooter = new Boot(token, prefix); var discordbooter = new Boot(token, prefix);
await discordbooter.Awake(); await discordbooter.Awake();
return discordbooter; return discordbooter;
@@ -145,12 +148,14 @@ public class Program
{ {
if (ex.Message == "No process is on the other end of the pipe." || (uint)ex.HResult == 0x800700E9) if (ex.Message == "No process is on the other end of the pipe." || (uint)ex.HResult == 0x800700E9)
{ {
if (Data.ContainsKey("LaunchMessage")) if (AppSettings.ContainsKey("LaunchMessage"))
Data.Add("LaunchMessage", AppSettings.Add("LaunchMessage",
"An error occured while closing the bot last time. Please consider closing the bot using the &rsd&c method !\nThere is a risk of losing all data or corruption of the save file, which in some cases requires to reinstall the bot !"); "An error occured while closing the bot last time. Please consider closing the bot using the &rsd&c method !\nThere is a risk of losing all data or corruption of the save file, which in some cases requires to reinstall the bot !"
);
Logger Logger
.Log("An error occured while closing the bot last time. Please consider closing the bot using the &rsd&c method !\nThere is a risk of losing all data or corruption of the save file, which in some cases requires to reinstall the bot !", .Log("An error occured while closing the bot last time. Please consider closing the bot using the &rsd&c method !\nThere is a risk of losing all data or corruption of the save file, which in some cases requires to reinstall the bot !",
"Bot", LogLevel.ERROR); "Bot", LogLevel.ERROR
);
} }
} }
} }
@@ -163,7 +168,9 @@ public class Program
await Installer.SetupPluginDatabase(); await Installer.SetupPluginDatabase();
URLs = new Json<string, string>("./Data/Resources/URLs.json"); URLs = new SettingsDictionary<string, string>("./Data/Resources/URLs.json");
File.WriteAllText("temp.txt", string.Join(" ", URLs.Keys));
Logger.LogEvent += (message, type, isInternal) => Logger.LogEvent += (message, type, isInternal) =>
{ {
@@ -179,23 +186,20 @@ public class Program
Console.WriteLine($"[{type.ToString()}] {message}"); Console.WriteLine($"[{type.ToString()}] {message}");
Console.ResetColor(); Console.ResetColor();
}; };
Console.WriteLine("Loading resources ..."); Console.WriteLine("Loading resources ...");
if (Data.ContainsKey("DeleteLogsAtStartup")) if (AppSettings.ContainsKey("DeleteLogsAtStartup"))
if (Data["DeleteLogsAtStartup"] == "true") if (AppSettings["DeleteLogsAtStartup"] == "true")
foreach (var file in Directory.GetFiles("./Output/Logs/")) foreach (var file in Directory.GetFiles("./Output/Logs/"))
File.Delete(file); File.Delete(file);
var OnlineDefaultKeys =
await ServerCom.ReadTextFromURL(URLs["SetupKeys"]); var OnlineDefaultKeys = await ServerCom.ReadTextFromURL(URLs["SetupKeys"]);
Data["Version"] = Assembly.GetExecutingAssembly().GetName().Version.ToString(); AppSettings["Version"] = Assembly.GetExecutingAssembly().GetName().Version.ToString();
foreach (var key in OnlineDefaultKeys) foreach (var key in OnlineDefaultKeys)
{ {
@@ -203,7 +207,7 @@ public class Program
var s = key.Split(' '); var s = key.Split(' ');
try try
{ {
Data[s[0]] = s[1]; AppSettings[s[0]] = s[1];
} }
catch ( Exception ex ) catch ( Exception ex )
{ {
@@ -221,7 +225,7 @@ public class Program
switch ( s[0] ) switch ( s[0] )
{ {
case "CurrentVersion": case "CurrentVersion":
var currentVersion = Data["Version"]; var currentVersion = AppSettings["Version"];
var newVersion = s[1]; var newVersion = s[1];
if (new VersionString(newVersion) != new VersionString(newVersion)) if (new VersionString(newVersion) != new VersionString(newVersion))
{ {

View File

@@ -203,9 +203,9 @@ public static class Utilities
{ {
private readonly string[] Sequence; private readonly string[] Sequence;
private bool isRunning; private bool isRunning;
public string Message;
private int position; private int position;
private Thread thread; private Thread thread;
public string Message;
public Spinner() public Spinner()
{ {
@@ -228,7 +228,8 @@ public static class Utilities
position = 0; position = 0;
Thread.Sleep(100); Thread.Sleep(100);
} }
}); }
);
thread.Start(); thread.Start();
} }

View File

@@ -107,10 +107,10 @@ public class Boot
{ {
if (arg.Message.Contains("401")) if (arg.Message.Contains("401"))
{ {
Config.Data.Remove("token"); Config.AppSettings.Remove("token");
Config.Logger.Log("The token is invalid. Please restart the bot and enter a valid token.", this, Config.Logger.Log("The token is invalid. Please restart the bot and enter a valid token.", this,
LogLevel.ERROR); LogLevel.ERROR);
Config.Data.Save(); await Config.AppSettings.SaveToFile();
await Task.Delay(4000); await Task.Delay(4000);
Environment.Exit(0); Environment.Exit(0);
} }

View File

@@ -1,7 +1,4 @@
using System; using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
using PluginManager.Bot; using PluginManager.Bot;
using PluginManager.Others; using PluginManager.Others;
@@ -13,8 +10,7 @@ public class Config
{ {
private static bool IsLoaded; private static bool IsLoaded;
public static DBLogger Logger; public static DBLogger Logger;
public static Json<string, string>? Data; public static SettingsDictionary<string, string>? AppSettings;
// public static Json<string, string>? Plugins;
internal static Boot? _DiscordBotClient; internal static Boot? _DiscordBotClient;
@@ -22,8 +18,7 @@ public class Config
public static async Task Initialize() public static async Task Initialize()
{ {
if (IsLoaded) if (IsLoaded) return;
return;
Directory.CreateDirectory("./Data/Resources"); Directory.CreateDirectory("./Data/Resources");
Directory.CreateDirectory("./Data/Plugins"); Directory.CreateDirectory("./Data/Plugins");
@@ -31,11 +26,10 @@ public class Config
Directory.CreateDirectory("./Data/Logs/Logs"); Directory.CreateDirectory("./Data/Logs/Logs");
Directory.CreateDirectory("./Data/Logs/Errors"); Directory.CreateDirectory("./Data/Logs/Errors");
Data = new Json<string, string>("./Data/Resources/config.json"); AppSettings = new SettingsDictionary<string, string>("./Data/Resources/config.json");
// Plugins = new Json<string, string>("./Data/Resources/Plugins.json");
Data["LogFolder"] = "./Data/Logs/Logs"; AppSettings["LogFolder"] = "./Data/Logs/Logs";
Data["ErrorFolder"] = "./Data/Logs/Errors"; AppSettings["ErrorFolder"] = "./Data/Logs/Errors";
Logger = new DBLogger(); Logger = new DBLogger();
@@ -46,128 +40,4 @@ public class Config
Logger.Log("Config initialized", LogLevel.INFO); Logger.Log("Config initialized", LogLevel.INFO);
} }
public class Json<TKey, TValue> : IDictionary<TKey, TValue>
{
private readonly string _file = "";
private readonly IDictionary<TKey, TValue>? _dictionary;
public Json(string file)
{
if (file is null) throw new FileLoadException("The file can not be null");
if(!File.Exists(file))
File.Create(file).Close();
_dictionary = PrivateReadConfig(file).GetAwaiter().GetResult();
_file = file;
}
public virtual void Add(TKey key, TValue value)
{
_dictionary.Add(key, value);
}
public void Clear() { _dictionary.Clear(); }
public bool ContainsKey(TKey key)
{
if (_dictionary == null)
throw new Exception("Dictionary is null");
return _dictionary.ContainsKey(key);
}
public virtual ICollection<TKey> Keys => _dictionary.Keys;
public virtual ICollection<TValue> Values => _dictionary.Values;
public int Count => _dictionary.Count;
public bool IsReadOnly => _dictionary.IsReadOnly;
public virtual TValue this[TKey key]
{
get
{
if (_dictionary.TryGetValue(key, out var value)) return value;
throw new Exception("Key not found in dictionary " + key + " (Json )" + GetType().Name +
")");
}
set
{
if (_dictionary.ContainsKey(key))
_dictionary[key] = value;
else _dictionary.Add(key, value);
}
}
public virtual bool TryGetValue(TKey key, out TValue value)
{
return _dictionary.TryGetValue(key, out value);
}
public bool Remove(TKey key)
{
return _dictionary.Remove(key);
}
public void Add(KeyValuePair<TKey, TValue> item)
{
_dictionary.Add(item);
}
public bool Contains(KeyValuePair<TKey, TValue> item)
{
return _dictionary.Contains(item);
}
public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
{
_dictionary.CopyTo(array, arrayIndex);
}
public bool Remove(KeyValuePair<TKey, TValue> item)
{
return _dictionary.Remove(item);
}
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
{
return _dictionary.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable)_dictionary).GetEnumerator();
}
public async Task Save()
{
if (!string.IsNullOrEmpty(_file))
await Functions.SaveToJsonFile(_file, _dictionary);
}
private async Task<Dictionary<TKey, TValue>> PrivateReadConfig(string file)
{
if (!File.Exists(file))
{
var dictionary = new Dictionary<TKey, TValue>();
await Functions.SaveToJsonFile(file, _dictionary);
return dictionary;
}
try
{
var d = await Functions.ConvertFromJson<Dictionary<TKey, TValue>>(file);
if (d is null)
throw new Exception("Failed to read config file");
return d;
}
catch (Exception ex)
{
File.Delete(file);
return new Dictionary<TKey, TValue>();
}
}
}
} }

View File

@@ -10,7 +10,6 @@ namespace PluginManager.Database;
public class SqlDatabase public class SqlDatabase
{ {
private readonly SQLiteConnection Connection; private readonly SQLiteConnection Connection;
private readonly string ConnectionString;
/// <summary> /// <summary>
/// Initialize a SQL connection by specifing its private path /// Initialize a SQL connection by specifing its private path
@@ -22,8 +21,8 @@ public class SqlDatabase
fileName = Path.Combine("./Data/Resources", fileName); fileName = Path.Combine("./Data/Resources", fileName);
if (!File.Exists(fileName)) if (!File.Exists(fileName))
SQLiteConnection.CreateFile(fileName); SQLiteConnection.CreateFile(fileName);
ConnectionString = $"URI=file:{fileName}"; var connectionString = $"URI=file:{fileName}";
Connection = new SQLiteConnection(ConnectionString); Connection = new SQLiteConnection(connectionString);
} }

View File

@@ -16,10 +16,10 @@ public static class ArchiveManager
{ {
if (isInitialized) throw new Exception("ArchiveManager is already initialized"); if (isInitialized) throw new Exception("ArchiveManager is already initialized");
if (!Config.Data.ContainsKey("ArchiveFolder")) if (!Config.AppSettings.ContainsKey("ArchiveFolder"))
Config.Data["ArchiveFolder"] = "./Data/PAKS/"; Config.AppSettings["ArchiveFolder"] = "./Data/PAKS/";
archiveFolder = Config.Data["ArchiveFolder"]; archiveFolder = Config.AppSettings["ArchiveFolder"];
isInitialized = true; isInitialized = true;
} }

View File

@@ -77,41 +77,6 @@ public static class Functions
} }
} }
/// <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)
{
var str = new MemoryStream();
await JsonSerializer.SerializeAsync(str, Data, typeof(T), new JsonSerializerOptions { WriteIndented = true });
await File.WriteAllBytesAsync(file, str.ToArray());
await str.FlushAsync();
str.Close();
}
/// <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;
if (File.Exists(input))
text = new MemoryStream(await File.ReadAllBytesAsync(input));
else
text = new MemoryStream(Encoding.ASCII.GetBytes(input));
text.Position = 0;
var obj = await JsonSerializer.DeserializeAsync<T>(text);
await text.FlushAsync();
text.Close();
return (obj ?? default)!;
}
public static T SelectRandomValueOf<T>() public static T SelectRandomValueOf<T>()
{ {

View File

@@ -0,0 +1,47 @@
using System;
using System.IO;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace PluginManager;
public class JsonManager
{
/// <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)
{
var str = new MemoryStream();
await JsonSerializer.SerializeAsync(str, Data, typeof(T), new JsonSerializerOptions { WriteIndented = true });
await File.WriteAllBytesAsync(file, str.ToArray());
await str.FlushAsync();
str.Close();
}
/// <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)
{
Console.WriteLine(input);
Stream text;
if (File.Exists(input))
text = new MemoryStream(await File.ReadAllBytesAsync(input));
else
text = new MemoryStream(Encoding.ASCII.GetBytes(input));
text.Position = 0;
var obj = await JsonSerializer.DeserializeAsync<T>(text);
await text.FlushAsync();
text.Close();
return (obj ?? default)!;
}
}

View File

@@ -16,8 +16,8 @@ public class DBLogger
public DBLogger() public DBLogger()
{ {
_logFolder = Config.Data["LogFolder"]; _logFolder = Config.AppSettings["LogFolder"];
_errFolder = Config.Data["ErrorFolder"]; _errFolder = Config.AppSettings["ErrorFolder"];
} }
public IReadOnlyList<LogMessage> Logs => LogHistory; public IReadOnlyList<LogMessage> Logs => LogHistory;
@@ -69,9 +69,9 @@ public class DBLogger
public async Task SaveToFile(bool ErrorsOnly = true) public async Task SaveToFile(bool ErrorsOnly = true)
{ {
if(!ErrorsOnly) if(!ErrorsOnly)
await Functions.SaveToJsonFile(_logFolder + "/" + DateTime.Now.ToString("yyyy-MM-dd") + ".json", await JsonManager.SaveToJsonFile(_logFolder + "/" + DateTime.Now.ToString("yyyy-MM-dd") + ".json",
LogHistory); LogHistory);
await Functions.SaveToJsonFile(_errFolder + "/" + DateTime.Now.ToString("yyyy-MM-dd") + ".json", await JsonManager.SaveToJsonFile(_errFolder + "/" + DateTime.Now.ToString("yyyy-MM-dd") + ".json",
ErrorHistory); ErrorHistory);
} }
} }

View File

@@ -0,0 +1,102 @@
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
namespace PluginManager.Others;
public class SettingsDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
public string _file { get; set; }
private IDictionary<TKey, TValue>? _dictionary;
public SettingsDictionary(string file)
{
if (file is null)
throw new FileLoadException("The file can not be null");
if (!File.Exists(file))
File.Create(file).Close();
_file = file;
LoadFromFile();
}
public async Task SaveToFile()
{
if (!string.IsNullOrEmpty(_file))
await JsonManager.SaveToJsonFile(_file, _dictionary);
}
private void LoadFromFile()
{
if (!string.IsNullOrEmpty(_file))
_dictionary = JsonManager.ConvertFromJson<IDictionary<TKey, TValue>>(_file).Result;
}
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
{
return _dictionary!.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable) _dictionary!).GetEnumerator();
}
public void Add(KeyValuePair<TKey, TValue> item)
{
this._dictionary!.Add(item);
}
public void Clear()
{
this._dictionary!.Clear();
}
public bool Contains(KeyValuePair<TKey, TValue> item)
{
return this._dictionary!.Contains(item);
}
public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
{
this._dictionary!.CopyTo(array, arrayIndex);
}
public bool Remove(KeyValuePair<TKey, TValue> item)
{
return this._dictionary!.Remove(item);
}
public int Count => _dictionary!.Count;
public bool IsReadOnly => _dictionary!.IsReadOnly;
public void Add(TKey key, TValue value)
{
this._dictionary!.Add(key, value);
}
public bool ContainsKey(TKey key)
{
return this._dictionary!.ContainsKey(key);
}
public bool Remove(TKey key)
{
return this._dictionary!.Remove(key);
}
public bool TryGetValue(TKey key, out TValue value)
{
return this._dictionary!.TryGetValue(key, out value);
}
public TValue this[TKey key]
{
get => this._dictionary![key];
set => this._dictionary![key] = value;
}
public ICollection<TKey> Keys => _dictionary!.Keys;
public ICollection<TValue> Values => _dictionary!.Values;
}