GameController.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. using Common;
  2. using Common.Extension;
  3. using Common.Http.Apis.Request;
  4. using Microsoft.AspNetCore.Mvc;
  5. using System.Text.Json;
  6. namespace Kitty_Fall.Website.Controllers
  7. {
  8. public class GameController : Controller
  9. {
  10. private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(GameController));
  11. private readonly IConfiguration _configuration;
  12. public GameController(IConfiguration configuration)
  13. {
  14. _configuration = configuration;
  15. }
  16. [HttpPost]
  17. public async Task<IActionResult> StartSession([FromBody] UserGameLevelResultReq request)
  18. {
  19. try
  20. {
  21. var apiResult = await SendGameApiAsync(request, UrlConstant.GameStartSessionUrl);
  22. if (apiResult.errorCode == "0" && apiResult.data != null)
  23. {
  24. return Json(new
  25. {
  26. success = true,
  27. point = apiResult.data.point,
  28. data = apiResult.data.data,
  29. score = apiResult.data.score,
  30. transId = apiResult.data.transId
  31. });
  32. }
  33. return Json(new
  34. {
  35. success = false,
  36. reason = apiResult.data?.reason ?? "",
  37. message = apiResult.message ?? "Start game failed."
  38. });
  39. }
  40. catch (Exception ex)
  41. {
  42. log.Error("StartSession error: ", ex);
  43. return Json(new { success = false, message = ex.Message });
  44. }
  45. }
  46. [HttpPost]
  47. public async Task<IActionResult> SaveLevelResult([FromBody] UserGameLevelResultReq request)
  48. {
  49. try
  50. {
  51. var apiResult = await SendGameApiAsync(request, UrlConstant.GameSaveLevelResultUrl);
  52. if (apiResult.data != null)
  53. {
  54. return Json(new
  55. {
  56. point = apiResult.data.point,
  57. data = apiResult.data.data,
  58. score = apiResult.data.score,
  59. transId = apiResult.data.transId,
  60. rewardType = apiResult.data.rewardType,
  61. rewardValue = apiResult.data.rewardValue,
  62. rewardUnit = apiResult.data.rewardUnit,
  63. success = apiResult.errorCode == "0"
  64. });
  65. }
  66. return Json(new
  67. {
  68. point = "0",
  69. data = "",
  70. // Khong tra lai score cu cua level truoc khi API ghi level loi.
  71. score = "0",
  72. transId = request.transId ?? "",
  73. rewardType = "",
  74. rewardValue = 0,
  75. rewardUnit = "",
  76. success = false,
  77. message = apiResult.message ?? "Save level result failed."
  78. });
  79. }
  80. catch (Exception ex)
  81. {
  82. log.Error("SaveLevelResult error: ", ex);
  83. return Json(new { success = false, message = ex.Message });
  84. }
  85. }
  86. [HttpPost]
  87. public async Task<IActionResult> ExitGame(UserGameLevelResultReq request)
  88. {
  89. try
  90. {
  91. log.Info($"ExitGame msisdn={request.msisdn}, transId={request.transId}, level={request.level}, score={request.score}, gameType={request.gameType}, gameOver={request.gameOver}");
  92. request.gameOver = request.gameOver == 0 ? 1 : request.gameOver;
  93. var apiResult = await SendGameApiAsync(request, UrlConstant.GameSaveLevelResultUrl);
  94. var payload = JsonSerializer.Serialize(new
  95. {
  96. type = "EXIT_GAME_RESULT",
  97. success = apiResult.errorCode == "0",
  98. score = apiResult.data?.score ?? request.score.ToString(),
  99. data = apiResult.data?.totalDataMb ?? 0,
  100. loyalty = apiResult.data?.totalLoyalty ?? 0,
  101. level = request.level,
  102. message = apiResult.message ?? ""
  103. });
  104. var callbackHtml = $"""
  105. <!doctype html>
  106. <html><head><meta charset="utf-8"></head><body>
  107. <script>window.parent.postMessage({payload}, "*");</script>
  108. </body></html>
  109. """;
  110. return Content(callbackHtml, "text/html; charset=utf-8");
  111. }
  112. catch (Exception ex)
  113. {
  114. log.Error("ExitGame error: ", ex);
  115. return Json(new { success = false, message = ex.Message });
  116. }
  117. }
  118. private async Task<UserGameLevelResultRes> SendGameApiAsync(UserGameLevelResultReq request, string apiPath)
  119. {
  120. var msisdn = HttpContext.Session.GetComplexData<string>("msisdn") ?? request.msisdn ?? "";
  121. var apiToken = HttpContext.Session.GetString("apiToken") ?? request.token ?? "";
  122. var language = GetCurrentLanguage();
  123. request.msisdn = msisdn;
  124. request.token = apiToken;
  125. request.language = language;
  126. var baseUrl = GetParameter("url");
  127. if (string.IsNullOrWhiteSpace(baseUrl) || string.IsNullOrWhiteSpace(apiToken))
  128. {
  129. return new UserGameLevelResultRes("{\"errorCode\":1,\"message\":\"Please login again.\",\"status\":false,\"data\":{}}");
  130. }
  131. var postTask = DotnetLib.Rest.RestHandler.SendPostWithAuthen(
  132. log,
  133. baseUrl + apiPath,
  134. request,
  135. apiToken,
  136. "",
  137. "",
  138. language);
  139. if (postTask == null)
  140. {
  141. return new UserGameLevelResultRes("{\"errorCode\":1,\"message\":\"Game API returned empty response.\",\"status\":false,\"data\":{}}");
  142. }
  143. var response = await postTask;
  144. if (response?.data == null)
  145. {
  146. return new UserGameLevelResultRes("{\"errorCode\":1,\"message\":\"Game API returned empty response.\",\"status\":false,\"data\":{}}");
  147. }
  148. return new UserGameLevelResultRes(response.data);
  149. }
  150. private string GetParameter(string key)
  151. {
  152. return _configuration.GetSection(key).Value
  153. ?? _configuration.GetSection("Url").Value
  154. ?? "";
  155. }
  156. private string GetCurrentLanguage()
  157. {
  158. var sessionLang = HttpContext.Session.GetComplexData<string>("culture");
  159. if (!string.IsNullOrWhiteSpace(sessionLang)) return sessionLang;
  160. return System.Globalization.CultureInfo.CurrentUICulture.Name.StartsWith("vi", StringComparison.OrdinalIgnoreCase) ? "vi" : "en";
  161. }
  162. }
  163. }