diff --git a/MareAPI b/MareAPI index 7728ef2..d105d20 160000 --- a/MareAPI +++ b/MareAPI @@ -1 +1 @@ -Subproject commit 7728ef23909c2cd73d19f09777253cc674263aa7 +Subproject commit d105d2050722a0f2e6ab695dc22adbf2437dd9c1 diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Typing.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Typing.cs index bc17ddc..3d325cc 100644 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Typing.cs +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Typing.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using System.Threading.Tasks; +using MareSynchronos.API.Data.Enum; using MareSynchronos.API.Data.Extensions; using MareSynchronos.API.Dto.User; using MareSynchronosServer.Utils; @@ -22,7 +23,7 @@ public partial class MareHub .SingleAsync(u => u.UID == UserUID) .ConfigureAwait(false); - var typingDto = new TypingStateDto(sender.ToUserData(), isTyping); + var typingDto = new TypingStateDto(sender.ToUserData(), isTyping, TypingScope.Proximity); await Clients.Caller.Client_UserTypingState(typingDto).ConfigureAwait(false); @@ -37,4 +38,35 @@ public partial class MareHub await Clients.Users(recipients).Client_UserTypingState(typingDto).ConfigureAwait(false); } + + [Authorize(Policy = "Identified")] + public async Task UserSetTypingState(bool isTyping, TypingScope scope) + { + _logger.LogCallInfo(MareHubLogger.Args(isTyping, scope)); + + var sender = await DbContext.Users.AsNoTracking() + .SingleAsync(u => u.UID == UserUID) + .ConfigureAwait(false); + + var typingDto = new TypingStateDto(sender.ToUserData(), isTyping, scope); + + await Clients.Caller.Client_UserTypingState(typingDto).ConfigureAwait(false); + + if (scope == TypingScope.Party || scope == TypingScope.CrossParty) + { + _logger.LogCallInfo(MareHubLogger.Args("Typing scope is party-based; server-side party routing not yet implemented, not broadcasting to non-caller.")); + return; + } + + var pairedEntries = await GetAllPairedClientsWithPauseState().ConfigureAwait(false); + var recipients = pairedEntries + .Where(p => !p.IsPaused) + .Select(p => p.UID) + .Distinct(StringComparer.Ordinal) + .ToList(); + + if (recipients.Count == 0) return; + + await Clients.Users(recipients).Client_UserTypingState(typingDto).ConfigureAwait(false); + } }