AdminNotesSystem.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System.Linq;
  2. using Content.Server.Administration.Commands;
  3. using Content.Server.Chat.Managers;
  4. using Content.Server.EUI;
  5. using Content.Shared.Database;
  6. using Content.Shared.Verbs;
  7. using Robust.Server.Player;
  8. using Robust.Shared.Console;
  9. using Robust.Shared.Enums;
  10. using Robust.Shared.Player;
  11. using Robust.Shared.Utility;
  12. namespace Content.Server.Administration.Notes;
  13. public sealed class AdminNotesSystem : EntitySystem
  14. {
  15. [Dependency] private readonly IConsoleHost _console = default!;
  16. [Dependency] private readonly IAdminNotesManager _notes = default!;
  17. [Dependency] private readonly IPlayerManager _playerManager = default!;
  18. [Dependency] private readonly IChatManager _chat = default!;
  19. [Dependency] private readonly EuiManager _euis = default!;
  20. public override void Initialize()
  21. {
  22. SubscribeLocalEvent<GetVerbsEvent<Verb>>(AddVerbs);
  23. _playerManager.PlayerStatusChanged += OnPlayerStatusChanged;
  24. }
  25. private void AddVerbs(GetVerbsEvent<Verb> ev)
  26. {
  27. if (EntityManager.GetComponentOrNull<ActorComponent>(ev.User) is not {PlayerSession: var user} ||
  28. EntityManager.GetComponentOrNull<ActorComponent>(ev.Target) is not {PlayerSession: var target})
  29. {
  30. return;
  31. }
  32. if (!_notes.CanView(user))
  33. {
  34. return;
  35. }
  36. var verb = new Verb
  37. {
  38. Text = Loc.GetString("admin-notes-verb-text"),
  39. Category = VerbCategory.Admin,
  40. Icon = new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/VerbIcons/examine.svg.192dpi.png")),
  41. Act = () => _console.RemoteExecuteCommand(user, $"{OpenAdminNotesCommand.CommandName} \"{target.UserId}\""),
  42. Impact = LogImpact.Low
  43. };
  44. ev.Verbs.Add(verb);
  45. }
  46. private async void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e)
  47. {
  48. if (e.NewStatus != SessionStatus.InGame)
  49. return;
  50. var messages = await _notes.GetNewMessages(e.Session.UserId);
  51. var watchlists = await _notes.GetActiveWatchlists(e.Session.UserId);
  52. if (!_playerManager.TryGetPlayerData(e.Session.UserId, out var playerData))
  53. {
  54. Log.Error($"Could not get player data for ID {e.Session.UserId}");
  55. }
  56. var username = playerData?.UserName ?? e.Session.UserId.ToString();
  57. foreach (var watchlist in watchlists)
  58. {
  59. _chat.SendAdminAlert(Loc.GetString("admin-notes-watchlist", ("player", username), ("message", watchlist.Message)));
  60. }
  61. var messagesToShow = messages.OrderBy(x => x.CreatedAt).Where(x => !x.Dismissed).ToArray();
  62. if (messagesToShow.Length == 0)
  63. return;
  64. var ui = new AdminMessageEui(messagesToShow);
  65. _euis.OpenEui(ui, e.Session);
  66. }
  67. }