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;