Updated, the update... should be working now hopefully...
This commit is contained in:
56
RelayServer/Services/Chat/ConnectedClientService.cs
Normal file
56
RelayServer/Services/Chat/ConnectedClientService.cs
Normal file
@@ -0,0 +1,56 @@
|
||||
using System.Collections.Concurrent;
|
||||
|
||||
namespace RelayServer.Services.Chat;
|
||||
|
||||
public static class ConnectedClientService
|
||||
{
|
||||
private static readonly ConcurrentDictionary<string, string> SessionToUsername = new();
|
||||
private static readonly ConcurrentDictionary<string, HashSet<string>> UsernameToSessions =
|
||||
new(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
public static void Register(string sessionId, string username)
|
||||
{
|
||||
if (SessionToUsername.TryGetValue(sessionId, out var oldUsername) &&
|
||||
!string.Equals(oldUsername, username, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
RemoveSessionFromUsername(sessionId, oldUsername);
|
||||
}
|
||||
|
||||
SessionToUsername[sessionId] = username;
|
||||
|
||||
var sessions = UsernameToSessions.GetOrAdd(username, _ => new HashSet<string>(StringComparer.Ordinal));
|
||||
lock (sessions)
|
||||
sessions.Add(sessionId);
|
||||
}
|
||||
|
||||
public static void Unregister(string sessionId)
|
||||
{
|
||||
if (SessionToUsername.TryRemove(sessionId, out var username))
|
||||
RemoveSessionFromUsername(sessionId, username);
|
||||
}
|
||||
|
||||
public static IReadOnlyCollection<string> GetSessionsForUser(string username)
|
||||
{
|
||||
if (UsernameToSessions.TryGetValue(username, out var sessions))
|
||||
lock (sessions)
|
||||
return sessions.ToList();
|
||||
|
||||
return Array.Empty<string>();
|
||||
}
|
||||
|
||||
public static string? GetUsernameForSession(string sessionId) =>
|
||||
SessionToUsername.TryGetValue(sessionId, out var u) ? u : null;
|
||||
|
||||
private static void RemoveSessionFromUsername(string sessionId, string username)
|
||||
{
|
||||
if (!UsernameToSessions.TryGetValue(username, out var sessions))
|
||||
return;
|
||||
|
||||
lock (sessions)
|
||||
{
|
||||
sessions.Remove(sessionId);
|
||||
if (sessions.Count == 0)
|
||||
UsernameToSessions.TryRemove(username, out _);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user