Jelajahi Sumber

thêm guile và câu hình chỉ đợi ussd 15s

student 2 minggu lalu
induk
melakukan
b6066ee81f

+ 51 - 17
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Controllers/HomeController.cs

@@ -15,6 +15,7 @@ namespace Kitty_Fall.Website.Controllers
 {
     public class HomeController : BaseController
     {
+        private static readonly TimeSpan QuickRegisterTimeout = TimeSpan.FromSeconds(15);
         private readonly ILogger<HomeController> _logger;
         private readonly IConfiguration _configuration;
         private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(HomeController));
@@ -136,6 +137,7 @@ namespace Kitty_Fall.Website.Controllers
         [HttpPost]
         public async Task<IActionResult> RegisterQAction(string? productName)
         {
+            var startedAt = Stopwatch.StartNew();
             var msisdn = HttpContext.Session.GetComplexData<string>("msisdn") ?? "";
             if (string.IsNullOrWhiteSpace(msisdn))
             {
@@ -151,24 +153,25 @@ namespace Kitty_Fall.Website.Controllers
             var packageName = string.IsNullOrWhiteSpace(productName)
                 ? GetParameter("productName")
                 : productName.Trim();
-
-            if (string.IsNullOrWhiteSpace(packageName))
+            try
             {
-                var packages = await PackagesCacheHelper.GetOrLoadAsync(log, HttpContext.Session, baseUrl, GetCurrentLanguage());
-                packageName = packages.FirstOrDefault() is { } firstPackage
-                    ? ReadPackageString(firstPackage, "productName")
-                    : "";
-            }
+                if (string.IsNullOrWhiteSpace(packageName))
+                {
+                    var packages = await PackagesCacheHelper
+                        .GetOrLoadAsync(log, HttpContext.Session, baseUrl, GetCurrentLanguage())
+                        .WaitAsync(GetQuickRegisterRemainingTime(startedAt));
+                    packageName = packages.FirstOrDefault() is { } firstPackage
+                        ? ReadPackageString(firstPackage, "productName")
+                        : "";
+                }
 
-            if (string.IsNullOrWhiteSpace(packageName))
-            {
-                return Json(new { errorCode = CommonErrorCode.Error, message = "Package is not configured." });
-            }
+                if (string.IsNullOrWhiteSpace(packageName))
+                {
+                    return Json(new { errorCode = CommonErrorCode.Error, message = "Package is not configured." });
+                }
 
-            try
-            {
                 var language = GetCurrentLanguage();
-                var res = await DotnetLib.Rest.RestHandler.SendPostAsync(
+                var registerTask = DotnetLib.Rest.RestHandler.SendPostAsync(
                     log,
                     baseUrl + UrlConstant.UserRegisterSubQuickUrl,
                     new UserRegisterReq
@@ -177,8 +180,8 @@ namespace Kitty_Fall.Website.Controllers
                         packageName = packageName,
                         language = language
                     },
-                    language
-                );
+                    language);
+                var res = await registerTask.WaitAsync(GetQuickRegisterRemainingTime(startedAt));
 
                 if (res?.data == null)
                 {
@@ -198,7 +201,16 @@ namespace Kitty_Fall.Website.Controllers
 
                     // VAS da cong luot dong bo; tai lai profile de trang Play khong
                     // tiep tuc doc totalTurn cu trong session.
-                    await LoadHomeDataAsync();
+                    try
+                    {
+                        await LoadHomeDataAsync().WaitAsync(GetQuickRegisterRemainingTime(startedAt));
+                    }
+                    catch (TimeoutException)
+                    {
+                        // Registration already succeeded. Do not turn a successful charge into
+                        // a timeout just because refreshing the Home data took too long.
+                        log.Warn($"Quick register profile refresh timed out; continuing to Home. msisdn={msisdn}, packageName={packageName}, elapsedMs={startedAt.ElapsedMilliseconds}");
+                    }
                 }
 
                 return Json(new
@@ -210,6 +222,17 @@ namespace Kitty_Fall.Website.Controllers
                     totalPoint = HttpContext.Session.GetComplexData<long?>("totalPoint") ?? 0
                 });
             }
+            catch (TimeoutException ex)
+            {
+                log.Warn($"Quick register timed out after {QuickRegisterTimeout.TotalSeconds:0}s; continuing to Home. msisdn={msisdn}, packageName={packageName}, elapsedMs={startedAt.ElapsedMilliseconds}", ex);
+                return Json(new
+                {
+                    errorCode = CommonErrorCode.Error,
+                    timedOut = true,
+                    redirectUrl = Url.Action("Index", "Home") ?? "/",
+                    message = "Registration is taking longer than expected. Please check your package status later."
+                });
+            }
             catch (Exception ex)
             {
                 log.Error("RegisterQAction error: ", ex);
@@ -217,6 +240,17 @@ namespace Kitty_Fall.Website.Controllers
             }
         }
 
