Files
2026-05-26 16:15:54 +08:00

126 lines
3.8 KiB
C#

using System;
using System.Net.Http;
using System.Threading.Tasks;
using asap.core;
using GameCore;
using UnityEngine;
public struct RequestSvrTimeEvent
{
public bool Status;
}
public class ZZTimeHelper
{
public static TimeSpan timeDiff = TimeSpan.Zero;
public static bool isAttachedToFChange = false;
static bool isRequesting = false;
public static int LocalTimeOffsetInSec = 0;
public static DateTime UtcNow()
{
return DateTime.UtcNow.AddSeconds(LocalTimeOffsetInSec) + timeDiff;
}
public static void AdjustTime(DateTime svrTime)
{
var diff = svrTime - DateTime.UtcNow;
if(Mathf.Abs((float)diff.TotalSeconds) < 60)
{
timeDiff = TimeSpan.Zero;
}
else
{
timeDiff = diff;
}
//UnityEngine.Debug.Log("[ZZTimeHelper] AdjustTime:" + timeDiff);
}
public static void WathForcusChange()
{
if (!isAttachedToFChange)
{
UnityEngine.Application.focusChanged += focused =>
{
if (focused)
{
UnityEngine.Debug.Log("[ZZTimeHelper] RequestSvrTime");
_ = RequestSvrTime();
}
};
isAttachedToFChange = true;
}
}
/// <summary>
/// Request ServerTime, but also sync data.
/// </summary>
/// <param name="syncData">True if needing to sync data.</param>
public static async Task RequestSvrTime()
{
if (isRequesting)
{
return;
}
GameCore.UIManager.ShowWaitingBlock("RequestSvrTime");
isRequesting = true;
var SvrTime = await GetSvrTime();
isRequesting = false;
GameCore.UIManager.HideWaitingBlock("RequestSvrTime");
if(SvrTime != null)
{
AdjustTime(SvrTime.Value);
GContext.Publish(new RequestSvrTimeEvent() { Status = true });
}
else
{
GContext.Publish(new RequestSvrTimeEvent() { Status = false });
GameObject go = await UIManager.Instance.ShowUI(UITypes.NoticeConfirmPopupPanel);
var NoticeConfirmPopupPanel = go.GetComponent<NoticeConfirmPopupPanel>();
string info = LocalizationMgr.GetText("UI_FishingReconnectPanel_101003");
string label = LocalizationMgr.GetText("UI_FishingRewardPanel_101022");
string title = LocalizationMgr.GetText("UI_FishingReconnectPanel_101002");
NoticeConfirmPopupPanel.Init(1, title, info,
onClickLeft: async () => {await RequestSvrTime();},
onClose: async () =>{ await RequestSvrTime();},
btn_left_text: label);
}
}
private const string timeUrl = "http://time.bamboogames.cc";
private static async Task<DateTime?> GetSvrTime()
{
try
{
HttpClient client = new HttpClient();
client.Timeout = TimeSpan.FromSeconds(5);
//IConfig config = GContext.container.Resolve<IConfig>();
//string apiUrl = config.Get<string>(GConstant.K_Event_API_URL, "http://192.168.9.101:5292/");
//string url = $"{apiUrl}account/svrtime";
var svrTimeStr = await client.GetStringAsync(timeUrl);
if (!string.IsNullOrEmpty(svrTimeStr))
{
if(DateTime.TryParse(svrTimeStr, out DateTime SvrTime))
{
if(SvrTime.Kind == DateTimeKind.Local)
SvrTime = SvrTime.ToUniversalTime();
return SvrTime;
}
}
return null;
}
catch(System.Exception)
{
UnityEngine.Debug.LogWarning("[ZZTimeHelper] RequestSvrTime error");
return null;
}
}
}