142 lines
5.4 KiB
C#
142 lines
5.4 KiB
C#
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<IGamePlayer> OnlinePlayers { get; set; }
|
|
private readonly IHubContext<GameRoomHub> gameHubContext;
|
|
|
|
public GameRoomLogic(
|
|
IHubContext<GameRoomHub> GameHubContext
|
|
)
|
|
{
|
|
gameHubContext = GameHubContext;
|
|
GameRooms = new List<GameRoom>();
|
|
OnlinePlayers = new List<IGamePlayer>();
|
|
}
|
|
public List<GameRoom> 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;
|
|
}
|
|
}
|
|
}
|