+        private static TimeSpan GetQuickRegisterRemainingTime(Stopwatch stopwatch)
+        {
+            var remaining = QuickRegisterTimeout - stopwatch.Elapsed;
+            if (remaining <= TimeSpan.Zero)
+            {
+                throw new TimeoutException("Quick register exceeded its 15-second time limit.");
+            }
+
+            return remaining;
+        }
+
         [HttpPost]
         public async Task<IActionResult> CancelPackage(string? packageName)
         {

+ 9 - 0
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Language/Lang.Designer.cs

@@ -1347,6 +1347,15 @@ namespace Kitty_Fall.Website.Language {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Score will be reset at the end of the month..
+        /// </summary>
+        public static string GuideRescueOption1 {
+            get {
+                return ResourceManager.GetString("GuideRescueOption1", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Reward.
         /// </summary>

+ 3 - 0
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Language/Lang.resx

@@ -819,4 +819,7 @@
   <data name="GuideHowToPlayIntro" xml:space="preserve">
     <value>How to Play: Follow the steps below to access the game and start playing.</value>
   </data>
+  <data name="GuideRescueOption1" xml:space="preserve">
+    <value>Score will be reset at the end of the month.</value>
+  </data>
 </root>

+ 4 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Language/Lang.vi.resx

@@ -433,7 +433,7 @@
     <value>ကစားသမားတစ်ဦးသည် လိုအပ်သောအချိန်အတွင်း အဆင့်တစ်ခုကို ပြီးမြောက်အောင် မလုပ်ဆောင်နိုင်ပါက ၎င်းတို့သည် အလှည့်တစ်ခု ဆုံးရှုံးမည်ဖြစ်ပြီး ဂိမ်းသည် ရပ်တန့်သွားမည်ဖြစ်ပြီး အစမှ ပြန်လည်စတင်ရမည်။</value>
   </data>
   <data name="GuideRescueOption" xml:space="preserve">
-    <value>အဆင့်တိုးတက်မှု- ကစားသမား၏ တိုးတက်မှုကို တစ်နေ့တာလုံး သိမ်းဆည်းထားမည်ဖြစ်သည်။ တစ်ရက်တည်းတွင် ဂိမ်းသို့ ပြန်လည်ဝင်ရောက်ပါက နောက်ဆုံးအောင်မြင်ခဲ့သည့် အဆင့်မှ ဆက်လက်ကစားနိုင်ပါသည်။ နေ့သစ်တစ်ခု စတင်ချိန်တွင် တိုးတက်မှုအားလုံး ပြန်လည်စတင် (reset) ဖြစ်သွားမည်ဖြစ်ပြီး ကစားသမားများသည် အဆင့် ၁ မှ ပြန်လည်စတင်ရပါမည်။</value>
+    <value>အဆင့်တိုးတက်မှု- ကစားသမားအဆင့်ကို တစ်နေ့လုံး သိမ်းဆည်းထားသည်။ ကစားသမားများသည် ထိုနေ့တွင် ဂိမ်းသို့ပြန်လာသည့်အခါ ၎င်းတို့၏ နောက်ဆုံးပြီးစီးခဲ့သော အဆင့်မှ ဆက်ဆော့ကစားနိုင်သည်။ နေ့သစ်တစ်ခုစတင်ချိန်တွင် အဆင့်အားလုံးကို ပြန်လည်သတ်မှတ်မည်ဖြစ်ပြီး ကစားသမားများသည် အဆင့် ၁ မှ ပြန်လည်စတင်မည်ဖြစ်သည်။</value>
   </data>
   <data name="GuideLevelScoreTimeRewardTable" xml:space="preserve">
     <value>အဆင့် - ရမှတ် - အချိန် - ဆုလာဘ်ဇယား</value>
@@ -819,4 +819,7 @@
   <data name="GuideHowToPlayIntro" xml:space="preserve">
     <value>ကစားနည်း- ဂိမ်းကိုဝင်ရောက်ပြီး ကစားရန်အောက်ပါအဆင့်များကို လိုက်နာပါ။</value>
   </data>
+  <data name="GuideRescueOption1" xml:space="preserve">
+    <value>* လကုန်တွင် အမှတ်ကို ပြန်လည်သတ်မှတ်ပါမည်။</value>
+  </data>
 </root>

+ 1 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Guide/Index.cshtml

@@ -90,7 +90,7 @@
                     <p>@Lang.GuideProgressRewards</p>
                     <p>@Lang.GuideFailLevel</p>
                     <p>@Lang.GuideRescueOption</p>
-
+                    <p>@Lang.GuideRescueOption1</p>
                     <h3>@Lang.GuideLevelScoreTimeRewardTable</h3>
                     <div class="guide-table-wrap">
                         <table class="guide-table">

+ 10 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/kitty/js/all.min.js

@@ -661,10 +661,15 @@ const initKittyFall = () => {
             $.ajax({
                 url: actionUrl,
                 type: "POST",
+                timeout: 15000,
                 data: {
                     productName: confirmButton.dataset.productName || ""
                 },
                 success: function (response) {
+                    if (!isBuyTurn && response?.timedOut) {
+                        window.location.replace(response.redirectUrl || "/");
+                        return;
+                    }
                     const isSuccess = response && String(response.errorCode) === "0";
                     if (isSuccess) {
                         const turnsElement = document.querySelector(".stats-card .turns");
@@ -687,7 +692,11 @@ const initKittyFall = () => {
                     }
                     showSubscriptionResult(isSuccess ? "success" : "fail", response?.message || "");
                 },
-                error: function () {
+                error: function (_xhr, textStatus) {
+                    if (!isBuyTurn && textStatus === "timeout") {
+                        window.location.replace("/");
+                        return;
+                    }
                     showSubscriptionResult("fail", "");
                 },
                 complete: function () {

+ 10 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/kitty/js/input.js

@@ -661,10 +661,15 @@ const initKittyFall = () => {
             $.ajax({
                 url: actionUrl,
                 type: "POST",
+                timeout: 15000,
                 data: {
                     productName: confirmButton.dataset.productName || ""
                 },
                 success: function (response) {
+                    if (!isBuyTurn && response?.timedOut) {
+                        window.location.replace(response.redirectUrl || "/");
+                        return;
+                    }
                     const isSuccess = response && String(response.errorCode) === "0";
                     if (isSuccess) {
                         const turnsElement = document.querySelector(".stats-card .turns");
@@ -687,7 +692,11 @@ const initKittyFall = () => {
                     }
                     showSubscriptionResult(isSuccess ? "success" : "fail", response?.message || "");
                 },
-                error: function () {
+                error: function (_xhr, textStatus) {
+                    if (!isBuyTurn && textStatus === "timeout") {
+                        window.location.replace("/");
+                        return;
+                    }
                     showSubscriptionResult("fail", "");
                 },
                 complete: function () {