diff --git a/src/CloudGaming/Api/CloudGaming.Api/Controllers/PlayGameController.cs b/src/CloudGaming/Api/CloudGaming.Api/Controllers/PlayGameController.cs index 9eb4163..4e1db35 100644 --- a/src/CloudGaming/Api/CloudGaming.Api/Controllers/PlayGameController.cs +++ b/src/CloudGaming/Api/CloudGaming.Api/Controllers/PlayGameController.cs @@ -135,7 +135,7 @@ public class PlayGameController : CloudGamingControllerBase /// [HttpPost] [Authorize] - public async Task> GetMyScListAsync([FromBody] RequestBaseModel requestBaseModel) + public async Task GetMyScListAsync([FromBody] RequestBaseModel requestBaseModel) { PlayGameBLL playGameBLL = new PlayGameBLL(ServiceProvider, JYApi); return await playGameBLL.GetMyScList(requestBaseModel.Sn); @@ -145,13 +145,13 @@ public class PlayGameController : CloudGamingControllerBase /// /// 重连会话 /// - /// + /// /// [HttpPost] [Authorize] - public async Task> ReconPlayGameAsync([FromBody] ReconPlayGameRequest reconPlayGameSettings) + public async Task> ReconPlayGameAsync([FromBody] GameRequest gameRequest) { PlayGameBLL playGameBLL = new PlayGameBLL(ServiceProvider, JYApi); - return await playGameBLL.ReconPlayGame(reconPlayGameSettings); + return await playGameBLL.ReconPlayGame(gameRequest); } } diff --git a/src/CloudGaming/Code/CloudGaming.Code/Contract/IJYApi.cs b/src/CloudGaming/Code/CloudGaming.Code/Contract/IJYApi.cs index c836fa5..ca83f00 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Contract/IJYApi.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Contract/IJYApi.cs @@ -84,7 +84,7 @@ namespace CloudGaming.Code.Contract /// /// [Post("/jyapi/myScList")] - Task>> MyScList([Body(BodySerializationMethod.UrlEncoded)] JYRequestParameter parameter); + Task> MyScList([Body(BodySerializationMethod.UrlEncoded)] JYRequestParameter parameter); /// /// 获取会话列表 /// diff --git a/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameBLL.cs b/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameBLL.cs index 1e5b60f..91e49cc 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameBLL.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameBLL.cs @@ -143,6 +143,7 @@ public class PlayGameBLL : CloudGamingBase await Dao.DaoPhone.Context.SaveChangesAsync(); gameInfoCache?.PlayGameStart(gameResponse?.Data?.ScId ?? 0, userGameList.Id, playGameSettings.DisplayGrade, jyResponseData); gameInfoCache.Ip = HttpContextAccessor.HttpContext.GetClientIpAddress(); + gameInfoCache.Channel = AppRequestInfo.Channel; var gameResponse1 = JsonConvert.DeserializeObject>(jyResponseData.ResponseContent); if (gameResponse1 != null && gameResponse1.TryGetValue("data", out var xxx)) { @@ -202,7 +203,8 @@ public class PlayGameBLL : CloudGamingBase Sn = gameInfoCache.Sn, }; var jyResponse = await JYApi.StopGame(playGameCommonSetting); - gameInfoCache.PlayGameClose(); + gameInfoCache.PlayGameUserNotDiamond(jyResponse); + await gameInfoCache.SaveChangesAsync(this); throw MessageBox.Show(ResponseCode.NotMoney, "钻石不足"); } PlayGameHeartbeatResponse playGameHeartbeatResponse = new PlayGameHeartbeatResponse() @@ -492,16 +494,33 @@ public class PlayGameBLL : CloudGamingBase /// /// /// - public async Task> GetMyScList(string sn) + public async Task GetMyScList(string sn) { var requestParmat = new JYRequestParameter(sn, _UserId); var response = await JYApi.MyScList(requestParmat); if (response.IsSuccess) { - return new BaseResponse(ResponseCode.Success, "", response.Data) { }; + if (response.Data?.List?.Count > 0) + { + var sess = response.Data?.List[0]; + if (sess != null) + { + var gameInfo = await PlayGameExtend.PlayGameRecon(this, _UserId, sess.ScId); + if (gameInfo != null) + { + var game = Cache.GameEntityCache[gameInfo.GameId]; + if (game != null) + { + await gameInfo.SaveChangesAsync(this); + return new GameListDto(game, DtoModel.Epg.EpgEnum.ImageResStyle.小LOGO); + } + + } + } + } + return null; } throw response.ToMessageBox(); - } /// @@ -509,27 +528,43 @@ public class PlayGameBLL : CloudGamingBase /// /// /// - public async Task> ReconPlayGame(ReconPlayGameRequest reconPlayGameRequest) + public async Task> ReconPlayGame(GameRequest gameRequest) { - var setting = new ReconPlayGameSettings(reconPlayGameRequest.Sn, _UserId) + var gameId = gameRequest.GameId; + // 检查游戏是否存在 + var gameCache = Cache.GameEntityCache; + var gameInfo = gameCache[gameId]; + if (gameInfo == null) { - ScId = reconPlayGameRequest.ScId, - DisplayGrade = reconPlayGameRequest.DisplayGrade, - Cpu = reconPlayGameRequest.Cpu, - ModelName = reconPlayGameRequest.ModelName, + throw MessageBox.ErrorShow("游戏不存在"); + } + + // 获取用户和游戏信息 + var userInfo = UserInfo; + PlayGameUserInfo gameInfoCache = await PlayGameExtend.GetPlayGameUserInfoOrNull(this, userInfo, gameInfo); + if (gameInfoCache == null) + { + throw MessageBox.ErrorShow("未找到游戏信息"); + } + var setting = new ReconPlayGameSettings(gameInfoCache.Sn, _UserId) + { + ScId = gameInfoCache.ScId, + DisplayGrade = gameInfoCache.DisplayGrade, + Cpu = gameInfoCache.Cpu, + ModelName = gameInfoCache.ModelName, }; var jyResponseData = await JYApi.ReconPlayGame(setting); if (jyResponseData.IsSuccess) { - var gameInfo = await PlayGameExtend.PlayGameRecon(this, _UserId, reconPlayGameRequest.ScId); var gameResponse1 = JsonConvert.DeserializeObject>(jyResponseData.ResponseContent); if (gameResponse1 != null && gameResponse1.TryGetValue("data", out var xxx)) { if (gameInfo != null) { - await gameInfo.SaveChangesAsync(this); + gameInfoCache.PlayGameRecon(jyResponseData); + await gameInfoCache.SaveChangesAsync(this); } - return new BaseResponse(ResponseCode.Success, "", new { GameId = gameInfo?.GameId, GameData = JsonConvert.SerializeObject(xxx) }); + return new BaseResponse(ResponseCode.Success, "", JsonConvert.SerializeObject(xxx)); } } diff --git a/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameExtend.cs b/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameExtend.cs index 0949779..c60a335 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameExtend.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameExtend.cs @@ -342,6 +342,38 @@ namespace CloudGaming.Code.Game return true; } + /// + /// 游戏掉线 + /// + /// + /// + public static bool PlayGameDiaoXian(this PlayGameUserInfo playGameUserInfo, IJYApiRespnse jYApiRespnse) + { + playGameUserInfo.GameStatus = PlayGameStatus.游戏掉线结束; + playGameUserInfo.GameUserOperation.Add(new PlayGameUserOperation(jYApiRespnse) + { + Content = $"用户游戏掉线,结束游戏", + OperationDateTime = DateTime.Now, + }); + return true; + } + + /// + /// 游戏掉线 + /// + /// + /// + public static bool PlayGameUserNotDiamond(this PlayGameUserInfo playGameUserInfo, IJYApiRespnse jYApiRespnse) + { + playGameUserInfo.GameStatus = PlayGameStatus.用户钻石不足; + playGameUserInfo.GameUserOperation.Add(new PlayGameUserOperation(jYApiRespnse) + { + OperationDateTime = DateTime.Now, + Content = $"用户余额不足,准备退出游戏" + }); + return true; + } + /// /// /// @@ -367,7 +399,9 @@ namespace CloudGaming.Code.Game /// /// 游戏游戏重连 /// - /// + /// + /// + /// /// public static async Task PlayGameRecon(CloudGamingBase cloudGamingBase, int userId, int scId) { @@ -381,22 +415,43 @@ namespace CloudGaming.Code.Game } if (playGameUserInfo != null) { - if (playGameUserInfo.GameStatus != PlayGameStatus.游戏掉线) + playGameUserInfo.GameUserOperation.Add(new PlayGameUserOperation() { - playGameUserInfo.GameStatus = PlayGameStatus.游戏掉线; - playGameUserInfo.GameUserOperation.Add(new PlayGameUserOperation() - { - Content = $"用户游戏掉线,上一次心跳时间{playGameUserInfo.PlayGameHeartbeatAt?.ToString("yyyy-MM-dd HH:mm:ss")};", - OperationDateTime = DateTime.Now, - }); - } + Content = $"用户获取可连接的游戏列表scId:${scId};", + OperationDateTime = DateTime.Now, + }); } return playGameUserInfo; } return null; } + /// + /// 游戏游戏重连 + /// + /// + /// + /// + /// + public static PlayGameUserInfo PlayGameRecon(this PlayGameUserInfo playGameUserInfo, IJYApiRespnse jYApiRespnse) + { + + if (playGameUserInfo != null) + { + if (playGameUserInfo.GameStatus != PlayGameStatus.游戏掉线) + { + playGameUserInfo.GameStatus = PlayGameStatus.游戏中; + + } + playGameUserInfo.GameUserOperation.Add(new PlayGameUserOperation(jYApiRespnse) + { + Content = $"用户重连游戏成功,上一次心跳时间{playGameUserInfo.PlayGameHeartbeatAt?.ToString("yyyy-MM-dd HH:mm:ss")};", + OperationDateTime = DateTime.Now, + }); + } + return playGameUserInfo; + } /// /// 保存缓存到redis中 /// @@ -420,47 +475,62 @@ namespace CloudGaming.Code.Game { playGameUserInfo.LastDateTime = DateTime.Now; var redisGameKey = GetPlayGameKey(playGameUserInfo.GameId, playGameUserInfo.UserId); - if (playGameUserInfo.GameStatus == PlayGameStatus.取消排队 || playGameUserInfo.GameStatus == PlayGameStatus.游戏启动失败 || playGameUserInfo.GameStatus == PlayGameStatus.游戏结束) + if (playGameUserInfo.GameStatus == PlayGameStatus.取消排队 || playGameUserInfo.GameStatus == PlayGameStatus.游戏启动失败 || playGameUserInfo.GameStatus == PlayGameStatus.游戏结束 || playGameUserInfo.GameStatus == PlayGameStatus.用户钻石不足 || playGameUserInfo.GameStatus == PlayGameStatus.游戏掉线结束) { + T_User_GameList userGameListLog = null; if (playGameUserInfo.DiamondListId > 0) { //设置游玩记录 - var userGameListLog = await dao.DaoPhone.Context.T_User_GameList.FirstOrDefaultAsync(it => it.Id == playGameUserInfo.DiamondListId); - if (userGameListLog != null) + userGameListLog = await dao.DaoPhone.Context.T_User_GameList.FirstOrDefaultAsync(it => it.Id == playGameUserInfo.DiamondListId); + } + if (userGameListLog == null) + { + userGameListLog = new T_User_GameList { - userGameListLog.Status = (int)PlayGameStatus.游戏结束; + Channel = playGameUserInfo.Channel, + CreateTime = playGameUserInfo.PlayGameStartAt ?? playGameUserInfo.CreateDateTime, + GameId = playGameUserInfo.GameId, + Status = (int)PlayGameStatus.开始游戏, + UpdateTime = DateTime.Now, + UserId = playGameUserInfo.UserId, + SessionId = playGameUserInfo?.SessionId + }; + await dao.DaoPhone.Context.T_User_GameList.AddAsync(userGameListLog); + } + userGameListLog.Status = (int)PlayGameStatus.游戏结束; - var t = DateTime.Now.Subtract(playGameUserInfo.PlayGameStartAt ?? playGameUserInfo.CreateDateTime); - var playTime = (int)t.TotalSeconds / 60; - userGameListLog.PlaySeconds = (int)t.TotalSeconds; - userGameListLog.PlayTime = playTime; - userGameListLog.UpdateTime = DateTime.Now; - await dao.DaoPhone.Context.SaveChangesAsync(); - //设置游玩历史 - var userId = playGameUserInfo.UserId; - var gameId = playGameUserInfo.GameId; - //设置用户游玩历史 - var playGameTime = await dao.DaoPhone.Context.T_User_PlayGameTime.Where(it => it.UserId == userId && it.GameId == gameId).FirstOrDefaultAsync(); - if (playGameTime == null) + var t = DateTime.Now.Subtract(playGameUserInfo.PlayGameStartAt ?? playGameUserInfo.CreateDateTime); + var playTime = (int)t.TotalSeconds / 60; + userGameListLog.PlaySeconds = (int)t.TotalSeconds; + userGameListLog.PlayTime = playTime; + userGameListLog.UpdateTime = DateTime.Now; + await dao.DaoPhone.Context.SaveChangesAsync(); + //设置游玩历史 + var userId = playGameUserInfo.UserId; + var gameId = playGameUserInfo.GameId; + if (playGameUserInfo.GameStatus != PlayGameStatus.取消排队 && playGameUserInfo.GameStatus != PlayGameStatus.游戏启动失败) + { + //设置用户游玩历史 + var playGameTime = await dao.DaoPhone.Context.T_User_PlayGameTime.Where(it => it.UserId == userId && it.GameId == gameId).FirstOrDefaultAsync(); + if (playGameTime == null) + { + playGameTime = new T_User_PlayGameTime() { - playGameTime = new T_User_PlayGameTime() - { - Createtime = DateTime.Now, - NightCardPlayTime = 0, - DiamondPlayTime = 0, - FreePlayTime = 0, - GameId = gameId, - PlayTime = 0, - UpdateTime = DateTime.Now, - UserId = userId, - }; - await dao.DaoPhone.Context.T_User_PlayGameTime.AddAsync(playGameTime); - } - playGameTime.PlayTime += playTime; - playGameTime.UpdateTime = DateTime.Now; - playGameTime.DiamondPlayTime += playTime; - await dao.DaoPhone.Context.SaveChangesAsync(); + Createtime = DateTime.Now, + NightCardPlayTime = 0, + DiamondPlayTime = 0, + FreePlayTime = 0, + GameId = gameId, + PlayTime = 0, + UpdateTime = DateTime.Now, + UserId = userId, + }; + await dao.DaoPhone.Context.T_User_PlayGameTime.AddAsync(playGameTime); } + playGameTime.PlayTime += playTime; + playGameTime.UpdateTime = DateTime.Now; + playGameTime.DiamondPlayTime += playTime; + await dao.DaoPhone.Context.SaveChangesAsync(); } var playGameLog = playGameUserInfo.ToGamePlayGameLog(); if (playGameLog != null) diff --git a/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameProcessor.cs b/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameProcessor.cs index 4bb8daa..1740107 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameProcessor.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameProcessor.cs @@ -120,7 +120,7 @@ public class PlayGameProcessor(IServiceProvider serviceProvider) : ThreadProcess var jyResponse = await jyApi.StopGame(playGameCommonSetting).ConfigureAwait(false); - user.ExitPlayGame(jyResponse); + user.PlayGameDiaoXian(jyResponse); await user.SaveChangesAsync(dao, redis).ConfigureAwait(false); } } diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/JY/MyScListModel.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/JY/MyScListModel.cs new file mode 100644 index 0000000..1007aef --- /dev/null +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/JY/MyScListModel.cs @@ -0,0 +1,21 @@ +using CloudGaming.DtoModel.PlayGame; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudGaming.DtoModel.JY +{ + /// + /// 获取我的会话列表 + /// + public class MyScListModel + { + /// + /// 会话列表 + /// + public List List { get; set; } + } +} diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameSession.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameSession.cs new file mode 100644 index 0000000..557758e --- /dev/null +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameSession.cs @@ -0,0 +1,60 @@ +using Newtonsoft.Json; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json.Serialization; +using System.Threading.Tasks; + +namespace CloudGaming.DtoModel.PlayGame +{ + /// + /// 游戏会话 + /// + public class PlayGameSession + { + /// + ///会话 ID + /// + [JsonProperty("sc_id")] + [JsonPropertyName("sc_id")] + public int ScId { get; set; } + /// + /// 类型 (able_take 或 able_recon) + /// + [JsonProperty("type")] + [JsonPropertyName("type")] + public string Type { get; set; } + /// + /// 挂机剩余时长 + /// + [JsonProperty("rest_time")] + [JsonPropertyName("rest_time")] + public int RestTime { get; set; } + /// + /// 游戏 key + /// + [JsonProperty("game_key")] + [JsonPropertyName("game_key")] + public string GameKey { get; set; } + /// + /// 游戏名称 + /// + [JsonProperty("game_name")] + [JsonPropertyName("game_name")] + public string GameName { get; set; } + /// + /// 房间 ID + /// + [JsonProperty("room_id")] + [JsonPropertyName("room_id")] + public int RoomId { get; set; } + /// + /// 房间名称 + /// + [JsonProperty("room_name")] + [JsonPropertyName("room_name")] + public string RoomName { get; set; } + } +} diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameStatus.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameStatus.cs index 6df1b31..5b84f6e 100644 --- a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameStatus.cs +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameStatus.cs @@ -48,11 +48,22 @@ namespace CloudGaming.DtoModel.PlayGame /// 游戏掉线 /// 游戏掉线 = 8, + + /// + /// + /// + 游戏掉线结束 = 10, + /// /// 游戏启动失败 /// 游戏启动失败 = 9, - + /// + /// + /// + 用户钻石不足 = 11, + + } } diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameUserInfo.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameUserInfo.cs index 6dd0c90..b3f790b 100644 --- a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameUserInfo.cs +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameUserInfo.cs @@ -146,6 +146,11 @@ public class PlayGameUserInfo /// public string Ip { get; set; } + /// + /// 渠道号 + /// + public string Channel { get; set; } + /// /// 转化成数据库实体类 /// diff --git a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/T_Game_PlayGameLog.cs b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/T_Game_PlayGameLog.cs index 4411ddb..e5d3cc6 100644 --- a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/T_Game_PlayGameLog.cs +++ b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_Phone/T_Game_PlayGameLog.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace CloudGaming.Model.DbSqlServer.Db_Phone;