diff --git a/builtin/BitMod.Whitelist/Hooks/WhitelistHooks.cs b/builtin/BitMod.Whitelist/Hooks/WhitelistHooks.cs index 7b2833b..4001b73 100644 --- a/builtin/BitMod.Whitelist/Hooks/WhitelistHooks.cs +++ b/builtin/BitMod.Whitelist/Hooks/WhitelistHooks.cs @@ -3,6 +3,8 @@ using BitMod.Attributes.Injects; using BitMod.Attributes.Targets; using BitMod.Configuration.Model; +using BitMod.Events.Config; +using BitMod.Events.Meta; using BitMod.Events.Server; using BitMod.Plugins.Events; using BitMod.Whitelist.Adapter; @@ -16,14 +18,25 @@ namespace BitMod.Whitelist.Hooks; public class WhitelistHooks { + + [Config("whitelist")] private IConfigObject _whitelist; [Singleton] private ILogger _logger; + [BitConfigUpdate("whitelist")] + public async Task ServerConfigUpdate(ConfigUpdatedEventArgs ev) + { + var config = new WhitelistConfigAdapter(ev.Config); + + _logger.Information("Updated whitelist with new allowed IPs: {@List}", + config.GetAllowedAddresses().Select(x => x.ToString())); + } + [BitHook(Priority.LOW)] - private async Task ServerConnectionRequest(GameServerConnectingEventArgs ev) + public async Task ServerConnectionRequest(GameServerConnectingEventArgs ev) { var config = new WhitelistConfigAdapter(_whitelist); diff --git a/standalone/BitMod.Config/Cache/ConfigCache.cs b/standalone/BitMod.Config/Cache/ConfigCache.cs index 8e318f8..f407e77 100644 --- a/standalone/BitMod.Config/Cache/ConfigCache.cs +++ b/standalone/BitMod.Config/Cache/ConfigCache.cs @@ -1,6 +1,7 @@ using System.Security; using BitMod.Configuration.Model; +using BitMod.Internal.Public; using Serilog; @@ -15,12 +16,14 @@ public class ConfigCache private KVSerializer _serializer; private KVSerializerOptions _serializerOptions; private Dictionary _watchers = new(); + private PluginInvoker _invoker; - public ConfigCache(KVSerializerOptions serializerOptions, KVSerializer serializer, ILogger logger) + public ConfigCache(KVSerializerOptions serializerOptions, KVSerializer serializer, ILogger logger, PluginInvoker invoker) { _serializerOptions = serializerOptions; _serializer = serializer; _logger = logger; + _invoker = invoker; } public ConfigWatcher GetWatcher(string file) @@ -28,7 +31,7 @@ public ConfigWatcher GetWatcher(string file) if (_watchers.TryGetValue(file, out var watcher)) return watcher; - _watchers[file] = new ConfigWatcher(file, _logger, _serializer, _serializerOptions); + _watchers[file] = new ConfigWatcher(file, _logger, _serializer, _serializerOptions, _invoker); return _watchers[file]; } diff --git a/standalone/BitMod.Config/Cache/ConfigWatcher.cs b/standalone/BitMod.Config/Cache/ConfigWatcher.cs index 10c4d18..0c59cc1 100644 --- a/standalone/BitMod.Config/Cache/ConfigWatcher.cs +++ b/standalone/BitMod.Config/Cache/ConfigWatcher.cs @@ -2,6 +2,7 @@ using BitMod.Config.Implementation; using BitMod.Configuration.Model; +using BitMod.Internal.Public; using Serilog; @@ -24,19 +25,22 @@ public class ConfigWatcher private ILogger _logger; + private PluginInvoker _invoker; + private KVSerializer _serializer; private KVSerializerOptions _serializerOptions; private FileSystemWatcher _watcher; - public ConfigWatcher(string configFileName, ILogger logger, KVSerializer serializer, KVSerializerOptions serializerOptions) + public ConfigWatcher(string configFileName, ILogger logger, KVSerializer serializer, KVSerializerOptions serializerOptions, PluginInvoker invoker) { _configFileName = configFileName; _configFilePath = Path.Join(System.Environment.CurrentDirectory, CONFIG_PATH, $"{_configFileName}.{CONFIG_EXT}"); _logger = logger; _serializer = serializer; _serializerOptions = serializerOptions; + _invoker = invoker; // Create an empty config object _configObject = new ConfigObject( new KVObject(_configFileName, Enumerable.Empty())); @@ -59,6 +63,8 @@ private void OnChange(object sender, FileSystemEventArgs args) { _logger.Information("[BitMod Config] Reloading config file {@Name} due to update.", _configFileName); TryRead(); + + _invoker.ConfigUpdate(_configFileName, _configObject); } @@ -69,7 +75,6 @@ private void TryRead() using (var reader = File.OpenRead(_configFilePath)) { var kvObject = _serializer.Deserialize(reader, _serializerOptions); - _configObject = new ConfigObject(kvObject); } } diff --git a/standalone/BitMod.Config/ConfigurationSystem.cs b/standalone/BitMod.Config/ConfigurationSystem.cs index 2655f24..8afabad 100644 --- a/standalone/BitMod.Config/ConfigurationSystem.cs +++ b/standalone/BitMod.Config/ConfigurationSystem.cs @@ -28,7 +28,7 @@ public void Start(BitMod env) _logger = _parent.Logger; // Set up the cache - _parent.Store(new ConfigCache(Options, Serializer, _logger)); + _parent.Store(new ConfigCache(Options, Serializer, _logger, _parent.Invoker)); } public IConfigObject Get(string name) diff --git a/standalone/BitMod.Launcher/configs/whitelist.cfg b/standalone/BitMod.Launcher/configs/whitelist.cfg index 1350601..8a3f6ac 100644 --- a/standalone/BitMod.Launcher/configs/whitelist.cfg +++ b/standalone/BitMod.Launcher/configs/whitelist.cfg @@ -4,9 +4,8 @@ // default handler. Note that if you do not specify any here, // other plugins will still be able to accept connections. // Plugins can also override this list, and reject connections listed here. - "AllowedIPs" - { - // Format: "entryNumber" "ipAddress" - "0" "127.0.0.1" - } + + // Format: "entryNumber" "ipAddress" + "0" "127.0.0.1" + }