Added Discord Bot Status and a button to Stop/Start the discord bot

This commit is contained in:
Brett Hewitson 2021-12-17 13:21:33 +10:00
parent a2b811972f
commit 13713b7092
18 changed files with 439 additions and 16 deletions

View file

@ -9,6 +9,7 @@
xmlns:cvr="clr-namespace:ServerManagerTool.Common.ValidationRules;assembly=ServerManager.Common"
xmlns:com="clr-namespace:ServerManagerTool.Common;assembly=ServerManager.Common"
xmlns:enum="clr-namespace:ServerManagerTool.Enums"
xmlns:bot="clr-namespace:ServerManagerTool.DiscordBot;assembly=ServerManager.Discord"
MinWidth="900" MinHeight="600" Width="1100" Height="900" Left="50" Top="50" WindowState="Normal"
Loaded="MainWindow_Loaded" SizeChanged="MainWindow_SizeChanged" StateChanged="MainWindow_StateChanged" LocationChanged="MainWindow_LocationChanged"
Name="Main" Icon="../Art/favicon.ico" Title="{DynamicResource MainWindow_Title}">
@ -128,6 +129,7 @@
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Label Grid.Row="0" Margin="0,-2,0,-3" Background="Transparent" Foreground="White" FontSize="11" Content="{DynamicResource MainWindow_TaskStatusLabel}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
@ -253,6 +255,61 @@
</Button.Style>
</Button>
</StackPanel>
<StackPanel Grid.Row="3" Orientation="Horizontal" VerticalAlignment="Center" Margin="5,0,0,0">
<Label Margin="0" Background="Transparent" Foreground="White" FontSize="10" Content="{DynamicResource MainWindow_DiscordBotStatusLabel}" VerticalAlignment="Center" HorizontalAlignment="Left"/>
<Label Margin="0" Background="Transparent" FontSize="10" Content="{Binding DiscordBotStateString}" VerticalAlignment="Center" HorizontalAlignment="Left">
<Label.Style>
<Style BasedOn="{StaticResource {x:Type Label}}" TargetType="{x:Type Label}">
<Setter Property="Foreground" Value="White"/>
<Style.Triggers>
<DataTrigger Binding="{Binding DiscordBotState}" Value="{x:Static bot:Enums.BotState.Disabled}">
<Setter Property="Foreground" Value="DarkRed"/>
</DataTrigger>
<DataTrigger Binding="{Binding DiscordBotState}" Value="{x:Static bot:Enums.BotState.Stopped}">
<Setter Property="Foreground" Value="White"/>
</DataTrigger>
<DataTrigger Binding="{Binding DiscordBotState}" Value="{x:Static bot:Enums.BotState.Running}">
<Setter Property="Foreground" Value="LightGreen"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Label.Style>
</Label>
<Button Margin="5,0,0,0" Padding="1" BorderThickness="1" BorderBrush="White" Click="DiscordBotTaskState_Click" VerticalAlignment="Center">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="#00AA00"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="Content" Value="{DynamicResource MainWindow_DiscordBotTaskStartLabel}"/>
<Setter Property="ToolTip" Value="{DynamicResource MainWindow_DiscordBotTaskStartTooltip}"/>
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding DiscordBotState}" Value="{x:Static bot:Enums.BotState.Stopped}"/>
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="#00AA00"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="Content" Value="{DynamicResource MainWindow_DiscordBotTaskStartLabel}"/>
<Setter Property="ToolTip" Value="{DynamicResource MainWindow_DiscordBotTaskStartTooltip}"/>
<Setter Property="Visibility" Value="Visible"/>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding DiscordBotState}" Value="{x:Static bot:Enums.BotState.Running}"/>
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="#AA8A00"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="Content" Value="{DynamicResource MainWindow_DiscordBotTaskStopLabel}"/>
<Setter Property="ToolTip" Value="{DynamicResource MainWindow_DiscordBotTaskStopTooltip}"/>
<Setter Property="Visibility" Value="Visible"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</StackPanel>
</Grid>
<Grid DockPanel.Dock="Top" VerticalAlignment="Top" Margin="10,0,10,0" HorizontalAlignment="Center">

