This commit is contained in:
2024-10-16 00:03:41 +08:00
commit 897058435c
5033 changed files with 1009728 additions and 0 deletions

View File

@@ -0,0 +1,151 @@
using FJson;
using Framework.Save;
using Framework.Timer;
using Framework.Utils;
using Framework.Utils.SingletonTemplate;
using Script.Core.Utils.Extend;
using UnityEngine;
namespace System.OfflineSystem
{
public class OfflineMgr : MgrBase<OfflineMgr>
{
private const string OfflineMgrTimeKey = "OfflineMgr_HistoryTimeKey";
[Serializable]
public class TimeNode
{
public ENumber64 timestamp = new ENumber64();
public float duration = 0;
public bool HasValid => this.timestamp?.Read > 0;
public DateTime StartTime => this.HasValid ? this.timestamp.Read.GetDateTime13 () : new DateTime();
public DateTime EndTime => this.StartTime.AddSeconds(this.duration);
public override string ToString() => $"起始时间:{this.StartTime:u} , 在线时长: {this.duration:F1}s 结束时间: {this.EndTime:u}";
}
#region private
protected override void OnCreateMge()
{
this.startTimeNode = new TimeNode();
var offlineMgrTime = Account.Instance.AccountGameData.OfflineMgrTime;
this.historyTimeNode = !string.IsNullOrEmpty(offlineMgrTime) ? FJsonUtility.ToObject<TimeNode>(offlineMgrTime) : new TimeNode();
if (this.historyTimeNode.StartTime.Year <= 1999)
{
//无效的历史记录,重新初始化一个空历史记录
this.historyTimeNode = new TimeNode();
}
GameUpdateMgr.Instance.AddUpdater(DoUpdate);
}
private void DoUpdate()
{
this.startTimeNode.duration = Time.realtimeSinceStartup + this._extendTime;
}
private void OnTimeLoad(long timeStr)
{
if (timeStr <= 0)
{
this.initCallback?.Invoke(false);
}
else
{
var timestamp= timeStr;
this.startTimeNode.timestamp.Write(timestamp);
this.initCallback?.Invoke(true);
}
UpdateHistoryTime();
}
#endregion
private readonly OfflineTimeLoader timeLoader = new OfflineTimeLoader();
private TimeNode startTimeNode;
private TimeNode historyTimeNode;
private float _extendTime; //额外时间
private Action<bool> initCallback;
public float ExtendTime
{
get => this._extendTime;
set => this._extendTime = value;
}
// ReSharper disable once ConvertToAutoPropertyWithPrivateSetter
/// <summary>
/// 离线时间
/// </summary>
public TimeSpan OfflineTimeSpan => this.startTimeNode.HasValid && this.historyTimeNode.HasValid ? this.startTimeNode.StartTime - this.historyTimeNode.EndTime: TimeSpan.Zero;
// public TimeSpan OfflineTimeSpan => TimeSpan.FromSeconds(5);
// ReSharper disable once ConvertToAutoPropertyWithPrivateSetter
public TimeNode CurTimeNode => this.startTimeNode;
// ReSharper disable once ConvertToAutoPropertyWithPrivateSetter
public TimeNode HistoryTimeNode => this.historyTimeNode;
#region Public API
/// <summary>
/// 初始化启动时间信息,此操作会自动获取网络时间
/// </summary>
/// <param name="callback"></param>
/// <param name="useLocalTime">无法获取到网络时间时,是否使用本地系统时间</param>
public void InitStartTime(Action<bool> callback , bool useLocalTime = true )
{
this.initCallback = callback;
this.timeLoader.LoadTime(OnTimeLoad , useLocalTime);
}
/// <summary>
/// 初始化启动时间信息
/// </summary>
/// <param name="callback"></param>
/// <param name="timestr"></param>
public void InitStartTime(Action<bool> callback , long timestr)
{
this.initCallback = callback;
OnTimeLoad (timestr);
}
/// <summary>
/// 更新并持久化存储本次在线时长
/// </summary>
public void UpdateHistoryTime()
{
if (this.startTimeNode.HasValid)
{
// WX.StorageSetStringSync(OfflineMgrTimeKey , FJsonUtility.ToJson(startTimeNode));
Account.Instance.AccountGameData.OfflineMgrTime = FJsonUtility.ToJson(this.startTimeNode);
}
}
// public void ResetStartTime (long timeStr)
// {
// var timestamp = timeStr;
// this.startTimeNode.timestamp.Write(timestamp);
// UpdateHistoryTime();
// }
/// <summary>
/// 创建一个离线计时器
/// </summary>
/// <param name="duration">秒</param>
/// <returns></returns>
public OfflineTimeHandler CreateTimeHandler (float duration)
{
return new OfflineTimeHandler (this.CurTimeNode.EndTime.ToTimeStamp13 () , duration);
}
#endregion
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: bc16e4e24c3b4d5c9e43c0aa6e2f0a70
timeCreated: 1675834434

View File

@@ -0,0 +1,77 @@
using Script.Core.Utils.Extend;
namespace System.OfflineSystem
{
/// <summary>
/// 计时器handler支持直接序列化
/// </summary>
[Serializable]
public class OfflineTimeHandler
{
[FJson.Core.FSerialize] private long _timeStamp;
[FJson.Core.FSerialize] private float _duration; //倒计时时长 单位:秒
[FJson.Core.FSerialize] private float _extraTime; //额外时长 单位:秒
private DateTime _startTime;
/// <summary>
/// 单位时长
/// </summary>
/// <param name="time"></param>
public void AddExtraTime (float time)
{
this._extraTime += time;
}
/// <summary>
/// 获取计时器初始时间
/// </summary>
public DateTime StartTime
{
get
{
if (this._startTime == default)
{
this._startTime = this._timeStamp.GetDateTime13 ();
}
return this._startTime;
}
}
public float Duration => this._duration; //倒计时时长 单位:秒
/// <summary>
/// 获取剩余时长 单位s
/// </summary>
/// <returns></returns>
public float RemainingTime ()
{
if (this._duration <= 0)
return 0;
var curDuration = this.CurDuration;
return (float) Math.Max (0 , this._duration - curDuration);
}
/// <summary>
/// 当前持续时长 , 单位:秒
/// </summary>
public double CurDuration => (OfflineMgr.Instance.CurTimeNode.EndTime - this.StartTime).TotalSeconds + this._extraTime;
/// <summary>
/// 计时器是否计时完成
/// </summary>
public bool HasCountComplete => RemainingTime () <= 0;
public OfflineTimeHandler ()
{
}
internal OfflineTimeHandler (long timeStamp, float duration)
{
this._timeStamp = timeStamp;
this._duration = duration;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 0d6411b5b2054403bfa7ecb590ca20af
timeCreated: 1701162787

View File

@@ -0,0 +1,100 @@
using Framework.NetWork.ToffeeHttp;
using ToffeeHttp.Runtime.Core;
namespace System.OfflineSystem
{
public class OfflineTimeLoader
{
public const string TargetAPI = "https://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp"; //淘宝时间获取接口
public const string TargetAPI2 = "https://quan.suning.com/getSysTime.do"; //苏宁时间获取接口
public const string TargetAPI3 = "https://pikagame.cn/index.php/app/user/getGtmnqConf"; //超神网络时间获取接口
private Action<long> _timeCallback;
private bool _useLocalTime;
/// <summary>
/// 获取时间
/// </summary>
/// <param name="timeCallback"></param>
/// <param name="useLocalTime">在无法请求所有网络时间的情况下使用系统时间</param>
public void LoadTime(Action<long> timeCallback, bool useLocalTime = true)
{
this._timeCallback = timeCallback;
this._useLocalTime = useLocalTime;
// HttpClient.Instance.QuickHttpSend(TargetAPI3, new HttpRequestData(HttpRequestType.GET), OnResponseAPI3, 1);
HttpClient.Instance.QuickHttpSend(TargetAPI, new HttpRequestData(HttpRequestType.GET), OnResponseAPI1, 1);
}
private void OnResponseAPI3(HttpResponse response)
{
var callback = this._timeCallback;
if (!response.IsNetError && response.Code == 200)
{
this._timeCallback = null;
var jsonObject = response.ObjectData;
var key = "GTMNQ_TIMESTAMP";
var timeData = jsonObject != null && jsonObject.ContainsKey(key) ? jsonObject.GetObject<string>(key) : null;
if (timeData != null)
{
if (long.TryParse(timeData , out var times))
{
callback?.Invoke(times * 1000);
return;
}
}
}
HttpClient.Instance.QuickHttpSend(TargetAPI, new HttpRequestData(HttpRequestType.GET), OnResponseAPI1, 2);
}
private void OnResponseAPI1(HttpResponse response)
{
var callback = this._timeCallback;
if (!response.IsNetError)
{
this._timeCallback = null;
var jsonObject = response.ObjectData;
var key = "t";
var timeData = jsonObject != null && jsonObject.ContainsKey(key) ? jsonObject.GetObject<string>(key) : null;
if (timeData != null)
{
if (long.TryParse(timeData , out var times))
{
callback?.Invoke(times);
return;
}
}
}
HttpClient.Instance.QuickHttpSend(TargetAPI2, new HttpRequestData(HttpRequestType.GET), OnResponseAPI2, 2);
}
private void OnResponseAPI2(HttpResponse response)
{
var callback = this._timeCallback;
this._timeCallback = null;
if (!response.IsNetError)
{
var key = "sysTime2";
var timeData = response.JsonObject.ContainsKey(key) ? response.JsonObject.GetObject<string>(key) : null;
if (timeData != null)
{
if (DateTime.TryParse(timeData , out var dateTime))
{
callback?.Invoke(ToTimestamp(dateTime));
return;
}
}
}
callback?.Invoke(this._useLocalTime ? ToTimestamp(DateTime.Now) : 0);
}
private long ToTimestamp(DateTime dateTime)
{
TimeSpan ts = dateTime - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalMilliseconds);
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 2f2fb1f852f24c61a0e570177003032a
timeCreated: 1675835872