GameController.cs 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. using Common.Extension;
  2. using Common.Http.Apis.Request;
  3. using Microsoft.AspNetCore.Mvc;
  4. using System.Text.Json;
  5. namespace Kitty_Fall.Website.Controllers
  6. {
  7. public class GameController : Controller
  8. {
  9. private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(GameController));
  10. private readonly IConfiguration _configuration;
  11. public GameController(IConfiguration configuration)
  12. {
  13. _configuration = configuration;
  14. }
  15. [HttpPost]
  16. public async Task<IActionResult> StartSession([FromBody] UserGameLevelResultReq request)
  17. {
  18. try
  19. {
  20. var apiResult = await SendGameApiAsync(request, UrlConstant.GameStartSessionUrl);
  21. if (apiResult.errorCode == "0" && apiResult.data != null)
  22. {
  23. var maxLevel = await GetTodayMaxLevelAsync(request);
  24. HttpContext.Session.SetComplexData("totalTurn", (long)apiResult.data.totalTurn);
  25. return Json(new
  26. {
  27. success = true,
  28. point = apiResult.data.point,
  29. data = apiResult.data.data,
  30. score = apiResult.data.score,
  31. transId = apiResult.data.transId,
  32. totalTurn = apiResult.data.totalTurn,
  33. max_level = maxLevel
  34. });
  35. }
  36. return Json(new
  37. {
  38. success = false,
  39. reason = apiResult.data?.reason ?? "",
  40. message = apiResult.message ?? "Start game failed."
  41. });
  42. }
  43. catch (Exception ex)
  44. {
  45. log.Error("StartSession error: ", ex);
  46. return Json(new { success = false, message = ex.Message });
  47. }
  48. }
  49. [HttpPost]
  50. public async Task<IActionResult> SaveLevelResult([FromBody] UserGameLevelResultReq request)
  51. {
  52. try
  53. {
  54. var apiResult = await SendGameApiAsync(request, UrlConstant.GameSaveLevelResultUrl);
  55. if (apiResult.data != null)
  56. {
  57. return Json(new
  58. {
  59. point = apiResult.data.point,
  60. data = apiResult.data.data,
  61. score = apiResult.data.score,
  62. transId = apiResult.data.transId,
  63. rewardType = apiResult.data.rewardType,
  64. rewardValue = apiResult.data.rewardValue,
  65. rewardUnit = apiResult.data.rewardUnit,
  66. success = apiResult.errorCode == "0"
  67. });
  68. }
  69. return Json(new
  70. {
  71. point = "0",
  72. data = "",
  73. // Khong tra lai score cu cua level truoc khi API ghi level loi.
  74. score = "0",
  75. transId = request.transId ?? "",
  76. rewardType = "",
  77. rewardValue = 0,
  78. rewardUnit = "",
  79. success = false,
  80. message = apiResult.message ?? "Save level result failed."
  81. });
  82. }
  83. catch (Exception ex)
  84. {
  85. log.Error("SaveLevelResult error: ", ex);
  86. return Json(new { success = false, message = ex.Message });
  87. }
  88. }
  89. [HttpPost]
  90. public async Task<IActionResult> ExitGame(UserGameLevelResultReq request)
  91. {
  92. try
  93. {
  94. log.Info($"ExitGame msisdn={request.msisdn}, transId={request.transId}, level={request.level}, score={request.score}, gameType={request.gameType}, gameOver={request.gameOver}");
  95. request.gameOver = request.gameOver == 0 ? 1 : request.gameOver;
  96. var apiResult = await SendGameApiAsync(request, UrlConstant.GameSaveLevelResultUrl);
  97. if (apiResult.errorCode == "0" && apiResult.data != null)
  98. {
  99. HttpContext.Session.SetComplexData("totalTurn", (long)apiResult.data.totalTurn);
  100. }
  101. var payload = JsonSerializer.Serialize(new
  102. {
  103. type = "EXIT_GAME_RESULT",
  104. success = apiResult.errorCode == "0",
  105. score = apiResult.data?.score ?? request.score.ToString(),
  106. data = apiResult.data?.totalDataMb ?? 0,
  107. loyalty = apiResult.data?.totalLoyalty ?? 0,
  108. totalTurn = apiResult.data?.totalTurn,
  109. level = request.level,
  110. message = apiResult.message ?? ""
  111. });
  112. var callbackHtml = $"""
  113. <!doctype html>
  114. <html><head><meta charset="utf-8"></head><body>
  115. <script>window.parent.postMessage({payload}, "*");</script>
  116. </body></html>
  117. """;
  118. return Content(callbackHtml, "text/html; charset=utf-8");
  119. }
  120. catch (Exception ex)
  121. {
  122. log.Error("ExitGame error: ", ex);
  123. return Json(new { success = false, message = ex.Message });
  124. }
  125. }
  126. private async Task<UserGameLevelResultRes> SendGameApiAsync(UserGameLevelResultReq request, string apiPath)
  127. {
  128. var msisdn = HttpContext.Session.GetComplexData<string>("msisdn") ?? request.msisdn ?? "";
  129. var apiToken = HttpContext.Session.GetString("apiToken") ?? request.token ?? "";
  130. var language = GetCurrentLanguage();
  131. request.msisdn = msisdn;
  132. request.token = apiToken;
  133. request.language = language;
  134. var baseUrl = GetParameter("url");
  135. if (string.IsNullOrWhiteSpace(baseUrl) || string.IsNullOrWhiteSpace(apiToken))
  136. {
  137. return new UserGameLevelResultRes("{\"errorCode\":1,\"message\":\"Please login again.\",\"status\":false,\"data\":{}}");
  138. }
  139. var postTask = DotnetLib.Rest.RestHandler.SendPostWithAuthen(
  140. log,
  141. baseUrl + apiPath,
  142. request,
  143. apiToken,
  144. "",
  145. "",
  146. language);
  147. if (postTask == null)
  148. {
  149. return new UserGameLevelResultRes("{\"errorCode\":1,\"message\":\"Game API returned empty response.\",\"status\":false,\"data\":{}}");
  150. }
  151. var response = await postTask;
  152. if (response?.data == null)
  153. {
  154. return new UserGameLevelResultRes("{\"errorCode\":1,\"message\":\"Game API returned empty response.\",\"status\":false,\"data\":{}}");
  155. }
  156. return new UserGameLevelResultRes(response.data);
  157. }
  158. private async Task<int> GetTodayMaxLevelAsync(UserGameLevelResultReq request)
  159. {
  160. const int defaultLevel = 1;
  161. try
  162. {
  163. var baseUrl = GetParameter("url");
  164. var apiToken = HttpContext.Session.GetString("apiToken") ?? request.token ?? "";
  165. var msisdn = HttpContext.Session.GetComplexData<string>("msisdn") ?? request.msisdn ?? "";
  166. var language = GetCurrentLanguage();
  167. if (string.IsNullOrWhiteSpace(baseUrl)
  168. || string.IsNullOrWhiteSpace(apiToken)
  169. || string.IsNullOrWhiteSpace(msisdn)
  170. || string.IsNullOrWhiteSpace(request.gameType))
  171. {
  172. return defaultLevel;
  173. }
  174. var today = DateTime.Today.ToString("yyyy-MM-dd");
  175. var historyRequest = new UserGameActivityHistoryReq
  176. {
  177. msisdn = msisdn,
  178. language = language,
  179. fromDate = today,
  180. toDate = today,
  181. pageNumber = 1,
  182. pageSize = 1000
  183. };
  184. var postTask = DotnetLib.Rest.RestHandler.SendPostWithAuthen(
  185. log,
  186. baseUrl + UrlConstant.GameActivityHistoryUrl,
  187. historyRequest,
  188. apiToken,
  189. "",
  190. "",
  191. language);
  192. if (postTask == null)
  193. return defaultLevel;
  194. var response = await postTask;
  195. if (response?.data == null)
  196. return defaultLevel;
  197. var history = new UserGameActivityHistoryRes(response.data).data;
  198. if (history?.items == null)
  199. return defaultLevel;
  200. var maxLevel = history.items
  201. .Where(item =>
  202. string.Equals(item.modeCode, request.gameType, StringComparison.OrdinalIgnoreCase)
  203. || string.Equals(item.modeName, request.gameType, StringComparison.OrdinalIgnoreCase))
  204. .Select(item => item.levelNo)
  205. .DefaultIfEmpty(defaultLevel)
  206. .Max();
  207. return Math.Clamp(maxLevel, defaultLevel, 50);
  208. }
  209. catch (Exception ex)
  210. {
  211. log.Warn("GetTodayMaxLevel failed; using level 1.", ex);
  212. return defaultLevel;
  213. }
  214. }
  215. private string GetParameter(string key)
  216. {
  217. return _configuration.GetSection(key).Value
  218. ?? _configuration.GetSection("Url").Value
  219. ?? "";
  220. }
  221. private string GetCurrentLanguage()
  222. {
  223. var sessionLang = HttpContext.Session.GetComplexData<string>("culture");
  224. if (!string.IsNullOrWhiteSpace(sessionLang)) return sessionLang;
  225. return System.Globalization.CultureInfo.CurrentUICulture.Name.StartsWith("vi", StringComparison.OrdinalIgnoreCase) ? "vi" : "en";
  226. }
  227. }
  228. }