Skip to content

Commit

Permalink
全面改造GameHub,重新定义Alert和Error
Browse files Browse the repository at this point in the history
  • Loading branch information
hsyhhssyy committed Jun 22, 2024
1 parent 7448f08 commit be4701c
Show file tree
Hide file tree
Showing 2 changed files with 123 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ public Task<object> HandleMove(Game rawGame, string playerId, string move)
}

var answer = game.QuestionList[game.CurrentQuestionIndex];
if (answer.CharacterName != characterName)
if (answer.CharacterName.ToUpper() != characterName.ToUpper())
{
game.PlayerMoveList.Add(new PlayerMove()
{
Expand Down
151 changes: 122 additions & 29 deletions AmiyaBotPlayerRatingServer/RealtimeHubs/GameHub.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System.Data;
using AmiyaBotPlayerRatingServer.GameLogic;
using AmiyaBotPlayerRatingServer.GameLogic;
using Microsoft.AspNetCore.SignalR;
using Newtonsoft.Json;
using System.Security.Claims;
Expand Down Expand Up @@ -33,6 +32,7 @@ private async Task<ApplicationUser> ValidateUser()

if (appUser == null)
{
//登录信息失效,此时就是要弹回,所以抛出异常
throw new UnauthorizedAccessException();
}

Expand All @@ -45,6 +45,7 @@ private async Task<Game> ValidateGame(string gameId, bool readOnly = true)

if (game == null)
{
//获取了错误的房间信息,此时就是要弹回,所以抛出异常
throw new UnauthorizedAccessException();
}

Expand All @@ -57,6 +58,7 @@ private Task<IGameManager> ValidateManager(String gameType)

if (manager == null)
{
//获取了错误的房间信息,此时就是要弹回,所以抛出异常
throw new UnauthorizedAccessException();
}

Expand Down Expand Up @@ -90,6 +92,7 @@ public async Task Me()

if (userId == null)
{
//登录信息失效,此时就是要弹回,所以抛出异常
throw new UnauthorizedAccessException();
}

Expand Down Expand Up @@ -123,9 +126,13 @@ public async Task GetGame(string id)
var manager = await ValidateManager(game.GameType);
var appUser = await ValidateUser();

if (game==null||!game.PlayerList.ContainsKey(appUser.Id))
if (!game.PlayerList.ContainsKey(appUser.Id))
{
throw new UnauthorizedAccessException();
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "您需要先加入该房间才能查看房间信息。",
}));
return;
}

game.PlayerList[appUser.Id] = Context.ConnectionId;
Expand Down Expand Up @@ -162,11 +169,17 @@ public async Task CreateGame(string gameType,string param)
var gameManager = await ValidateManager(gameType);
var appUser = await ValidateUser();

//用户每10秒才能创建一个房间


var paramObj = JsonConvert.DeserializeObject<Dictionary<String,object>>(param);
if (paramObj == null)
{
throw new DataException("Invalid Game Param");
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "错误的房间设置s",
}));
return;
}

await using var game = await gameManager.CreateNewGame(paramObj);
Expand Down Expand Up @@ -274,7 +287,11 @@ public async Task KickPlayer(string gameId, string playerId)

if (game.CreatorId != appUser.Id)
{
throw new UnauthorizedAccessException();
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "您不是房主,无法踢人",
}));
return;
}

var manager = await ValidateManager(game.GameType);
Expand Down Expand Up @@ -310,7 +327,11 @@ public async Task LeaveGame(string gameId)

if (!game.PlayerList.ContainsKey(appUser.Id))
{
throw new UnauthorizedAccessException();
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "您需要先加入该房间才能查看房间信息。",
}));
return;
}

var manager = await ValidateManager(game.GameType);
Expand Down Expand Up @@ -348,7 +369,11 @@ public async Task ChangeGameSettings(string gameId, string settings)

if (game.CreatorId != appUser.Id)
{
throw new UnauthorizedAccessException();
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "您不是房主,无法修改房间设置",
}));
return;
}


Expand All @@ -357,7 +382,11 @@ public async Task ChangeGameSettings(string gameId, string settings)
var settingsObj = JsonConvert.DeserializeObject<Dictionary<String,Object>>(settings);
if (settingsObj == null)
{
throw new DataException("Invalid Game Settings");
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "错误的房间设置",
}));
return;
}

game.RoomSettings = settingsObj;
Expand All @@ -383,7 +412,11 @@ public async Task CloseGame(string gameId)

if (game.CreatorId != appUser.Id)
{
throw new UnauthorizedAccessException();
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "您不是房主,无法关闭房间",
}));
return;
}

var oldCompleteState = game.IsCompleted;
Expand Down Expand Up @@ -419,10 +452,14 @@ public async Task CompleteGame(string gameId)

