merge latest
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user