From 6c5a7b80195ac65726f43cddf0206f8a1792a765 Mon Sep 17 00:00:00 2001 From: zpc Date: Sat, 23 Nov 2024 01:50:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B8=B8=E6=88=8F=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/GameController.cs | 2 +- .../Code/CloudGaming.Code/Contract/IJYApi.cs | 2 +- .../Code/CloudGaming.Code/Game/PlayGameBLL.cs | 292 +++++++++++++----- .../CloudGaming.Code/Game/PlayGameExtend.cs | 230 ++++++++++++-- .../Game/PlayGameUserInfoCache.cs | 19 ++ .../Code/CloudGaming.Code/GlobalUsings.cs | 3 +- .../Code/CloudGaming.Code/JY/JYApiHandler.cs | 1 + .../{GameCollectRequest.cs => GameRequest.cs} | 2 +- .../JY/DisplayGradeModel.cs | 18 ++ .../CloudGaming.DtoModel/JY/JYApiResponse.cs | 5 + .../JY/JYPlayGameModel.cs | 43 +++ .../JY/PlayQueueInfoModel.cs | 29 ++ .../PlayGame/PlayGameQueue.cs | 2 +- .../PlayGame/PlayGameQueueRequest.cs | 13 + .../PlayGame/PlayGameSettings.cs | 4 +- .../PlayGame/PlayGameStatus.cs | 35 ++- .../PlayGame/PlayGameUserInfo.cs | 122 ++++++++ .../PlayGame/PlayGameUserOperation.cs | 24 ++ .../Db_Phone/CloudGamingPhoneContext.cs | 17 +- .../DbSqlServer/Db_Phone/T_User_GameLog.cs | 5 + .../Db_Phone/T_User_PlayGameTime.cs | 7 +- .../Db_Phone/T_User_PlayGmaeLog.cs | 15 + 22 files changed, 775 insertions(+), 115 deletions(-) create mode 100644 src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameUserInfoCache.cs rename src/CloudGaming/Model/CloudGaming.DtoModel/Game/{GameCollectRequest.cs => GameRequest.cs} (90%) create mode 100644 src/CloudGaming/Model/CloudGaming.DtoModel/JY/DisplayGradeModel.cs create mode 100644 src/CloudGaming/Model/CloudGaming.DtoModel/JY/JYPlayGameModel.cs create mode 100644 src/CloudGaming/Model/CloudGaming.DtoModel/JY/PlayQueueInfoModel.cs create mode 100644 src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameQueueRequest.cs create mode 100644 src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameUserInfo.cs create mode 100644 src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameUserOperation.cs diff --git a/src/CloudGaming/Api/CloudGaming.Api/Controllers/GameController.cs b/src/CloudGaming/Api/CloudGaming.Api/Controllers/GameController.cs index 2f9ffad..9c5c27f 100644 --- a/src/CloudGaming/Api/CloudGaming.Api/Controllers/GameController.cs +++ b/src/CloudGaming/Api/CloudGaming.Api/Controllers/GameController.cs @@ -122,7 +122,7 @@ namespace CloudGaming.Api.Controllers /// [HttpPost] [Authorize] - public async Task> GameCollect([FromBody] GameCollectRequest collectRequest) + public async Task> GameCollect([FromBody] GameRequest collectRequest) { if (string.IsNullOrEmpty(collectRequest.GameId)) { diff --git a/src/CloudGaming/Code/CloudGaming.Code/Contract/IJYApi.cs b/src/CloudGaming/Code/CloudGaming.Code/Contract/IJYApi.cs index f4e47a3..a2cae7a 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Contract/IJYApi.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Contract/IJYApi.cs @@ -43,7 +43,7 @@ namespace CloudGaming.Code.Contract /// /// [Post("/jyapi/playQueue")] - Task>> PlayGame([Body(BodySerializationMethod.UrlEncoded)] PlayGameQueue playGameQueue); + Task> PlayQueue([Body(BodySerializationMethod.UrlEncoded)] PlayGameQueue playGameQueue); /// /// 取消排队 diff --git a/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameBLL.cs b/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameBLL.cs index 78b9d13..fd589b2 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameBLL.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameBLL.cs @@ -1,8 +1,13 @@ using CloudGaming.Code.AppExtend.ConfigModel; using CloudGaming.Code.Contract; +using CloudGaming.DtoModel.Game; using CloudGaming.DtoModel.JY; using CloudGaming.DtoModel.PlayGame; +using HuanMeng.DotNetCore.Redis; + +using Microsoft.EntityFrameworkCore.Metadata.Internal; + using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -57,111 +62,258 @@ namespace CloudGaming.Code.Game } /// - /// + /// 启动游戏方法 /// - /// - /// + /// 启动游戏的请求参数 + /// 包含操作结果的响应对象 public async Task> PlayGameAsync(PlayGameRequest playGameRequest) { + // 检查用户是否已登录 if (_UserId == 0) { throw MessageBox.ErrorShow("请先登录"); } + + // 检查游戏是否存在 var gameCache = Cache.GameEntityCache; var gameInfo = gameCache[playGameRequest.GameId]; if (gameInfo == null) { throw MessageBox.ErrorShow("游戏不存在"); } + + // 检查用户钻石是否足够 if (UserInfo.Diamond <= 0) { throw MessageBox.Show(ResponseCode.NotMoney, "钻石不足"); } - var gameId = playGameRequest.GameId; - var modelName = playGameRequest.ModelName; - var cpu = playGameRequest.Cpu; - var userGame = await Dao.DaoPhone.Context.T_User_GameList.Where(it => (it.Status == (int)PlayGameStatus.游戏中 || it.Status == (int)PlayGameStatus.排队中) && it.UserId == _UserId).FirstOrDefaultAsync(); - if (userGame != null && userGame.Status == (int)PlayGameStatus.游戏中) + + // 获取用户和游戏信息 + var userInfo = UserInfo; + PlayGameUserInfo gameInfoCache = await PlayGameExtend.GetPlayGameUserInfoCacheAsync(this, userInfo, gameInfo); + + // 检查游戏状态 + if (gameInfoCache != null) { - throw MessageBox.Show(ResponseCode.Error, "已在游戏中"); - } - if (userGame != null && userGame?.Status == (int)PlayGameStatus.排队中) - { - if (userGame.GameId == gameId) + switch (gameInfoCache.GameStatus) { - throw MessageBox.Show(ResponseCode.Error, "已经在排队中"); - } - else - { - userGame.Status = (int)PlayGameStatus.取消排队; - await Dao.DaoPhone.Context.SaveChangesAsync(); + case PlayGameStatus.游戏中: + case PlayGameStatus.开始游戏: + throw MessageBox.Show(ResponseCode.Error, "已在游戏中"); + + case PlayGameStatus.排队中: + throw MessageBox.Show(ResponseCode.Error, "用户正在排队中"); } } - PlayGameSettings playGameSettings = new PlayGameSettings(playGameRequest.Sn, _UserId); - playGameSettings.GameKey = gameInfo.GameCloudId ?? gameId; - if (UserInfo.IsPay) + + // 配置启动游戏设置 + var playGameSettings = new PlayGameSettings(playGameRequest.Sn, _UserId) { - playGameSettings.QueueGrade = 5; - } - playGameSettings.HangUpTimer = 60 * 5; - playGameSettings.ModelName = modelName; - playGameSettings.StartResolution = "1080P"; - playGameRequest.Cpu = cpu; + GameKey = gameInfo.GameCloudId ?? playGameRequest.GameId, + QueueGrade = UserInfo.IsPay ? 5 : 1, + DisplayGrade = 1, + HangUpTimer = 300, // 挂机时间 5 分钟 + ModelName = playGameRequest.ModelName, + StartResolution = "1080P", + }; + playGameRequest.Cpu = playGameRequest.Cpu; + + // 调用游戏启动接口 var data = await JYApi.PlayGame(playGameSettings); - T_User_GameList t_User_GameList = new T_User_GameList() - { - Channel = this.AppRequestInfo.Channel, - CreateTime = DateTime.Now, - GameId = gameId, - PlaySeconds = 0, - PlayTime = 0, - Status = (int)PlayGameStatus.游戏中, - UpdateTime = DateTime.Now, - UserId = _UserId, - }; - T_User_GameLog t_User_GameLog = new T_User_GameLog() - { - Cpu = cpu, - CreateTime = DateTime.Now, - DisplayGrade = 0, - GameId = gameId, - Gamekey = gameInfo.GameCloudId, - IP = this.HttpContextAccessor.HttpContext.GetClientIpAddress(), - ModelName = modelName, - PlayQueueId = 0, - PlayQueueStatus = 0, - QueueGrade = 0, - ScId = "", - Status = 0, - UpdateTime = DateTime.Now, - UserId = _UserId, - UserKey = "", - }; - T_User_PlayGmaeLog playGmaeLog = new T_User_PlayGmaeLog() + + // 创建游戏启动日志对象 + var playGameLog = new T_User_PlayGmaeLog { CreateTime = DateTime.Now, - DescribeContent = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}用户启动游戏;", - GameId = gameId, + DescribeContent = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} 用户尝试启动游戏;", + GameId = playGameRequest.GameId, UserId = _UserId, + RequestContent = data.RequestStr, + ResponseContent = data.ResponseStr, + SessionId = gameInfoCache?.SessionId }; + + var response = new BaseResponse(); + // 用户进入排队 if (data.IsLineUp) { - playGmaeLog.DescribeContent += $"用户开始排队;"; - t_User_GameList.Status = (int)PlayGameStatus.排队中; - await Dao.DaoPhone.Context.AddAsync(t_User_GameList); - await Dao.DaoPhone.Context.SaveChangesAsync(); - return new BaseResponse(ResponseCode.StartQueue, "开始排队", data.Data); + var gameResponse = JsonConvert.DeserializeObject>(data.ResponseContent); + + gameInfoCache?.PlayQueueStart(gameResponse?.Data?.PlayQueueId ?? 0, gameResponse?.Data?.QueuePos ?? 0, playGameSettings.QueueGrade); + playGameLog.DescribeContent += "用户进入排队状态;"; + response = new BaseResponse(ResponseCode.StartQueue, "开始排队", data.Data); } else if (data.IsSuccess) { - playGmaeLog.DescribeContent += $"用户启动游戏成功;"; - await Dao.DaoPhone.Context.AddAsync(t_User_GameList); + // 游戏启动成功 + var gameResponse = JsonConvert.DeserializeObject>(data.ResponseContent); + + // 创建游戏记录和日志 + var userGameList = new T_User_GameList + { + Channel = AppRequestInfo.Channel, + CreateTime = DateTime.Now, + GameId = playGameRequest.GameId, + Status = (int)PlayGameStatus.开始游戏, + UpdateTime = DateTime.Now, + UserId = _UserId + }; + + var userGameLog = new T_User_GameLog + { + Cpu = playGameRequest.Cpu, + CreateTime = DateTime.Now, + DisplayGrade = playGameSettings.DisplayGrade, + GameId = playGameRequest.GameId, + Gamekey = gameInfo.GameCloudId, + IP = HttpContextAccessor.HttpContext.GetClientIpAddress(), + ModelName = playGameRequest.ModelName, + QueueGrade = playGameSettings.QueueGrade, + ScId = gameResponse?.Data?.ScId ?? "", + Status = (int)PlayGameStatus.开始游戏, + UpdateTime = DateTime.Now, + UserId = _UserId, + UserKey = gameResponse?.Data?.UserKey ?? "", + SessionId = gameInfoCache?.SessionId + }; + + playGameLog.DescribeContent += "游戏启动成功;"; + + // 保存数据 + await Dao.DaoPhone.Context.T_User_GameLog.AddAsync(userGameLog); + await Dao.DaoPhone.Context.T_User_GameList.AddAsync(userGameList); await Dao.DaoPhone.Context.SaveChangesAsync(); - return new BaseResponse(ResponseCode.Success, "", data.Data); + + gameInfoCache?.PlayGameStart(userGameLog.ScId, userGameList.Id, playGameSettings.DisplayGrade); + response = new BaseResponse(ResponseCode.Success, "", data.Data); } - playGmaeLog.DescribeContent += $"用户游戏启动失败;"; - return new BaseResponse(ResponseCode.Error, data.Msg, data.Data); + else // 游戏启动失败 + { + gameInfoCache?.PlayGameError(); + playGameLog.DescribeContent += "游戏启动失败;"; + response = new BaseResponse(ResponseCode.Error, data.Msg, data.Data); + } + + // 保存日志 + await Dao.DaoPhone.Context.T_User_PlayGmaeLog.AddAsync(playGameLog); + await Dao.DaoPhone.Context.SaveChangesAsync(); + + // 保存游戏缓存状态 + await gameInfoCache.SaveChangesAsync(this); + return response; } + + /// + /// 游戏排队 + /// + /// + /// + public async Task> PlayGameQueue(GameRequest gameRequest) + { + if (_UserId == 0) + { + throw MessageBox.ErrorShow("请先登录"); + } + var gameId = gameRequest.GameId; + // 检查游戏是否存在 + var gameCache = Cache.GameEntityCache; + var gameInfo = gameCache[gameId]; + if (gameInfo == null) + { + throw MessageBox.ErrorShow("游戏不存在"); + } + + // 获取用户和游戏信息 + var userInfo = UserInfo; + PlayGameUserInfo gameInfoCache = await PlayGameExtend.GetPlayGameUserInfoOrNull(this, userInfo, gameInfo); + if (gameInfoCache == null) + { + throw MessageBox.ErrorShow("未找到排队信息"); + } + if (gameInfoCache.PlayQueueId == 0) + { + throw MessageBox.ErrorShow("排队出错"); + } + PlayGameQueue playGameQueue = new PlayGameQueue() + { + GameKey = gameInfoCache.JyGameId, + PlayQueueId = gameInfoCache.PlayQueueId, + QueueGrade = gameInfoCache.QueueGrade, + Sn = gameInfoCache.Sn, + }; + var paidui = await JYApi.PlayQueue(playGameQueue); + BaseResponse back = new BaseResponse(); + if (paidui.IsSuccess) + { + gameInfoCache.PlayQueueSuccess(); + back = new BaseResponse(0, "排队成功"); + } + else if (paidui.IsLineUp) + { + gameInfoCache.PlayQueueStart(paidui?.Data?.PlayQueueId ?? 0, paidui?.Data?.QueuePos ?? 0); + back = new BaseResponse(ResponseCode.StartQueue, "", paidui.Data); + } + else + { + gameInfoCache.PlayGameError(); + back = new BaseResponse(ResponseCode.Error, "排队出现错误", paidui.Data); + } + + await gameInfoCache.SaveChangesAsync(this); + return back; + } + + /// + /// 取消排队 + /// + /// + /// + public async Task> CancelQueue(GameRequest gameRequest) + { + if (_UserId == 0) + { + throw MessageBox.ErrorShow("请先登录"); + } + var gameId = gameRequest.GameId; + // 检查游戏是否存在 + var gameCache = Cache.GameEntityCache; + var gameInfo = gameCache[gameId]; + if (gameInfo == null) + { + throw MessageBox.ErrorShow("游戏不存在"); + } + + // 获取用户和游戏信息 + var userInfo = UserInfo; + PlayGameUserInfo gameInfoCache = await PlayGameExtend.GetPlayGameUserInfoOrNull(this, userInfo, gameInfo); + if (gameInfoCache == null) + { + throw MessageBox.ErrorShow("未找到排队信息"); + } + if (gameInfoCache.PlayQueueId == 0) + { + throw MessageBox.ErrorShow("排队出错"); + } + //CancelQueue + //PlayGameCancelQueue playGameQueue + PlayGameQueue playGameQueue = new PlayGameQueue() + { + PlayQueueId = gameInfoCache.PlayQueueId, + Sn = gameInfoCache.Sn, + }; + var paidui = await JYApi.CancelQueue(playGameQueue); + if (paidui.IsSuccess) + { + gameInfoCache.PlayQueueCancel(); + } + await gameInfoCache.SaveChangesAsync(this); + return new BaseResponse(ResponseCode.Success, "取消排队成功"); + } + + public async Task DisplayGrade(int queue_grade) + { + return new BaseResponse(); + } } } diff --git a/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameExtend.cs b/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameExtend.cs index 853b8da..d74da81 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameExtend.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameExtend.cs @@ -1,44 +1,220 @@ +using CloudGaming.DtoModel.Account.User; +using CloudGaming.DtoModel.Game; +using CloudGaming.DtoModel.JY; using CloudGaming.DtoModel.PlayGame; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using HuanMeng.DotNetCore.Redis; + +using System.Runtime.CompilerServices; namespace CloudGaming.Code.Game { public static class PlayGameExtend { + private static string GetPlayGameKey(string gameId, int userId) => $"PlayGame:{gameId}:{userId}"; /// - /// + /// 获取用户游戏缓存 /// - /// + /// + /// + /// + /// + public static async Task GetPlayGameUserInfoCacheAsync(CloudGamingBase cloudGamingBase, UserInfo userInfo, GameInfo gameInfo) + { + var redisGameKey = GetPlayGameKey(gameInfo.GameId, userInfo.UserId); + var gameInfoCache = await cloudGamingBase.RedisCache.StringGetAsync(redisGameKey); + if (gameInfoCache == null) + { + gameInfoCache = new PlayGameUserInfo() + { + GameId = gameInfo.GameId, + GameName = gameInfo.GameName, + GameStatus = PlayGameStatus.初始化, + CreateDateTime = DateTime.Now, + GameUserOperation = new List(), + UserId = userInfo.UserId, + UserPlayGameDiamonds = userInfo.Diamond, + SessionId = Guid.NewGuid().ToString("N"), + }; + } + return gameInfoCache; + } + + /// + /// 获取用户游戏缓存 + /// + /// + /// + /// + /// + public static async Task GetPlayGameUserInfoOrNull(CloudGamingBase cloudGamingBase, UserInfo userInfo, GameInfo gameInfo) + { + var redisGameKey = GetPlayGameKey(gameInfo.GameId, userInfo.UserId); + var gameInfoCache = await cloudGamingBase.RedisCache.StringGetAsync(redisGameKey); + return gameInfoCache; + } + + /// + /// 初始化 + /// + /// + /// + /// + /// + /// + public static bool InitStartPlayGame(this PlayGameUserInfo playGameUserInfo, string sn, string modenName, string cpu) + { + playGameUserInfo.Sn = sn; + playGameUserInfo.Cpu = cpu; + playGameUserInfo.ModelName = modenName; + if (playGameUserInfo.GameStatus == PlayGameStatus.初始化) + { + playGameUserInfo.GameStatus = PlayGameStatus.初始化成功; + } + return true; + } + + /// + /// 开始游戏 + /// + /// + /// 本次游戏连接会话 id + /// 游戏记录id + /// 游戏显示等级 + /// + public static bool PlayGameStart(this PlayGameUserInfo playGameUserInfo, string scId, int gameListId, int display_grade) + { + playGameUserInfo.GameStatus = PlayGameStatus.开始游戏; + playGameUserInfo.GameListId = gameListId; + playGameUserInfo.ScId = scId; + playGameUserInfo.DisplayGrade = display_grade; + playGameUserInfo.GameUserOperation.Add(new PlayGameUserOperation() + { + Content = "开始游戏", + OperationDateTime = DateTime.Now, + }); + playGameUserInfo.PlayGameStartAt = DateTime.Now; + playGameUserInfo.PlayGameHeartbeatAt = DateTime.Now; + return true; + } + + /// + /// 游戏启动失败 + /// + /// + /// + public static bool PlayGameError(this PlayGameUserInfo playGameUserInfo) + { + playGameUserInfo.GameStatus = PlayGameStatus.游戏启动失败; + return true; + } + /// + /// 游戏心跳 + /// + /// + /// + public static bool PlayGameHeartbeat(this PlayGameUserInfo playGameUserInfo) + { + + playGameUserInfo.GameStatus = PlayGameStatus.游戏中; + playGameUserInfo.PlayGameHeartbeatAt = DateTime.Now; + return true; + } + + /// + /// 开始排队 + /// + /// + /// 队列id + /// 前面还有多少位 + /// 队列等级 + /// + public static bool PlayQueueStart(this PlayGameUserInfo playGameUserInfo, int play_queue_id, int queue_pos, int? queue_grade = null) + { + if (playGameUserInfo.GameStatus == PlayGameStatus.排队中) + { + playGameUserInfo.GameUserOperation.Add(new PlayGameUserOperation() + { + Content = $"排队中,前面还有{queue_pos}人", + OperationDateTime = DateTime.Now, + }); + } + else + { + playGameUserInfo.GameUserOperation.Add(new PlayGameUserOperation() + { + Content = $"开始排队,前面还有{queue_pos}人", + OperationDateTime = DateTime.Now, + }); + } + playGameUserInfo.GameStatus = PlayGameStatus.排队中; + playGameUserInfo.PlayQueueId = play_queue_id; + + playGameUserInfo.PlayQueueStartAt = DateTime.Now; + if (queue_grade != null) + { + playGameUserInfo.QueueGrade = queue_grade ?? 1; + } + return true; + } + /// + /// 排队成功 + /// + /// + /// + public static bool PlayQueueSuccess(this PlayGameUserInfo playGameUserInfo) + { + if (playGameUserInfo.GameStatus == PlayGameStatus.排队中) + { + playGameUserInfo.GameStatus = PlayGameStatus.排队成功; + playGameUserInfo.PlayQueueSuccessAt = DateTime.Now; + var totalSeconds = 0; + if (playGameUserInfo.PlayQueueStart != null) + { + totalSeconds = (int)DateTime.Now.Subtract(playGameUserInfo.PlayQueueStartAt ?? DateTime.Now).TotalSeconds; + } + playGameUserInfo.GameUserOperation.Add(new PlayGameUserOperation() + { + Content = $"排队成功,本次排队耗时{totalSeconds}秒", + OperationDateTime = DateTime.Now, + }); + } + return true; + } + /// + /// 取消排队 + /// + /// + /// + public static bool PlayQueueCancel(this PlayGameUserInfo playGameUserInfo) + { + playGameUserInfo.GameStatus = PlayGameStatus.取消排队; + playGameUserInfo.GameUserOperation.Add(new PlayGameUserOperation() + { + Content = $"用户取消排队", + OperationDateTime = DateTime.Now, + }); + return true; + } + + /// + /// 保存缓存到redis中 + /// + /// 用户玩游戏信息 /// /// - public static SortedDictionary GetDefaultParams(this RequestBaseModel requestBaseModel, CloudGamingBase cloudGamingBase) + public static async Task SaveChangesAsync(this PlayGameUserInfo playGameUserInfo, CloudGamingBase cloudGamingBase) { + var redisGameKey = GetPlayGameKey(playGameUserInfo.GameId, playGameUserInfo.UserId); + if (playGameUserInfo.GameStatus == PlayGameStatus.取消排队 || playGameUserInfo.GameStatus == PlayGameStatus.游戏启动失败) + { + return await cloudGamingBase.RedisCache.KeyDeleteAsync(redisGameKey); + + } + return await cloudGamingBase.RedisCache.StringSetAsync(redisGameKey, playGameUserInfo, TimeSpan.FromMinutes(10)); - return GetDefaultParams(requestBaseModel, cloudGamingBase.AppConfig.GameConfig, cloudGamingBase.HttpContextAccessor.HttpContext.GetClientIpAddress(), cloudGamingBase._UserId); } - /// - /// - /// - /// - /// - /// - /// - /// - public static SortedDictionary GetDefaultParams(this RequestBaseModel requestBaseModel, GameConfig gameConfig, string ip, int UserId) - { - var dicParams = new SortedDictionary(); - dicParams.Add("channel_id", gameConfig.ChannelId); - dicParams.Add("sn", requestBaseModel.Sn); - dicParams.Add("client_sid", UserId); - dicParams.Add("ip", ip); - dicParams.Add("time", DateTimeOffset.UtcNow.ToUnixTimeSeconds()); - return dicParams; - } + } } diff --git a/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameUserInfoCache.cs b/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameUserInfoCache.cs new file mode 100644 index 0000000..e529e0f --- /dev/null +++ b/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameUserInfoCache.cs @@ -0,0 +1,19 @@ +using CloudGaming.DtoModel.PlayGame; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudGaming.Code.Game +{ + public class PlayGameUserInfoCache + { + private string redisGameKey; + public PlayGameUserInfoCache(CloudGamingBase cloudGamingBase, string gameId, string userId) + { + redisGameKey = $"PlayGame:{gameId}:{userId}"; + } + } +} diff --git a/src/CloudGaming/Code/CloudGaming.Code/GlobalUsings.cs b/src/CloudGaming/Code/CloudGaming.Code/GlobalUsings.cs index 5b642e7..fa3d847 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/GlobalUsings.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/GlobalUsings.cs @@ -21,4 +21,5 @@ global using Microsoft.Extensions.DependencyInjection; global using Microsoft.Extensions.Hosting; global using System.Diagnostics; -global using CloudGaming.Code.AppExtend.ConfigModel; \ No newline at end of file +global using CloudGaming.Code.AppExtend.ConfigModel; +global using HuanMeng.DotNetCore.Redis; \ No newline at end of file diff --git a/src/CloudGaming/Code/CloudGaming.Code/JY/JYApiHandler.cs b/src/CloudGaming/Code/CloudGaming.Code/JY/JYApiHandler.cs index 286593f..d32926a 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/JY/JYApiHandler.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/JY/JYApiHandler.cs @@ -122,6 +122,7 @@ public class JYApiHandler : DelegatingHandler responseJson["RequestStr"] = await request.ToJsonAsync(); responseJson["ResponseStr"] = SerializeResponse(response, responseContent); responseJson["TotalMilliseconds"] = totalMilliseconds; + responseJson["ResponseContent"] = responseContent; var newContent = new StringContent(JsonConvert.SerializeObject(responseJson), Encoding.UTF8, "application/json"); response.Content = newContent; diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/Game/GameCollectRequest.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/Game/GameRequest.cs similarity index 90% rename from src/CloudGaming/Model/CloudGaming.DtoModel/Game/GameCollectRequest.cs rename to src/CloudGaming/Model/CloudGaming.DtoModel/Game/GameRequest.cs index f3cf8dc..df1e0e1 100644 --- a/src/CloudGaming/Model/CloudGaming.DtoModel/Game/GameCollectRequest.cs +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/Game/GameRequest.cs @@ -9,7 +9,7 @@ namespace CloudGaming.DtoModel.Game /// /// 游戏收藏 /// - public class GameCollectRequest + public class GameRequest { /// /// 游戏Id diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/JY/DisplayGradeModel.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/JY/DisplayGradeModel.cs new file mode 100644 index 0000000..d0be0ae --- /dev/null +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/JY/DisplayGradeModel.cs @@ -0,0 +1,18 @@ +using Newtonsoft.Json; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudGaming.DtoModel.JY; + +/// +/// 切换视频等级 +/// +public class DisplayGradeModel +{ + [JsonProperty("level_config")] + public string LevelConfig { get; set; } +} diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/JY/JYApiResponse.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/JY/JYApiResponse.cs index 3276dc9..89ee319 100644 --- a/src/CloudGaming/Model/CloudGaming.DtoModel/JY/JYApiResponse.cs +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/JY/JYApiResponse.cs @@ -23,6 +23,11 @@ namespace CloudGaming.DtoModel.JY /// public string ResponseStr { get; set; } + /// + /// 返回内容 + /// + public string ResponseContent { get; set; } + /// /// 请求耗时 /// diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/JY/JYPlayGameModel.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/JY/JYPlayGameModel.cs new file mode 100644 index 0000000..7c864c8 --- /dev/null +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/JY/JYPlayGameModel.cs @@ -0,0 +1,43 @@ +using Newtonsoft.Json; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudGaming.DtoModel.JY +{ + /// + /// 鲸云返回的实体类 + /// + public class JYPlayGameModel + { + public JYPlayGameModel() + { + + } + /// + /// 用户 id + /// + [JsonProperty("sn_user_id")] + public string SnUserId { get; set; } + /// + /// 用户标识 + /// + [JsonProperty("user_key")] + public string UserKey { get; set; } + + /// + /// 本次游戏连接会话 id + /// + [JsonProperty("sc_id")] + public string ScId { get; set; } + /// + /// 链路唯一标识, + /// + [JsonProperty("gl_key")] + public string GlKey { get; set; } + + } +} diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/JY/PlayQueueInfoModel.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/JY/PlayQueueInfoModel.cs new file mode 100644 index 0000000..5952645 --- /dev/null +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/JY/PlayQueueInfoModel.cs @@ -0,0 +1,29 @@ +using Newtonsoft.Json; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudGaming.DtoModel.JY; + +/// +/// 排队信息 +/// +public class PlayQueueInfoModel +{ + /// + /// 排队id + /// + [JsonProperty("play_queue_id")] + public int PlayQueueId { get; set; } + + /// + /// 前面还有多少人 + /// + [JsonProperty("queue_pos")] + public int QueuePos { get; set; } +} + + diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameQueue.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameQueue.cs index 3ff17c7..976a00f 100644 --- a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameQueue.cs +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameQueue.cs @@ -28,5 +28,5 @@ public class PlayGameQueue : RequestBaseModel /// 队列等级,默认 1 /// [JsonPropertyName("queue_grade")] - public int QueueGrade { get; set; } = 1; // 默认值为 1 + public int QueueGrade { get; set; } } diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameQueueRequest.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameQueueRequest.cs new file mode 100644 index 0000000..6af852b --- /dev/null +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameQueueRequest.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudGaming.DtoModel.PlayGame +{ + public class PlayGameQueueRequest + { + + } +} diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameSettings.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameSettings.cs index db53e3b..e1709bf 100644 --- a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameSettings.cs +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameSettings.cs @@ -35,13 +35,13 @@ namespace CloudGaming.DtoModel.PlayGame /// 显示等级,可在后台配置,默认为 1 /// [JsonPropertyName("display_grade")] - public int? DisplayGrade { get; set; } + public int DisplayGrade { get; set; } /// /// 队列等级,等级越高优先级越高, 默认 1 /// [JsonPropertyName("queue_grade")] - public int? QueueGrade { get; set; } + public int QueueGrade { get; set; } /// /// 服务器等级,只使用相同等级的资源,默认 0,不限定资源 diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameStatus.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameStatus.cs index 148ba70..a14a40b 100644 --- a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameStatus.cs +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameStatus.cs @@ -12,24 +12,45 @@ namespace CloudGaming.DtoModel.PlayGame public enum PlayGameStatus { /// - /// + /// 正常 /// - 正常 = 0, + 初始化 = 0, + /// + /// 初始化成功 + /// + 初始化成功 = 1, + /// + /// 开始游戏 + /// + 开始游戏 = 2, + /// + /// 游戏中 + /// + 游戏中 = 3, + /// + /// 游戏结束 + /// + 游戏结束 = 4, /// /// /// - 游戏中 = 1, + 排队中 = 5, /// /// /// - 排队中 = 2, + 排队成功 = 6, /// /// /// - 游戏结束 = 3, + 取消排队 = 7, + /// - /// + /// 游戏掉线 /// - 取消排队 = 4 + 游戏掉线 = 8, + /// + /// 游戏启动失败 + /// + 游戏启动失败 = 9 } } diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameUserInfo.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameUserInfo.cs new file mode 100644 index 0000000..0bb1587 --- /dev/null +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameUserInfo.cs @@ -0,0 +1,122 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudGaming.DtoModel.PlayGame +{ + /// + /// 游戏 + /// + public class PlayGameUserInfo + { + /// + /// 游戏Id + /// + public string GameId { get; set; } + /// + /// 游戏名称 + /// + public string GameName { get; set; } + + /// + /// 用户剩余钻石 + /// + public int UserPlayGameDiamonds { get; set; } + + /// + /// 用户本次玩游戏共花销多少钻石 + /// + public int SpendingDiamonds { get; set; } + + /// + /// 用户Id + /// + public int UserId { get; set; } + /// + /// 创建时间 + /// + public DateTime CreateDateTime { get; set; } + + /// + /// 最后一次修改时间 + /// + public DateTime LastDateTime { get; set; } + /// + /// 开始游戏时间 + /// + public DateTime PlayGameStartAt { get; set; } + + /// + /// 游戏心跳时间 + /// + public DateTime PlayGameHeartbeatAt { get; set; } + + /// + /// 游戏记录id + /// + public int GameListId { get; set; } + + + /// + /// 用户设备号 + /// + public string Sn { get; set; } + /// + /// 设备号 + /// + public string SessionId { get; set; } + /// + /// 设备型号 + /// + public string ModelName { get; set; } + /// + /// 用户cpu + /// + public string Cpu { get; set; } + /// + /// 鲸云scid + /// + public string ScId { get; set; } + + /// + /// 第三方游戏id + /// + public string JyGameId { get; set; } + + /// + /// 显示等级 + /// + public int DisplayGrade { get; set; } + /// + /// 队列等级 + /// + public int QueueGrade { get; set; } + + /// + /// 用户游戏状态 + /// + public PlayGameStatus GameStatus { get; set; } + + /// + /// 用户排队Id + /// + public int PlayQueueId { get; set; } + + /// + /// 用户开始排队时间 + /// + public DateTime? PlayQueueStartAt { get; set; } + + /// + /// 结束排队时间 + /// + public DateTime? PlayQueueSuccessAt { get; set; } + + /// + /// 用户操作内容 + /// + public List GameUserOperation { get; set; } + } +} diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameUserOperation.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameUserOperation.cs new file mode 100644 index 0000000..4021507 --- /dev/null +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameUserOperation.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudGaming.DtoModel.PlayGame +{ + /// + /// 用户玩游戏时操作 + /// + public class PlayGameUserOperation + { + /// + /// 操作时间 + /// + public DateTime OperationDateTime { get; set; } + + /// + /// 操作内容 + /// + public string Content { get; set; } + } +} diff --git a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/CloudGamingPhoneContext.cs b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/CloudGamingPhoneContext.cs index 44120af..ee269c0 100644 --- a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/CloudGamingPhoneContext.cs +++ b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/CloudGamingPhoneContext.cs @@ -1142,7 +1142,7 @@ public partial class CloudGamingPhoneContext : MultiTenantDbContext//DbContext entity.ToTable(tb => tb.HasComment("游戏日志表")); entity.Property(e => e.Cpu) - .HasMaxLength(1) + .HasMaxLength(50) .HasComment("设备cpu"); entity.Property(e => e.CreateTime) .HasComment("开始时间") @@ -1158,7 +1158,7 @@ public partial class CloudGamingPhoneContext : MultiTenantDbContext//DbContext .HasMaxLength(64) .HasComment("ip"); entity.Property(e => e.ModelName) - .HasMaxLength(1) + .HasMaxLength(50) .HasComment("设备型号"); entity.Property(e => e.PlayQueueId).HasComment("游戏排队id"); entity.Property(e => e.PlayQueueStatus).HasComment("排队状态"); @@ -1166,6 +1166,9 @@ public partial class CloudGamingPhoneContext : MultiTenantDbContext//DbContext entity.Property(e => e.ScId) .HasMaxLength(64) .HasComment("会话Id"); + entity.Property(e => e.SessionId) + .HasMaxLength(64) + .HasComment("会话id"); entity.Property(e => e.Status).HasComment("状态,排队,游戏中,启动失败"); entity.Property(e => e.TenantId).HasComment("租户"); entity.Property(e => e.UpdateTime) @@ -1173,7 +1176,7 @@ public partial class CloudGamingPhoneContext : MultiTenantDbContext//DbContext .HasColumnType("datetime"); entity.Property(e => e.UserId).HasComment("用户Id"); entity.Property(e => e.UserKey) - .HasMaxLength(1) + .HasMaxLength(100) .HasComment("用户标识"); //添加全局筛选器 if (this.TenantInfo != null) @@ -1234,6 +1237,9 @@ public partial class CloudGamingPhoneContext : MultiTenantDbContext//DbContext .HasComment("游戏Id"); entity.Property(e => e.NightCardPlayTime).HasComment("包夜卡游玩时间"); entity.Property(e => e.PlayTime).HasComment("游玩总时间"); + entity.Property(e => e.SessionId) + .HasMaxLength(64) + .HasComment("会话id"); entity.Property(e => e.TenantId).HasComment("租户"); entity.Property(e => e.UpdateTime) .HasComment("创建时间") @@ -1260,6 +1266,11 @@ public partial class CloudGamingPhoneContext : MultiTenantDbContext//DbContext entity.Property(e => e.GameId) .HasMaxLength(50) .HasComment("游戏Id"); + entity.Property(e => e.RequestContent).HasComment("请求接口内容"); + entity.Property(e => e.ResponseContent).HasComment("返回内容"); + entity.Property(e => e.SessionId) + .HasMaxLength(64) + .HasComment("会话id"); entity.Property(e => e.TenantId).HasComment("租户"); entity.Property(e => e.UpdateTime) .HasComment("修改时间") diff --git a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/T_User_GameLog.cs b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/T_User_GameLog.cs index 2cd0770..c678933 100644 --- a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/T_User_GameLog.cs +++ b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/T_User_GameLog.cs @@ -90,4 +90,9 @@ public partial class T_User_GameLog: MultiTenantEntity /// 状态,排队,游戏中,启动失败 /// public virtual int Status { get; set; } + + /// + /// 会话id + /// + public virtual string? SessionId { get; set; } } diff --git a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/T_User_PlayGameTime.cs b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/T_User_PlayGameTime.cs index 22e937c..049913f 100644 --- a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/T_User_PlayGameTime.cs +++ b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/T_User_PlayGameTime.cs @@ -55,4 +55,9 @@ public partial class T_User_PlayGameTime: MultiTenantEntity /// 所属租户 /// public override Guid TenantId { get; set; } - } + + /// + /// 会话id + /// + public virtual string? SessionId { get; set; } +} diff --git a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/T_User_PlayGmaeLog.cs b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/T_User_PlayGmaeLog.cs index 5979505..2d71be3 100644 --- a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/T_User_PlayGmaeLog.cs +++ b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/T_User_PlayGmaeLog.cs @@ -43,4 +43,19 @@ public partial class T_User_PlayGmaeLog: MultiTenantEntity /// 用户id /// public virtual int UserId { get; set; } + + /// + /// 请求接口内容 + /// + public virtual string? RequestContent { get; set; } + + /// + /// 返回内容 + /// + public virtual string? ResponseContent { get; set; } + + /// + /// 会话id + /// + public virtual string? SessionId { get; set; } }