merge latest

This commit is contained in:
Stefan Berg
2022-08-15 12:45:19 +02:00
2 changed files with 29 additions and 14 deletions

View File

@@ -91,11 +91,12 @@ namespace MareSynchronosServer.Hubs
{ {
MareMetrics.Connections.Dec(); MareMetrics.Connections.Dec();
var user = await _dbContext.Users.AsNoTracking().SingleOrDefaultAsync(u => u.UID == AuthenticatedUserId); var user = await _dbContext.Users.SingleOrDefaultAsync(u => u.UID == AuthenticatedUserId);
if (user != null && !string.IsNullOrEmpty(user.CharacterIdentification)) if (user != null && !string.IsNullOrEmpty(user.CharacterIdentification))
{ {
MareMetrics.AuthorizedConnections.Dec(); MareMetrics.AuthorizedConnections.Dec();
_logger.LogInformation("Disconnect from " + AuthenticatedUserId);
_logger.LogInformation("Disconnect from " + AuthenticatedUserId);
var query = var query =
from userToOther in _dbContext.ClientPairs from userToOther in _dbContext.ClientPairs
@@ -112,15 +113,14 @@ namespace MareSynchronosServer.Hubs
userToOther.UserUID == user.UID userToOther.UserUID == user.UID
&& !userToOther.IsPaused && !userToOther.IsPaused
&& !otherToUser.IsPaused && !otherToUser.IsPaused
select otherToUser; select otherToUser.UserUID;
var otherEntries = await query.ToListAsync(); var otherEntries = await query.ToListAsync();
await Clients.Users(otherEntries.Select(e => e.User.UID)).SendAsync(Api.OnUserRemoveOnlinePairedPlayer, user.CharacterIdentification);
var notUploadedFiles = _dbContext.Files.Where(f => !f.Uploaded && f.Uploader.UID == user.UID).ToList(); await Clients.Users(otherEntries).SendAsync(Api.OnUserRemoveOnlinePairedPlayer, user.CharacterIdentification);
_dbContext.RemoveRange(notUploadedFiles);
(await _dbContext.Users.SingleAsync(u => u.UID == AuthenticatedUserId)).CharacterIdentification = null; _dbContext.RemoveRange(_dbContext.Files.Where(f => !f.Uploaded && f.Uploader.UID == user.UID));
user.CharacterIdentification = null;
await _dbContext.SaveChangesAsync(); await _dbContext.SaveChangesAsync();
} }

View File

@@ -15,7 +15,8 @@ public class SignalRLimitFilter : IHubFilter
private readonly IRateLimitProcessor _processor; private readonly IRateLimitProcessor _processor;
private readonly IHttpContextAccessor accessor; private readonly IHttpContextAccessor accessor;
private readonly ILogger<SignalRLimitFilter> logger; private readonly ILogger<SignalRLimitFilter> logger;
private static SemaphoreSlim ConnectionLimiterSemaphore = new SemaphoreSlim(20); private static SemaphoreSlim ConnectionLimiterSemaphore = new(20);
private static SemaphoreSlim DisconnectLimiterSemaphore = new(20);
public SignalRLimitFilter( public SignalRLimitFilter(
IOptions<IpRateLimitOptions> options, IProcessingStrategy processing, IIpPolicyStore policyStore, IHttpContextAccessor accessor, ILogger<SignalRLimitFilter> logger) IOptions<IpRateLimitOptions> options, IProcessingStrategy processing, IIpPolicyStore policyStore, IHttpContextAccessor accessor, ILogger<SignalRLimitFilter> logger)
@@ -76,20 +77,34 @@ public class SignalRLimitFilter : IHubFilter
try try
{ {
await Task.Delay(100); await Task.Delay(250);
await next(context); await next(context);
} }
catch { } catch (Exception ex)
{
logger.LogWarning(ex, "Error on OnConnectedAsync");
}
finally finally
{ {
ConnectionLimiterSemaphore.Release(); ConnectionLimiterSemaphore.Release();
} }
} }
// Optional method public async Task OnDisconnectedAsync(
public Task OnDisconnectedAsync(
HubLifetimeContext context, Exception exception, Func<HubLifetimeContext, Exception, Task> next) HubLifetimeContext context, Exception exception, Func<HubLifetimeContext, Exception, Task> next)
{ {
return next(context, exception); await DisconnectLimiterSemaphore.WaitAsync();
try
{
await next(context, exception);
}
catch
{
logger.LogWarning(exception, "Error on OnDisconnectedAsync");
}
finally
{
DisconnectLimiterSemaphore.Release();
}
} }
} }