 c98e2b2dd6
			
		
	
	c98e2b2dd6
	
	
	
		
			
			* add base grpc service and swap auth service to streaming * remove Authorize from hub itself * remove unused usings * heave files server to net 7, add exception handling in grpc auth stream Co-authored-by: rootdarkarchon <root.darkarchon@outlook.com>
		
			
				
	
	
		
			141 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using MareSynchronosShared.Models;
 | |
| using Microsoft.EntityFrameworkCore;
 | |
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| using System.Threading.Tasks;
 | |
| using System;
 | |
| using MareSynchronosServer.Utils;
 | |
| using System.Security.Claims;
 | |
| 
 | |
| namespace MareSynchronosServer.Hubs;
 | |
| 
 | |
| public partial class MareHub
 | |
| {
 | |
|     private async Task<List<PausedEntry>> GetAllPairedClientsWithPauseState(string? uid = null)
 | |
|     {
 | |
|         uid ??= AuthenticatedUserId;
 | |
| 
 | |
|         var query = await (from userPair in _dbContext.ClientPairs
 | |
|                            join otherUserPair in _dbContext.ClientPairs on userPair.OtherUserUID equals otherUserPair.UserUID
 | |
|                            where otherUserPair.OtherUserUID == uid && userPair.UserUID == uid
 | |
|                            select new
 | |
|                            {
 | |
|                                UID = Convert.ToString(userPair.OtherUserUID),
 | |
|                                GID = "DIRECT",
 | |
|                                PauseState = (userPair.IsPaused || otherUserPair.IsPaused)
 | |
|                            })
 | |
|                             .Union(
 | |
|                                 (from userGroupPair in _dbContext.GroupPairs
 | |
|                                  join otherGroupPair in _dbContext.GroupPairs on userGroupPair.GroupGID equals otherGroupPair.GroupGID
 | |
|                                  where
 | |
|                                      userGroupPair.GroupUserUID == uid
 | |
|                                      && otherGroupPair.GroupUserUID != uid
 | |
|                                  select new
 | |
|                                  {
 | |
|                                      UID = Convert.ToString(otherGroupPair.GroupUserUID),
 | |
|                                      GID = Convert.ToString(otherGroupPair.GroupGID),
 | |
|                                      PauseState = (userGroupPair.IsPaused || otherGroupPair.IsPaused)
 | |
|                                  })
 | |
|                             ).AsNoTracking().ToListAsync().ConfigureAwait(false);
 | |
| 
 | |
|         return query.GroupBy(g => g.UID, g => (g.GID, g.PauseState),
 | |
|             (key, g) => new PausedEntry
 | |
|             {
 | |
|                 UID = key,
 | |
|                 PauseStates = g.Select(p => new PauseState() { GID = string.Equals(p.GID, "DIRECT", StringComparison.Ordinal) ? null : p.GID, IsPaused = p.PauseState })
 | |
|                 .ToList()
 | |
|             }, StringComparer.Ordinal).ToList();
 | |
|     }
 | |
| 
 | |
|     private async Task<List<string>> GetAllPairedUnpausedUsers(string? uid = null)
 | |
|     {
 | |
|         uid ??= AuthenticatedUserId;
 | |
|         var ret = await GetAllPairedClientsWithPauseState(uid).ConfigureAwait(false);
 | |
|         return ret.Where(k => !k.IsPaused).Select(k => k.UID).ToList();
 | |
|     }
 | |
| 
 | |
|     private async Task<List<string>> SendOnlineToAllPairedUsers(string arg)
 | |
|     {
 | |
|         var usersToSendDataTo = await GetAllPairedUnpausedUsers().ConfigureAwait(false);
 | |
|         await Clients.Users(usersToSendDataTo).Client_UserChangePairedPlayer(arg, true).ConfigureAwait(false);
 | |
| 
 | |
|         return usersToSendDataTo;
 | |
|     }
 | |
| 
 | |
|     private async Task<List<string>> SendOfflineToAllPairedUsers(string arg)
 | |
|     {
 | |
|         var usersToSendDataTo = await GetAllPairedUnpausedUsers().ConfigureAwait(false);
 | |
|         await Clients.Users(usersToSendDataTo).Client_UserChangePairedPlayer(arg, false).ConfigureAwait(false);
 | |
| 
 | |
|         return usersToSendDataTo;
 | |
|     }
 | |
| 
 | |
|     public string AuthenticatedUserId => Context.User?.Claims?.SingleOrDefault(c => string.Equals(c.Type, ClaimTypes.NameIdentifier, StringComparison.Ordinal))?.Value ?? "Unknown";
 | |
| 
 | |
|     private async Task UserGroupLeave(GroupPair groupUserPair, List<PausedEntry> allUserPairs, string userIdent, string? uid = null)
 | |
|     {
 | |
|         uid ??= AuthenticatedUserId;
 | |
|         var userPair = allUserPairs.SingleOrDefault(p => string.Equals(p.UID, groupUserPair.GroupUserUID, StringComparison.Ordinal));
 | |
|         if (userPair != null)
 | |
|         {
 | |
|             if (userPair.IsDirectlyPaused != PauseInfo.NoConnection) return;
 | |
|             if (userPair.IsPausedPerGroup is PauseInfo.Unpaused) return;
 | |
|         }
 | |
| 
 | |
|         var groupUserIdent = _clientIdentService.GetCharacterIdentForUid(groupUserPair.GroupUserUID);
 | |
|         if (!string.IsNullOrEmpty(groupUserIdent))
 | |
|         {
 | |
|             await Clients.User(uid).Client_UserChangePairedPlayer(groupUserIdent, false).ConfigureAwait(false);
 | |
|             await Clients.User(groupUserPair.GroupUserUID).Client_UserChangePairedPlayer(userIdent, false).ConfigureAwait(false);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private async Task SendGroupDeletedToAll(List<GroupPair> groupUsers)
 | |
|     {
 | |
|         foreach (var pair in groupUsers)
 | |
|         {
 | |
|             var pairIdent = _clientIdentService.GetCharacterIdentForUid(pair.GroupUserUID);
 | |
|             if (string.IsNullOrEmpty(pairIdent)) continue;
 | |
| 
 | |
|             var pairs = await GetAllPairedClientsWithPauseState(pair.GroupUserUID).ConfigureAwait(false);
 | |
| 
 | |
|             foreach (var groupUserPair in groupUsers.Where(g => !string.Equals(g.GroupUserUID, pair.GroupUserUID, StringComparison.Ordinal)))
 | |
|             {
 | |
|                 await UserGroupLeave(groupUserPair, pairs, pairIdent, pair.GroupUserUID).ConfigureAwait(false);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private async Task<(bool IsValid, GroupPair ReferredPair)> TryValidateUserInGroup(string gid, string? uid = null)
 | |
|     {
 | |
|         uid ??= AuthenticatedUserId;
 | |
| 
 | |
|         var groupPair = await _dbContext.GroupPairs.Include(c => c.GroupUser)
 | |
|             .SingleOrDefaultAsync(g => g.GroupGID == gid && (g.GroupUserUID == uid || g.GroupUser.Alias == uid)).ConfigureAwait(false);
 | |
|         if (groupPair == null) return (false, null);
 | |
| 
 | |
|         return (true, groupPair);
 | |
|     }
 | |
| 
 | |
|     private async Task<(bool IsValid, Group ReferredGroup)> TryValidateGroupModeratorOrOwner(string gid)
 | |
|     {
 | |
|         var isOwnerResult = await TryValidateOwner(gid).ConfigureAwait(false);
 | |
|         if (isOwnerResult.isValid) return (true, isOwnerResult.ReferredGroup);
 | |
| 
 | |
|         if (isOwnerResult.ReferredGroup == null) return (false, null);
 | |
| 
 | |
|         var groupPairSelf = await _dbContext.GroupPairs.SingleOrDefaultAsync(g => g.GroupGID == gid && g.GroupUserUID == AuthenticatedUserId).ConfigureAwait(false);
 | |
|         if (groupPairSelf == null || !groupPairSelf.IsModerator) return (false, null);
 | |
| 
 | |
|         return (true, isOwnerResult.ReferredGroup);
 | |
|     }
 | |
| 
 | |
|     private async Task<(bool isValid, Group ReferredGroup)> TryValidateOwner(string gid)
 | |
|     {
 | |
|         var group = await _dbContext.Groups.SingleOrDefaultAsync(g => g.GID == gid).ConfigureAwait(false);
 | |
|         if (group == null) return (false, null);
 | |
| 
 | |
|         return (string.Equals(group.OwnerUID, AuthenticatedUserId, StringComparison.Ordinal), group);
 | |
|     }
 | |
| }
 |