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 user) { _usersOnline.TryAdd(connection, user); UserJoined(user); return Task.CompletedTask; } public Task RemoveUser(Connection connection) { if (_usersOnline.TryRemove(connection, out var userDetails)) { UserLeft(userDetails); } return Task.FromResult(userDetails); } } }