using Gameboard.ShogiUI.Sockets.Extensions; using Gameboard.ShogiUI.Sockets.ServiceModels.Socket.Types; using Newtonsoft.Json; using System.Collections.Concurrent; using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; namespace Gameboard.ShogiUI.Sockets.Models { public class Session { [JsonIgnore] public ConcurrentDictionary Subscriptions { get; } public string Name { get; } public string Player1 { get; } public string? Player2 { get; } public bool IsPrivate { get; } public Session(string name, bool isPrivate, string player1, string? player2 = null) { Subscriptions = new ConcurrentDictionary(); Name = name; Player1 = player1; Player2 = player2; IsPrivate = isPrivate; } 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 (Player2 != null && 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() }; } } }