using Firebird2D.Logger; using Microsoft.Extensions.Configuration; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Schema; using SFML.Window; using System.Text; namespace Firebird2D.Configuration { public class GameConfig { public VideoMode VideoMode { get { return _videoMode; } set { _videoMode = value; updateConfig(); } } public bool FullScreen { get { return _fullScreen; } set { _fullScreen = value; updateConfig(); } } public bool LogActive { get { return _logActive; } set { _logActive = value; GameLogger.LogActive = value; updateConfig(); } } private static readonly string ConfigSchema = "Configuration/ConfigurationSchema/ConfigSchema.json"; private static readonly string ConfigPath = "Configuration/GameConfig.json"; private IConfigurationBuilder _configurationBuilder; private IConfigurationSection _configurationSection; private VideoMode _videoMode; private bool _fullScreen; private bool _logActive; public GameConfig() { CheckFile(); LoadConfig(); } private void updateConfig() { if (_configurationBuilder != null) { _configurationSection["ScreenResolution:x"] = _videoMode.Width.ToString(); _configurationSection["ScreenResolution:y"] = _videoMode.Height.ToString(); _configurationSection["Fullscreen"] = _fullScreen.ToString(); _configurationSection["Log"] = _logActive.ToString(); } } private void LoadConfig() { _configurationBuilder = new ConfigurationBuilder().AddJsonFile(ConfigPath, false, true); _configurationSection = _configurationBuilder.Build().GetSection("AppSettings"); _videoMode = new VideoMode(); if (_configurationSection != null) { try { _videoMode.Width = uint.Parse(_configurationSection["ScreenResolution:x"]); _videoMode.Height = uint.Parse(_configurationSection["ScreenResolution:y"]); _fullScreen = bool.Parse(_configurationSection["Fullscreen"]); _logActive = bool.Parse(_configurationSection["Log"]); GameLogger.LogActive = _logActive; } catch(Exception ex) { GameLogger.Log("GameConfig", LogType.Error, ex.Message); File.Delete(ConfigPath); MakeConfigFile(); LoadConfig(); } } else { GameLogger.Log("GameConfig", LogType.Error, "The Config File Was Corrupted"); File.Delete(ConfigPath); MakeConfigFile(); LoadConfig(); } } private void CheckFile() { if (File.Exists(ConfigPath)) { string schemaJson = File.ReadAllText(ConfigSchema); JSchema schema = JSchema.Parse(schemaJson); string ConfigData = File.ReadAllText(ConfigPath); JObject json = JObject.Parse(ConfigData); IList validationErrors = []; if (schema != null) { if (!json.IsValid(schema,out validationErrors)){ File.Delete(ConfigPath); MakeConfigFile(); GameLogger.Log("GameConfig", LogType.Error, "The Config File Was Corrupted"); foreach (string error in validationErrors) { GameLogger.Log("GameConfig", LogType.Error, error); } } } } else { MakeConfigFile(); } } private void MakeConfigFile() { VideoMode desktopMode = VideoMode.DesktopMode; using (FileStream stream = File.Create(ConfigPath)) { AddText(stream, "{" + " \"AppSettings\":{" + " \"ScreenResolution\": {" + string.Format(" \"x\": {0},", desktopMode.Width) + string.Format(" \"y\": {0}", desktopMode.Height) + " }," + " \"Fullscreen\": false," + " \"Log\": true," + " }" + "}" ); stream.Close(); } } private static void AddText(FileStream fs, string value) { byte[] info = new UTF8Encoding(true).GetBytes(value); fs.Write(info, 0, info.Length); } } }