refactors adminmenu a timid amount (#5095)

Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
This commit is contained in:
Paul Ritter
2021-11-10 13:26:25 +01:00
committed by GitHub
parent 747f02f3f3
commit e74301a856
19 changed files with 306 additions and 236 deletions

View File

@@ -1,6 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Content.Client.Administration.Managers; using Content.Shared.Administration.Events;
using Content.Shared.Administration.Menu;
using Robust.Client.Graphics; using Robust.Client.Graphics;
using Robust.Client.ResourceManagement; using Robust.Client.ResourceManagement;
using Robust.Shared.Enums; using Robust.Shared.Enums;
@@ -11,16 +10,15 @@ namespace Content.Client.Administration
{ {
internal class AdminNameOverlay : Overlay internal class AdminNameOverlay : Overlay
{ {
private readonly AdminMenuManager _manager; private readonly AdminSystem _system;
private readonly IEntityManager _entityManager; private readonly IEntityManager _entityManager;
private readonly IEyeManager _eyeManager; private readonly IEyeManager _eyeManager;
private readonly IEntityLookup _entityLookup; private readonly IEntityLookup _entityLookup;
private IReadOnlyList<AdminMenuPlayerListMessage.PlayerInfo>? _playerInfos;
private readonly Font _font; private readonly Font _font;
public AdminNameOverlay(AdminMenuManager manager, IEntityManager entityManager, IEyeManager eyeManager, IResourceCache resourceCache, IEntityLookup entityLookup) public AdminNameOverlay(AdminSystem system, IEntityManager entityManager, IEyeManager eyeManager, IResourceCache resourceCache, IEntityLookup entityLookup)
{ {
_manager = manager; _system = system;
_entityManager = entityManager; _entityManager = entityManager;
_eyeManager = eyeManager; _eyeManager = eyeManager;
_entityLookup = entityLookup; _entityLookup = entityLookup;
@@ -30,21 +28,11 @@ namespace Content.Client.Administration
public override OverlaySpace Space => OverlaySpace.ScreenSpace; public override OverlaySpace Space => OverlaySpace.ScreenSpace;
public void UpdatePlayerInfo(List<AdminMenuPlayerListMessage.PlayerInfo> playerInfos)
{
_playerInfos = playerInfos;
}
protected override void Draw(in OverlayDrawArgs args) protected override void Draw(in OverlayDrawArgs args)
{ {
if (_playerInfos == null)
{
return;
}
var viewport = _eyeManager.GetWorldViewport(); var viewport = _eyeManager.GetWorldViewport();
foreach (var playerInfo in _playerInfos) foreach (var playerInfo in _system.PlayerList)
{ {
// Otherwise the entity can not exist yet // Otherwise the entity can not exist yet
if (!_entityManager.TryGetEntity(playerInfo.EntityUid, out var entity)) if (!_entityManager.TryGetEntity(playerInfo.EntityUid, out var entity))

View File

@@ -1,7 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Content.Client.Administration.Managers;
using Content.Client.Administration.UI; using Content.Client.Administration.UI;
using Content.Client.HUD; using Content.Client.HUD;
using Content.Shared.Administration.Menu;
using Content.Shared.Input; using Content.Shared.Input;
using Robust.Client.Console; using Robust.Client.Console;
using Robust.Client.Graphics; using Robust.Client.Graphics;
@@ -13,9 +13,9 @@ using Robust.Shared.Input.Binding;
using Robust.Shared.IoC; using Robust.Shared.IoC;
using Robust.Shared.Network; using Robust.Shared.Network;
namespace Content.Client.Administration.Managers namespace Content.Client.Administration
{ {
internal class AdminMenuManager : IAdminMenuManager public partial class AdminSystem
{ {
[Dependency] private readonly INetManager _netManager = default!; [Dependency] private readonly INetManager _netManager = default!;
[Dependency] private readonly IInputManager _inputManager = default!; [Dependency] private readonly IInputManager _inputManager = default!;
@@ -29,16 +29,10 @@ namespace Content.Client.Administration.Managers
[Dependency] private readonly IEntityLookup _entityLookup = default!; [Dependency] private readonly IEntityLookup _entityLookup = default!;
private AdminMenuWindow? _window; private AdminMenuWindow? _window;
private List<SS14Window> _commandWindows = new(); private readonly List<SS14Window> _commandWindows = new();
private AdminNameOverlay _adminNameOverlay = default!;
public void Initialize() private void InitializeMenu()
{ {
_netManager.RegisterNetMessage<AdminMenuPlayerListRequest>();
_netManager.RegisterNetMessage<AdminMenuPlayerListMessage>(HandlePlayerListMessage);
_commandWindows = new List<SS14Window>();
_adminNameOverlay = new AdminNameOverlay(this, _entityManager, _eyeManager, _resourceCache, _entityLookup);
// Reset the AdminMenu Window on disconnect // Reset the AdminMenu Window on disconnect
_netManager.Disconnect += (_, _) => ResetWindow(); _netManager.Disconnect += (_, _) => ResetWindow();
@@ -70,37 +64,19 @@ namespace Content.Client.Administration.Managers
_gameHud.AdminButtonDown = false; _gameHud.AdminButtonDown = false;
} }
private void RequestPlayerList()
{
var message = _netManager.CreateNetMessage<AdminMenuPlayerListRequest>();
_netManager.ClientSendMessage(message);
}
private void HandlePlayerListMessage(AdminMenuPlayerListMessage msg)
{
_window?.RefreshPlayerList(msg.PlayersInfo);
_adminNameOverlay.UpdatePlayerInfo(msg.PlayersInfo);
}
private void AdminNameOverlayOn()
{
if (!_overlayManager.HasOverlay<AdminNameOverlay>())
_overlayManager.AddOverlay(_adminNameOverlay);
}
private void AdminNameOverlayOff()
{
_overlayManager.RemoveOverlay<AdminNameOverlay>();
}
public void ResetWindow() public void ResetWindow()
{ {
_window?.Close(); _window?.Close();
_window?.Dispose();
_window = null; _window = null;
foreach (var window in _commandWindows) foreach (var window in _commandWindows)
window?.Dispose(); {
window.Close();
window.Dispose();
}
_commandWindows.Clear(); _commandWindows.Clear();
} }
@@ -113,9 +89,6 @@ namespace Content.Client.Administration.Managers
public void Open() public void Open()
{ {
_window ??= new AdminMenuWindow(); _window ??= new AdminMenuWindow();
_window.OnPlayerListRefresh += RequestPlayerList;
_window.OnAdminNameOverlayOn += AdminNameOverlayOn;
_window.OnAdminNameOverlayOff += AdminNameOverlayOff;
_window.OpenCentered(); _window.OpenCentered();
} }
@@ -158,14 +131,4 @@ namespace Content.Client.Administration.Managers
} }
} }
} }
internal interface IAdminMenuManager
{
void Initialize();
void Open();
void OpenCommand(SS14Window window);
bool CanOpen();
void TryOpen();
void Toggle();
}
} }

View File

@@ -0,0 +1,25 @@
using Robust.Client.UserInterface.Controls;
namespace Content.Client.Administration
{
public partial class AdminSystem
{
private AdminNameOverlay _adminNameOverlay = default!;
private void InitializeOverlay()
{
_adminNameOverlay = new AdminNameOverlay(this, _entityManager, _eyeManager, _resourceCache, _entityLookup);
}
public void AdminOverlayOn(BaseButton.ButtonEventArgs? _ = null)
{
if (!_overlayManager.HasOverlay<AdminNameOverlay>())
_overlayManager.AddOverlay(_adminNameOverlay);
}
public void AdminOverlayOff(BaseButton.ButtonEventArgs? _ = null)
{
_overlayManager.RemoveOverlay<AdminNameOverlay>();
}
}
}

View File

@@ -0,0 +1,67 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Content.Shared.Administration;
using Content.Shared.Administration.Events;
using Robust.Client.Player;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Log;
using Robust.Shared.Network;
using Robust.Shared.Players;
namespace Content.Client.Administration
{
public partial class AdminSystem : EntitySystem
{
[Dependency] private readonly IPlayerManager _playerManager = default!;
public event Action<List<PlayerInfo>>? PlayerListChanged;
private Dictionary<NetUserId, PlayerInfo>? _playerList;
public IReadOnlyList<PlayerInfo> PlayerList
{
get
{
if (_playerList != null) return _playerList.Values.ToList();
return new List<PlayerInfo>();
}
}
public override void Initialize()
{
base.Initialize();
InitializeOverlay();
InitializeMenu();
SubscribeNetworkEvent<FullPlayerListEvent>(OnPlayerListChanged);
SubscribeNetworkEvent<PlayerInfoChangedEvent>(OnPlayerInfoChanged);
SubscribeNetworkEvent<PlayerInfoRemovalMessage>(OnPlayerInfoRemoval);
}
private void OnPlayerInfoRemoval(PlayerInfoRemovalMessage ev)
{
if (_playerList == null) _playerList = new();
_playerList.Remove(ev.NetUserId);
PlayerListChanged?.Invoke(_playerList.Values.ToList());
}
private void OnPlayerInfoChanged(PlayerInfoChangedEvent ev)
{
if(ev.PlayerInfo == null) return;
if (_playerList == null) _playerList = new();
_playerList[ev.PlayerInfo.SessionId] = ev.PlayerInfo;
PlayerListChanged?.Invoke(_playerList.Values.ToList());
}
private void OnPlayerListChanged(FullPlayerListEvent msg)
{
_playerList = msg.PlayersInfo.ToDictionary(x => x.SessionId, x => x);
PlayerListChanged?.Invoke(msg.PlayersInfo);
}
}
}

View File

@@ -1,7 +1,5 @@
using System.Collections.Generic;
using Content.Client.Administration.UI.Tabs; using Content.Client.Administration.UI.Tabs;
using Content.Client.HUD; using Content.Client.HUD;
using Content.Shared.Administration.Menu;
using Robust.Client.AutoGenerated; using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML; using Robust.Client.UserInterface.XAML;
@@ -15,24 +13,6 @@ namespace Content.Client.Administration.UI
{ {
[Dependency] private readonly IGameHud? _gameHud = default!; [Dependency] private readonly IGameHud? _gameHud = default!;
public event PlayerTab.PlayerListRefresh? OnPlayerListRefresh
{
add => PlayerTabControl.OnPlayerListRefresh += value;
remove => PlayerTabControl.OnPlayerListRefresh -= value;
}
public event PlayerTab.AdminNameOverlayToggle? OnAdminNameOverlayOn
{
add => PlayerTabControl.OnAdminNameOverlayOn += value;
remove => PlayerTabControl.OnAdminNameOverlayOn -= value;
}
public event PlayerTab.AdminNameOverlayToggle? OnAdminNameOverlayOff
{
add => PlayerTabControl.OnAdminNameOverlayOff += value;
remove => PlayerTabControl.OnAdminNameOverlayOff -= value;
}
public AdminMenuWindow() public AdminMenuWindow()
{ {
MinSize = SetSize = (500, 250); MinSize = SetSize = (500, 250);
@@ -60,10 +40,5 @@ namespace Content.Client.Administration.UI
if (_gameHud != null) if (_gameHud != null)
_gameHud.AdminButtonDown = false; _gameHud.AdminButtonDown = false;
} }
public void RefreshPlayerList(IEnumerable<AdminMenuPlayerListMessage.PlayerInfo> players)
{
PlayerTabControl.RefreshPlayerList(players);
}
} }
} }

View File

@@ -1,9 +1,13 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Content.Shared.Administration;
using Content.Shared.Administration.Events;
using Robust.Client.AutoGenerated; using Robust.Client.AutoGenerated;
using Robust.Client.Player; using Robust.Client.Player;
using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC; using Robust.Shared.IoC;
using Robust.Shared.Players; using Robust.Shared.Players;
@@ -12,28 +16,31 @@ namespace Content.Client.Administration.UI.CustomControls
[GenerateTypedNameReferences] [GenerateTypedNameReferences]
public partial class PlayerListControl : BoxContainer public partial class PlayerListControl : BoxContainer
{ {
private List<ICommonSession>? _data; [Dependency] private readonly IPlayerManager _playerManager = default!;
private readonly AdminSystem _adminSystem;
public event Action<ICommonSession?>? OnSelectionChanged; public event Action<ICommonSession?>? OnSelectionChanged;
public PlayerListControl()
{
_adminSystem = EntitySystem.Get<AdminSystem>();
IoCManager.InjectDependencies(this);
RobustXamlLoader.Load(this);
}
protected override void EnteredTree() protected override void EnteredTree()
{ {
// Fill the Option data // Fill the Option data
_data = IoCManager.Resolve<IPlayerManager>().Sessions.OfType<ICommonSession>().ToList();
PopulateList(); PopulateList();
PlayerItemList.OnItemSelected += PlayerItemListOnOnItemSelected; PlayerItemList.OnItemSelected += PlayerItemListOnOnItemSelected;
PlayerItemList.OnItemDeselected += PlayerItemListOnOnItemDeselected; PlayerItemList.OnItemDeselected += PlayerItemListOnOnItemDeselected;
FilterLineEdit.OnTextChanged += FilterLineEditOnOnTextEntered; FilterLineEdit.OnTextChanged += FilterLineEditOnOnTextEntered;
_adminSystem.PlayerListChanged += PopulateList;
} }
private void FilterLineEditOnOnTextEntered(LineEdit.LineEditEventArgs obj) private void FilterLineEditOnOnTextEntered(LineEdit.LineEditEventArgs obj)
{ {
PopulateList(FilterLineEdit.Text); PopulateList();
}
private static string GetDisplayName(ICommonSession session)
{
return $"{session.Name} ({session.AttachedEntity?.Name})";
} }
private void PlayerItemListOnOnItemSelected(ItemList.ItemListSelectedEventArgs obj) private void PlayerItemListOnOnItemSelected(ItemList.ItemListSelectedEventArgs obj)
@@ -47,32 +54,24 @@ namespace Content.Client.Administration.UI.CustomControls
OnSelectionChanged?.Invoke(null); OnSelectionChanged?.Invoke(null);
} }
private void PopulateList(string? filter = null) private void PopulateList(IReadOnlyList<PlayerInfo> _ = null!)
{ {
// _data should never be null here
if (_data == null)
return;
PlayerItemList.Clear(); PlayerItemList.Clear();
foreach (var session in _data) foreach (var info in _adminSystem.PlayerList)
{ {
var displayName = GetDisplayName(session); var displayName = $"{info.CharacterName} ({info.Username})";
if (!string.IsNullOrEmpty(filter) && if (!string.IsNullOrEmpty(FilterLineEdit.Text) &&
!displayName.ToLowerInvariant().Contains(filter.Trim().ToLowerInvariant())) !displayName.ToLowerInvariant().Contains(FilterLineEdit.Text.Trim().ToLowerInvariant()))
{ {
continue; continue;
} }
PlayerItemList.Add(new ItemList.Item(PlayerItemList) PlayerItemList.Add(new ItemList.Item(PlayerItemList)
{ {
Metadata = session, Metadata = _playerManager.SessionsDict[info.SessionId],
Text = displayName Text = displayName
}); });
} }
} }
public void ClearSelection()
{
PlayerItemList.ClearSelected();
}
} }
} }

View File

@@ -5,6 +5,7 @@ using Robust.Client.ResourceManagement;
using Robust.Client.UserInterface; using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.CustomControls;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC; using Robust.Shared.IoC;
using Robust.Shared.Map; using Robust.Shared.Map;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
@@ -27,20 +28,18 @@ namespace Content.Client.Administration.UI.Tabs.AdminbusTab
private void SpawnEntitiesButtonOnOnPressed(BaseButton.ButtonEventArgs obj) private void SpawnEntitiesButtonOnOnPressed(BaseButton.ButtonEventArgs obj)
{ {
var manager = IoCManager.Resolve<IAdminMenuManager>();
_entitySpawnWindow ??= new EntitySpawnWindow(IoCManager.Resolve<IPlacementManager>(), _entitySpawnWindow ??= new EntitySpawnWindow(IoCManager.Resolve<IPlacementManager>(),
IoCManager.Resolve<IPrototypeManager>(), IoCManager.Resolve<IPrototypeManager>(),
IoCManager.Resolve<IResourceCache>()); IoCManager.Resolve<IResourceCache>());
manager.OpenCommand(_entitySpawnWindow); EntitySystem.Get<AdminSystem>().OpenCommand(_entitySpawnWindow);
} }
private void SpawnTilesButtonOnOnPressed(BaseButton.ButtonEventArgs obj) private void SpawnTilesButtonOnOnPressed(BaseButton.ButtonEventArgs obj)
{ {
var manager = IoCManager.Resolve<IAdminMenuManager>();
_tileSpawnWindow ??= new TileSpawnWindow(IoCManager.Resolve<ITileDefinitionManager>(), _tileSpawnWindow ??= new TileSpawnWindow(IoCManager.Resolve<ITileDefinitionManager>(),
IoCManager.Resolve<IPlacementManager>(), IoCManager.Resolve<IPlacementManager>(),
IoCManager.Resolve<IResourceCache>()); IoCManager.Resolve<IResourceCache>());
manager.OpenCommand(_tileSpawnWindow); EntitySystem.Get<AdminSystem>().OpenCommand(_tileSpawnWindow);
} }
} }
} }

