diff --git a/PlayerManagement/TailgrabPannel.xaml b/PlayerManagement/TailgrabPannel.xaml
index ddbc8f4..be3cff0 100644
--- a/PlayerManagement/TailgrabPannel.xaml
+++ b/PlayerManagement/TailgrabPannel.xaml
@@ -2,7 +2,7 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Tailgrab Player Panel"
- Width="900" Height="520"
+ Width="990" Height="520"
FontFamily="Segoe UI"
Language="en-US"
WindowStartupLocation="CenterOwner"
@@ -88,6 +88,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -172,6 +185,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PlayerManagement/TailgrabPannel.xaml.cs b/PlayerManagement/TailgrabPannel.xaml.cs
index bd0b454..beee0d6 100644
--- a/PlayerManagement/TailgrabPannel.xaml.cs
+++ b/PlayerManagement/TailgrabPannel.xaml.cs
@@ -181,6 +181,49 @@ private void GridViewColumnHeader_Click(object sender, RoutedEventArgs e)
UpdateHeaderSortIndicator(header, view, property);
}
+ private void CopyPlayer_Click(object sender, RoutedEventArgs e)
+ {
+ if (sender is not System.Windows.Controls.Button btn) return;
+
+ // Find the DataContext for the row (should be PlayerViewModel)
+ if (btn.DataContext is PlayerViewModel pvm)
+ {
+ // Try to find the underlying Player by UserId
+ var player = PlayerManager.GetPlayerByUserId(pvm.UserId);
+ if (player == null)
+ {
+ // Build formatted string from the viewmodel alone
+ var sb = new System.Text.StringBuilder();
+ sb.AppendLine($"DisplayName: {pvm.DisplayName}");
+ sb.AppendLine($"UserId: {pvm.UserId}");
+ sb.AppendLine($"AvatarName: {pvm.AvatarName}");
+ sb.AppendLine($"InstanceStart: {pvm.InstanceStartTime}");
+ sb.AppendLine($"InstanceEnd: {pvm.InstanceEndTime}");
+ var text = sb.ToString();
+ System.Windows.Clipboard.SetText(text);
+ return;
+ }
+
+ var sb2 = new System.Text.StringBuilder();
+ sb2.AppendLine($"DisplayName: {player.DisplayName}");
+ sb2.AppendLine($"UserId: {player.UserId}");
+ sb2.AppendLine($"AvatarName: { (string.IsNullOrEmpty(player.AvatarName) ? string.Empty : player.AvatarName) }");
+ sb2.AppendLine($"InstanceStart: {player.InstanceStartTime:u}");
+ sb2.AppendLine($"InstanceEnd: { (player.InstanceEndTime.HasValue ? player.InstanceEndTime.Value.ToString("u") : string.Empty) }");
+
+ if (player.Events != null && player.Events.Count > 0)
+ {
+ sb2.AppendLine("Events:");
+ foreach (var ev in player.Events)
+ {
+ sb2.AppendLine($" - {ev.EventTime:u} {ev.Type} {ev.EventDescription}");
+ }
+ }
+
+ System.Windows.Clipboard.SetText(sb2.ToString());
+ }
+ }
+
private static T? FindAncestor(DependencyObject? child) where T : DependencyObject
{
if (child == null) return null;
diff --git a/config.json b/config.json
index 3695eff..c040163 100644
--- a/config.json
+++ b/config.json
@@ -70,39 +70,7 @@
"pattern": "([\\d]{4}.[\\d]{2}.[\\d]{2}\\W[\\d]{2}:[\\d]{2}:[\\d]{2})\\W(Log[\\W]{8}|Debug[\\W]{6})-\\W\\W\\[ModerationManager\\] A vote kick has been initiated against ([\\S\\W]+), do you agree",
"logOutput": true,
"logOutputColor": "Default",
- "actions": [
- {
- "actionTypeValue": "KeyPressAction",
- "windowTitle": "Voicemod",
- "keys": "%{f}"
- },
- {
- "actionTypeValue": "OSCAction",
- "parameterName": "/avatar/parameters/Ear/Right_Angle",
- "oscValueType": "Float",
- "value": "20.0"
- },
- {
- "actionTypeValue": "DelayAction",
- "milliseconds": 500
- },
- {
- "actionTypeValue": "OSCAction",
- "parameterName": "/avatar/parameters/Ear/Right_Angle",
- "oscValueType": "Float",
- "value": "0.0"
- },
- {
- "actionTypeValue": "KeyPressAction",
- "windowTitle": "OBS 64",
- "keys": "^{F8}"
- },
- {
- "actionTypeValue": "KeyPressAction",
- "windowTitle": "VRChat",
- "keys": "^{F12}"
- }
- ]
+ "actions": []
},
{
"handlerTypeValue": "WarnKick",
diff --git a/regular-expressions.txt b/regular-expressions.txt
deleted file mode 100644
index 25843e2..0000000
--- a/regular-expressions.txt
+++ /dev/null
@@ -1 +0,0 @@
-\[AssetBundleDownloadManager\] [\d+] Unpacking Avatar
diff --git a/tailgrab.csproj b/tailgrab.csproj
index f0b5af4..e0cea0e 100644
--- a/tailgrab.csproj
+++ b/tailgrab.csproj
@@ -7,9 +7,9 @@
true
true
enable
- 1.0.4.1041
- 1.0.4.1041
- 1.0.4.1041-beta
+ 1.0.5.1059
+ 1.0.5.1059
+ 1.0.5.1059-beta