Add ahelp typing indicator for admins (#19060)

* Add ahelp typing indicator for admins

* Lower typing updates throttle from 3 seconds to 1

* Add stopping typing when sending a message

* Lower typing indicator timeout from 15 to 10 seconds
This commit is contained in:
DrSmugleaf
2023-08-13 16:03:17 -07:00
committed by GitHub
parent c7bff10300
commit 35d7656784
7 changed files with 168 additions and 0 deletions

View File

@@ -17,6 +17,7 @@ using Robust.Shared;
using Robust.Shared.Configuration;
using Robust.Shared.Enums;
using Robust.Shared.Network;
using Robust.Shared.Timing;
using Robust.Shared.Utility;
namespace Content.Server.Administration.Systems
@@ -27,6 +28,7 @@ namespace Content.Server.Administration.Systems
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IAdminManager _adminManager = default!;
[Dependency] private readonly IConfigurationManager _config = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly IPlayerLocator _playerLocator = default!;
[Dependency] private readonly GameTicker _gameTicker = default!;
@@ -41,6 +43,7 @@ namespace Content.Server.Administration.Systems
private Dictionary<NetUserId, string> _oldMessageIds = new();
private readonly Dictionary<NetUserId, Queue<string>> _messageQueues = new();
private readonly HashSet<NetUserId> _processingChannels = new();
private readonly Dictionary<NetUserId, (TimeSpan Timestamp, bool Typing)> _typingUpdateTimestamps = new();
// Max embed description length is 4096, according to https://discord.com/developers/docs/resources/channel#embed-object-embed-limits
// Keep small margin, just to be safe
@@ -67,6 +70,7 @@ namespace Content.Server.Administration.Systems
_playerManager.PlayerStatusChanged += OnPlayerStatusChanged;
SubscribeLocalEvent<GameRunLevelChangedEvent>(OnGameRunLevelChanged);
SubscribeNetworkEvent<BwoinkClientTypingUpdated>(OnClientTypingUpdated);
}
private void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e)
@@ -102,6 +106,31 @@ namespace Content.Server.Administration.Systems
_relayMessages.Clear();
}
private void OnClientTypingUpdated(BwoinkClientTypingUpdated msg, EntitySessionEventArgs args)
{
if (_typingUpdateTimestamps.TryGetValue(args.SenderSession.UserId, out var tuple) &&
tuple.Typing == msg.Typing &&
tuple.Timestamp + TimeSpan.FromSeconds(1) > _timing.RealTime)
{
return;
}
_typingUpdateTimestamps[args.SenderSession.UserId] = (_timing.RealTime, msg.Typing);
// Non-admins can only ever type on their own ahelp, guard against fake messages
var isAdmin = _adminManager.GetAdminData((IPlayerSession) args.SenderSession)?.HasFlag(AdminFlags.Adminhelp) ?? false;
var channel = isAdmin ? msg.Channel : args.SenderSession.UserId;
var update = new BwoinkPlayerTypingUpdated(channel, args.SenderSession.Name, msg.Typing);
foreach (var admin in GetTargetAdmins())
{
if (admin.UserId == args.SenderSession.UserId)
continue;
RaiseNetworkEvent(update, admin);
}
}
private void OnServerNameChanged(string obj)
{
_serverName = obj;