Skip to content

Commit c14750a

Browse files
committed
Option to edit random attack event names. Fix for player list becoming inaccurate. Fix for not being able to check for updates on some SteamCMD installs.
1 parent 01c5d4f commit c14750a

10 files changed

+386
-48
lines changed

DiscordWebhookEventNamesWindow.xaml

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<Window x:Class="ValheimServerWarden.DiscordWebhookEventNamesWindow"
2+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6+
xmlns:local="clr-namespace:ValheimServerWarden"
7+
mc:Ignorable="d"
8+
xmlns:ui="http://schemas.modernwpf.com/2019"
9+
ui:WindowHelper.UseModernWindowStyle="True"
10+
Title="Discord Webhook Event Names" Height="Auto" SizeToContent="Height" Width="350">
11+
<Window.Resources>
12+
<BitmapImage x:Key="Remove" UriSource="Resources/Remove_32x.png" />
13+
</Window.Resources>
14+
<Grid x:Name="gridMain">
15+
<Grid.RowDefinitions>
16+
<RowDefinition Height="Auto"/>
17+
<RowDefinition Height="Auto"/>
18+
</Grid.RowDefinitions>
19+
<Grid x:Name="gridNames" Grid.Row="0" Height="Auto">
20+
<Grid.RowDefinitions>
21+
<RowDefinition Height="Auto"/>
22+
</Grid.RowDefinitions>
23+
<Grid.ColumnDefinitions>
24+
<ColumnDefinition Width="Auto"/>
25+
<ColumnDefinition Width="*"/>
26+
<ColumnDefinition Width="Auto"/>
27+
</Grid.ColumnDefinitions>
28+
<Label Content="Event key" Margin="10" VerticalAlignment="Center" Grid.Row="0" Grid.Column="0"/>
29+
<Grid Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2">
30+
<Grid.ColumnDefinitions>
31+
<ColumnDefinition Width="*"/>
32+
<ColumnDefinition Width="Auto"/>
33+
</Grid.ColumnDefinitions>
34+
<Label Content="Event name" Margin="10" VerticalAlignment="Center" Grid.Column="0"/>
35+
<Button x:Name="btnAddEvent" ToolTip="Add event" Margin="10" Grid.Column="1" Click="btnAddEvent_Click">
36+
<Button.Content>
37+
<Image Source="Resources/Add_32x.png"/>
38+
</Button.Content>
39+
</Button>
40+
</Grid>
41+
</Grid>
42+
<Grid x:Name="gridButtons" Grid.Row="1" Grid.ColumnSpan="2">
43+
<Grid.ColumnDefinitions>
44+
<ColumnDefinition Width="*"/>
45+
<ColumnDefinition Width="Auto"/>
46+
<ColumnDefinition Width="Auto"/>
47+
<ColumnDefinition Width="*"/>
48+
</Grid.ColumnDefinitions>
49+
<Button x:Name="btnSave" Content="Save" Margin="10" Grid.Column="1" Click="btnSave_Click"/>
50+
<Button x:Name="btnCancel" Content="Cancel" Margin="10" Grid.Column="2" Click="btnCancel_Click"/>
51+
</Grid>
52+
</Grid>
53+
</Window>
+164
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Collections.Specialized;
4+
using System.Diagnostics;
5+
using System.Linq;
6+
using System.Text;
7+
using System.Threading.Tasks;
8+
using System.Windows;
9+
using System.Windows.Controls;
10+
using System.Windows.Data;
11+
using System.Windows.Documents;
12+
using System.Windows.Input;
13+
using System.Windows.Media;
14+
using System.Windows.Media.Imaging;
15+
using System.Windows.Shapes;
16+
17+
namespace ValheimServerWarden
18+
{
19+
/// <summary>
20+
/// Interaction logic for DiscordWebhookEventNamesWindow.xaml
21+
/// </summary>
22+
public partial class DiscordWebhookEventNamesWindow : Window
23+
{
24+
private ValheimServer Server { get; set; }
25+
private Dictionary<string, string> DefaultNames {get; set;}
26+
private Dictionary<string, string> CustomNames { get; set; }
27+
private List<TextBox> nameTextBoxes;
28+
private List<string> removeKeys;
29+
public DiscordWebhookEventNamesWindow(ValheimServer server)
30+
{
31+
InitializeComponent();
32+
Server = server;
33+
nameTextBoxes = new();
34+
removeKeys = new();
35+
DefaultNames = ValheimServer.DiscordWebhookDefaultAttackNames;
36+
CustomNames = Server.DiscordServerEventNames;
37+
var combinedNames = new SortedDictionary<string,string>();
38+
foreach (string key in CustomNames.Keys)
39+
{
40+
combinedNames.Add(key, CustomNames[key]);
41+
}
42+
foreach (string key in DefaultNames.Keys)
43+
{
44+
if (!combinedNames.ContainsKey(key))
45+
{
46+
combinedNames.Add(key, DefaultNames[key]);
47+
}
48+
}
49+
foreach (string key in combinedNames.Keys)
50+
{
51+
addEventRow(key, combinedNames[key]);
52+
}
53+
}
54+
55+
private void addEventRow(string key, string name)
56+
{
57+
if (key == null) key = "";
58+
if (Name == null) Name = "";
59+
var txtName = new TextBox();
60+
txtName.Margin = new Thickness(5);
61+
txtName.Text = name;
62+
txtName.SetValue(Grid.RowProperty, gridNames.RowDefinitions.Count);
63+
txtName.SetValue(Grid.ColumnProperty, 1);
64+
nameTextBoxes.Add(txtName);
65+
66+
var txtKey = new TextBox();
67+
txtKey.Margin = new Thickness(5);
68+
txtKey.Text = key;
69+
txtKey.Tag = key;
70+
txtKey.IsReadOnly = DefaultNames.ContainsKey(key);
71+
txtKey.SetValue(Grid.RowProperty, gridNames.RowDefinitions.Count);
72+
txtKey.SetValue(Grid.ColumnProperty, 0);
73+
txtName.Tag = txtKey;
74+
75+
gridNames.Children.Add(txtKey);
76+
gridNames.Children.Add(txtName);
77+
if (!DefaultNames.ContainsKey(key))
78+
{
79+
var btnRemove = new Button();
80+
var image = new Image();
81+
image.Source = (BitmapImage)FindResource("Remove");
82+
btnRemove.Content = image;
83+
btnRemove.ToolTip = "Remove custom event name";
84+
btnRemove.Margin = new Thickness(5);
85+
btnRemove.Tag = txtName;
86+
btnRemove.SetValue(Grid.RowProperty, gridNames.RowDefinitions.Count);
87+
btnRemove.SetValue(Grid.ColumnProperty, 2);
88+
btnRemove.Click += (sender, args) =>
89+
{
90+
var button = (Button)sender;
91+
var txtName = (TextBox)button.Tag;
92+
var txtKey = (TextBox)txtName.Tag;
93+
nameTextBoxes.Remove(txtName);
94+
gridNames.Children.Remove(txtKey);
95+
gridNames.Children.Remove(txtName);
96+
gridNames.Children.Remove(button);
97+
if (Server.DiscordServerEventNames.ContainsKey(txtKey.Tag.ToString()))
98+
{
99+
if (!removeKeys.Contains(txtKey.Tag.ToString()))
100+
{
101+
removeKeys.Add(txtKey.Tag.ToString());
102+
}
103+
}
104+
};
105+
gridNames.Children.Add(btnRemove);
106+
}
107+
108+
var rowDef = new RowDefinition();
109+
rowDef.Height = GridLength.Auto;
110+
gridNames.RowDefinitions.Add(rowDef);
111+
}
112+
private void addEventRow()
113+
{
114+
addEventRow(null, null);
115+
}
116+
117+
private void btnCancel_Click(object sender, RoutedEventArgs e)
118+
{
119+
Close();
120+
}
121+
122+
private void btnSave_Click(object sender, RoutedEventArgs e)
123+
{
124+
foreach (var removekey in removeKeys)
125+
{
126+
if (Server.DiscordServerEventNames.ContainsKey(removekey))
127+
{
128+
Server.DiscordServerEventNames.Remove(removekey);
129+
}
130+
}
131+
foreach (var txtName in nameTextBoxes)
132+
{
133+
var key = ((TextBox)txtName.Tag).Text;
134+
var oldkey = ((TextBox)txtName.Tag).Tag.ToString();
135+
var name = txtName.Text;
136+
if (!ValheimServer.DiscordWebhookDefaultAttackNames.ContainsKey(key) || (ValheimServer.DiscordWebhookDefaultAttackNames.ContainsKey(key) && ValheimServer.DiscordWebhookDefaultAttackNames[key] != name))
137+
{
138+
if (key == "") continue;
139+
if (Server.DiscordServerEventNames.ContainsKey(key))
140+
{
141+
Server.DiscordServerEventNames[key] = name;
142+
}
143+
else
144+
{
145+
Server.DiscordServerEventNames.Add(key, name);
146+
}
147+
if (key != oldkey && Server.DiscordServerEventNames.ContainsKey(oldkey))
148+
{
149+
Server.DiscordServerEventNames.Remove(oldkey);
150+
}
151+
}
152+
else if (ValheimServer.DiscordWebhookDefaultAttackNames.ContainsKey(key) && Server.DiscordServerEventNames.ContainsKey(key))
153+
{
154+
Server.DiscordServerEventNames.Remove(key);
155+
}
156+
}
157+
Close();
158+
}
159+
private void btnAddEvent_Click(object sender, RoutedEventArgs e)
160+
{
161+
addEventRow();
162+
}
163+
}
164+
}

