using Gameboard.ShogiUI.Sockets.Extensions; using Gameboard.ShogiUI.Sockets.ServiceModels.Socket.Types; using System.Collections.Concurrent; using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; namespace Gameboard.ShogiUI.Sockets.Models { public class Session { public string Name { get; } public string Player1 { get; } public string Player2 { get; } public ConcurrentDictionary Subscriptions { get; } public Session(Shogi.Api.ServiceModels.Types.Session session) { Name = session.Name; Player1 = session.Player1; Player2 = session.Player2; Subscriptions = new ConcurrentDictionary(); } public bool Subscribe(string playerName, WebSocket socket) => Subscriptions.TryAdd(playerName, socket); public Task Broadcast(string message) { var tasks = new List(Subscriptions.Count); foreach (var kvp in Subscriptions) { var socket = kvp.Value; tasks.Add(socket.SendTextAsync(message)); } return Task.WhenAll(tasks); } public Task SendToPlayer1(string message) { if (Subscriptions.TryGetValue(Player1, out var socket)) { return socket.SendTextAsync(message); } return Task.CompletedTask; } public Task SendToPlayer2(string message) { if (Subscriptions.TryGetValue(Player2, out var socket)) { return socket.SendTextAsync(message); } return Task.CompletedTask; } public Game ToServiceModel() { var players = new List(2) { Player1 }; if (!string.IsNullOrWhiteSpace(Player2)) players.Add(Player2); return new Game { GameName = Name, Players = players.ToArray() }; } } }