TypingIndicatorSystem.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using Content.Shared.CCVar;
  2. using Content.Shared.Chat.TypingIndicator;
  3. using Robust.Client.Player;
  4. using Robust.Shared.Configuration;
  5. using Robust.Shared.Timing;
  6. namespace Content.Client.Chat.TypingIndicator;
  7. // Client-side typing system tracks user input in chat box
  8. public sealed class TypingIndicatorSystem : SharedTypingIndicatorSystem
  9. {
  10. [Dependency] private readonly IGameTiming _time = default!;
  11. [Dependency] private readonly IPlayerManager _playerManager = default!;
  12. [Dependency] private readonly IConfigurationManager _cfg = default!;
  13. private readonly TimeSpan _typingTimeout = TimeSpan.FromSeconds(2);
  14. private TimeSpan _lastTextChange;
  15. private bool _isClientTyping;
  16. public override void Initialize()
  17. {
  18. base.Initialize();
  19. Subs.CVar(_cfg, CCVars.ChatShowTypingIndicator, OnShowTypingChanged);
  20. }
  21. public void ClientChangedChatText()
  22. {
  23. // don't update it if player don't want to show typing indicator
  24. if (!_cfg.GetCVar(CCVars.ChatShowTypingIndicator))
  25. return;
  26. // client typed something - show typing indicator
  27. ClientUpdateTyping(true);
  28. _lastTextChange = _time.CurTime;
  29. }
  30. public void ClientSubmittedChatText()
  31. {
  32. // don't update it if player don't want to show typing
  33. if (!_cfg.GetCVar(CCVars.ChatShowTypingIndicator))
  34. return;
  35. // client submitted text - hide typing indicator
  36. ClientUpdateTyping(false);
  37. }
  38. public override void Update(float frameTime)
  39. {
  40. base.Update(frameTime);
  41. // check if client didn't changed chat text box for a long time
  42. if (_isClientTyping)
  43. {
  44. var dif = _time.CurTime - _lastTextChange;
  45. if (dif > _typingTimeout)
  46. {
  47. // client didn't typed anything for a long time - hide indicator
  48. ClientUpdateTyping(false);
  49. }
  50. }
  51. }
  52. private void ClientUpdateTyping(bool isClientTyping)
  53. {
  54. if (_isClientTyping == isClientTyping)
  55. return;
  56. // check if player controls any entity.
  57. if (_playerManager.LocalEntity == null)
  58. return;
  59. _isClientTyping = isClientTyping;
  60. RaisePredictiveEvent(new TypingChangedEvent(isClientTyping));
  61. }
  62. private void OnShowTypingChanged(bool showTyping)
  63. {
  64. // hide typing indicator immediately if player don't want to show it anymore
  65. if (!showTyping)
  66. {
  67. ClientUpdateTyping(false);
  68. }
  69. }
  70. }