DiscordWebhookWindow.xaml

+15-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
xmlns:ui="http://schemas.modernwpf.com/2019"
99
ui:WindowHelper.UseModernWindowStyle="True"
1010
Title="Discord Webhook" Height="Auto" Width="800" SizeToContent="Height">
11+
<Window.Resources>
12+
<Image x:Key="Edit" Source="Resources/Edit_32x.png"/>
13+
<Image x:Key="Cancel" Source="Resources/Cancel_32x.png"/>
14+
</Window.Resources>
1115
<Grid>
1216
<Grid.RowDefinitions>
1317
<RowDefinition Height="Auto"/>
@@ -53,7 +57,17 @@
5357
<TextBox x:Name="txtOnFailedPassword" Tag="OnFailedPassword" Margin="5" Grid.Row="9" Grid.Column="1" />
5458
<Button x:Name="btnFailedPassword" Content="Test" Tag="OnFailedPassword" Margin="0,5,10,5" VerticalAlignment="Center" Grid.Row="9" Grid.Column="2" Click="btnTestWebhook_Click"/>
5559
<Label Content="Random Event" Margin="10,5,5,5" VerticalAlignment="Center" Grid.Row="10" Grid.Column="0"/>
56-
<TextBox x:Name="txtOnRandomServerEvent" Tag="OnRandomServerEvent" Margin="5" Grid.Row="10" Grid.Column="1" />
60+
<TextBox x:Name="txtOnRandomServerEvent" Tag="OnRandomServerEvent" Margin="5" Grid.Row="10" Grid.Column="1">
61+
<TextBox.ContextMenu>
62+
<ContextMenu>
63+
<MenuItem x:Name="menuServerEventNames" Header="Edit random event names" Click="menuServerEventNames_Click">
64+
<MenuItem.Icon>
65+
<Image Source="Resources/Edit_32x.png"/>
66+
</MenuItem.Icon>
67+
</MenuItem>
68+
</ContextMenu>
69+
</TextBox.ContextMenu>
70+
</TextBox>
5771
<Button x:Name="btnRandomServerEvent" Content="Test" Tag="OnRandomServerEvent" Margin="0,5,10,5" VerticalAlignment="Center" Grid.Row="10" Grid.Column="2" Click="btnTestWebhook_Click"/>
5872
<Grid Grid.Row="11" Grid.ColumnSpan="3" HorizontalAlignment="Center">
5973
<Grid.ColumnDefinitions>

