Files
tbd-station-14/Content.Server/Administration/Notes/AdminNotesEui.cs
2023-08-24 09:55:15 -08:00

167 lines
4.7 KiB
C#

using Content.Server.Administration.Managers;
using Content.Server.EUI;
using Content.Shared.Administration.Notes;
using Content.Shared.Database;
using Content.Shared.Eui;
using System.Linq;
using System.Threading.Tasks;
using Content.Server.Database;
using Robust.Shared.Network;
using static Content.Shared.Administration.Notes.AdminNoteEuiMsg;
namespace Content.Server.Administration.Notes;
public sealed class AdminNotesEui : BaseEui
{
[Dependency] private readonly IAdminManager _admins = default!;
[Dependency] private readonly IAdminNotesManager _notesMan = default!;
[Dependency] private readonly IPlayerLocator _locator = default!;
public AdminNotesEui()
{
IoCManager.InjectDependencies(this);
}
private Guid NotedPlayer { get; set; }
private string NotedPlayerName { get; set; } = string.Empty;
private bool HasConnectedBefore { get; set; }
private Dictionary<(int, NoteType), SharedAdminNote> Notes { get; set; } = new();
public override async void Opened()
{
base.Opened();
_admins.OnPermsChanged += OnPermsChanged;
_notesMan.NoteAdded += NoteModified;
_notesMan.NoteModified += NoteModified;
_notesMan.NoteDeleted += NoteDeleted;
}
public override void Closed()
{
base.Closed();
_admins.OnPermsChanged -= OnPermsChanged;
_notesMan.NoteAdded -= NoteModified;
_notesMan.NoteModified -= NoteModified;
_notesMan.NoteDeleted -= NoteDeleted;
}
public override EuiStateBase GetNewState()
{
return new AdminNotesEuiState(
NotedPlayerName,
Notes,
_notesMan.CanCreate(Player) && HasConnectedBefore,
_notesMan.CanDelete(Player),
_notesMan.CanEdit(Player)
);
}
public override async void HandleMessage(EuiMessageBase msg)
{
base.HandleMessage(msg);
switch (msg)
{
case CreateNoteRequest request:
{
if (!_notesMan.CanCreate(Player))
{
break;
}
if (string.IsNullOrWhiteSpace(request.Message))
{
break;
}
if (request.ExpiryTime is not null && request.ExpiryTime <= DateTime.UtcNow)
{
break;
}
await _notesMan.AddAdminRemark(Player, NotedPlayer, request.NoteType, request.Message, request.NoteSeverity, request.Secret, request.ExpiryTime);
break;
}
case DeleteNoteRequest request:
{
if (!_notesMan.CanDelete(Player))
{
break;
}
await _notesMan.DeleteAdminRemark(request.Id, request.Type, Player);
break;
}
case EditNoteRequest request:
{
if (!_notesMan.CanEdit(Player))
{
break;
}
if (string.IsNullOrWhiteSpace(request.Message))
{
break;
}
await _notesMan.ModifyAdminRemark(request.Id, request.Type, Player, request.Message, request.NoteSeverity, request.Secret, request.ExpiryTime);
break;
}
}
}
public async Task ChangeNotedPlayer(Guid notedPlayer)
{
NotedPlayer = notedPlayer;
await LoadFromDb();
}
private void NoteModified(SharedAdminNote note)
{
if (note.Player != NotedPlayer)
return;
Notes[(note.Id, note.NoteType)] = note;
StateDirty();
}
private void NoteDeleted(SharedAdminNote note)
{
if (note.Player != NotedPlayer)
return;
Notes.Remove((note.Id, note.NoteType));
StateDirty();
}
private async Task LoadFromDb()
{
var locatedPlayer = await _locator.LookupIdAsync((NetUserId) NotedPlayer);
NotedPlayerName = locatedPlayer?.Username ?? string.Empty;
HasConnectedBefore = locatedPlayer?.LastAddress is not null;
Notes = (from note in await _notesMan.GetAllAdminRemarks(NotedPlayer)
select note.ToShared())
.ToDictionary(sharedNote => (sharedNote.Id, sharedNote.NoteType));
StateDirty();
}
private void OnPermsChanged(AdminPermsChangedEventArgs args)
{
if (args.Player != Player)
{
return;
}
if (!_notesMan.CanView(Player))
{
Close();
}
else
{
StateDirty();
}
}
}