using Arrowgene.Ddon.GameServer.Scripting;
using Arrowgene.Ddon.Server.Scripting.utils;
using Arrowgene.Ddon.Server.Settings;
using Arrowgene.Ddon.Shared.Model;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Scripting;
using System;
using System.Collections.Generic;
using System.IO;
namespace Arrowgene.Ddon.Server.Scripting.modules
{
public class GameServerSettingsModule : ScriptModule
{
public override string ModuleRoot => "settings";
public override string Filter => "*.csx";
public override bool ScanSubdirectories => true;
public override bool EnableHotLoad => true;
///
/// Settings data is organized as ScriptName.FieldName
///
private ScriptableSettings SettingsData { get; set; }
public GameSettings GameSettings { get; private set; }
private List DefaultSettings { get; set; }
public string TemplatesDirectory {get; private set;}
public GameServerSettingsModule(string scriptsRoot)
{
TemplatesDirectory = Path.Combine(scriptsRoot, "settings/templates");
SettingsData = new ScriptableSettings();
GameSettings = new GameSettings(SettingsData);
// Provide a list of all the settings objects
// that defaults need to be assigned for
DefaultSettings = new List()
{
GameSettings.DebugSettings,
GameSettings.GameServerSettings,
GameSettings.ChatCommandsSettings,
GameSettings.SeasonalEventsSettings,
GameSettings.PointModifiersSettings,
GameSettings.EmblemSettings,
};
}
private void CreateTemplate(string outputRootPath, Type type)
{
string outputPath = Path.Combine(outputRootPath, $"{type.Name}.csx");
SettingsTemplate.Generate(outputPath, type);
}
public override void Initialize()
{
if (!Directory.Exists(TemplatesDirectory))
{
Directory.CreateDirectory(TemplatesDirectory);
}
foreach (var defaultSetting in DefaultSettings)
{
defaultSetting.InitializeDefaults();
CreateTemplate(TemplatesDirectory, defaultSetting.GetType());
}
}
public override ScriptOptions Options()
{
return ScriptOptions.Default
.AddReferences(MetadataReference.CreateFromFile(typeof(GameSettings).Assembly.Location))
.AddReferences(MetadataReference.CreateFromFile(typeof(WalletType).Assembly.Location))
.AddReferences(MetadataReference.CreateFromFile(typeof(LibUtils).Assembly.Location))
.AddImports("System", "System.Collections", "System.Collections.Generic")
.AddImports("Arrowgene.Ddon.Server.Scripting")
.AddImports("Arrowgene.Ddon.Server.Settings")
.AddImports("Arrowgene.Ddon.Shared.Model")
.AddImports("Arrowgene.Ddon.Shared.Model.Quest");
}
public override bool EvaluateResult(string path, object result, IDictionary variables)
{
if (path.Contains(TemplatesDirectory))
{
return true;
}
var scriptName = Path.GetFileNameWithoutExtension(path);
foreach (var (name, value) in variables)
{
SettingsData.Set(scriptName, name, value);
}
return true;
}
}
}