diff --git a/src/CloudGaming/Code/CloudGaming.Code/Account/AccountExtend.cs b/src/CloudGaming/Code/CloudGaming.Code/Account/AccountExtend.cs index f7b9193..2c5841e 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Account/AccountExtend.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Account/AccountExtend.cs @@ -349,6 +349,66 @@ namespace CloudGaming.Code.Account } return await UserConsumeDiamondMoneyAsync(cloudGamingBase, money, it => { it.Title = title; it.OrderCode = orderId; }); } + /// + /// 用户玩游戏消耗钻石 + /// + /// + /// 金额 + /// 资产记录日志id + /// 游戏名称 + /// 资产收入支出记录id + /// 游戏每分钟消耗多少钻石 + /// + public static async Task<(bool, int, int)> UserPlayGameDiamondConsumeMoney(this CloudGamingBase cloudGamingBase, decimal money, string gameName, int currencyLogId,int diamondListId, string gameXiaoHao) + { + bool issuccess = false; + int _currencyLogId = currencyLogId; + try + { + var currency = new T_User_Currency(); + GameDiamondConsumeMoney gameDiamondConsumeMoney = new GameDiamondConsumeMoney(cloudGamingBase.Dao, cloudGamingBase._UserId, UserCurrencyType.钻石, currency); + (issuccess, _currencyLogId) = await gameDiamondConsumeMoney.ConsumeMoneyAsync(money, currencyLogId); + if (issuccess) + { + cloudGamingBase.UserInfo.Diamond = (int)currency.CurrencyMoney; + await cloudGamingBase.SaveUserInfoCacheChangesAsync(); + UserCurrencyConsumeType consumeType = money >= 0 ? UserCurrencyConsumeType.收入 : UserCurrencyConsumeType.消耗; + T_User_DiamondList userDiamondList = null; + if (diamondListId > 0) + { + userDiamondList = await cloudGamingBase.Dao.DaoUser.Context.T_User_DiamondList.FirstOrDefaultAsync(it => it.Id == diamondListId); + } + if (userDiamondList == null) + { + userDiamondList = new T_User_DiamondList() + { + CreateAt = DateTime.Now, + Consume = 0, + ConsumeType = (int)consumeType, + CurrencyType = (int)UserCurrencyType.钻石, + OrderCode = "", + Title = $"游玩《{gameName}》", + UpdateAt = DateTime.Now, + UserId = cloudGamingBase.UserInfo.UserId, + Extend = gameXiaoHao, + }; + await cloudGamingBase.Dao.DaoUser.Context.AddAsync(userDiamondList); + diamondListId = userDiamondList.Id; + } + userDiamondList.Consume += money; + userDiamondList.UpdateAt = DateTime.Now; + await cloudGamingBase.Dao.DaoUser.Context.SaveChangesAsync(); + } + } + catch (Exception ex) + { + + return (false, _currencyLogId, diamondListId); ; + } + return (issuccess, _currencyLogId, diamondListId); + + } + /// /// 发送消息 diff --git a/src/CloudGaming/Code/CloudGaming.Code/Account/UserCurrency/DiamondConsumeMoney.cs b/src/CloudGaming/Code/CloudGaming.Code/Account/UserCurrency/DiamondConsumeMoney.cs index a6325a8..ee3b0d1 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Account/UserCurrency/DiamondConsumeMoney.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Account/UserCurrency/DiamondConsumeMoney.cs @@ -1,3 +1,5 @@ +using Bogus.DataSets; + using CloudGaming.Code.Account.Contract; using CloudGaming.Code.DataAccess; using CloudGaming.DtoModel.Account.User; @@ -8,75 +10,89 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace CloudGaming.Code.Account.UserCurrency +namespace CloudGaming.Code.Account.UserCurrency; + +/// +/// 扣除或者充值用户钻石 +/// +/// +/// +/// +/// +public class DiamondConsumeMoney(DAO dao, int userId, UserCurrencyType userCurrencyType, T_User_Currency userCurrency = null) : IUserConsumeMoney { /// - /// 扣除或者充值用户钻石 + /// 用户余额扣除 + /// + /// + /// + /// + + public async Task ConsumeMoneyAsync(decimal money) + { + T_User_Currency? currency = await AddUserCurrencyAsync(dao, userId, userCurrencyType, money); + UserCurrencyConsumeType consumeType = money >= 0 ? UserCurrencyConsumeType.收入 : UserCurrencyConsumeType.消耗; + var currency_Log = new T_User_Currency_Log() + { + Consume = money, + ConsumeType = (int)consumeType, + CreateAt = DateTime.Now, + CurrencyType = (int)userCurrencyType, + Remarks = $"于{DateTime.Now:yyyy-MM-dd HH:mm:ss}{consumeType}[{Math.Abs(money)}]{userCurrencyType};", + UpdateAt = DateTime.Now, + UserId = userId, + }; + await dao.DaoUser.Context.T_User_Currency_Log.AddAsync(currency_Log); + await dao.DaoUser.Context.SaveChangesAsync(); + if (userCurrency != null) + { + userCurrency.CurrencyMoney = currency.CurrencyMoney; + userCurrency.UpdateAt = currency.UpdateAt; + userCurrency.Id = currency.Id; + userCurrency.CurrencyName = currency.CurrencyName; + userCurrency.CreateAt = currency.CreateAt; + userCurrency.CurrencyType = currency.CurrencyType; + } + else + { + userCurrency = currency; + } + return true; + } + + + /// + /// /// /// /// /// - /// - public class DiamondConsumeMoney(DAO dao, int userId, UserCurrencyType userCurrencyType, T_User_Currency userCurrency = null) : IUserConsumeMoney + /// + /// + /// 余额不足 + public async Task AddUserCurrencyAsync(decimal money) { - /// - /// 用户余额扣除 - /// - /// - /// - /// - - public async Task ConsumeMoneyAsync(decimal money) + var currency = await dao.DaoUser.Context.T_User_Currency.Where(it => it.CurrencyType == (int)userCurrencyType && it.UserId == userId).FirstOrDefaultAsync(); + if (currency == null) { - - var currency = await dao.DaoUser.Context.T_User_Currency.Where(it => it.CurrencyType == (int)userCurrencyType && it.UserId == userId).FirstOrDefaultAsync(); - if (currency == null) + currency = new T_User_Currency() { - currency = new T_User_Currency() - { - CreateAt = DateTime.Now, - CurrencyMoney = 0, - CurrencyName = userCurrencyType.ToString(), - CurrencyType = (int)userCurrencyType, - UserId = userId, - UpdateAt = DateTime.Now, - }; - await dao.DaoUser.Context.T_User_Currency.AddAsync(currency); - await dao.DaoUser.Context.SaveChangesAsync(); - } - currency.CurrencyMoney += money; - if (currency.CurrencyMoney < 0) - { - throw new Exception("余额不足"); - } - UserCurrencyConsumeType consumeType = money >= 0 ? UserCurrencyConsumeType.收入 : UserCurrencyConsumeType.消耗; - var currency_Log = new T_User_Currency_Log() - { - Consume = money, - ConsumeType = (int)consumeType, CreateAt = DateTime.Now, + CurrencyMoney = 0, + CurrencyName = userCurrencyType.ToString(), CurrencyType = (int)userCurrencyType, - Remarks = $"于{DateTime.Now:yyyy-MM-dd HH:mm:ss}{consumeType}[{Math.Abs(money)}]{userCurrencyType};", - UpdateAt = DateTime.Now, UserId = userId, + UpdateAt = DateTime.Now, }; - await dao.DaoUser.Context.T_User_Currency_Log.AddAsync(currency_Log); + await dao.DaoUser.Context.T_User_Currency.AddAsync(currency); await dao.DaoUser.Context.SaveChangesAsync(); - if (userCurrency != null) - { - userCurrency.CurrencyMoney = currency.CurrencyMoney; - userCurrency.UpdateAt = currency.UpdateAt; - userCurrency.Id = currency.Id; - userCurrency.CurrencyName = currency.CurrencyName; - userCurrency.CreateAt = currency.CreateAt; - userCurrency.CurrencyType = currency.CurrencyType; - } - else - { - userCurrency = currency; - } - return true; - } + currency.CurrencyMoney += money; + if (currency.CurrencyMoney < 0) + { + throw new Exception("余额不足"); + } + + return currency; } } diff --git a/src/CloudGaming/Code/CloudGaming.Code/Account/UserCurrency/GameDiamondConsumeMoney.cs b/src/CloudGaming/Code/CloudGaming.Code/Account/UserCurrency/GameDiamondConsumeMoney.cs new file mode 100644 index 0000000..03dbb75 --- /dev/null +++ b/src/CloudGaming/Code/CloudGaming.Code/Account/UserCurrency/GameDiamondConsumeMoney.cs @@ -0,0 +1,89 @@ +using CloudGaming.Code.Account.Contract; +using CloudGaming.Code.DataAccess; +using CloudGaming.DtoModel.Account.User; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudGaming.Code.Account.UserCurrency; + +/// +/// 游戏扣除钻石 +/// +/// +/// +/// +/// +public class GameDiamondConsumeMoney(DAO dao, int userId, UserCurrencyType userCurrencyType, T_User_Currency userCurrency = null) : IUserConsumeMoney +{ + /// + /// 玩游戏消耗钻石 + /// + /// + /// + /// + /// + public async Task<(bool, int)> ConsumeMoneyAsync(decimal money, int currencyLogId) + { + var currency = await new DiamondConsumeMoney(dao, userId, userCurrencyType, userCurrency).AddUserCurrencyAsync(money); + if (currency == null) + { + throw new Exception("扣费失败"); + } + UserCurrencyConsumeType consumeType = money >= 0 ? UserCurrencyConsumeType.收入 : UserCurrencyConsumeType.消耗; + T_User_Currency_Log currency_Log = null; + if (currencyLogId > 0) + { + currency_Log = await dao.DaoUser.Context.T_User_Currency_Log.FirstOrDefaultAsync(it => it.Id == currencyLogId); + } + if (currency_Log == null) + { + currency_Log = new T_User_Currency_Log() + { + Consume = 0, + ConsumeType = (int)consumeType, + CreateAt = DateTime.Now, + CurrencyType = (int)userCurrencyType, + Remarks = $"", + UpdateAt = DateTime.Now, + UserId = userId, + }; + await dao.DaoUser.Context.T_User_Currency_Log.AddAsync(currency_Log); + } + currency_Log.Consume += money; + currency_Log.Remarks = $"用户玩游戏{consumeType}[{Math.Abs(money)}]{userCurrencyType}"; + await dao.DaoUser.Context.SaveChangesAsync(); + if (userCurrency != null) + { + userCurrency.CurrencyMoney = currency.CurrencyMoney; + userCurrency.UpdateAt = currency.UpdateAt; + userCurrency.Id = currency.Id; + userCurrency.CurrencyName = currency.CurrencyName; + userCurrency.CreateAt = currency.CreateAt; + userCurrency.CurrencyType = currency.CurrencyType; + } + else + { + userCurrency = currency; + } + return (true, currency_Log?.Id ?? 0); + } + + + /// + /// 用户余额扣除 + /// + /// + /// + /// + + public async Task ConsumeMoneyAsync(decimal money) + { + return await new DiamondConsumeMoney(dao, userId, userCurrencyType, userCurrency).ConsumeMoneyAsync(money); + } + + +} diff --git a/src/CloudGaming/Code/CloudGaming.Code/Contract/IJYApi.cs b/src/CloudGaming/Code/CloudGaming.Code/Contract/IJYApi.cs index a2cae7a..9767ca9 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Contract/IJYApi.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Contract/IJYApi.cs @@ -67,7 +67,7 @@ namespace CloudGaming.Code.Contract /// /// [Post("/jyapi/reconPlayGame")] - Task>> ReconPlayGame([Body(BodySerializationMethod.UrlEncoded)] DisplayGradeSettings playGameQueue); + Task>> ReconPlayGame([Body(BodySerializationMethod.UrlEncoded)] ReconPlayGameSettings reconPlayGameSettings); /// /// 停止游戏 @@ -77,6 +77,14 @@ namespace CloudGaming.Code.Contract [Post("/jyapi/stopGame")] Task>> StopGame([Body(BodySerializationMethod.UrlEncoded)] PlayGameCommonSetting playGameQueue); + + /// + /// 查看自己的会话列表 + /// + /// + /// + [Post("/jyapi/myScList")] + Task>> MyScList([Body(BodySerializationMethod.UrlEncoded)] RequestBaseModel requestBase); /// /// 获取会话列表 /// diff --git a/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameBLL.cs b/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameBLL.cs index fd589b2..2d947e2 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameBLL.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameBLL.cs @@ -1,5 +1,9 @@ +using Azure.Core; + +using CloudGaming.Code.Account; using CloudGaming.Code.AppExtend.ConfigModel; using CloudGaming.Code.Contract; +using CloudGaming.DtoModel.Account.User; using CloudGaming.DtoModel.Game; using CloudGaming.DtoModel.JY; using CloudGaming.DtoModel.PlayGame; @@ -118,20 +122,10 @@ namespace CloudGaming.Code.Game }; playGameRequest.Cpu = playGameRequest.Cpu; - // 调用游戏启动接口 + // 调用游戏启动接口 var data = await JYApi.PlayGame(playGameSettings); - // 创建游戏启动日志对象 - var playGameLog = new T_User_PlayGmaeLog - { - CreateTime = DateTime.Now, - DescribeContent = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} 用户尝试启动游戏;", - GameId = playGameRequest.GameId, - UserId = _UserId, - RequestContent = data.RequestStr, - ResponseContent = data.ResponseStr, - SessionId = gameInfoCache?.SessionId - }; + //T_User_PlayGmaeLog playGameLog = await AddPlayGmaeLog(gameInfoCache, $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} 用户尝试启动游戏;", data.ResponseStr, data.ResponseContent); var response = new BaseResponse(); // 用户进入排队 @@ -140,14 +134,13 @@ namespace CloudGaming.Code.Game var gameResponse = JsonConvert.DeserializeObject>(data.ResponseContent); gameInfoCache?.PlayQueueStart(gameResponse?.Data?.PlayQueueId ?? 0, gameResponse?.Data?.QueuePos ?? 0, playGameSettings.QueueGrade); - playGameLog.DescribeContent += "用户进入排队状态;"; + //playGameLog.DescribeContent += "用户进入排队状态;"; response = new BaseResponse(ResponseCode.StartQueue, "开始排队", data.Data); } else if (data.IsSuccess) { // 游戏启动成功 var gameResponse = JsonConvert.DeserializeObject>(data.ResponseContent); - // 创建游戏记录和日志 var userGameList = new T_User_GameList { @@ -158,7 +151,6 @@ namespace CloudGaming.Code.Game UpdateTime = DateTime.Now, UserId = _UserId }; - var userGameLog = new T_User_GameLog { Cpu = playGameRequest.Cpu, @@ -169,7 +161,7 @@ namespace CloudGaming.Code.Game IP = HttpContextAccessor.HttpContext.GetClientIpAddress(), ModelName = playGameRequest.ModelName, QueueGrade = playGameSettings.QueueGrade, - ScId = gameResponse?.Data?.ScId ?? "", + ScId = (gameResponse?.Data?.ScId ?? 0).ToString(), Status = (int)PlayGameStatus.开始游戏, UpdateTime = DateTime.Now, UserId = _UserId, @@ -177,25 +169,24 @@ namespace CloudGaming.Code.Game SessionId = gameInfoCache?.SessionId }; - playGameLog.DescribeContent += "游戏启动成功;"; + //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(); - - gameInfoCache?.PlayGameStart(userGameLog.ScId, userGameList.Id, playGameSettings.DisplayGrade); + gameInfoCache?.PlayGameStart(gameResponse?.Data?.ScId ?? 0, userGameList.Id, playGameSettings.DisplayGrade); response = new BaseResponse(ResponseCode.Success, "", data.Data); } else // 游戏启动失败 { gameInfoCache?.PlayGameError(); - playGameLog.DescribeContent += "游戏启动失败;"; + //playGameLog.DescribeContent += "游戏启动失败;"; + await Dao.DaoPhone.Context.SaveChangesAsync(); response = new BaseResponse(ResponseCode.Error, data.Msg, data.Data); } - // 保存日志 - await Dao.DaoPhone.Context.T_User_PlayGmaeLog.AddAsync(playGameLog); + await Dao.DaoPhone.Context.SaveChangesAsync(); // 保存游戏缓存状态 @@ -203,13 +194,150 @@ namespace CloudGaming.Code.Game return response; } + /// + /// 游戏心跳 + /// + /// + /// + public async Task PlayGameHeartbeat(string gameId) + { + + // 检查用户是否已登录 + if (_UserId == 0) + { + throw MessageBox.ErrorShow("请先登录"); + } + + // 检查游戏是否存在 + 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 (userInfo.Diamond == 0 && gameInfo.ConsumeDiamondNumHour > 0) + { + PlayGameCommonSetting playGameCommonSetting = new PlayGameCommonSetting() + { + ScId = gameInfoCache.ScId, + Sn = gameInfoCache.Sn, + }; + var jyResponse = await JYApi.StopGame(playGameCommonSetting); + gameInfoCache.PlayGameClose(); + throw MessageBox.Show(ResponseCode.NotMoney, "钻石不足"); + } + PlayGameHeartbeatResponse playGameHeartbeatResponse = new PlayGameHeartbeatResponse() + { + Diamond = userInfo.Diamond, + UserPlayGameTime = 999 + }; + //LastChargingAt + if (gameInfo.ConsumeDiamondNumHour > 0) + { + //每分钟扣费 + var diamondNumHour = gameInfo.ConsumeDiamondNumHour / 60.0; + playGameHeartbeatResponse.GameConsumeDiamond = (int)diamondNumHour; + var chargingAt = DateTime.Now; + var minutes = (int)chargingAt.Subtract(gameInfoCache.LastChargingAt).TotalMinutes; + //判断扣费时间 + if (minutes > 1) + { + var gameDiamondNumHour = (int)diamondNumHour * minutes; + //当前游玩的扣费金额 + if (gameDiamondNumHour > 0) + { + //如果游玩余额大于用户可扣款的余额 + if (gameDiamondNumHour > userInfo.Diamond) + { + //去数据库中在验证一下 + //(int)userCurrency.GetUserCurrency(UserCurrencyType.钻石); + var currency = await Dao.DaoUser.Context.T_User_Currency.Where(it => it.UserId == userInfo.UserId && it.CurrencyType == (int)UserCurrencyType.钻石).FirstOrDefaultAsync(); + if (currency == null) + { + throw MessageBox.ErrorShow("用户数据错误"); + } + if ((int)(currency.CurrencyMoney) != userInfo.Diamond) + { + userInfo.Diamond = (int)currency.CurrencyMoney; + } + if (gameDiamondNumHour > userInfo.Diamond) + { + //用户余额不足 + gameDiamondNumHour = userInfo.Diamond; + playGameHeartbeatResponse.UserPlayGameTime = 0; + } + + } + var (issuccess, currlogId, diamId) = await this.UserPlayGameDiamondConsumeMoney(-gameDiamondNumHour, gameInfoCache.GameName, gameInfoCache.CurrencyLogId, gameInfoCache.DiamondListId, $"{diamondNumHour}/分钟"); + if (!issuccess) + { + throw MessageBox.ErrorShow("扣款出现错误"); + } + gameInfoCache.CurrencyLogId = currlogId; + gameInfoCache.DiamondListId = diamId; + //修改最后扣费时间 + gameInfoCache.LastChargingAt = gameInfoCache.LastChargingAt.AddMinutes(minutes); + await gameInfoCache.SaveChangesAsync(this); + await Dao.DaoUser.Context.SaveChangesAsync(); + //用户剩余游玩时间 + if (userInfo.Diamond > 0) + { + var userPlayGameTime = (int)(userInfo.Diamond / diamondNumHour); + playGameHeartbeatResponse.UserPlayGameTime = userPlayGameTime; + } + + //重置一下用户钻石 + playGameHeartbeatResponse.Diamond = userInfo.Diamond; + + } + + } + } + return playGameHeartbeatResponse; + + } + + /// + /// 添加日志 + /// + /// + /// + /// + /// + /// + private async Task AddPlayGmaeLog(PlayGameUserInfo gameInfoCache, string describeContent, string requestContent, string responseContent) + { + var playGameLog = new T_User_PlayGmaeLog + { + CreateTime = DateTime.Now, + DescribeContent = describeContent, + GameId = gameInfoCache.GameId, + UserId = gameInfoCache.UserId, + RequestContent = requestContent, + ResponseContent = responseContent, + SessionId = gameInfoCache?.SessionId + }; + // 创建游戏启动日志对象 + + // 保存日志 + await Dao.DaoPhone.Context.T_User_PlayGmaeLog.AddAsync(playGameLog); + return playGameLog; + } + /// /// 游戏排队 /// /// /// - public async Task> PlayGameQueue(GameRequest gameRequest) + public async Task> PlayGameQueueAsync(GameRequest gameRequest) { if (_UserId == 0) { @@ -229,7 +357,7 @@ namespace CloudGaming.Code.Game PlayGameUserInfo gameInfoCache = await PlayGameExtend.GetPlayGameUserInfoOrNull(this, userInfo, gameInfo); if (gameInfoCache == null) { - throw MessageBox.ErrorShow("未找到排队信息"); + throw MessageBox.ErrorShow("未找到游戏信息"); } if (gameInfoCache.PlayQueueId == 0) { @@ -247,6 +375,7 @@ namespace CloudGaming.Code.Game if (paidui.IsSuccess) { gameInfoCache.PlayQueueSuccess(); + back = new BaseResponse(0, "排队成功"); } else if (paidui.IsLineUp) @@ -269,7 +398,7 @@ namespace CloudGaming.Code.Game /// /// /// - public async Task> CancelQueue(GameRequest gameRequest) + public async Task> CancelQueueAsync(GameRequest gameRequest) { if (_UserId == 0) { @@ -289,13 +418,9 @@ namespace CloudGaming.Code.Game PlayGameUserInfo gameInfoCache = await PlayGameExtend.GetPlayGameUserInfoOrNull(this, userInfo, gameInfo); if (gameInfoCache == null) { - throw MessageBox.ErrorShow("未找到排队信息"); + throw MessageBox.ErrorShow("未找到游戏信息"); } - if (gameInfoCache.PlayQueueId == 0) - { - throw MessageBox.ErrorShow("排队出错"); - } - //CancelQueue + //CancelQueueAsync //PlayGameCancelQueue playGameQueue PlayGameQueue playGameQueue = new PlayGameQueue() { @@ -311,9 +436,105 @@ namespace CloudGaming.Code.Game return new BaseResponse(ResponseCode.Success, "取消排队成功"); } - public async Task DisplayGrade(int queue_grade) + /// + /// 切换视频等级 + /// + /// + /// + /// + public async Task> DisplayGrade(int displayGrade, string gameId) { - return new BaseResponse(); + + if (_UserId == 0) + { + throw MessageBox.ErrorShow("请先登录"); + } + + // 检查游戏是否存在 + 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.GameStatus != PlayGameStatus.开始游戏 && gameInfoCache.GameStatus != PlayGameStatus.游戏中) + { + throw MessageBox.ErrorShow("不在游戏中"); + } + DisplayGradeSettings displayGradeSettings = new DisplayGradeSettings() + { + DisplayGrade = displayGrade, + ScId = gameInfoCache.ScId, + Sn = gameInfoCache.Sn, + }; + //切换视频等级 + var response = await JYApi.DisplayGrade(displayGradeSettings); + if (response.IsSuccess) + { + gameInfoCache.DisplayGrade = displayGrade; + await gameInfoCache.SaveChangesAsync(this); + } + else + { + throw MessageBox.ErrorShow("切换失败"); + } + return new BaseResponse(ResponseCode.Success, "", response.Data); + } + + + /// + /// 获取可重连的会话列表 + /// + /// + /// + public async Task> GetMyScList(string sn) + { + var requestParmat = new RequestBaseModel() + { + Sn = sn, + }; + var response = await JYApi.MyScList(requestParmat); + if (response.IsSuccess) + { + return new BaseResponse(ResponseCode.Success, "", response.Data) { }; + } + throw response.ToMessageBox(); + + } + + /// + /// 重连会话 + /// + /// + /// + /// + /// + /// + /// + public async Task> ReconPlayGame(int sc_id, int display_grade, string model_name, string sn, string cpu) + { + var setting = new ReconPlayGameSettings() + { + ScId = sc_id, + DisplayGrade = display_grade, + Cpu = cpu, + ModelName = model_name, + Sn = sn, + }; + var response = await JYApi.ReconPlayGame(setting); + if (response.IsSuccess) + { + return new BaseResponse(ResponseCode.Success, "", response.Data) { }; + } + throw response.ToMessageBox(); } } } diff --git a/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameExtend.cs b/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameExtend.cs index d74da81..8a9bede 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameExtend.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameExtend.cs @@ -82,7 +82,7 @@ namespace CloudGaming.Code.Game /// 游戏记录id /// 游戏显示等级 /// - public static bool PlayGameStart(this PlayGameUserInfo playGameUserInfo, string scId, int gameListId, int display_grade) + public static bool PlayGameStart(this PlayGameUserInfo playGameUserInfo, int scId, int gameListId, int display_grade) { playGameUserInfo.GameStatus = PlayGameStatus.开始游戏; playGameUserInfo.GameListId = gameListId; @@ -95,6 +95,7 @@ namespace CloudGaming.Code.Game }); playGameUserInfo.PlayGameStartAt = DateTime.Now; playGameUserInfo.PlayGameHeartbeatAt = DateTime.Now; + playGameUserInfo.LastChargingAt = DateTime.Now; return true; } @@ -108,6 +109,18 @@ namespace CloudGaming.Code.Game playGameUserInfo.GameStatus = PlayGameStatus.游戏启动失败; return true; } + + /// + /// 游戏启动失败 + /// + /// + /// + public static bool PlayGameClose(this PlayGameUserInfo playGameUserInfo) + { + playGameUserInfo.GameStatus = PlayGameStatus.游戏结束; + return true; + } + /// /// 游戏心跳 /// diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/JY/JYPlayGameModel.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/JY/JYPlayGameModel.cs index 7c864c8..d2c9a96 100644 --- a/src/CloudGaming/Model/CloudGaming.DtoModel/JY/JYPlayGameModel.cs +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/JY/JYPlayGameModel.cs @@ -32,7 +32,7 @@ namespace CloudGaming.DtoModel.JY /// 本次游戏连接会话 id /// [JsonProperty("sc_id")] - public string ScId { get; set; } + public int ScId { get; set; } /// /// 链路唯一标识, /// diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameCommonSetting.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameCommonSetting.cs index daacb7f..89cc336 100644 --- a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameCommonSetting.cs +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameCommonSetting.cs @@ -16,6 +16,6 @@ namespace CloudGaming.DtoModel.PlayGame /// 本次游戏连接会话 id /// [JsonPropertyName("sc_id")] - public string ScId { get; set; } + public int ScId { get; set; } } } diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameHeartbeatResponse.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameHeartbeatResponse.cs new file mode 100644 index 0000000..4183c34 --- /dev/null +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameHeartbeatResponse.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudGaming.DtoModel.PlayGame +{ + /// + /// + /// + public class PlayGameHeartbeatResponse + { + /// + /// 当前游戏消耗钻石数/每分钟 + /// + public int GameConsumeDiamond { get; set; } + + /// + /// 用户剩余游玩时间(分钟) + /// + public int UserPlayGameTime { get; set; } + + /// + /// 用户剩余钻石 + /// + public int Diamond { get; set; } + } +} diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameUserInfo.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameUserInfo.cs index 0bb1587..736830f 100644 --- a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameUserInfo.cs +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/PlayGameUserInfo.cs @@ -53,6 +53,11 @@ namespace CloudGaming.DtoModel.PlayGame /// public DateTime PlayGameHeartbeatAt { get; set; } + /// + /// 最后一次扣费时间 + /// + public DateTime LastChargingAt { get; set; } + /// /// 游戏记录id /// @@ -78,7 +83,7 @@ namespace CloudGaming.DtoModel.PlayGame /// /// 鲸云scid /// - public string ScId { get; set; } + public int ScId { get; set; } /// /// 第三方游戏id @@ -118,5 +123,16 @@ namespace CloudGaming.DtoModel.PlayGame /// 用户操作内容 /// public List GameUserOperation { get; set; } + + /// + /// 金额日志表id + /// + public int CurrencyLogId { get; set; } + + + /// + /// 资产记录表id + /// + public int DiamondListId { get; set; } } } diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/ReconPlayGameSettings.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/ReconPlayGameSettings.cs index bfc703a..ec2b032 100644 --- a/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/ReconPlayGameSettings.cs +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/PlayGame/ReconPlayGameSettings.cs @@ -15,6 +15,12 @@ namespace CloudGaming.DtoModel.PlayGame public ReconPlayGameSettings() { } + /// + /// 会话 id + /// + [JsonPropertyName("sc_id")] + public int ScId { get; set; } + /// /// 显示等级,可在后台配置,默认为 1 ///