DiscordWebhookWindow.xaml.cs

+37-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public partial class DiscordWebhookWindow : Window
2424
private ValheimServer _server;
2525
private List<TextBox> messageControls;
2626
private TextBox clickedTextBox;
27+
private MenuItem menuEditNames;
2728
public DiscordWebhookWindow(ValheimServer server)
2829
{
2930
InitializeComponent();
@@ -36,7 +37,13 @@ public DiscordWebhookWindow(ValheimServer server)
3637
var defaultMenu = new MenuItem();
3738
contextMenu.Items.Add(defaultMenu);
3839
defaultMenu.Header = "Reset to default";
40+
defaultMenu.Icon = FindResource("Cancel");
3941
defaultMenu.Click += DefaultMenu_Click;
42+
menuEditNames = new MenuItem();
43+
contextMenu.Items.Add(menuEditNames);
44+
menuEditNames.Header = "Edit random event names";
45+
menuEditNames.Icon = FindResource("Edit");
46+
menuEditNames.Click += MenuEditNames_Click;
4047

4148
messageControls = new();
4249
messageControls.Add(txtOnPlayerConnected);
@@ -55,9 +62,25 @@ public DiscordWebhookWindow(ValheimServer server)
5562
}
5663
}
5764

65+
private void MenuEditNames_Click(object sender, RoutedEventArgs e)
66+
{
67+
var win = new DiscordWebhookEventNamesWindow(_server);
68+
win.Owner = this;
69+
win.WindowStartupLocation = WindowStartupLocation.CenterOwner;
70+
win.ShowDialog();
71+
}
72+
5873
private void TextBox_ContextMenuOpening(object sender, ContextMenuEventArgs e)
5974
{
6075
clickedTextBox = (TextBox)sender;
76+
if (clickedTextBox.Tag.ToString() == "OnRandomServerEvent")
77+
{
78+
menuEditNames.Visibility = Visibility.Visible;
79+
}
80+
else
81+
{
82+
menuEditNames.Visibility = Visibility.Collapsed;
83+
}
6184
}
6285

