From 461221294a1f6384428fab30dec094129198a6cb Mon Sep 17 00:00:00 2001 From: Brett Hewitson Date: Thu, 16 Dec 2021 12:56:26 +1000 Subject: [PATCH] Global Settings - Discord Bot section - Added a whitelist to allow bots to send commands to the server manager. --- src/ARKServerManager/App.config | 7 +++ src/ARKServerManager/App.xaml.cs | 9 ++- src/ARKServerManager/Config.Designer.cs | 14 +++++ src/ARKServerManager/Config.settings | 6 ++ .../Globalization/en-US/en-US.xaml | 6 ++ .../UserControls/GlobalSettingsControl.xaml | 50 ++++++++++++++++ .../GlobalSettingsControl.xaml.cs | 60 ++++++++++++++++++- src/ARKServerManager/VersionFeed.xml | 9 ++- src/ARKServerManager/VersionFeedBeta.xml | 23 +++++++ .../Windows/SettingsWindow.xaml | 2 +- .../Windows/SettingsWindow.xaml.cs | 2 + src/ConanServerManager/App.config | 7 +++ src/ConanServerManager/App.xaml.cs | 9 ++- src/ConanServerManager/Config.Designer.cs | 14 +++++ src/ConanServerManager/Config.settings | 6 ++ .../Globalization/en-US/en-US.xaml | 6 ++ .../UserControls/GlobalSettingsControl.xaml | 50 ++++++++++++++++ .../GlobalSettingsControl.xaml.cs | 60 ++++++++++++++++++- src/ConanServerManager/VersionFeed.xml | 9 ++- src/ConanServerManager/VersionFeedBeta.xml | 23 +++++++ .../Windows/SettingsWindow.xaml.cs | 2 + .../Model/DiscordBotWhitelist.cs | 15 +++++ .../Interfaces/IServerManagerBot.cs | 3 +- .../Models/DiscordBotWhitelist.cs | 7 +++ .../Models/DiscordBotWhitelistConfig.cs | 9 +++ src/ServerManager.Discord/ServerManagerBot.cs | 9 ++- .../Services/CommandHandlerService.cs | 11 ++-- 27 files changed, 413 insertions(+), 15 deletions(-) create mode 100644 src/ServerManager.Common/Model/DiscordBotWhitelist.cs create mode 100644 src/ServerManager.Discord/Models/DiscordBotWhitelist.cs create mode 100644 src/ServerManager.Discord/Models/DiscordBotWhitelistConfig.cs diff --git a/src/ARKServerManager/App.config b/src/ARKServerManager/App.config index febac3a6..7b6ed13e 100644 --- a/src/ARKServerManager/App.config +++ b/src/ARKServerManager/App.config @@ -849,6 +849,13 @@ 50 + + + + + + + diff --git a/src/ARKServerManager/App.xaml.cs b/src/ARKServerManager/App.xaml.cs index c1345361..9484683b 100644 --- a/src/ARKServerManager/App.xaml.cs +++ b/src/ARKServerManager/App.xaml.cs @@ -11,6 +11,7 @@ using ServerManagerTool.Plugin.Common; using ServerManagerTool.Utils; using ServerManagerTool.Windows; using System; +using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.IO; @@ -493,7 +494,13 @@ namespace ServerManagerTool Task discordTask = Task.Run(async () => { - await ServerManagerBotFactory.GetServerManagerBot()?.StartAsync(Config.Default.DiscordBotToken, Config.Default.DiscordBotPrefix, Config.Default.DataDir, DiscordBotHelper.HandleDiscordCommand, DiscordBotHelper.HandleTranslation, _tokenSource.Token); + var discordWhiteList = new List(); + if (Config.Default.DiscordBotWhitelist != null) + { + discordWhiteList.AddRange(Config.Default.DiscordBotWhitelist.Cast()); + } + + await ServerManagerBotFactory.GetServerManagerBot()?.StartAsync(Config.Default.DiscordBotToken, Config.Default.DiscordBotPrefix, Config.Default.DataDir, discordWhiteList, DiscordBotHelper.HandleDiscordCommand, DiscordBotHelper.HandleTranslation, _tokenSource.Token); }, _tokenSource.Token) .ContinueWith(t => { var message = t.Exception.InnerException is null ? t.Exception.Message : t.Exception.InnerException.Message; diff --git a/src/ARKServerManager/Config.Designer.cs b/src/ARKServerManager/Config.Designer.cs index 5f9d64bb..f75b7b57 100644 --- a/src/ARKServerManager/Config.Designer.cs +++ b/src/ARKServerManager/Config.Designer.cs @@ -2986,5 +2986,19 @@ namespace ServerManagerTool { this["ServerMonitorWindow_Top"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("\r\n\r\n \r\n")] + public global::System.Collections.Specialized.StringCollection DiscordBotWhitelist { + get { + return ((global::System.Collections.Specialized.StringCollection)(this["DiscordBotWhitelist"])); + } + set { + this["DiscordBotWhitelist"] = value; + } + } } } diff --git a/src/ARKServerManager/Config.settings b/src/ARKServerManager/Config.settings index c11d5ae4..7ecdcda8 100644 --- a/src/ARKServerManager/Config.settings +++ b/src/ARKServerManager/Config.settings @@ -824,5 +824,11 @@ 50 + + <?xml version="1.0" encoding="utf-16"?> +<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <string /> +</ArrayOfString> + \ No newline at end of file diff --git a/src/ARKServerManager/Globalization/en-US/en-US.xaml b/src/ARKServerManager/Globalization/en-US/en-US.xaml index 7e85edde..9c35aa98 100644 --- a/src/ARKServerManager/Globalization/en-US/en-US.xaml +++ b/src/ARKServerManager/Globalization/en-US/en-US.xaml @@ -624,6 +624,12 @@ The prefix that must be used when sending a command via discord. Get Token... Help... + Bot Whitelist + Bot ID + The id of the bot to whitelist. + Add Whitelist + Clear Whitelists + Delete Whitelist If enabled, the backup command can be sent from discord. If enabled, the restart command can be sent from discord. If enabled, the shutdown command can be sent from discord. diff --git a/src/ARKServerManager/UserControls/GlobalSettingsControl.xaml b/src/ARKServerManager/UserControls/GlobalSettingsControl.xaml index f9cc4b01..f0825055 100644 --- a/src/ARKServerManager/UserControls/GlobalSettingsControl.xaml +++ b/src/ARKServerManager/UserControls/GlobalSettingsControl.xaml @@ -591,6 +591,7 @@ + @@ -625,6 +626,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ARKServerManager/UserControls/GlobalSettingsControl.xaml.cs b/src/ARKServerManager/UserControls/GlobalSettingsControl.xaml.cs index 52c7114a..a7029e0f 100644 --- a/src/ARKServerManager/UserControls/GlobalSettingsControl.xaml.cs +++ b/src/ARKServerManager/UserControls/GlobalSettingsControl.xaml.cs @@ -5,13 +5,16 @@ using ServerManagerTool.Common.Lib; using ServerManagerTool.Common.Model; using ServerManagerTool.Common.Utils; using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Linq; using System.Reflection; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; +using System.Windows.Data; using System.Windows.Input; using System.Xml; using WPFSharp.Globalizer; @@ -24,12 +27,13 @@ namespace ServerManagerTool public partial class GlobalSettingsControl : UserControl { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - private GlobalizedApplication _globalizer = GlobalizedApplication.Instance; + private readonly GlobalizedApplication _globalizer = GlobalizedApplication.Instance; public static readonly DependencyProperty IsAdministratorProperty = DependencyProperty.Register(nameof(IsAdministrator), typeof(bool), typeof(GlobalSettingsControl), new PropertyMetadata(false)); public static readonly DependencyProperty ConfigProperty = DependencyProperty.Register(nameof(Config), typeof(Config), typeof(GlobalSettingsControl), new PropertyMetadata(null)); public static readonly DependencyProperty CommonConfigProperty = DependencyProperty.Register(nameof(CommonConfig), typeof(CommonConfig), typeof(GlobalSettingsControl), new PropertyMetadata(null)); public static readonly DependencyProperty WindowStatesProperty = DependencyProperty.Register(nameof(WindowStates), typeof(ComboBoxItemList), typeof(GlobalSettingsControl), new PropertyMetadata(null)); + public static readonly DependencyProperty DiscordBotWhitelistProperty = DependencyProperty.Register(nameof(DiscordBotWhitelist), typeof(List), typeof(GlobalSettingsControl), new PropertyMetadata(null)); public GlobalSettingsControl() { @@ -41,6 +45,15 @@ namespace ServerManagerTool PopulateWindowsStatesComboBox(); + DiscordBotWhitelist = new List(); + if (Config.DiscordBotWhitelist != null) + { + foreach (var item in Config.DiscordBotWhitelist) + { + DiscordBotWhitelist.Add(new DiscordBotWhitelist() { BotId = item }); + } + } + InitializeComponent(); WindowUtils.RemoveDefaultResourceDictionary(this, Config.Default.DefaultGlobalizationFile); @@ -77,6 +90,21 @@ namespace ServerManagerTool set { SetValue(WindowStatesProperty, value); } } + public List DiscordBotWhitelist + { + get { return (List)GetValue(DiscordBotWhitelistProperty); } + set { SetValue(DiscordBotWhitelistProperty, value); } + } + + public void ApplyChangesToConfig() + { + if (Config.DiscordBotWhitelist is null) + Config.DiscordBotWhitelist = new System.Collections.Specialized.StringCollection(); + + Config.DiscordBotWhitelist.Clear(); + Config.DiscordBotWhitelist.AddRange(DiscordBotWhitelist.Select(i => i.BotId).ToArray()); + } + private string GetDeployedVersion() { XmlDocument xmlDoc = new XmlDocument(); @@ -462,5 +490,35 @@ namespace ServerManagerTool this.WindowStateComboBox.SelectedValue = selectedValue; } } + + #region Discord Bot Whitelist + private void AddDiscordBotWhitelist_Click(object sender, RoutedEventArgs e) + { + DiscordBotWhitelist.Add(new DiscordBotWhitelist()); + + CollectionViewSource.GetDefaultView(DiscordBotWhitelistGrid.ItemsSource).Refresh(); + } + + private void ClearDiscordBotWhitelists_Click(object sender, RoutedEventArgs e) + { + if (MessageBox.Show(_globalizer.GetResourceString("ServerSettings_ClearLabel"), _globalizer.GetResourceString("ServerSettings_ClearTitle"), MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes) + return; + + DiscordBotWhitelist.Clear(); + + CollectionViewSource.GetDefaultView(DiscordBotWhitelistGrid.ItemsSource).Refresh(); + } + + private void RemoveDiscordBotWhitelist_Click(object sender, RoutedEventArgs e) + { + if (MessageBox.Show(_globalizer.GetResourceString("ServerSettings_DeleteLabel"), _globalizer.GetResourceString("ServerSettings_DeleteTitle"), MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes) + return; + + var item = ((DiscordBotWhitelist)((Button)e.Source).DataContext); + DiscordBotWhitelist.Remove(item); + + CollectionViewSource.GetDefaultView(DiscordBotWhitelistGrid.ItemsSource).Refresh(); + } + #endregion } } diff --git a/src/ARKServerManager/VersionFeed.xml b/src/ARKServerManager/VersionFeed.xml index ae217023..4082c2dd 100644 --- a/src/ARKServerManager/VersionFeed.xml +++ b/src/ARKServerManager/VersionFeed.xml @@ -9,13 +9,18 @@ urn:uuid:3E33DCB2-ECFE-4489-B1A4-56F5D386F9DC - 1.1.413 (1.1.413.1) - 1.1.413.1 + 1.1.413 (1.1.413.2) + 1.1.413.2 2021-12-16T00:00:00Z

+ NEW +
+

    +
  • Global Settings - Discord Bot section - Added a whitelist to allow bots to send commands to the server manager.
  • +
CHANGE
    diff --git a/src/ARKServerManager/VersionFeedBeta.xml b/src/ARKServerManager/VersionFeedBeta.xml index 6aa7c218..60775726 100644 --- a/src/ARKServerManager/VersionFeedBeta.xml +++ b/src/ARKServerManager/VersionFeedBeta.xml @@ -7,6 +7,29 @@ 2021-12-16T00:00:00Z + + urn:uuid:8958A494-DE13-4F6F-ACA2-10026D5FB8A9 + 1.1.413 (1.1.413.2) + 1.1.413.2 + + 2021-12-16T00:00:00Z + +
    +

    + NEW +
    +

      +
    • Global Settings - Discord Bot section - Added a whitelist to allow bots to send commands to the server manager.
    • +
    +

    +
    +
    + + bletch + bletch1971@hotmail.com + +
    + urn:uuid:3E33DCB2-ECFE-4489-B1A4-56F5D386F9DC 1.1.413 (1.1.413.1) diff --git a/src/ARKServerManager/Windows/SettingsWindow.xaml b/src/ARKServerManager/Windows/SettingsWindow.xaml index 19e1b951..f2826aa5 100644 --- a/src/ARKServerManager/Windows/SettingsWindow.xaml +++ b/src/ARKServerManager/Windows/SettingsWindow.xaml @@ -16,6 +16,6 @@ - + diff --git a/src/ARKServerManager/Windows/SettingsWindow.xaml.cs b/src/ARKServerManager/Windows/SettingsWindow.xaml.cs index 58c918b6..c1981589 100644 --- a/src/ARKServerManager/Windows/SettingsWindow.xaml.cs +++ b/src/ARKServerManager/Windows/SettingsWindow.xaml.cs @@ -22,6 +22,8 @@ namespace ServerManagerTool protected override void OnClosed(EventArgs e) { + globalSettingsControl.ApplyChangesToConfig(); + if (SecurityUtils.IsAdministrator()) { // check if the Auto Update has been enabled. diff --git a/src/ConanServerManager/App.config b/src/ConanServerManager/App.config index bd610257..b8f36415 100644 --- a/src/ConanServerManager/App.config +++ b/src/ConanServerManager/App.config @@ -615,6 +615,13 @@ 50 + + + + + + + \ No newline at end of file diff --git a/src/ConanServerManager/App.xaml.cs b/src/ConanServerManager/App.xaml.cs index 495ec5b6..c67324b3 100644 --- a/src/ConanServerManager/App.xaml.cs +++ b/src/ConanServerManager/App.xaml.cs @@ -10,6 +10,7 @@ using ServerManagerTool.Plugin.Common; using ServerManagerTool.Utils; using ServerManagerTool.Windows; using System; +using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.IO; @@ -474,7 +475,13 @@ namespace ServerManagerTool Task discordTask = Task.Run(async () => { - await ServerManagerBotFactory.GetServerManagerBot()?.StartAsync(Config.Default.DiscordBotToken,Config.Default.DiscordBotPrefix, Config.Default.DataPath, DiscordBotHelper.HandleDiscordCommand, DiscordBotHelper.HandleTranslation, _tokenSource.Token); + var discordWhiteList = new List(); + if (Config.Default.DiscordBotWhitelist != null) + { + discordWhiteList.AddRange(Config.Default.DiscordBotWhitelist.Cast()); + } + + await ServerManagerBotFactory.GetServerManagerBot()?.StartAsync(Config.Default.DiscordBotToken,Config.Default.DiscordBotPrefix, Config.Default.DataPath, discordWhiteList, DiscordBotHelper.HandleDiscordCommand, DiscordBotHelper.HandleTranslation, _tokenSource.Token); }, _tokenSource.Token) .ContinueWith(t => { var message = t.Exception.InnerException is null ? t.Exception.Message : t.Exception.InnerException.Message; diff --git a/src/ConanServerManager/Config.Designer.cs b/src/ConanServerManager/Config.Designer.cs index 994ba21a..241558af 100644 --- a/src/ConanServerManager/Config.Designer.cs +++ b/src/ConanServerManager/Config.Designer.cs @@ -2139,5 +2139,19 @@ namespace ServerManagerTool { this["ServerMonitorWindow_Top"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("\r\n\r\n \r\n")] + public global::System.Collections.Specialized.StringCollection DiscordBotWhitelist { + get { + return ((global::System.Collections.Specialized.StringCollection)(this["DiscordBotWhitelist"])); + } + set { + this["DiscordBotWhitelist"] = value; + } + } } } diff --git a/src/ConanServerManager/Config.settings b/src/ConanServerManager/Config.settings index 90cf58e4..3f8244fe 100644 --- a/src/ConanServerManager/Config.settings +++ b/src/ConanServerManager/Config.settings @@ -590,5 +590,11 @@ 50 + + <?xml version="1.0" encoding="utf-16"?> +<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <string /> +</ArrayOfString> + \ No newline at end of file diff --git a/src/ConanServerManager/Globalization/en-US/en-US.xaml b/src/ConanServerManager/Globalization/en-US/en-US.xaml index bbc06aad..92e1de83 100644 --- a/src/ConanServerManager/Globalization/en-US/en-US.xaml +++ b/src/ConanServerManager/Globalization/en-US/en-US.xaml @@ -782,6 +782,12 @@ The prefix that must be used when sending a command via discord. Get Token... Help... + Bot Whitelist + Bot ID + The id of the bot to whitelist. + Add Whitelist + Clear Whitelists + Delete Whitelist If enabled, the backup command can be sent from discord. If enabled, the restart command can be sent from discord. If enabled, the shutdown command can be sent from discord. diff --git a/src/ConanServerManager/UserControls/GlobalSettingsControl.xaml b/src/ConanServerManager/UserControls/GlobalSettingsControl.xaml index 1a6f3909..e85293d1 100644 --- a/src/ConanServerManager/UserControls/GlobalSettingsControl.xaml +++ b/src/ConanServerManager/UserControls/GlobalSettingsControl.xaml @@ -539,6 +539,7 @@ + @@ -573,6 +574,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ConanServerManager/UserControls/GlobalSettingsControl.xaml.cs b/src/ConanServerManager/UserControls/GlobalSettingsControl.xaml.cs index 19119725..8d2d1cd4 100644 --- a/src/ConanServerManager/UserControls/GlobalSettingsControl.xaml.cs +++ b/src/ConanServerManager/UserControls/GlobalSettingsControl.xaml.cs @@ -5,13 +5,16 @@ using ServerManagerTool.Common.Lib; using ServerManagerTool.Common.Model; using ServerManagerTool.Common.Utils; using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Linq; using System.Reflection; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; +using System.Windows.Data; using System.Windows.Input; using System.Xml; using WPFSharp.Globalizer; @@ -24,11 +27,12 @@ namespace ServerManagerTool public partial class GlobalSettingsControl : UserControl { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - private GlobalizedApplication _globalizer = GlobalizedApplication.Instance; + private readonly GlobalizedApplication _globalizer = GlobalizedApplication.Instance; public static readonly DependencyProperty AppInstanceProperty = DependencyProperty.Register(nameof(AppInstance), typeof(App), typeof(GlobalSettingsControl), new PropertyMetadata(null)); public static readonly DependencyProperty IsAdministratorProperty = DependencyProperty.Register(nameof(IsAdministrator), typeof(bool), typeof(GlobalSettingsControl), new PropertyMetadata(false)); public static readonly DependencyProperty WindowStatesProperty = DependencyProperty.Register(nameof(WindowStates), typeof(ComboBoxItemList), typeof(GlobalSettingsControl), new PropertyMetadata(null)); + public static readonly DependencyProperty DiscordBotWhitelistProperty = DependencyProperty.Register(nameof(DiscordBotWhitelist), typeof(List), typeof(GlobalSettingsControl), new PropertyMetadata(null)); public GlobalSettingsControl() { @@ -40,6 +44,15 @@ namespace ServerManagerTool PopulateWindowsStatesComboBox(); + DiscordBotWhitelist = new List(); + if (Config.DiscordBotWhitelist != null) + { + foreach (var item in Config.DiscordBotWhitelist) + { + DiscordBotWhitelist.Add(new DiscordBotWhitelist() { BotId = item }); + } + } + InitializeComponent(); WindowUtils.RemoveDefaultResourceDictionary(this, Config.Default.DefaultGlobalizationFile); @@ -82,6 +95,21 @@ namespace ServerManagerTool set; } + public List DiscordBotWhitelist + { + get { return (List)GetValue(DiscordBotWhitelistProperty); } + set { SetValue(DiscordBotWhitelistProperty, value); } + } + + public void ApplyChangesToConfig() + { + if (Config.DiscordBotWhitelist is null) + Config.DiscordBotWhitelist = new System.Collections.Specialized.StringCollection(); + + Config.DiscordBotWhitelist.Clear(); + Config.DiscordBotWhitelist.AddRange(DiscordBotWhitelist.Select(i => i.BotId).ToArray()); + } + private string GetDeployedVersion() { XmlDocument xmlDoc = new XmlDocument(); @@ -471,5 +499,35 @@ namespace ServerManagerTool this.WindowStateComboBox.SelectedValue = selectedValue; } } + + #region Discord Bot Whitelist + private void AddDiscordBotWhitelist_Click(object sender, RoutedEventArgs e) + { + DiscordBotWhitelist.Add(new DiscordBotWhitelist()); + + CollectionViewSource.GetDefaultView(DiscordBotWhitelistGrid.ItemsSource).Refresh(); + } + + private void ClearDiscordBotWhitelists_Click(object sender, RoutedEventArgs e) + { + if (MessageBox.Show(_globalizer.GetResourceString("ServerSettings_ClearLabel"), _globalizer.GetResourceString("ServerSettings_ClearTitle"), MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes) + return; + + DiscordBotWhitelist.Clear(); + + CollectionViewSource.GetDefaultView(DiscordBotWhitelistGrid.ItemsSource).Refresh(); + } + + private void RemoveDiscordBotWhitelist_Click(object sender, RoutedEventArgs e) + { + if (MessageBox.Show(_globalizer.GetResourceString("ServerSettings_DeleteLabel"), _globalizer.GetResourceString("ServerSettings_DeleteTitle"), MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes) + return; + + var item = ((DiscordBotWhitelist)((Button)e.Source).DataContext); + DiscordBotWhitelist.Remove(item); + + CollectionViewSource.GetDefaultView(DiscordBotWhitelistGrid.ItemsSource).Refresh(); + } + #endregion } } diff --git a/src/ConanServerManager/VersionFeed.xml b/src/ConanServerManager/VersionFeed.xml index 3ff402f6..d84ed2ad 100644 --- a/src/ConanServerManager/VersionFeed.xml +++ b/src/ConanServerManager/VersionFeed.xml @@ -9,13 +9,18 @@ urn:uuid:19B09A66-43F2-4D5F-AF33-5C77D7EA9A6B - 1.1.58 (1.1.58.1) - 1.1.58.1 + 1.1.58 (1.1.58.2) + 1.1.58.2 2021-12-16T00:00:00Z

    + NEW +
    +

      +
    • Global Settings - Discord Bot section - Added a whitelist to allow bots to send commands to the server manager.
    • +
    CHANGE
      diff --git a/src/ConanServerManager/VersionFeedBeta.xml b/src/ConanServerManager/VersionFeedBeta.xml index 37767523..1cd4d40f 100644 --- a/src/ConanServerManager/VersionFeedBeta.xml +++ b/src/ConanServerManager/VersionFeedBeta.xml @@ -7,6 +7,29 @@ 2021-12-16T00:00:00Z + + urn:uuid:C566D9D2-3566-46DF-8AD4-39F5FC0FFEF2 + 1.1.58 (1.1.58.2) + 1.1.58.2 + + 2021-12-16T00:00:00Z + +
      +

      + NEW +
      +

        +
      • Global Settings - Discord Bot section - Added a whitelist to allow bots to send commands to the server manager.
      • +
      +

      +
      +
      + + bletch + bletch1971@hotmail.com + +
      + urn:uuid:19B09A66-43F2-4D5F-AF33-5C77D7EA9A6B 1.1.58 (1.1.58.1) diff --git a/src/ConanServerManager/Windows/SettingsWindow.xaml.cs b/src/ConanServerManager/Windows/SettingsWindow.xaml.cs index d989298b..99005204 100644 --- a/src/ConanServerManager/Windows/SettingsWindow.xaml.cs +++ b/src/ConanServerManager/Windows/SettingsWindow.xaml.cs @@ -39,6 +39,8 @@ namespace ServerManagerTool protected override void OnClosed(EventArgs e) { + globalSettingsControl.ApplyChangesToConfig(); + if (SecurityUtils.IsAdministrator()) { // check if the Auto Update has been enabled. diff --git a/src/ServerManager.Common/Model/DiscordBotWhitelist.cs b/src/ServerManager.Common/Model/DiscordBotWhitelist.cs new file mode 100644 index 00000000..ea456fd9 --- /dev/null +++ b/src/ServerManager.Common/Model/DiscordBotWhitelist.cs @@ -0,0 +1,15 @@ +using System.Windows; + +namespace ServerManagerTool.Common.Model +{ + public class DiscordBotWhitelist : DependencyObject + { + public static readonly DependencyProperty BotIdProperty = DependencyProperty.Register(nameof(BotId), typeof(string), typeof(DiscordBotWhitelist), new PropertyMetadata("")); + + public string BotId + { + get { return (string)GetValue(BotIdProperty); } + set { SetValue(BotIdProperty, value); } + } + } +} diff --git a/src/ServerManager.Discord/Interfaces/IServerManagerBot.cs b/src/ServerManager.Discord/Interfaces/IServerManagerBot.cs index f44c1878..5206f7ed 100644 --- a/src/ServerManager.Discord/Interfaces/IServerManagerBot.cs +++ b/src/ServerManager.Discord/Interfaces/IServerManagerBot.cs @@ -1,4 +1,5 @@ using ServerManagerTool.DiscordBot.Delegates; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -8,6 +9,6 @@ namespace ServerManagerTool.DiscordBot.Interfaces { CancellationToken Token { get; } - Task StartAsync(string discordToken, string commandPrefix, string dataDirectory, HandleCommandDelegate handleCommandCallback, HandleTranslationDelegate handleTranslationCallback, CancellationToken token); + Task StartAsync(string discordToken, string commandPrefix, string dataDirectory, IEnumerable botWhitelist, HandleCommandDelegate handleCommandCallback, HandleTranslationDelegate handleTranslationCallback, CancellationToken token); } } diff --git a/src/ServerManager.Discord/Models/DiscordBotWhitelist.cs b/src/ServerManager.Discord/Models/DiscordBotWhitelist.cs new file mode 100644 index 00000000..4fb932b6 --- /dev/null +++ b/src/ServerManager.Discord/Models/DiscordBotWhitelist.cs @@ -0,0 +1,7 @@ +namespace ServerManagerTool.DiscordBot.Models +{ + public class DiscordBotWhitelist + { + public string BotId { get; set; } = string.Empty; + } +} diff --git a/src/ServerManager.Discord/Models/DiscordBotWhitelistConfig.cs b/src/ServerManager.Discord/Models/DiscordBotWhitelistConfig.cs new file mode 100644 index 00000000..bbb40957 --- /dev/null +++ b/src/ServerManager.Discord/Models/DiscordBotWhitelistConfig.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace ServerManagerTool.DiscordBot.Models +{ + public class DiscordBotWhitelistConfig + { + public List DiscordBotWhitelists { get; set; } = new List(); + } +} diff --git a/src/ServerManager.Discord/ServerManagerBot.cs b/src/ServerManager.Discord/ServerManagerBot.cs index 6c7f0d63..3390cbcc 100644 --- a/src/ServerManager.Discord/ServerManagerBot.cs +++ b/src/ServerManager.Discord/ServerManagerBot.cs @@ -7,6 +7,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using ServerManagerTool.DiscordBot.Delegates; using ServerManagerTool.DiscordBot.Interfaces; +using ServerManagerTool.DiscordBot.Models; using ServerManagerTool.DiscordBot.Services; using System; using System.Collections.Generic; @@ -27,7 +28,7 @@ namespace ServerManagerTool.DiscordBot public CancellationToken Token { get; private set; } public bool Started { get; private set; } - public async Task StartAsync(string discordToken, string commandPrefix, string dataDirectory, HandleCommandDelegate handleCommandCallback, HandleTranslationDelegate handleTranslationCallback, CancellationToken token) + public async Task StartAsync(string discordToken, string commandPrefix, string dataDirectory, IEnumerable botWhitelist, HandleCommandDelegate handleCommandCallback, HandleTranslationDelegate handleTranslationCallback, CancellationToken token) { if (Started) { @@ -91,6 +92,11 @@ namespace ServerManagerTool.DiscordBot #endif }; + var discordBotWhitelistConfig = new DiscordBotWhitelistConfig + { + DiscordBotWhitelists = new List ( botWhitelist.Select(i => new DiscordBotWhitelist { BotId = i }) ) + }; + // Build the service provider var services = new ServiceCollection() // Add the discord client to the service provider @@ -105,6 +111,7 @@ namespace ServerManagerTool.DiscordBot .AddSingleton() .AddSingleton() .AddSingleton(config) + .AddSingleton(discordBotWhitelistConfig) .AddSingleton(handleCommandCallback) .AddSingleton(handleTranslationCallback) .AddSingleton(this); diff --git a/src/ServerManager.Discord/Services/CommandHandlerService.cs b/src/ServerManager.Discord/Services/CommandHandlerService.cs index dcb2f917..60e7996b 100644 --- a/src/ServerManager.Discord/Services/CommandHandlerService.cs +++ b/src/ServerManager.Discord/Services/CommandHandlerService.cs @@ -1,7 +1,9 @@ using Discord.Commands; using Discord.WebSocket; using Microsoft.Extensions.Configuration; +using ServerManagerTool.DiscordBot.Models; using System; +using System.Linq; using System.Threading.Tasks; namespace ServerManagerTool.DiscordBot.Services @@ -12,14 +14,15 @@ namespace ServerManagerTool.DiscordBot.Services private readonly CommandService _commands; private readonly IConfigurationRoot _config; private readonly IServiceProvider _provider; + private readonly DiscordBotWhitelistConfig _botWhitelist; - public CommandHandlerService(DiscordSocketClient discord, CommandService commands, IConfigurationRoot config, IServiceProvider provider) + public CommandHandlerService(DiscordSocketClient discord, CommandService commands, IConfigurationRoot config, IServiceProvider provider, DiscordBotWhitelistConfig botWhitelist) { _discord = discord; _commands = commands; _config = config; _provider = provider; - + _botWhitelist = botWhitelist ?? new DiscordBotWhitelistConfig(); _discord.MessageReceived += OnMessageReceivedAsync; } @@ -38,8 +41,8 @@ namespace ServerManagerTool.DiscordBot.Services return; } - //Tell bot to ignore itself. - if (msg.Author.IsBot) + // Tell bot to ignore itself, unless on the whitelist + if (msg.Author.IsBot && !_botWhitelist.DiscordBotWhitelists.Any(b => b.BotId.Equals(msg.Author.Id))) { return; }