2020-10-30 16:06:48 +01:00
|
|
|
using Content.Shared.Administration;
|
2023-03-06 06:12:08 +13:00
|
|
|
using Content.Shared.Administration.Managers;
|
2020-10-30 16:06:48 +01:00
|
|
|
using Robust.Client.Console;
|
2023-03-06 06:12:08 +13:00
|
|
|
using Robust.Client.Player;
|
2024-03-06 02:43:51 +01:00
|
|
|
using Robust.Client.UserInterface;
|
2022-07-10 15:43:44 +02:00
|
|
|
using Robust.Shared.ContentPack;
|
2021-02-11 01:13:03 -08:00
|
|
|
using Robust.Shared.Network;
|
2023-10-28 09:59:53 +11:00
|
|
|
using Robust.Shared.Player;
|
2022-07-10 15:43:44 +02:00
|
|
|
using Robust.Shared.Utility;
|
2020-10-30 16:06:48 +01:00
|
|
|
|
2021-06-09 22:19:39 +02:00
|
|
|
namespace Content.Client.Administration.Managers
|
2020-10-30 16:06:48 +01:00
|
|
|
{
|
2023-03-06 06:12:08 +13:00
|
|
|
public sealed class ClientAdminManager : IClientAdminManager, IClientConGroupImplementation, IPostInjectInit, ISharedAdminManager
|
2020-10-30 16:06:48 +01:00
|
|
|
{
|
2023-03-06 06:12:08 +13:00
|
|
|
[Dependency] private readonly IPlayerManager _player = default!;
|
2020-10-30 16:06:48 +01:00
|
|
|
[Dependency] private readonly IClientNetManager _netMgr = default!;
|
|
|
|
|
[Dependency] private readonly IClientConGroupController _conGroup = default!;
|
2022-07-10 15:43:44 +02:00
|
|
|
[Dependency] private readonly IResourceManager _res = default!;
|
2024-02-13 22:48:39 +01:00
|
|
|
[Dependency] private readonly ILogManager _logManager = default!;
|
2024-03-06 02:43:51 +01:00
|
|
|
[Dependency] private readonly IUserInterfaceManager _userInterface = default!;
|
2020-10-30 16:06:48 +01:00
|
|
|
|
|
|
|
|
private AdminData? _adminData;
|
2020-11-27 11:00:49 +01:00
|
|
|
private readonly HashSet<string> _availableCommands = new();
|
2020-10-30 16:06:48 +01:00
|
|
|
|
2022-07-10 15:43:44 +02:00
|
|
|
private readonly AdminCommandPermissions _localCommandPermissions = new();
|
2024-02-13 22:48:39 +01:00
|
|
|
private ISawmill _sawmill = default!;
|
2022-07-10 15:43:44 +02:00
|
|
|
|
2020-11-01 23:55:55 +01:00
|
|
|
public event Action? AdminStatusUpdated;
|
|
|
|
|
|
2021-02-16 20:14:32 +01:00
|
|
|
public bool IsActive()
|
|
|
|
|
{
|
|
|
|
|
return _adminData?.Active ?? false;
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-30 16:06:48 +01:00
|
|
|
public bool HasFlag(AdminFlags flag)
|
|
|
|
|
{
|
|
|
|
|
return _adminData?.HasFlag(flag) ?? false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool CanCommand(string cmdName)
|
|
|
|
|
{
|
2022-07-10 15:43:44 +02:00
|
|
|
if (_adminData != null && _adminData.HasFlag(AdminFlags.Host))
|
|
|
|
|
{
|
|
|
|
|
// Host can execute all commands when connected.
|
|
|
|
|
// Kind of a shortcut to avoid pains during development.
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (_localCommandPermissions.CanCommand(cmdName, _adminData))
|
|
|
|
|
return true;
|
|
|
|
|
|
2020-10-30 16:06:48 +01:00
|
|
|
return _availableCommands.Contains(cmdName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool CanViewVar()
|
|
|
|
|
{
|
2021-12-18 14:16:34 +01:00
|
|
|
return CanCommand("vv");
|
2020-10-30 16:06:48 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool CanAdminPlace()
|
|
|
|
|
{
|
|
|
|
|
return _adminData?.CanAdminPlace() ?? false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool CanScript()
|
|
|
|
|
{
|
|
|
|
|
return _adminData?.CanScript() ?? false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool CanAdminMenu()
|
|
|
|
|
{
|
|
|
|
|
return _adminData?.CanAdminMenu() ?? false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Initialize()
|
|
|
|
|
{
|
2021-06-20 22:43:54 -07:00
|
|
|
_netMgr.RegisterNetMessage<MsgUpdateAdminStatus>(UpdateMessageRx);
|
2022-07-10 15:43:44 +02:00
|
|
|
|
|
|
|
|
// Load flags for engine commands, since those don't have the attributes.
|
2023-04-20 20:16:01 +10:00
|
|
|
if (_res.TryContentFileRead(new ResPath("/clientCommandPerms.yml"), out var efs))
|
2022-07-10 15:43:44 +02:00
|
|
|
{
|
|
|
|
|
_localCommandPermissions.LoadPermissionsFromStream(efs);
|
|
|
|
|
}
|
2020-10-30 16:06:48 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UpdateMessageRx(MsgUpdateAdminStatus message)
|
|
|
|
|
{
|
|
|
|
|
_availableCommands.Clear();
|
2021-12-13 16:45:49 +11:00
|
|
|
var host = IoCManager.Resolve<IClientConsoleHost>();
|
|
|
|
|
|
|
|
|
|
// Anything marked as Any we'll just add even if the server doesn't know about it.
|
2023-02-13 05:51:56 +13:00
|
|
|
foreach (var (command, instance) in host.AvailableCommands)
|
2021-12-13 16:45:49 +11:00
|
|
|
{
|
|
|
|
|
if (Attribute.GetCustomAttribute(instance.GetType(), typeof(AnyCommandAttribute)) == null) continue;
|
|
|
|
|
_availableCommands.Add(command);
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-30 16:06:48 +01:00
|
|
|
_availableCommands.UnionWith(message.AvailableCommands);
|
2024-02-13 22:48:39 +01:00
|
|
|
_sawmill.Debug($"Have {message.AvailableCommands.Length} commands available");
|
2020-10-30 16:06:48 +01:00
|
|
|
|
|
|
|
|
_adminData = message.Admin;
|
|
|
|
|
if (_adminData != null)
|
|
|
|
|
{
|
2020-11-10 21:30:20 +01:00
|
|
|
var flagsText = string.Join("|", AdminFlagsHelper.FlagsToNames(_adminData.Flags));
|
2024-02-13 22:48:39 +01:00
|
|
|
_sawmill.Info($"Updated admin status: {_adminData.Active}/{_adminData.Title}/{flagsText}");
|
2024-03-06 02:43:51 +01:00
|
|
|
|
|
|
|
|
if (_adminData.Active)
|
|
|
|
|
_userInterface.DebugMonitors.SetMonitor(DebugMonitor.Coords, true);
|
2020-10-30 16:06:48 +01:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2024-02-13 22:48:39 +01:00
|
|
|
_sawmill.Info("Updated admin status: Not admin");
|
2020-10-30 16:06:48 +01:00
|
|
|
}
|
2020-11-01 23:55:55 +01:00
|
|
|
|
|
|
|
|
AdminStatusUpdated?.Invoke();
|
2020-11-10 16:50:28 +01:00
|
|
|
ConGroupUpdated?.Invoke();
|
2020-10-30 16:06:48 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public event Action? ConGroupUpdated;
|
|
|
|
|
|
|
|
|
|
void IPostInjectInit.PostInject()
|
|
|
|
|
{
|
|
|
|
|
_conGroup.Implementation = this;
|
2024-02-13 22:48:39 +01:00
|
|
|
_sawmill = _logManager.GetSawmill("admin");
|
2020-10-30 16:06:48 +01:00
|
|
|
}
|
2023-03-06 06:12:08 +13:00
|
|
|
|
|
|
|
|
public AdminData? GetAdminData(EntityUid uid, bool includeDeAdmin = false)
|
|
|
|
|
{
|
2024-02-13 22:48:39 +01:00
|
|
|
return uid == _player.LocalEntity ? _adminData : null;
|
2023-03-06 06:12:08 +13:00
|
|
|
}
|
2023-08-22 21:27:41 +12:00
|
|
|
|
|
|
|
|
public AdminData? GetAdminData(ICommonSession session, bool includeDeAdmin = false)
|
|
|
|
|
{
|
2024-02-13 22:48:39 +01:00
|
|
|
if (_player.LocalUser == session.UserId)
|
2023-08-22 21:27:41 +12:00
|
|
|
return _adminData;
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
2023-10-12 15:45:04 -07:00
|
|
|
|
|
|
|
|
public AdminData? GetAdminData(bool includeDeAdmin = false)
|
|
|
|
|
{
|
2024-02-13 22:48:39 +01:00
|
|
|
if (_player.LocalSession is { } session)
|
2023-10-12 15:45:04 -07:00
|
|
|
return GetAdminData(session, includeDeAdmin);
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
2020-10-30 16:06:48 +01:00
|
|
|
}
|
|
|
|
|
}
|