View File

@@ -1,10 +1,8 @@
<Control xmlns="https://spacestation14.io"> <Control xmlns="https://spacestation14.io">
<BoxContainer Orientation="Vertical"> <BoxContainer Orientation="Vertical">
<BoxContainer Orientation="Horizontal"> <BoxContainer Orientation="Horizontal">
<Label Name="PlayerCount" HorizontalExpand="True" SizeFlagsStretchRatio="0.25" <Label Name="PlayerCount" HorizontalExpand="True" SizeFlagsStretchRatio="0.50"
Text="{Loc Player Count}" /> Text="{Loc Player Count}" />
<Button Name="RefreshButton" HorizontalExpand="True" SizeFlagsStretchRatio="0.25"
Text="{Loc Refresh}" />
<Button Name="OverlayButtonOn" HorizontalExpand="True" SizeFlagsStretchRatio="0.25" <Button Name="OverlayButtonOn" HorizontalExpand="True" SizeFlagsStretchRatio="0.25"
Text="{Loc Overlay On}"/> Text="{Loc Overlay On}"/>
<Button Name="OverlayButtonOff" HorizontalExpand="True" SizeFlagsStretchRatio="0.25" <Button Name="OverlayButtonOff" HorizontalExpand="True" SizeFlagsStretchRatio="0.25"

