AdminNotesEui.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. using Content.Server.Administration.Managers;
  2. using Content.Server.EUI;
  3. using Content.Shared.Administration.Notes;
  4. using Content.Shared.Database;
  5. using Content.Shared.Eui;
  6. using System.Linq;
  7. using System.Threading.Tasks;
  8. using Content.Server.Database;
  9. using Robust.Shared.Network;
  10. using static Content.Shared.Administration.Notes.AdminNoteEuiMsg;
  11. namespace Content.Server.Administration.Notes;
  12. public sealed class AdminNotesEui : BaseEui
  13. {
  14. [Dependency] private readonly IAdminManager _admins = default!;
  15. [Dependency] private readonly IAdminNotesManager _notesMan = default!;
  16. [Dependency] private readonly IPlayerLocator _locator = default!;
  17. public AdminNotesEui()
  18. {
  19. IoCManager.InjectDependencies(this);
  20. }
  21. private Guid NotedPlayer { get; set; }
  22. private string NotedPlayerName { get; set; } = string.Empty;
  23. private bool HasConnectedBefore { get; set; }
  24. private Dictionary<(int, NoteType), SharedAdminNote> Notes { get; set; } = new();
  25. public override async void Opened()
  26. {
  27. base.Opened();
  28. _admins.OnPermsChanged += OnPermsChanged;
  29. _notesMan.NoteAdded += NoteModified;
  30. _notesMan.NoteModified += NoteModified;
  31. _notesMan.NoteDeleted += NoteDeleted;
  32. }
  33. public override void Closed()
  34. {
  35. base.Closed();
  36. _admins.OnPermsChanged -= OnPermsChanged;
  37. _notesMan.NoteAdded -= NoteModified;
  38. _notesMan.NoteModified -= NoteModified;
  39. _notesMan.NoteDeleted -= NoteDeleted;
  40. }
  41. public override EuiStateBase GetNewState()
  42. {
  43. return new AdminNotesEuiState(
  44. NotedPlayerName,
  45. Notes,
  46. _notesMan.CanCreate(Player) && HasConnectedBefore,
  47. _notesMan.CanDelete(Player),
  48. _notesMan.CanEdit(Player)
  49. );
  50. }
  51. public override async void HandleMessage(EuiMessageBase msg)
  52. {
  53. base.HandleMessage(msg);
  54. switch (msg)
  55. {
  56. case CreateNoteRequest request:
  57. {
  58. if (!_notesMan.CanCreate(Player))
  59. {
  60. break;
  61. }
  62. if (string.IsNullOrWhiteSpace(request.Message))
  63. {
  64. break;
  65. }
  66. if (request.ExpiryTime is not null && request.ExpiryTime <= DateTime.UtcNow)
  67. {
  68. break;
  69. }
  70. await _notesMan.AddAdminRemark(Player, NotedPlayer, request.NoteType, request.Message, request.NoteSeverity, request.Secret, request.ExpiryTime);
  71. break;
  72. }
  73. case DeleteNoteRequest request:
  74. {
  75. if (!_notesMan.CanDelete(Player))
  76. {
  77. break;
  78. }
  79. await _notesMan.DeleteAdminRemark(request.Id, request.Type, Player);
  80. break;
  81. }
  82. case EditNoteRequest request:
  83. {
  84. if (!_notesMan.CanEdit(Player))
  85. {
  86. break;
  87. }
  88. if (string.IsNullOrWhiteSpace(request.Message))
  89. {
  90. break;
  91. }
  92. await _notesMan.ModifyAdminRemark(request.Id, request.Type, Player, request.Message, request.NoteSeverity, request.Secret, request.ExpiryTime);
  93. break;
  94. }
  95. }
  96. }
  97. public async Task ChangeNotedPlayer(Guid notedPlayer)
  98. {
  99. NotedPlayer = notedPlayer;
  100. await LoadFromDb();
  101. }
  102. private void NoteModified(SharedAdminNote note)
  103. {
  104. if (note.Player != NotedPlayer)
  105. return;
  106. Notes[(note.Id, note.NoteType)] = note;
  107. StateDirty();
  108. }
  109. private void NoteDeleted(SharedAdminNote note)
  110. {
  111. if (note.Player != NotedPlayer)
  112. return;
  113. Notes.Remove((note.Id, note.NoteType));
  114. StateDirty();
  115. }
  116. private async Task LoadFromDb()
  117. {
  118. var locatedPlayer = await _locator.LookupIdAsync((NetUserId) NotedPlayer);
  119. NotedPlayerName = locatedPlayer?.Username ?? string.Empty;
  120. HasConnectedBefore = locatedPlayer?.LastAddress is not null;
  121. Notes = (from note in await _notesMan.GetAllAdminRemarks(NotedPlayer)
  122. select note.ToShared())
  123. .ToDictionary(sharedNote => (sharedNote.Id, sharedNote.NoteType));
  124. StateDirty();
  125. }
  126. private void OnPermsChanged(AdminPermsChangedEventArgs args)
  127. {
  128. if (args.Player != Player)
  129. {
  130. return;
  131. }
  132. if (!_notesMan.CanView(Player))
  133. {
  134. Close();
  135. }
  136. else
  137. {
  138. StateDirty();
  139. }
  140. }
  141. }