2024-05-02 15:24:13 -07:00

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;
}
}
}