View File

@@ -1,12 +1,13 @@
 using System.Collections.Generic;
using System.Collections.Generic; using Content.Shared.Administration;
using Content.Shared.Administration.Menu; using Content.Shared.Administration.Events;
using Robust.Client.AutoGenerated; using Robust.Client.AutoGenerated;
using Robust.Client.Graphics; using Robust.Client.Graphics;
using Robust.Client.Player; using Robust.Client.Player;
using Robust.Client.UserInterface; using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML; using Robust.Client.UserInterface.XAML;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC; using Robust.Shared.IoC;
using Robust.Shared.Maths; using Robust.Shared.Maths;
using static Robust.Client.UserInterface.Controls.BoxContainer; using static Robust.Client.UserInterface.Controls.BoxContainer;
@@ -16,30 +17,28 @@ namespace Content.Client.Administration.UI.Tabs
[GenerateTypedNameReferences] [GenerateTypedNameReferences]
public partial class PlayerTab : Control public partial class PlayerTab : Control
{ {
public delegate void PlayerListRefresh(); private readonly AdminSystem _adminSystem;
public delegate void AdminNameOverlayToggle();
public event PlayerListRefresh? OnPlayerListRefresh;
public event AdminNameOverlayToggle? OnAdminNameOverlayOn;
public event AdminNameOverlayToggle? OnAdminNameOverlayOff;
public PlayerTab() public PlayerTab()
{ {
IoCManager.InjectDependencies(this); _adminSystem = EntitySystem.Get<AdminSystem>();
RobustXamlLoader.Load(this); RobustXamlLoader.Load(this);
RefreshButton.OnPressed += (_) => OnPlayerListRefresh?.Invoke(); RefreshPlayerList(_adminSystem.PlayerList);
OverlayButtonOn.OnPressed += (_) => OnAdminNameOverlayOn?.Invoke(); _adminSystem.PlayerListChanged += RefreshPlayerList;
OverlayButtonOff.OnPressed += (_) => OnAdminNameOverlayOff?.Invoke(); OverlayButtonOn.OnPressed += _adminSystem.AdminOverlayOn;
OverlayButtonOff.OnPressed += _adminSystem.AdminOverlayOff;
} }
protected override void EnteredTree() protected override void Dispose(bool disposing)
{ {
OnPlayerListRefresh?.Invoke(); base.Dispose(disposing);
_adminSystem.PlayerListChanged -= RefreshPlayerList;
OverlayButtonOn.OnPressed -= _adminSystem.AdminOverlayOn;
OverlayButtonOff.OnPressed -= _adminSystem.AdminOverlayOff;
} }
public void RefreshPlayerList(IEnumerable<AdminMenuPlayerListMessage.PlayerInfo> players) private void RefreshPlayerList(IReadOnlyList<PlayerInfo> players)
{ {
PlayerList.RemoveAllChildren(); PlayerList.RemoveAllChildren();
var playerManager = IoCManager.Resolve<IPlayerManager>(); var playerManager = IoCManager.Resolve<IPlayerManager>();

View File

@@ -178,7 +178,6 @@ namespace Content.Client.Entry
IoCManager.Resolve<ISandboxManager>().Initialize(); IoCManager.Resolve<ISandboxManager>().Initialize();
IoCManager.Resolve<IClientPreferencesManager>().Initialize(); IoCManager.Resolve<IClientPreferencesManager>().Initialize();
IoCManager.Resolve<IStationEventManager>().Initialize(); IoCManager.Resolve<IStationEventManager>().Initialize();
IoCManager.Resolve<IAdminMenuManager>().Initialize();
IoCManager.Resolve<EuiManager>().Initialize(); IoCManager.Resolve<EuiManager>().Initialize();
IoCManager.Resolve<AlertManager>().Initialize(); IoCManager.Resolve<AlertManager>().Initialize();
IoCManager.Resolve<ActionManager>().Initialize(); IoCManager.Resolve<ActionManager>().Initialize();

View File

@@ -38,7 +38,6 @@ namespace Content.Client.IoC
IoCManager.Register<IScreenshotHook, ScreenshotHook>(); IoCManager.Register<IScreenshotHook, ScreenshotHook>();
IoCManager.Register<IClickMapManager, ClickMapManager>(); IoCManager.Register<IClickMapManager, ClickMapManager>();
IoCManager.Register<IStationEventManager, StationEventManager>(); IoCManager.Register<IStationEventManager, StationEventManager>();
IoCManager.Register<IAdminMenuManager, AdminMenuManager>();
IoCManager.Register<AlertManager, AlertManager>(); IoCManager.Register<AlertManager, AlertManager>();
IoCManager.Register<ActionManager, ActionManager>(); IoCManager.Register<ActionManager, ActionManager>();
IoCManager.Register<IClientAdminManager, ClientAdminManager>(); IoCManager.Register<IClientAdminManager, ClientAdminManager>();

View File

@@ -0,0 +1,107 @@
using System;
using System.Linq;
using Content.Server.Administration.Managers;
using Content.Server.Players;
using Content.Shared.Administration;
using Content.Shared.Administration.Events;
using Robust.Server.GameObjects;
using Robust.Server.Player;
using Robust.Shared.Enums;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
namespace Content.Server.Administration
{
public class AdminSystem : EntitySystem
{
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IAdminManager _adminManager = default!;
public override void Initialize()
{
base.Initialize();
_playerManager.PlayerStatusChanged += OnPlayerStatusChanged;
SubscribeLocalEvent<PlayerAttachedEvent>(OnPlayerAttached);
SubscribeLocalEvent<PlayerDetachedEvent>(OnPlayerDetached);
}
private void OnPlayerDetached(PlayerDetachedEvent ev)
{
foreach (var admin in _adminManager.ActiveAdmins)
{
RaiseNetworkEvent(GetChangedEvent(ev.Player), admin.ConnectedClient);
}
}
private void OnPlayerAttached(PlayerAttachedEvent ev)
{
foreach (var admin in _adminManager.ActiveAdmins)
{
RaiseNetworkEvent(GetChangedEvent(ev.Player), admin.ConnectedClient);
}
}
public override void Shutdown()
{
base.Shutdown();
_playerManager.PlayerStatusChanged -= OnPlayerStatusChanged;
}
private PlayerInfoChangedEvent GetChangedEvent(IPlayerSession session)
{
return new()
{
PlayerInfo = new PlayerInfo(
session.Name, session.AttachedEntity?.Name ?? string.Empty,
session.ContentData()?.Mind?.AllRoles.Any(r => r.Antagonist) ?? false,
session.AttachedEntity?.Uid ?? EntityUid.Invalid,
session.UserId),
};
}
private void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e)
{
EntityEventArgs? args = null;
switch (e.NewStatus)
{
case SessionStatus.InGame:
case SessionStatus.Connected:
args = GetChangedEvent(e.Session);
break;
case SessionStatus.Disconnected:
args = new PlayerInfoRemovalMessage {NetUserId = e.Session.UserId};
break;
}
if(args == null) return;
foreach (var admin in _adminManager.ActiveAdmins)
{
RaiseNetworkEvent(args, admin.ConnectedClient);
}
if (e.NewStatus != SessionStatus.Disconnected && _adminManager.IsAdmin(e.Session))
{
SendFullPlayerList(e.Session);
}
}
private void SendFullPlayerList(IPlayerSession playerSession)
{
var ev = new FullPlayerListEvent();
ev.PlayersInfo.Clear();
foreach (var session in _playerManager.GetAllPlayers())
{
var name = session.Name;
var username = session.AttachedEntity?.Name ?? string.Empty;
var antag = session.ContentData()?.Mind?.AllRoles.Any(r => r.Antagonist) ?? false;
var uid = session.AttachedEntity?.Uid ?? EntityUid.Invalid;
ev.PlayersInfo.Add(new PlayerInfo(name, username, antag, uid, session.UserId));
}
RaiseNetworkEvent(ev, playerSession.ConnectedClient);
}
}
}

View File

@@ -7,9 +7,7 @@ using System.Threading.Tasks;
using Content.Server.Chat.Managers; using Content.Server.Chat.Managers;
using Content.Server.Database; using Content.Server.Database;
using Content.Server.Players; using Content.Server.Players;
using Content.Shared;
using Content.Shared.Administration; using Content.Shared.Administration;
using Content.Shared.Administration.Menu;
using Content.Shared.CCVar; using Content.Shared.CCVar;
using Robust.Server.Console; using Robust.Server.Console;
using Robust.Server.Player; using Robust.Server.Player;
@@ -17,7 +15,6 @@ using Robust.Shared.Configuration;
using Robust.Shared.Console; using Robust.Shared.Console;
using Robust.Shared.ContentPack; using Robust.Shared.ContentPack;
using Robust.Shared.Enums; using Robust.Shared.Enums;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC; using Robust.Shared.IoC;
using Robust.Shared.Localization; using Robust.Shared.Localization;
using Robust.Shared.Network; using Robust.Shared.Network;
@@ -172,8 +169,6 @@ namespace Content.Server.Administration.Managers
public void Initialize() public void Initialize()
{ {
_netMgr.RegisterNetMessage<MsgUpdateAdminStatus>(); _netMgr.RegisterNetMessage<MsgUpdateAdminStatus>();
_netMgr.RegisterNetMessage<AdminMenuPlayerListRequest>(HandlePlayerListRequest);
_netMgr.RegisterNetMessage<AdminMenuPlayerListMessage>();
// Cache permissions for loaded console commands with the requisite attributes. // Cache permissions for loaded console commands with the requisite attributes.
foreach (var (cmdName, cmd) in _consoleHost.RegisteredCommands) foreach (var (cmdName, cmd) in _consoleHost.RegisteredCommands)
@@ -234,32 +229,6 @@ namespace Content.Server.Administration.Managers
} }
} }
private void HandlePlayerListRequest(AdminMenuPlayerListRequest message)
{
var senderSession = _playerManager.GetSessionByChannel(message.MsgChannel);
if (!_admins.ContainsKey(senderSession))
{
return;
}
var netMsg = _netMgr.CreateNetMessage<AdminMenuPlayerListMessage>();
netMsg.PlayersInfo.Clear();
foreach (var session in _playerManager.GetAllPlayers())
{
var name = session.Name;
var username = session.AttachedEntity?.Name ?? string.Empty;
var antag = session.ContentData()?.Mind?.AllRoles.Any(r => r.Antagonist) ?? false;
var uid = session.AttachedEntity?.Uid ?? EntityUid.Invalid;
netMsg.PlayersInfo.Add(new AdminMenuPlayerListMessage.PlayerInfo(name, username, antag, uid));
}
_netMgr.ServerSendMessage(netMsg, senderSession.ConnectedClient);
}
public void PromoteHost(IPlayerSession player) public void PromoteHost(IPlayerSession player)
{ {
_promotedPlayers.Add(player.UserId); _promotedPlayers.Add(player.UserId);

View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using Robust.Shared.GameObjects;
using Robust.Shared.Serialization;
namespace Content.Shared.Administration.Events
{
[Serializable, NetSerializable]
public class FullPlayerListEvent : EntityEventArgs
{
public List<PlayerInfo> PlayersInfo = new();
}
}

View File

@@ -0,0 +1,12 @@
using System;
using Robust.Shared.GameObjects;
using Robust.Shared.Serialization;
namespace Content.Shared.Administration.Events
{
[NetSerializable, Serializable]
public class PlayerInfoChangedEvent : EntityEventArgs
{
public PlayerInfo? PlayerInfo;
}
}

View File

@@ -0,0 +1,13 @@
using System;
using Robust.Shared.GameObjects;
using Robust.Shared.Network;
using Robust.Shared.Serialization;
namespace Content.Shared.Administration.Events
{
[NetSerializable, Serializable]
public class PlayerInfoRemovalMessage : EntityEventArgs
{
public NetUserId NetUserId;
}
}

View File

@@ -1,47 +0,0 @@
using System.Collections.Generic;
using System.Diagnostics;
using Lidgren.Network;
using Robust.Shared.GameObjects;
using Robust.Shared.Network;
namespace Content.Shared.Administration.Menu
{
public class AdminMenuPlayerListMessage : NetMessage
{
public override MsgGroups MsgGroup => MsgGroups.Command;
public List<PlayerInfo> PlayersInfo = new();
public override void ReadFromBuffer(NetIncomingMessage buffer)
{
var count = buffer.ReadInt32();
PlayersInfo.Clear();
for (var i = 0; i < count; i++)
{
var username = buffer.ReadString();
var characterName = buffer.ReadString();
var antag = buffer.ReadBoolean();
var uid = buffer.ReadEntityUid();
PlayersInfo.Add(new PlayerInfo(username, characterName, antag, uid));
}
}
public override void WriteToBuffer(NetOutgoingMessage buffer)
{
buffer.Write(PlayersInfo.Count);
foreach (var player in PlayersInfo)
{
buffer.Write(player.Username);
buffer.Write(player.CharacterName);
buffer.Write(player.Antag);
buffer.Write(player.EntityUid);
}
}
public record PlayerInfo(string Username, string CharacterName, bool Antag, EntityUid EntityUid);
}
}

View File

@@ -1,18 +0,0 @@
using Lidgren.Network;
using Robust.Shared.Network;
namespace Content.Shared.Administration.Menu
{
public class AdminMenuPlayerListRequest : NetMessage
{
public override MsgGroups MsgGroup => MsgGroups.Command;
public override void ReadFromBuffer(NetIncomingMessage buffer)
{
}
public override void WriteToBuffer(NetOutgoingMessage buffer)
{
}
}
}

View File

@@ -0,0 +1,10 @@
using System;
using Robust.Shared.GameObjects;
using Robust.Shared.Network;
using Robust.Shared.Serialization;
namespace Content.Shared.Administration
{
[Serializable, NetSerializable]
public record PlayerInfo(string Username, string CharacterName, bool Antag, EntityUid EntityUid, NetUserId SessionId);
}