using Content.Shared.ActionBlocker; using Content.Shared.Chat.TypingIndicator; using Robust.Shared.Player; namespace Content.Server.Chat.TypingIndicator; // Server-side typing system // It receives networked typing events from clients // And sync typing indicator using appearance component public sealed class TypingIndicatorSystem : SharedTypingIndicatorSystem { [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnPlayerAttached); SubscribeLocalEvent(OnPlayerDetached); SubscribeNetworkEvent(OnClientTypingChanged); } private void OnPlayerAttached(PlayerAttachedEvent ev) { // when player poses entity we want to make sure that there is typing indicator EnsureComp(ev.Entity); // we also need appearance component to sync visual state EnsureComp(ev.Entity); } private void OnPlayerDetached(EntityUid uid, TypingIndicatorComponent component, PlayerDetachedEvent args) { // player left entity body - hide typing indicator SetTypingIndicatorState(uid, TypingIndicatorState.None); // Corvax-TypingIndicator } private void OnClientTypingChanged(TypingChangedEvent ev, EntitySessionEventArgs args) { var uid = args.SenderSession.AttachedEntity; if (!Exists(uid)) { Log.Warning($"Client {args.SenderSession} sent TypingChangedEvent without an attached entity."); return; } // check if this entity can speak or emote if (!_actionBlocker.CanEmote(uid.Value) && !_actionBlocker.CanSpeak(uid.Value)) { // nah, make sure that typing indicator is disabled SetTypingIndicatorState(uid.Value, TypingIndicatorState.None); // Corvax-TypingIndicator return; } SetTypingIndicatorState(uid.Value, ev.State); // Corvax-TypingIndicator } private void SetTypingIndicatorState(EntityUid uid, TypingIndicatorState state, AppearanceComponent? appearance = null) // Corvax-TypingIndicator { // if (!Resolve(uid, ref appearance, false)) // Corvax-TypingIndicator // return; _appearance.SetData(uid, TypingIndicatorVisuals.State, state); // Corvax-TypingIndicator } }