diff --git a/Application/Configuration/ScriptPluginConfiguration.cs b/Application/Configuration/ScriptPluginConfiguration.cs new file mode 100644 index 00000000..5728055e --- /dev/null +++ b/Application/Configuration/ScriptPluginConfiguration.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using SharedLibraryCore.Interfaces; + +namespace IW4MAdmin.Application.Configuration +{ + public class ScriptPluginConfiguration : Dictionary>, IBaseConfiguration + { + public string Name() => nameof(ScriptPluginConfiguration); + + public IBaseConfiguration Generate() + { + return new ScriptPluginConfiguration(); + } + } +} \ No newline at end of file diff --git a/Application/Misc/ScriptPlugin.cs b/Application/Misc/ScriptPlugin.cs index 2a50fac7..dd8e02c9 100644 --- a/Application/Misc/ScriptPlugin.cs +++ b/Application/Misc/ScriptPlugin.cs @@ -168,6 +168,7 @@ namespace IW4MAdmin.Application.Misc } } + _scriptEngine.SetValue("_configHandler", new ScriptPluginConfigurationWrapper(Name, _scriptEngine)); await OnLoadAsync(manager); try diff --git a/Application/Misc/ScriptPluginConfigurationWrapper.cs b/Application/Misc/ScriptPluginConfigurationWrapper.cs new file mode 100644 index 00000000..d1899949 --- /dev/null +++ b/Application/Misc/ScriptPluginConfigurationWrapper.cs @@ -0,0 +1,90 @@ +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Threading.Tasks; +using IW4MAdmin.Application.Configuration; +using Jint; +using Jint.Native; +using Newtonsoft.Json.Linq; + +namespace IW4MAdmin.Application.Misc +{ + public class ScriptPluginConfigurationWrapper + { + private readonly BaseConfigurationHandler _handler; + private readonly ScriptPluginConfiguration _config; + private readonly string _pluginName; + private readonly Engine _scriptEngine; + + public ScriptPluginConfigurationWrapper(string pluginName, Engine scriptEngine) + { + _handler = new BaseConfigurationHandler("ScriptPluginSettings"); + _config = _handler.Configuration() ?? + (ScriptPluginConfiguration) new ScriptPluginConfiguration().Generate(); + _pluginName = pluginName; + _scriptEngine = scriptEngine; + } + + private static int? AsInteger(double d) + { + return int.TryParse(d.ToString(CultureInfo.InvariantCulture), out var parsed) ? parsed : (int?) null; + } + + public async Task SetValue(string key, object value) + { + var castValue = value; + + if (value is double d) + { + castValue = AsInteger(d) ?? value; + } + + if (value is object[] array && array.All(item => item is double d && AsInteger(d) != null)) + { + castValue = array.Select(item => (int) item).ToArray(); + } + + if (!_config.ContainsKey(_pluginName)) + { + _config.Add(_pluginName, new Dictionary()); + } + + var plugin = _config[_pluginName]; + + if (plugin.ContainsKey(key)) + { + plugin[key] = castValue; + } + + else + { + plugin.Add(key, castValue); + } + + _handler.Set(_config); + await _handler.Save(); + } + + public JsValue GetValue(string key) + { + if (!_config.ContainsKey(_pluginName)) + { + return JsValue.Undefined; + } + + if (!_config[_pluginName].ContainsKey(key)) + { + return JsValue.Undefined; + } + + var item = _config[_pluginName][key]; + + if (item is JArray array) + { + item = array.ToObject>(); + } + + return JsValue.FromObject(_scriptEngine, item); + } + } +} \ No newline at end of file diff --git a/Plugins/ScriptPlugins/SampleScriptPluginCommand.js b/Plugins/ScriptPlugins/SampleScriptPluginCommand.js index b02f9238..fb4c7784 100644 --- a/Plugins/ScriptPlugins/SampleScriptPluginCommand.js +++ b/Plugins/ScriptPlugins/SampleScriptPluginCommand.js @@ -39,7 +39,7 @@ let commands = [{ let plugin = { author: 'RaidMax', - version: 1.0, + version: 1.1, name: 'Ping Pong Sample Command Plugin', onEventAsync: function (gameEvent, server) { @@ -48,6 +48,36 @@ let plugin = { onLoadAsync: function (manager) { this.logger = _serviceResolver.ResolveService("ILogger"); this.logger.WriteDebug("sample plugin loaded"); + + const intArray = [ + 1337, + 1505, + 999 + ]; + + const stringArray = [ + "ping", + "pong", + "hello" + ]; + + _configHandler.SetValue("SampleIntegerValue", 123); + _configHandler.SetValue("SampleStringValue", this.author); + _configHandler.SetValue("SampleFloatValue", this.version); + _configHandler.SetValue("SampleNumericalArray", intArray); + _configHandler.SetValue("SampleStringArray", stringArray); + + this.logger.WriteDebug(_configHandler.GetValue("SampleIntegerValue")); + this.logger.WriteDebug(_configHandler.GetValue("SampleStringValue")); + this.logger.WriteDebug(_configHandler.GetValue("SampleFloatValue")); + + _configHandler.GetValue("SampleNumericalArray").forEach((element) => { + this.logger.WriteDebug(element); + }); + + _configHandler.GetValue("SampleStringArray").forEach((element) => { + this.logger.WriteDebug(element); + }); }, onUnloadAsync: function () {