rework some calls async

This commit is contained in:
Stanley Dimant
2022-07-11 17:11:57 +02:00
parent 0e0a75a71b
commit b8950ca886
2 changed files with 30 additions and 44 deletions

View File

@@ -1,6 +1,7 @@
using System.Linq;
using System.Security.Claims;
using System.Security.Cryptography;
using System.Threading.Tasks;
using MareSynchronosServer.Data;
using Microsoft.AspNetCore.SignalR;
using Microsoft.EntityFrameworkCore;
@@ -21,26 +22,11 @@ namespace MareSynchronosServer.Hubs
protected string AuthenticatedUserId => Context.User?.Claims?.SingleOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value ?? "Unknown";
protected Models.User GetAuthenticatedUserUntracked()
protected async Task<Models.User> GetAuthenticatedUserUntrackedAsync()
{
return DbContext.Users.AsNoTrackingWithIdentityResolution().Single(u => u.UID == AuthenticatedUserId);
return await DbContext.Users.AsNoTrackingWithIdentityResolution().SingleAsync(u => u.UID == AuthenticatedUserId);
}
protected Models.User? GetUserFromCID(string cid)
{
return DbContext.Users.SingleOrDefault(c => c.CharacterIdentification == cid);
}
protected Models.User? GetUserFromUID(string uid)
{
return DbContext.Users.SingleOrDefault(c => c.UID == uid);
}
protected bool IsUserOnline(string uid)
{
return DbContext.Users.Any(c => c.UID == uid && !string.IsNullOrEmpty(c.CharacterIdentification));
}
public static string GenerateRandomString(int length, string allowableChars = null)
{
if (string.IsNullOrEmpty(allowableChars))

View File

@@ -55,7 +55,7 @@ namespace MareSynchronosServer.Hubs
{
Logger.LogInformation("User " + AuthenticatedUserId + " requested online characters");
var ownUser = GetAuthenticatedUserUntracked();
var ownUser = await GetAuthenticatedUserUntrackedAsync();
var otherUsers = await DbContext.ClientPairs.AsNoTracking()
.Include(u => u.User)
@@ -102,23 +102,23 @@ namespace MareSynchronosServer.Hubs
public override async Task OnDisconnectedAsync(Exception exception)
{
var user = DbContext.Users.AsNoTracking().SingleOrDefault(u => u.UID == AuthenticatedUserId);
var user = await DbContext.Users.AsNoTracking().SingleOrDefaultAsync(u => u.UID == AuthenticatedUserId);
if (user != null && !string.IsNullOrEmpty(user.CharacterIdentification))
{
Logger.LogInformation("Disconnect from " + AuthenticatedUserId);
var otherUsers = DbContext.ClientPairs.AsNoTracking()
var otherUsers = await DbContext.ClientPairs.AsNoTracking()
.Include(u => u.User)
.Include(u => u.OtherUser)
.Where(w => w.User.UID == user.UID && !w.IsPaused)
.Where(w => !string.IsNullOrEmpty(w.OtherUser.CharacterIdentification))
.Select(e => e.OtherUser).ToList();
var otherEntries = DbContext.ClientPairs.AsNoTracking().Include(u => u.User)
.Where(u => otherUsers.Any(e => e == u.User) && u.OtherUser.UID == user.UID && !u.IsPaused).ToList();
.Select(e => e.OtherUser).ToListAsync();
var otherEntries = await DbContext.ClientPairs.AsNoTracking().Include(u => u.User)
.Where(u => otherUsers.Any(e => e == u.User) && u.OtherUser.UID == user.UID && !u.IsPaused).ToListAsync();
await Clients.Users(otherEntries.Select(e => e.User.UID)).SendAsync(UserHubAPI.OnRemoveOnlinePairedPlayer, user.CharacterIdentification);
DbContext.Users.Single(u => u.UID == AuthenticatedUserId).CharacterIdentification = null;
(await DbContext.Users.SingleAsync(u => u.UID == AuthenticatedUserId)).CharacterIdentification = null;
await DbContext.SaveChangesAsync();
await Clients.All.SendAsync("UsersOnline",
@@ -134,19 +134,19 @@ namespace MareSynchronosServer.Hubs
{
Logger.LogInformation("User " + AuthenticatedUserId + " pushing character data to " + visibleCharacterIds.Count + " visible clients");
var user = GetAuthenticatedUserUntracked();
var senderPairedUsers = DbContext.ClientPairs.AsNoTracking()
var user = await GetAuthenticatedUserUntrackedAsync();
var senderPairedUsers = await DbContext.ClientPairs.AsNoTracking()
.Include(w => w.User)
.Include(w => w.OtherUser)
.Where(w => w.User.UID == user.UID && !w.IsPaused
&& visibleCharacterIds.Contains(w.OtherUser.CharacterIdentification))
.Select(u => u.OtherUser).ToList();
.Select(u => u.OtherUser).ToListAsync();
foreach (var pairedUser in senderPairedUsers)
{
var isPaused = DbContext.ClientPairs.AsNoTracking()
.FirstOrDefault(w =>
w.User.UID == pairedUser.UID && w.OtherUser.UID == user.UID)?.IsPaused ?? true;
var isPaused = (await DbContext.ClientPairs.AsNoTracking()
.FirstOrDefaultAsync(w =>
w.User.UID == pairedUser.UID && w.OtherUser.UID == user.UID))?.IsPaused ?? true;
if (isPaused) continue;
await Clients.User(pairedUser.UID).SendAsync(UserHubAPI.OnReceiveCharacterData, characterCache,
user.CharacterIdentification);
@@ -194,13 +194,13 @@ namespace MareSynchronosServer.Hubs
{
if (uid == AuthenticatedUserId) return;
uid = uid.Trim();
var user = DbContext.Users.Single(u => u.UID == AuthenticatedUserId);
var user = await DbContext.Users.SingleAsync(u => u.UID == AuthenticatedUserId);
var otherUser = await DbContext.Users
.SingleOrDefaultAsync(u => u.UID == uid);
var existingEntry =
await DbContext.ClientPairs.AsNoTracking()
.SingleOrDefaultAsync(p =>
.FirstOrDefaultAsync(p =>
p.User.UID == AuthenticatedUserId && p.OtherUser.UID == uid);
if (otherUser == null || existingEntry != null) return;
Logger.LogInformation("User " + AuthenticatedUserId + " adding " + uid + " to whitelist");
@@ -218,19 +218,11 @@ namespace MareSynchronosServer.Hubs
{
OtherUID = otherUser.UID,
IsPaused = false,
IsPausedFromOthers = false,
IsPausedFromOthers = otherEntry?.IsPaused ?? false,
IsSynced = otherEntry != null
}, string.Empty);
if (otherEntry != null)
{
if (!string.IsNullOrEmpty(otherUser.CharacterIdentification))
{
await Clients.User(user.UID)
.SendAsync(UserHubAPI.OnAddOnlinePairedPlayer, otherUser.CharacterIdentification);
await Clients.User(otherUser.UID)
.SendAsync(UserHubAPI.OnAddOnlinePairedPlayer, user.CharacterIdentification);
}
await Clients.User(uid).SendAsync(UserHubAPI.OnUpdateClientPairs,
new ClientPairDto()
{
@@ -239,6 +231,14 @@ namespace MareSynchronosServer.Hubs
IsPausedFromOthers = false,
IsSynced = true
}, user.CharacterIdentification);
if (!string.IsNullOrEmpty(otherUser.CharacterIdentification))
{
await Clients.User(user.UID)
.SendAsync(UserHubAPI.OnAddOnlinePairedPlayer, otherUser.CharacterIdentification);
await Clients.User(otherUser.UID)
.SendAsync(UserHubAPI.OnAddOnlinePairedPlayer, user.CharacterIdentification);
}
}
}
@@ -247,8 +247,8 @@ namespace MareSynchronosServer.Hubs
public async Task SendPairedClientPauseChange(string uid, bool isPaused)
{
if (uid == AuthenticatedUserId) return;
var user = DbContext.Users.AsNoTracking()
.Single(u => u.UID == AuthenticatedUserId);
var user = await DbContext.Users.AsNoTracking()
.SingleAsync(u => u.UID == AuthenticatedUserId);
var otherUser = await DbContext.Users.AsNoTracking()
.SingleOrDefaultAsync(u => u.UID == uid);
if (otherUser == null) return;