mirror of
https://github.com/WWhiteDreamProject/wwdpublic.git
synced 2026-04-17 13:37:47 +03:00
## Mirror of PR #26223: [Improve admin message seen/dismiss state.](https://github.com/space-wizards/space-station-14/pull/26223) from <img src="https://avatars.githubusercontent.com/u/10567778?v=4" alt="space-wizards" width="22"/> [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `d776c4b392a082dba7539d77cfa20fc904ed4091` PR opened by <img src="https://avatars.githubusercontent.com/u/8107459?v=4" width="16"/><a href="https://github.com/PJB3005"> PJB3005</a> at 2024-03-18 04:02:20 UTC --- PR changed 21 files with 3748 additions and 108 deletions. The PR had the following labels: - Changes: UI - Status: Needs Review --- <details open="true"><summary><h1>Original Body</h1></summary> > As part of this, it has become impossible for a player to play without dismissing the message in some form. Instead of a shitty popup window, the popup is now a fullscreen overlay that blocks clicks behind it, making the game unplayable. Also, if a user somehow has multiple messages they will be combined into one popup. > > ## About the PR > Admin messages now have separate "seen" and "dismissed" fields. The idea is that an admin should be able to tell whether a user pressed the "dismiss for now" button. Instead of using "seen" as "show this message to players when they join", "dismissed" is now used for this. > > ## Why / Balance > Fixes #26211 > > ## Technical details > Existing notes in the database will automatically be marked as dismissed on migration. A note cannot be dismissed without being seen (enforced via constraint in the database too, aren't I fancy). > > ## Media > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > >  > >  > > **Changelog** > <!-- > Make players aware of new features and changes that could affect how they play the game by adding a Changelog entry. Please read the Changelog guidelines located at: https://docs.spacestation14.io/en/getting-started/pr-guideline#changelog > --> > > 🆑 > ADMIN: > - tweak: Admin messages are now shown as "seen" even if the player dismisses them only temporarily. Also, it is impossible for players to play without dismissing the message (temporary or permanent). </details> Co-authored-by: SimpleStation14 <Unknown>
81 lines
2.8 KiB
C#
81 lines
2.8 KiB
C#
using System.Linq;
|
|
using Content.Server.Administration.Commands;
|
|
using Content.Server.Chat.Managers;
|
|
using Content.Server.EUI;
|
|
using Content.Shared.Database;
|
|
using Content.Shared.Verbs;
|
|
using Robust.Server.Player;
|
|
using Robust.Shared.Console;
|
|
using Robust.Shared.Enums;
|
|
using Robust.Shared.Player;
|
|
using Robust.Shared.Utility;
|
|
|
|
namespace Content.Server.Administration.Notes;
|
|
|
|
public sealed class AdminNotesSystem : EntitySystem
|
|
{
|
|
[Dependency] private readonly IConsoleHost _console = default!;
|
|
[Dependency] private readonly IAdminNotesManager _notes = default!;
|
|
[Dependency] private readonly IPlayerManager _playerManager = default!;
|
|
[Dependency] private readonly IChatManager _chat = default!;
|
|
[Dependency] private readonly EuiManager _euis = default!;
|
|
|
|
public override void Initialize()
|
|
{
|
|
SubscribeLocalEvent<GetVerbsEvent<Verb>>(AddVerbs);
|
|
_playerManager.PlayerStatusChanged += OnPlayerStatusChanged;
|
|
}
|
|
|
|
private void AddVerbs(GetVerbsEvent<Verb> ev)
|
|
{
|
|
if (EntityManager.GetComponentOrNull<ActorComponent>(ev.User) is not {PlayerSession: var user} ||
|
|
EntityManager.GetComponentOrNull<ActorComponent>(ev.Target) is not {PlayerSession: var target})
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!_notes.CanView(user))
|
|
{
|
|
return;
|
|
}
|
|
|
|
var verb = new Verb
|
|
{
|
|
Text = Loc.GetString("admin-notes-verb-text"),
|
|
Category = VerbCategory.Admin,
|
|
Icon = new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/VerbIcons/examine.svg.192dpi.png")),
|
|
Act = () => _console.RemoteExecuteCommand(user, $"{OpenAdminNotesCommand.CommandName} \"{target.UserId}\""),
|
|
Impact = LogImpact.Low
|
|
};
|
|
|
|
ev.Verbs.Add(verb);
|
|
}
|
|
|
|
private async void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e)
|
|
{
|
|
if (e.NewStatus != SessionStatus.InGame)
|
|
return;
|
|
|
|
var messages = await _notes.GetNewMessages(e.Session.UserId);
|
|
var watchlists = await _notes.GetActiveWatchlists(e.Session.UserId);
|
|
|
|
if (!_playerManager.TryGetPlayerData(e.Session.UserId, out var playerData))
|
|
{
|
|
Log.Error($"Could not get player data for ID {e.Session.UserId}");
|
|
}
|
|
|
|
var username = playerData?.UserName ?? e.Session.UserId.ToString();
|
|
foreach (var watchlist in watchlists)
|
|
{
|
|
_chat.SendAdminAlert(Loc.GetString("admin-notes-watchlist", ("player", username), ("message", watchlist.Message)));
|
|
}
|
|
|
|
var messagesToShow = messages.OrderBy(x => x.CreatedAt).Where(x => !x.Dismissed).ToArray();
|
|
if (messagesToShow.Length == 0)
|
|
return;
|
|
|
|
var ui = new AdminMessageEui(messagesToShow);
|
|
_euis.OpenEui(ui, e.Session);
|
|
}
|
|
}
|