diff --git a/Content.Client/Administration/UI/Tabs/AdminTab/AdminTab.xaml b/Content.Client/Administration/UI/Tabs/AdminTab/AdminTab.xaml
index 083d214773..acff024586 100644
--- a/Content.Client/Administration/UI/Tabs/AdminTab/AdminTab.xaml
+++ b/Content.Client/Administration/UI/Tabs/AdminTab/AdminTab.xaml
@@ -3,7 +3,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cc="clr-namespace:Content.Client.Administration.UI.CustomControls"
xmlns:at="clr-namespace:Content.Client.Administration.UI.Tabs.AdminTab"
- xmlns:wd="clr-namespace:Content.Client._White.Administration"
+ xmlns:wd="clr-namespace:Content.Client._White.Administration.HoursPanelSystems"
Margin="4"
MinSize="50 50">
diff --git a/Content.Client/_White/Administration/HoursPanel.xaml b/Content.Client/_White/Administration/HoursPanelSystems/HoursPanel.xaml
similarity index 96%
rename from Content.Client/_White/Administration/HoursPanel.xaml
rename to Content.Client/_White/Administration/HoursPanelSystems/HoursPanel.xaml
index 6ea7218d98..65f75b1ba6 100644
--- a/Content.Client/_White/Administration/HoursPanel.xaml
+++ b/Content.Client/_White/Administration/HoursPanelSystems/HoursPanel.xaml
@@ -14,6 +14,7 @@
+
diff --git a/Content.Client/_White/Administration/HoursPanel.xaml.cs b/Content.Client/_White/Administration/HoursPanelSystems/HoursPanel.xaml.cs
similarity index 65%
rename from Content.Client/_White/Administration/HoursPanel.xaml.cs
rename to Content.Client/_White/Administration/HoursPanelSystems/HoursPanel.xaml.cs
index c51cedc28d..46b7fea751 100644
--- a/Content.Client/_White/Administration/HoursPanel.xaml.cs
+++ b/Content.Client/_White/Administration/HoursPanelSystems/HoursPanel.xaml.cs
@@ -7,8 +7,12 @@ using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes;
using static Robust.Client.UserInterface.Controls.LineEdit;
+using Content.Shared._White.Administration;
+using Robust.Client.UserInterface.Controls;
+using System.Diagnostics.CodeAnalysis;
+using Robust.Client.Graphics.Clyde;
-namespace Content.Client._White.Administration;
+namespace Content.Client._White.Administration.HoursPanelSystems;
[GenerateTypedNameReferences]
[UsedImplicitly]
@@ -17,18 +21,48 @@ public sealed partial class HoursPanel : DefaultWindow
public HoursPanel()
{
RobustXamlLoader.Load(this);
+
+ var entityManager = IoCManager.Resolve();
+ var hoursPanelSystem = entityManager.System();
+ hoursPanelSystem.Panel = this;
var roles = new Dictionary();
PlayerNameLine.OnTextChanged += _ => OnNamesChanged();
+ PlayerNameLine.OnTextEntered += _ => OnNameSubmited(hoursPanelSystem, roles);
PlayerList.OnSelectionChanged += OnPlayerSelectionChanged;
HourButton.OnPressed += _ => AddMinutes(60);
MinutesLine.OnTextChanged += UpdateButtonsText;
- RoleOption.OnItemSelected += args => RoleOption.SelectId(args.Id);
- SubmitButton.OnPressed += _ => OnSubmitButtonOnPressed(roles);
+ RoleOption.OnItemSelected += args => OnItemSelected(args, hoursPanelSystem, roles);
+ SubmitButton.OnPressed += _ => OnSubmitButtonOnPressed(roles, hoursPanelSystem);
SaveButton.OnPressed += _ => OnSaveButtonOnPressed();
OnNamesChanged();
InitRoleList(roles);
}
+ public void UpdateTime(TimeSpan? time)
+ {
+ if (time != null)
+ {
+ var t = (TimeSpan) time;
+ TimeDisplayer.Text = $"Время игры: {Math.Floor(t.TotalHours) + string.Format(" ч {0:%m} м", t)}";
+ }
+ else
+ TimeDisplayer.Text = $"Время игры: нет данных";
+ }
+
+ private void OnItemSelected(OptionButton.ItemSelectedEventArgs args, HoursPanelSystem owner, Dictionary roles)
+ {
+ RoleOption.SelectId(args.Id);
+ OnNameSubmited(owner, roles);
+ }
+
+ private void OnNameSubmited(HoursPanelSystem owner, Dictionary roles)
+ {
+ if (string.IsNullOrWhiteSpace(PlayerNameLine.Text))
+ return;
+
+ owner.SendPlayerTimeRequest(new HoursPanelMessageToServer(PlayerNameLine.Text, roles[RoleOption.SelectedId]));
+ }
+
private void InitRoleList(Dictionary roles)
{
var roleInd = 0;
@@ -88,11 +122,13 @@ public sealed partial class HoursPanel : DefaultWindow
OnNamesChanged();
}
- private void OnSubmitButtonOnPressed(Dictionary roles)
+ private void OnSubmitButtonOnPressed(Dictionary roles, HoursPanelSystem owner)
{
IoCManager.Resolve().ExecuteCommand(
$"playtime_addrole {PlayerNameLine.Text} {roles[RoleOption.SelectedId]} {MinutesLine.Text}");
SaveButton.Disabled = false;
+
+ owner.SendPlayerTimeRequest(new HoursPanelMessageToServer(PlayerNameLine.Text, roles[RoleOption.SelectedId]));
}
private void OnSaveButtonOnPressed()
diff --git a/Content.Client/_White/Administration/HoursPanelSystems/HoursPanelSystem.cs b/Content.Client/_White/Administration/HoursPanelSystems/HoursPanelSystem.cs
new file mode 100644
index 0000000000..20af3141e4
--- /dev/null
+++ b/Content.Client/_White/Administration/HoursPanelSystems/HoursPanelSystem.cs
@@ -0,0 +1,25 @@
+using Content.Shared._White.Administration;
+
+namespace Content.Client._White.Administration.HoursPanelSystems;
+
+public sealed class HoursPanelSystem : EntitySystem
+{
+ public HoursPanel? Panel;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeNetworkEvent(OnHoursPanelMessage);
+ }
+
+ private void OnHoursPanelMessage(HoursPanelMessageToClient message, EntitySessionEventArgs eventArgs)
+ {
+ Panel?.UpdateTime(message.Time);
+ }
+
+ public void SendPlayerTimeRequest(HoursPanelMessageToServer message)
+ {
+ RaiseNetworkEvent(message);
+ }
+}
diff --git a/Content.Server/_White/Administration/HoursPanelSystem.cs b/Content.Server/_White/Administration/HoursPanelSystem.cs
new file mode 100644
index 0000000000..bedb6f1ef2
--- /dev/null
+++ b/Content.Server/_White/Administration/HoursPanelSystem.cs
@@ -0,0 +1,40 @@
+using Content.Shared._White.Administration;
+using Robust.Server.Player;
+using Content.Server.Players.PlayTimeTracking;
+
+namespace Content.Server._White.Administration;
+
+public sealed class HoursPanelSystem : EntitySystem
+{
+ [Dependency] private readonly IPlayerManager _playerManager = default!;
+ [Dependency] private readonly IPlayTimeTrackingManager _playTimeTracking = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeNetworkEvent(OnHoursPanelMessage);
+ }
+
+ private void OnHoursPanelMessage(HoursPanelMessageToServer message, EntitySessionEventArgs eventArgs)
+ {
+ if (!_playerManager.TryGetSessionByUsername(message.PlayerCKey, out var player))
+ return;
+
+ if (player == null)
+ return;
+
+ TimeSpan timer;
+
+ if (message.Job == "Overall")
+ {
+ timer = _playTimeTracking.GetOverallPlaytime(player!);
+ }
+ else
+ {
+ timer = _playTimeTracking.GetPlayTimeForTracker(player!, message.Job);
+ }
+
+ RaiseNetworkEvent(new HoursPanelMessageToClient(timer));
+ }
+}
diff --git a/Content.Shared/_White/Administration/HoursPanelSystem/HoursPanelMessages.cs b/Content.Shared/_White/Administration/HoursPanelSystem/HoursPanelMessages.cs
new file mode 100644
index 0000000000..40062487bf
--- /dev/null
+++ b/Content.Shared/_White/Administration/HoursPanelSystem/HoursPanelMessages.cs
@@ -0,0 +1,25 @@
+using Robust.Shared.Serialization;
+
+namespace Content.Shared._White.Administration;
+
+[Serializable, NetSerializable]
+public sealed class HoursPanelMessageToServer : EntityEventArgs
+{
+ public string PlayerCKey { get; }
+ public string Job { get; }
+ public HoursPanelMessageToServer(string playerCKey, string job)
+ {
+ PlayerCKey = playerCKey;
+ Job = job;
+ }
+}
+
+[Serializable, NetSerializable]
+public sealed class HoursPanelMessageToClient : EntityEventArgs
+{
+ public TimeSpan Time { get; }
+ public HoursPanelMessageToClient(TimeSpan time)
+ {
+ Time = time;
+ }
+}