if (game.CreatorId != appUser.Id)
{
throw new UnauthorizedAccessException();
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "您不是房主,无法关闭房间",
}));
return;
}

if (game.IsClosed == true)
if (game.IsClosed)
{
return;
}
Expand All @@ -448,7 +485,11 @@ public async Task StartGame(string gameId)

if (game.CreatorId != appUser.Id)
{
throw new UnauthorizedAccessException();
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "您不是房主,无法开始游戏",
}));
return;
}

var payload = await manager.GetGameStartPayload(game);
Expand Down Expand Up @@ -476,20 +517,32 @@ public async Task RallyPointCreate(string gameId, string rallyData)

if (!game.PlayerList.ContainsKey(appUser.Id))
{
throw new UnauthorizedAccessException();
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "您不是该房间内的玩家。",
}));
return;
}

var rallyDataObj = JsonConvert.DeserializeObject<Dictionary<String,JToken>>(rallyData);
if (rallyDataObj == null)
{
throw new DataException("Invalid Rally Point Payload");
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "错误的集结点参数。",
}));
return;
}

var rallyName = rallyDataObj["Name"].ToString();
var rallyName = rallyDataObj.GetValueOrDefault("Name")?.ToString();

if (rallyName == null)
{
throw new DataException("Invalid Rally Point Name");
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "未提供集结点名称。",
}));
return;
}

var rallyNode = game.RallyNodes.GetValueOrSetDefault(rallyName, new Game.RallyNode(rallyName));
Expand Down Expand Up @@ -520,20 +573,32 @@ public async Task RallyPointStatus(string gameId, string rallyData)

if (!game.PlayerList.ContainsKey(appUser.Id))
{
throw new UnauthorizedAccessException();
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "您不是该房间内的玩家。",
}));
return;
}

var rallyDataObj = JsonConvert.DeserializeObject<Dictionary<String,JToken>>(rallyData);
if (rallyDataObj == null)
{
throw new DataException("Invalid Rally Point Payload");
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "错误的集结点参数。",
}));
return;
}

var rallyName = rallyDataObj["Name"].ToString();
var rallyName = rallyDataObj.GetValueOrDefault("Name")?.ToString();

if (rallyName == null)
{
throw new DataException("Invalid Rally Point Name");
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "未提供集结点名称。",
}));
return;
}

var rallyNode = game.RallyNodes.GetValueOrSetDefault(rallyName, new Game.RallyNode(rallyName));
Expand All @@ -554,20 +619,32 @@ public async Task RallyPointReached(string gameId,string rallyData)

if (!game.PlayerList.ContainsKey(appUser.Id))
{
throw new UnauthorizedAccessException();
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "您不是该房间内的玩家。",
}));
return;
}

var rallyDataObj = JsonConvert.DeserializeObject<Dictionary<String,JToken>>(rallyData);
if (rallyDataObj == null)
{
throw new DataException("Invalid Rally Point Payload");
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "错误的集结点参数。",
}));
return;
}

var rallyName = rallyDataObj["Name"].ToString();
var rallyName = rallyDataObj.GetValueOrDefault("Name")?.ToString();

if (rallyName == null)
{
throw new DataException("Invalid Rally Point Name");
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "未提供集结点名称。",
}));
return;
}

var rallyNode = game.RallyNodes.GetValueOrSetDefault(rallyName, new Game.RallyNode(rallyName));
Expand Down Expand Up @@ -606,7 +683,11 @@ public async Task SendMove(string gameId, string move)

if (!game.PlayerList.ContainsKey(appUser.Id))
{
throw new UnauthorizedAccessException();
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "您需要先加入该房间才能查看房间信息。",
}));
return;
}

if (game.IsCompleted)
Expand Down Expand Up @@ -646,7 +727,11 @@ public async Task RequestHint(string gameId)

if (!game.PlayerList.ContainsKey(appUser.Id))
{
throw new UnauthorizedAccessException();
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "您需要先加入该房间才能查看房间信息。",
}));
return;
}

if (game.IsCompleted)
Expand Down Expand Up @@ -706,7 +791,11 @@ public async Task GiveUp(string gameId)

if (!game.PlayerList.ContainsKey(appUser.Id))
{
throw new UnauthorizedAccessException();
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "您需要先加入该房间才能查看房间信息。",
}));
return;
}

if (game.IsCompleted)
Expand Down Expand Up @@ -776,7 +865,11 @@ public async Task Chat(string gameId, string message)

if (!game.PlayerList.ContainsKey(appUser.Id))
{
throw new UnauthorizedAccessException();
await Clients.Caller.SendAsync("Alert", JsonConvert.SerializeObject(new
{
Message = "您需要先加入该房间才能查看房间信息。",
}));
return;
}

await Clients.Group(gameId).SendAsync("Chat", JsonConvert.SerializeObject(new
Expand Down

0 comments on commit be4701c

Please sign in to comment.