6386
private void DefaultMenu_Click(object sender, RoutedEventArgs e)
@@ -90,13 +113,26 @@ private void btnTestWebhook_Click(object sender, RoutedEventArgs e)
90113
{
91114
var oldUrl = _server.DiscordWebhook;
92115
_server.DiscordWebhook = txtWebhook.Text;
93-
_server.SendDiscordWebhook(((Button)sender).Tag.ToString(), new Player("Bjorn", "123456789101112"), "army_bonemass");
116+
var events = (ValheimServer.DiscordWebhookDefaultAttackNames.Keys).ToList<string>();
117+
foreach (var cust in _server.DiscordServerEventNames.Keys)
118+
{
119+
if (!events.Contains(cust))
120+
{
121+
events.Add(cust);
122+
}
123+
}
124+
_server.SendDiscordWebhook(((Button)sender).Tag.ToString(), new Player("Bjorn", "123456789101112"), events[(new Random()).Next(events.Count)]);
94125
_server.DiscordWebhook = oldUrl;
95126
}
96127

97128
private void btnCancel_Click(object sender, RoutedEventArgs e)
98129
{
99130
Close();
100131
}
132+
133+
private void menuServerEventNames_Click(object sender, RoutedEventArgs e)
134+
{
135+
136+
}
101137
}
102138
}

MainWindow.xaml.cs

+2
Original file line numberDiff line numberDiff line change
@@ -185,13 +185,15 @@ private void NotifyMenuQuit_Click(object sender, EventArgs e)
185185
private void NotifyIcon_Click(object sender, EventArgs e)
186186
{
187187
Show();
188+
Activate();
188189
WindowState = storedWindowState;
189190
}
190191
private void NotifyIcon_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e)
191192
{
192193
if (e.Button == System.Windows.Forms.MouseButtons.Left)
193194
{
194195
Show();
196+
Activate();
195197
WindowState = storedWindowState;
196198
}
197199
else

Resources/Edit_32x.png

1.49 KB
Loading

Resources/Remove_32x.png

200 Bytes
Loading

ServerDetailsWindow.xaml.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -800,7 +800,7 @@ public void ThemeUpdated()
800800

801801
private void menuSteamCmdCheckUpdate_Click(object sender, RoutedEventArgs e)
802802
{
803-
Server.CheckForUpdate();
803+
Server.CheckForUpdate(true);
804804
}
805805

806806
private void chkAutoUpdate_Checked(object sender, RoutedEventArgs e)

0 commit comments

Comments
 (0)