Commit 1c9f195a authored by SherryChaos's avatar SherryChaos

online deck update

parent edcda087
......@@ -281,7 +281,7 @@ namespace MDPro3.Duel.YGOSharp
File.SetLastWriteTimeUtc(path, saveTime);
if (MyCard.account != null && upload)
_ = OnlineDeck.SyncDeck(deckId, deckName, this, true);
_ = OnlineDeck.SyncDeck(deckId, deckName, this, saveTime, true);
}
catch
{
......
using MDPro3.Duel.YGOSharp;
using MDPro3.Utility;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
using MDPro3.Utility;
namespace MDPro3.Net
{
......@@ -131,7 +129,7 @@ namespace MDPro3.Net
if (request.result == UnityWebRequest.Result.Success)
{
//UnityEngine.Debug.Log(request.downloadHandler.text);
//Debug.Log(request.downloadHandler.text);
decks = JsonUtility.FromJson<ResponseMultiSimpleData>(request.downloadHandler.text).data;
return decks;
}
......@@ -226,7 +224,8 @@ namespace MDPro3.Net
deckCase = decks[i].Case,
deckProtector = decks[i].Protector,
isDelete = false,
deckYdk = decks[i].GetYDK()
deckYdk = decks[i].GetYDK(),
timeStamp = ((DateTimeOffset)DateTime.UtcNow).ToUnixTimeMilliseconds()
};
decks[i].deckId = ids[i];
......@@ -262,7 +261,7 @@ namespace MDPro3.Net
}
}
public static async Task<bool> SyncDeck(string deckId, string deckName, Deck deck, bool showHint = true)
public static async Task<bool> SyncDeck(string deckId, string deckName, Deck deck, DateTime time, bool showHint = true)
{
//Debug.Log("Sync Deck: " + deckName);
deck.deckId = deckId;
......@@ -280,7 +279,7 @@ namespace MDPro3.Net
{
userId = MyCard.account.user.id,
deckContributor = MyCard.account.user.username,
deck = new PostDeck(deck, deckId, deckName, ydk)
deck = new PostDeck(deck, deckId, deckName, ydk, time)
};
var json = JsonUtility.ToJson(body);
......@@ -331,9 +330,11 @@ namespace MDPro3.Net
body.decks = new PostDeck[toDelete.Count];
for (int i = 0; i < toDelete.Count; i++)
{
body.decks[i] = new PostDeck();
body.decks[i].deckId = toDelete[i];
body.decks[i].isDelete = true;
body.decks[i] = new PostDeck
{
deckId = toDelete[i],
isDelete = true
};
}
var json = JsonUtility.ToJson(body);
......@@ -476,7 +477,7 @@ namespace MDPro3.Net
public DateTime GetUpdateUtcTime()
{
var dataTimeOffset = DateTimeOffset.FromUnixTimeSeconds(deckUpdateDate);
var dataTimeOffset = DateTimeOffset.FromUnixTimeSeconds(deckUpdateDate / 1000);
return dataTimeOffset.UtcDateTime;
}
}
......@@ -569,12 +570,14 @@ namespace MDPro3.Net
public int deckProtector;
public string deckYdk;
public bool isDelete;
public long timeStamp;
public PostDeck()
{
timeStamp = ((DateTimeOffset)DateTime.UtcNow).ToUnixTimeMilliseconds();
}
public PostDeck(Deck deck, string deckId, string deckName, string ydk)
public PostDeck(Deck deck, string deckId, string deckName, string ydk, DateTime time)
{
this.deckId = deckId;
this.deckName = deckName;
......@@ -588,7 +591,9 @@ namespace MDPro3.Net
deckProtector = deck.Protector;
deckYdk = ydk;
isDelete = false;
timeStamp = ((DateTimeOffset)time.ToUniversalTime()).ToUnixTimeMilliseconds();
}
}
[Serializable]
......
......@@ -269,7 +269,7 @@ namespace MDPro3.Servant
var decksNeedUpload = new Dictionary<string, Deck>();//没在服务器找到对应的deckId的本地卡组
var decksNeedUpdateToServer = new Dictionary<string, Deck>();//找到deckId但本地时间大于服务器时间五秒以上的卡组
var decksNeedUpdateFromServer = new Dictionary<string, Deck>();//找到deckId但本地时间小于服务器时间五秒以上的卡组
var localFoundedIds = new List<string>();
var localFoundIds = new List<string>();
for (int i = 0; i < decks.Count; i++)
{
......@@ -294,14 +294,14 @@ namespace MDPro3.Servant
}
else
{
localFoundedIds.Add(od.deckId);
localFoundIds.Add(od.deckId);
var fileInfo = new FileInfo(deckFiles[i]);
var serverTime = od.GetUpdateUtcTime();
var diff = serverTime - fileInfo.LastWriteTimeUtc;
//Debug.Log($"{od.deckName}: serverTime: {serverTime} localTime: {fileInfo.LastWriteTimeUtc}");
//Debug.Log($"{od.deckName}: serverTime: {serverTime} localTime: {fileInfo.LastWriteTimeUtc} diff: {diff.TotalSeconds}");
if (diff.TotalSeconds > 5f || diff.TotalSeconds < -5f)
if (diff.TotalSeconds > 1f || diff.TotalSeconds < -1f)
{
if (fileInfo.LastWriteTime > serverTime)
decksNeedUpdateToServer.Add(deckName, decks[i]);
......@@ -320,11 +320,11 @@ namespace MDPro3.Servant
foreach (var deck in decksNeedUpdateToServer)
{
Debug.LogFormat("卡组[{0}]需要更新上传。", deck.Key);
var task = OnlineDeck.SyncDeck(deck.Value.deckId, deck.Key, deck.Value, false);
var time = DateTime.UtcNow;
var task = OnlineDeck.SyncDeck(deck.Value.deckId, deck.Key, deck.Value, time, false);
while (!task.IsCompleted)
yield return null;
deck.Value.Save(deck.Key, DateTime.UtcNow, false);
deck.Value.Save(deck.Key, time, false);
}
//更新已经有Id的本地较旧卡组
foreach (var deck in decksNeedUpdateFromServer)
......@@ -340,6 +340,23 @@ namespace MDPro3.Servant
File.SetLastWriteTimeUtc(newPath, od.GetUpdateUtcTime());
}
//下载本地ID不存在的服务器卡组
//OnlineDeck.UploadDecks() 会刷新OnlineDeck.decks,因此本功能需要在[上传没有Id的本地卡组]之前执行
List<OnlineDeck.OnlineDeckData> odtd = new List<OnlineDeck.OnlineDeckData>();
foreach (var od in OnlineDeck.decks)
if (!od.isDelete)
if (!localFoundIds.Contains(od.deckId))
odtd.Add(od);
foreach (var deck in odtd)
{
Debug.LogFormat("卡组[{0}]需要下载。{1}", deck.deckName, deck.isDelete);
var d = new Deck(deck.deckYdk, string.Empty, string.Empty);
d.userId = MyCard.account.user.id.ToString();
d.deckId = deck.deckId;
d.Save(deck.deckName, deck.GetUpdateUtcTime());
}
//上传没有Id的本地卡组
if (decksNeedUpload.Count > 0)
{
......@@ -358,21 +375,6 @@ namespace MDPro3.Servant
yield return null;
}
//下载本地ID不存在的服务器卡组
List<OnlineDeck.OnlineDeckData> odtd = new List<OnlineDeck.OnlineDeckData>();
foreach (var od in OnlineDeck.decks)
if (!od.isDelete)
if (!localFoundedIds.Contains(od.deckId))
odtd.Add(od);
foreach (var deck in odtd)
{
Debug.LogFormat("卡组[{0}]需要下载。{1}", deck.deckName, deck.isDelete);
var d = new Deck(deck.deckYdk, string.Empty, string.Empty);
d.userId = MyCard.account.user.id.ToString();
d.deckId = deck.deckId;
d.Save(deck.deckName, deck.GetUpdateUtcTime());
}
#if UNITY_EDITOR
MessageManager.Cast("Deck Sync Finished.");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment