From 6ade388b89bf72be5e14baee93248804dcbc057f Mon Sep 17 00:00:00 2001 From: Loporrit <141286461+loporrit@users.noreply.github.com> Date: Sun, 24 Nov 2024 22:24:08 +0000 Subject: [PATCH] Basic group chat impl --- MareAPI | 2 +- .../MareSynchronosServer/Hubs/MareHub.Chat.cs | 52 +++++++++++++++++++ .../Hubs/MareHub.ClientStubs.cs | 5 ++ .../Hubs/MareHub.Groups.cs | 4 +- 4 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Chat.cs diff --git a/MareAPI b/MareAPI index b529a10..e007d99 160000 --- a/MareAPI +++ b/MareAPI @@ -1 +1 @@ -Subproject commit b529a101ae75bf9f20ae3b47d964e0a69b063754 +Subproject commit e007d99f025015543340b0e2fa22d212b9b9b57a diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Chat.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Chat.cs new file mode 100644 index 0000000..efbe490 --- /dev/null +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Chat.cs @@ -0,0 +1,52 @@ +using MareSynchronos.API.Data; +using MareSynchronos.API.Data.Enum; +using MareSynchronos.API.Dto.Group; +using MareSynchronos.API.Dto.User; +using MareSynchronosServer.Utils; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.SignalR; +using Microsoft.EntityFrameworkCore; + +namespace MareSynchronosServer.Hubs; + +public partial class MareHub +{ + [Authorize(Policy = "Identified")] + public Task UserChatSendMsg(UserDto dto, ChatMessage message) + { + _logger.LogCallInfo(MareHubLogger.Args(dto)); + // TODO + return Task.CompletedTask; + } + + [Authorize(Policy = "Identified")] + public async Task GroupChatSendMsg(GroupDto dto, ChatMessage message) + { + _logger.LogCallInfo(MareHubLogger.Args(dto)); + + var (userExists, groupPair) = await TryValidateUserInGroup(dto.GID, UserUID).ConfigureAwait(false); + if (!userExists) return; + + var group = await _dbContext.Groups.AsNoTracking().SingleAsync(g => g.GID == dto.GID).ConfigureAwait(false); + var sender = await _dbContext.Users.AsNoTracking().SingleAsync(u => u.UID == UserUID).ConfigureAwait(false); + var groupPairs = await _dbContext.GroupPairs.AsNoTracking().Include(p => p.GroupUser).Where(p => p.GroupGID == dto.Group.GID).ToListAsync().ConfigureAwait(false); + + if (group == null || sender == null) return; + + // TODO: Add and check chat permissions + if (group.Alias?.Equals("Loporrit", StringComparison.Ordinal) ?? false) + { + await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Warning, $"Chat is disabled for syncshell '{dto.GroupAliasOrGID}'.").ConfigureAwait(false); + return; + } + + // TOOO: Sign the message + var signedMessage = new SignedChatMessage(message, sender.ToUserData()) + { + Timestamp = 0, + Signature = "", + }; + + await Clients.Users(groupPairs.Select(p => p.GroupUserUID)).Client_GroupChatMsg(new(new(group.ToGroupData()), signedMessage)).ConfigureAwait(false); + } +} diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.ClientStubs.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.ClientStubs.cs index cdfa2f2..92313b7 100644 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.ClientStubs.cs +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.ClientStubs.cs @@ -1,5 +1,6 @@ using MareSynchronos.API.Data.Enum; using MareSynchronos.API.Dto; +using MareSynchronos.API.Dto.Chat; using MareSynchronos.API.Dto.Group; using MareSynchronos.API.Dto.User; @@ -11,6 +12,8 @@ namespace MareSynchronosServer.Hubs public Task Client_GroupChangePermissions(GroupPermissionDto groupPermission) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); + public Task Client_GroupChatMsg(GroupChatMsgDto groupChatMsgDto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); + public Task Client_GroupDelete(GroupDto groupDto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); public Task Client_GroupPairChangePermissions(GroupPairUserPermissionDto permissionDto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); @@ -31,6 +34,8 @@ namespace MareSynchronosServer.Hubs public Task Client_UserAddClientPair(UserPairDto dto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); + public Task Client_UserChatMsg(UserChatMsgDto userChatMsgDto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); + public Task Client_UserReceiveCharacterData(OnlineUserCharaDataDto dataDto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); public Task Client_UserReceiveUploadStatus(UserDto dto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs index 8cad198..bc4db5e 100644 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs @@ -1,5 +1,7 @@ -using MareSynchronos.API.Data.Enum; +using MareSynchronos.API.Data; +using MareSynchronos.API.Data.Enum; using MareSynchronos.API.Data.Extensions; +using MareSynchronos.API.Dto.Chat; using MareSynchronos.API.Dto.Group; using MareSynchronosServer.Utils; using MareSynchronosShared.Models;