Administration: Ahelp tabs (#5965)
This commit is contained in:
@@ -1,13 +1,17 @@
|
||||
#nullable enable
|
||||
using System.Text;
|
||||
using System.Linq;
|
||||
using Content.Client.Administration.Managers;
|
||||
using Content.Client.Administration.UI.CustomControls;
|
||||
using Content.Client.Administration.UI.Tabs.AdminTab;
|
||||
using Content.Shared.Administration;
|
||||
using Robust.Client.AutoGenerated;
|
||||
using Robust.Client.Player;
|
||||
using Robust.Client.Console;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
using Robust.Client.UserInterface.CustomControls;
|
||||
using Robust.Client.UserInterface.XAML;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.Network;
|
||||
using Robust.Shared.Utility;
|
||||
using Robust.Shared.IoC;
|
||||
|
||||
namespace Content.Client.Administration.UI
|
||||
{
|
||||
@@ -15,40 +19,140 @@ namespace Content.Client.Administration.UI
|
||||
/// This window connects to a BwoinkSystem channel. BwoinkSystem manages the rest.
|
||||
/// </summary>
|
||||
[GenerateTypedNameReferences]
|
||||
public partial class BwoinkWindow : SS14Window
|
||||
public partial class BwoinkWindow : DefaultWindow
|
||||
{
|
||||
[Dependency] private readonly IEntitySystemManager _systemManager = default!;
|
||||
[Dependency] private readonly IPlayerManager _playerManager = default!;
|
||||
[Dependency] private readonly IClientAdminManager _adminManager = default!;
|
||||
[Dependency] private readonly IClientConsoleHost _console = default!;
|
||||
|
||||
private readonly NetUserId _channelId;
|
||||
private readonly BwoinkSystem _bwoinkSystem;
|
||||
private PlayerInfo? _currentPlayer = default;
|
||||
|
||||
public BwoinkWindow(NetUserId userId, string channelName)
|
||||
public BwoinkWindow(BwoinkSystem bs)
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
IoCManager.InjectDependencies(this);
|
||||
_bwoinkSystem = bs;
|
||||
|
||||
_channelId = userId;
|
||||
Title = (_playerManager.LocalPlayer?.UserId == _channelId) ? "Admin Message" : channelName;
|
||||
_adminManager.AdminStatusUpdated += () => FixButtons();
|
||||
FixButtons();
|
||||
|
||||
SenderLineEdit.OnTextEntered += Input_OnTextEntered;
|
||||
ChannelSelector.OnSelectionChanged += sel =>
|
||||
{
|
||||
_currentPlayer = sel;
|
||||
if (sel is not null)
|
||||
{
|
||||
SwitchToChannel(sel.SessionId);
|
||||
Title = $"{sel.CharacterName} / {sel.Username}";
|
||||
}
|
||||
|
||||
foreach (var li in ChannelSelector.PlayerItemList)
|
||||
li.Text = FormatTabTitle(li);
|
||||
};
|
||||
|
||||
ChannelSelector.DecoratePlayer += (PlayerInfo pl, ItemList.Item li) =>
|
||||
{
|
||||
li.Text = FormatTabTitle(li, pl);
|
||||
};
|
||||
|
||||
ChannelSelector.SortKey = (PlayerInfo pl) =>
|
||||
{
|
||||
if (_bwoinkSystem.TryGetChannel(pl.SessionId, out var ch))
|
||||
{
|
||||
return ch.Unread;
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
|
||||
// ew
|
||||
Ban.OnPressed += _ =>
|
||||
{
|
||||
var bw = new BanWindow();
|
||||
bw.OnPlayerSelectionChanged(_currentPlayer);
|
||||
bw.Open();
|
||||
};
|
||||
|
||||
Kick.OnPressed += _ =>
|
||||
{
|
||||
// TODO: Reason field
|
||||
if (_currentPlayer is not null)
|
||||
_console.ExecuteCommand($"kick \"{_currentPlayer.Username}\"");
|
||||
};
|
||||
|
||||
Teleport.OnPressed += _ =>
|
||||
{
|
||||
if (_currentPlayer is not null)
|
||||
_console.ExecuteCommand($"tpto \"{_currentPlayer.Username}\"");
|
||||
};
|
||||
|
||||
Respawn.OnPressed += _ =>
|
||||
{
|
||||
if (_currentPlayer is not null)
|
||||
_console.ExecuteCommand($"respawn \"{_currentPlayer.Username}\"");
|
||||
};
|
||||
}
|
||||
|
||||
private void Input_OnTextEntered(LineEdit.LineEditEventArgs args)
|
||||
public void OnBwoink(NetUserId channel)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(args.Text))
|
||||
var open = IsOpen;
|
||||
Open();
|
||||
|
||||
ChannelSelector.Refresh();
|
||||
|
||||
if (!open)
|
||||
{
|
||||
var bwoink = _systemManager.GetEntitySystem<BwoinkSystem>();
|
||||
bwoink.Send(_channelId, args.Text);
|
||||
var pi = ChannelSelector
|
||||
.PlayerItemList
|
||||
.FirstOrDefault(i => ((PlayerInfo) i.Metadata!).SessionId == channel);
|
||||
|
||||
if (pi is not null)
|
||||
pi.Selected = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void FixButtons()
|
||||
{
|
||||
Ban.Visible = _adminManager.HasFlag(AdminFlags.Ban);
|
||||
Ban.Disabled = !Ban.Visible;
|
||||
|
||||
Kick.Visible = _adminManager.CanCommand("kick");
|
||||
Kick.Disabled = !Kick.Visible;
|
||||
|
||||
Teleport.Visible = _adminManager.CanCommand("tpto");
|
||||
Teleport.Disabled = !Teleport.Visible;
|
||||
|
||||
Respawn.Visible = _adminManager.CanCommand("respawn");
|
||||
Respawn.Disabled = !Respawn.Visible;
|
||||
}
|
||||
|
||||
private string FormatTabTitle(ItemList.Item li, PlayerInfo? pl = default)
|
||||
{
|
||||
pl ??= (PlayerInfo) li.Metadata!;
|
||||
var sb = new StringBuilder();
|
||||
sb.Append(pl.Connected ? '●' : '○');
|
||||
sb.Append(' ');
|
||||
if (_bwoinkSystem.TryGetChannel(pl.SessionId, out var panel) && panel.Unread > 0)
|
||||
{
|
||||
if (panel.Unread < 11)
|
||||
sb.Append(new Rune('➀' + (panel.Unread-1)));
|
||||
else
|
||||
sb.Append(new Rune(0x2639)); // ☹
|
||||
sb.Append(' ');
|
||||
}
|
||||
|
||||
SenderLineEdit.Clear();
|
||||
if (pl.Antag)
|
||||
sb.Append(new Rune(0x1F5E1)); // 🗡
|
||||
|
||||
sb.AppendFormat("\"{0}\"", pl.CharacterName)
|
||||
.Append(' ')
|
||||
.Append(pl.Username);
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
public void ReceiveLine(string text)
|
||||
public void SwitchToChannel(NetUserId ch)
|
||||
{
|
||||
var formatted = new FormattedMessage(1);
|
||||
formatted.AddMarkup(text);
|
||||
TextOutput.AddMessage(formatted);
|
||||
foreach (var bw in BwoinkArea.Children)
|
||||
bw.Visible = (bw as BwoinkPanel)?.ChannelId == ch;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user