using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Sockets; namespace ChatSample { public class InMemoryUserTracker : IUserTracker { private readonly ConcurrentDictionary _usersOnline = new ConcurrentDictionary(); public event Action UserJoined; public event Action UserLeft; public Task> UsersOnline() => Task.FromResult(_usersOnline.Values.AsEnumerable()); public Task AddUser(Connection connection, UserDetails userDetails) { _usersOnline.TryAdd(connection, userDetails); UserJoined(userDetails); return Task.CompletedTask; } public Task RemoveUser(Connection connection) { if (_usersOnline.TryRemove(connection, out var userDetails)) { UserLeft(userDetails); } return Task.CompletedTask; } } }