View file

@ -30,6 +30,9 @@ namespace ServerManagerTool
private readonly GlobalizedApplication _globalizer = GlobalizedApplication.Instance;
private readonly ActionQueue versionChecker;
private readonly ActionQueue scheduledTaskChecker;
private readonly ActionQueue discordBotChecker;
private bool discordBotStateClicked = false;
public static readonly DependencyProperty AppInstanceProperty = DependencyProperty.Register(nameof(AppInstance), typeof(App), typeof(MainWindow), new PropertyMetadata(null));
public static readonly DependencyProperty ConfigProperty = DependencyProperty.Register(nameof(Config), typeof(Config), typeof(MainWindow), new PropertyMetadata(null));
@ -40,6 +43,8 @@ namespace ServerManagerTool
public static readonly DependencyProperty AutoUpdateStateProperty = DependencyProperty.Register(nameof(AutoUpdateState), typeof(Microsoft.Win32.TaskScheduler.TaskState), typeof(MainWindow), new PropertyMetadata(Microsoft.Win32.TaskScheduler.TaskState.Unknown));
public static readonly DependencyProperty AutoUpdateStateStringProperty = DependencyProperty.Register(nameof(AutoUpdateStateString), typeof(string), typeof(MainWindow), new PropertyMetadata(string.Empty));
public static readonly DependencyProperty AutoUpdateNextRunTimeProperty = DependencyProperty.Register(nameof(AutoUpdateNextRunTime), typeof(string), typeof(MainWindow), new PropertyMetadata(string.Empty));
public static readonly DependencyProperty DiscordBotStateProperty = DependencyProperty.Register(nameof(DiscordBotState), typeof(DiscordBot.Enums.BotState), typeof(MainWindow), new PropertyMetadata(DiscordBot.Enums.BotState.Unknown));
public static readonly DependencyProperty DiscordBotStateStringProperty = DependencyProperty.Register(nameof(DiscordBotStateString), typeof(string), typeof(MainWindow), new PropertyMetadata(string.Empty));
public static readonly DependencyProperty IsIpValidProperty = DependencyProperty.Register(nameof(IsIpValid), typeof(bool), typeof(MainWindow), new PropertyMetadata(false));
public static readonly DependencyProperty LatestServerManagerVersionProperty = DependencyProperty.Register(nameof(LatestServerManagerVersion), typeof(Version), typeof(MainWindow), new PropertyMetadata(new Version()));
public static readonly DependencyProperty NewServerManagerAvailableProperty = DependencyProperty.Register(nameof(NewServerManagerAvailable), typeof(bool), typeof(MainWindow), new PropertyMetadata(false));
@ -57,6 +62,7 @@ namespace ServerManagerTool
this.DataContext = this;
this.versionChecker = new ActionQueue();
this.scheduledTaskChecker = new ActionQueue();
this.discordBotChecker = new ActionQueue();
IsAdministrator = SecurityUtils.IsAdministrator();
if (!string.IsNullOrWhiteSpace(App.Instance.Title))
@ -139,6 +145,18 @@ namespace ServerManagerTool
set { SetValue(AutoUpdateNextRunTimeProperty, value); }
}
public DiscordBot.Enums.BotState DiscordBotState
{
get { return (DiscordBot.Enums.BotState)GetValue(DiscordBotStateProperty); }
set { SetValue(DiscordBotStateProperty, value); }
}
public string DiscordBotStateString
{
get { return (string)GetValue(DiscordBotStateStringProperty); }
set { SetValue(DiscordBotStateStringProperty, value); }
}
public bool IsAdministrator
{
get;
@ -191,6 +209,7 @@ namespace ServerManagerTool
this.versionChecker.PostAction(CheckForUpdates).DoNotWait();
this.scheduledTaskChecker.PostAction(CheckForScheduledTasks).DoNotWait();
this.discordBotChecker.PostAction(CheckForDiscordBot).DoNotWait();
}
private void MainWindow_LocationChanged(object sender, EventArgs e)
@ -254,6 +273,7 @@ namespace ServerManagerTool
this.Title = _globalizer.GetResourceString("MainWindow_Title");
this.scheduledTaskChecker.PostAction(CheckForScheduledTasks).DoNotWait();
this.discordBotChecker.PostAction(CheckForDiscordBot).DoNotWait();
}
private void PatchNotes_Click(object sender, RoutedEventArgs e)
@ -563,6 +583,36 @@ namespace ServerManagerTool
}
}
private async void DiscordBotTaskState_Click(object sender, RoutedEventArgs e)
{
if (discordBotStateClicked)
return;
discordBotStateClicked = true;
try
{
switch (DiscordBotState)
{
case DiscordBot.Enums.BotState.Stopped:
AppInstance.StartDiscordBot();
break;
case DiscordBot.Enums.BotState.Running:
AppInstance.StopDiscordBot();
break;
}
await Task.Delay(5000);
}
catch (Exception)
{
// Ignore.
}
finally
{
discordBotStateClicked = false;
}
}
public ICommand ShowWindowCommand
{
get
@ -654,8 +704,8 @@ namespace ServerManagerTool
this.AutoBackupState = backupState;
this.AutoUpdateState = updateState;
this.AutoBackupStateString = GetTaskStateString(AutoBackupState);
this.AutoUpdateStateString = GetTaskStateString(AutoUpdateState);
this.AutoBackupStateString = GetTaskSchedulerStateString(AutoBackupState);
this.AutoUpdateStateString = GetTaskSchedulerStateString(AutoUpdateState);
this.AutoBackupNextRunTime = backupnextRunTime == DateTime.MinValue ? string.Empty : $"{_globalizer.GetResourceString("MainWindow_TaskRunTimeLabel")} {backupnextRunTime:G}";
this.AutoUpdateNextRunTime = updatenextRunTime == DateTime.MinValue ? string.Empty : $"{_globalizer.GetResourceString("MainWindow_TaskRunTimeLabel")} {updatenextRunTime:G}";
@ -672,7 +722,46 @@ namespace ServerManagerTool
this.scheduledTaskChecker.PostAction(CheckForScheduledTasks).DoNotWait();
}
private string GetTaskStateString(Microsoft.Win32.TaskScheduler.TaskState taskState)
private async Task CheckForDiscordBot()
{
TaskUtils.RunOnUIThreadAsync(() =>
{
try
{
var botState = DiscordBot.Enums.BotState.Unknown;
if (AppInstance.DiscordBotStarted)
{
botState = DiscordBot.Enums.BotState.Running;
}
else
{
if (Config.DiscordBotEnabled)
{
botState = DiscordBot.Enums.BotState.Stopped;
}
else
{
botState = DiscordBot.Enums.BotState.Disabled;
}
}
this.DiscordBotState = botState;
this.DiscordBotStateString = GetDiscordBotStateString(botState);
Logger.Info($"{nameof(CheckForDiscordBot)} performed");
}
catch (Exception)
{
// Ignore.
}
}).DoNotWait();
await Task.Delay(Config.Default.DiscordBotStatusCheckTime * 1 * 1000);
this.discordBotChecker.PostAction(CheckForDiscordBot).DoNotWait();
}
private string GetTaskSchedulerStateString(Microsoft.Win32.TaskScheduler.TaskState taskState)
{
switch (taskState)
{
@ -691,6 +780,21 @@ namespace ServerManagerTool
}
}
private string GetDiscordBotStateString(DiscordBot.Enums.BotState botState)
{
switch (botState)
{
case DiscordBot.Enums.BotState.Disabled:
return _globalizer.GetResourceString("MainWindow_TaskStateDisabledLabel");
case DiscordBot.Enums.BotState.Running:
return _globalizer.GetResourceString("MainWindow_TaskStateRunningLabel");
case DiscordBot.Enums.BotState.Stopped:
return _globalizer.GetResourceString("MainWindow_TaskStateStoppedLabel");
default:
return _globalizer.GetResourceString("MainWindow_TaskStateUnknownLabel");
}
}
private async Task StartServerAsync(Server server)
{
if (server == null || server.Profile == null || server.Runtime == null || server.Runtime.Status != ServerStatus.Stopped)