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
[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; }
}