using Church.Net.WebAPI.Models; using Jint.Native; using Microsoft.AspNetCore.SignalR; using Newtonsoft.Json.Serialization; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using WebAPI.Hubs; using WebAPI.Models.IceBreak; using WebAPI.Services.Interfaces; namespace WebAPI { public class GameRoomLogic { public List OnlinePlayers { get; set; } private readonly IHubContext gameHubContext; public GameRoomLogic( IHubContext GameHubContext ) { gameHubContext = GameHubContext; GameRooms = new List(); OnlinePlayers = new List(); } public List GameRooms { get; set; } public void CreateGameRoom(IGamePlayer gamePlayer) { if (!this.GameRooms.Any(g => g.Id == gamePlayer.Id)) { this.GameRooms.Add(new GameRoom() { Id = gamePlayer.Id, Name = gamePlayer.Name, SignalRClientId = gamePlayer.SignalRClientId, }); } else { var existingRoom = this.GameRooms.FirstOrDefault(g => g.Id == gamePlayer.Id); existingRoom.SignalRClientId = gamePlayer.SignalRClientId; } //this.OnlinePlayers.FirstOrDefault(p => p.SignalRClientId == gamePlayer.SignalRClientId).GameRoomId = gamePlayer.Id; //gameHubContext.Groups.AddToGroupAsync(gamePlayer.SignalRClientId, gamePlayer.Id); } public bool UserJoinGameRoom(string gameRoomId, IGamePlayer gamePlayer) { //this.OnlinePlayers.FirstOrDefault(p => p.SignalRClientId == gamePlayer.SignalRClientId) // .GameRoomId = gameRoomId; //if (GameRooms.Any(g => g.Id == gameRoomId)) //{ // //Make sure user not exist in other room // UserLeave(gamePlayer); //} var gameRoom = GameRooms.FirstOrDefault(r => r.Id == gameRoomId); if (gameRoom == null) { CreateGameRoom(gamePlayer); } if (gameRoom != null) { //gameHubContext.Groups.AddToGroupAsync(gamePlayer.SignalRClientId, gameRoomId); gameRoom.Players.Add(gamePlayer); var message = new SignalRMessage(new SignalRSession(gameRoomId, "", true), "GameRoom", "Join"); message.From = new SignalRSession(gamePlayer.SignalRClientId, gamePlayer.Name); SendMessage(message); return true; } return false; } public void UserLeave(IGamePlayer gamePlayer) { //foreach (var room in GameRooms) //{ // if (room.Id == gamePlayer.SignalRClientId) // { // GameRooms.Remove(room); // break; // } // if (room.Players.Any(p => p.Id == gamePlayer.Id)) // { // room.Players.Remove(room.Players.FirstOrDefault(p => p.Id == gamePlayer.Id)); // var message = new SignalRMessage(new SignalRSession(room.Id, "", true), "GameRoom", "Leaving"); // message.From = new SignalRSession(gamePlayer.SignalRClientId, gamePlayer.Name); // SendMessage(message); // break; // } //} if (!string.IsNullOrWhiteSpace(gamePlayer.GameRoomId)) { //gameHubContext.Groups.RemoveFromGroupAsync(gamePlayer.SignalRClientId, gamePlayer.GameRoomId); var message = new SignalRMessage(new SignalRSession(gamePlayer.GameRoomId, "", true), "GameRoom", "Leaving"); message.From = new SignalRSession(gamePlayer.TabId, gamePlayer.Name); SendMessage(message); } } public void BrodcastMessage(GameRoom room) { } public void SendMessage(SignalRMessage message) { string jsonString = JsonConvert.SerializeObject(message, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver(), ReferenceLoopHandling = ReferenceLoopHandling.Ignore, //DateTimeZoneHandling = DateTimeZoneHandling.Local }); if (message.Receiver.IsGroup) { //this.gameHubContext.Clients.Clients( // this.GameRooms.FirstOrDefault(g => g.Id == message.Receiver.SessionId).Players.Select(p => p.Id)) // .SendAsync("ReceivedMessage", jsonString); //this.gameHubContext.Clients.All.SendAsync("ReceivedMessage", jsonString); gameHubContext.Clients.Group(message.Receiver.SessionId).SendAsync("ReceivedMessage", jsonString); } else { gameHubContext.Clients.Client(message.Receiver.SessionId).SendAsync("ReceivedMessage", jsonString); } } public bool GetOnlinePlayerByTabId(string tabId,out IGamePlayer gamePlayer) { gamePlayer= this.OnlinePlayers.FirstOrDefault(p => p.TabId == tabId); return gamePlayer != null; } } }