Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 50 additions & 16 deletions Assets/Talo Game Services/Talo/Runtime/APIs/SavesAPI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,41 @@ public async Task<GameSave> ReplaceSaveWithOfflineSave(GameSave offlineSave)
return res.save;
}

private async Task<GameSave[]> SyncOfflineSaves(GameSave[] offlineSaves)
{
var offlineOnlySaves = offlineSaves.Where((save) => save.id < 0).ToArray();
if (offlineOnlySaves.Length == 0) return Array.Empty<GameSave>();

Talo.IdentityCheck();

var tasks = offlineOnlySaves.Select(async (offlineSave) =>
{
try
{
var uri = new Uri(baseUrl);
var json = await Call(uri, "POST", JsonUtility.ToJson(new SavesPostRequest
{
name = offlineSave.name,
content = offlineSave.content
}));

var res = JsonUtility.FromJson<SavesPostResponse>(json);
return new { res.save, offlineId = offlineSave.id };
}
catch
{
return null;
}
});

var results = await Task.WhenAll(tasks);
var successfulResults = results.Where((res) => res != null);
var offlineIdsToDelete = successfulResults.Select((res) => res.offlineId).ToArray();
savesManager.DeleteOfflineSaves(offlineIdsToDelete);

return successfulResults.Select((res) => res.save).ToArray();
}

public async Task<GameSave[]> GetSaves()
{
var saves = new List<GameSave>();
Expand All @@ -88,27 +123,26 @@ public async Task<GameSave[]> GetSaves()
var onlineSaves = res.saves;

if (offlineSaves != null)
{
var tasks = onlineSaves.Select(async (onlineSave) =>
{
var tasks = onlineSaves.Select(async (onlineSave) =>
{
var offlineSave = offlineSaves
.FirstOrDefault((offlineSave) => offlineSave.id == onlineSave.id);
var offlineSave = offlineSaves
.FirstOrDefault((offlineSave) => offlineSave.id == onlineSave.id);

if (offlineSave != null)
{
return await savesManager.SyncSave(onlineSave, offlineSave);
}
return onlineSave;
})
.ToList();
if (offlineSave != null)
{
return await savesManager.SyncSave(onlineSave, offlineSave);
}
return onlineSave;
});

onlineSaves = await Task.WhenAll(tasks);
onlineSaves = await Task.WhenAll(tasks);

var syncedSaves = await savesManager.SyncOfflineSaves(offlineSaves);
saves.AddRange(syncedSaves);
}
var syncedSaves = await SyncOfflineSaves(offlineSaves);
saves.AddRange(syncedSaves);
}

saves.AddRange(onlineSaves);
saves.AddRange(onlineSaves);
}

savesManager.HandleSavesLoaded(saves);
Expand Down
30 changes: 13 additions & 17 deletions Assets/Talo Game Services/Talo/Runtime/Utils/SavesManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,23 @@ public GameSave UpdateOfflineSaves(GameSave incomingSave)
public void DeleteOfflineSave(int saveId)
{
var offlineContent = GetOfflineSavesContent();
if (offlineContent?.saves == null) return;

offlineContent.saves = offlineContent.saves.Where((save) => save.id != saveId).ToArray();
WriteOfflineSavesContent(offlineContent);
}

public void DeleteOfflineSaves(int[] saveIds)
{
if (saveIds.Length == 0) return;

var offlineContent = GetOfflineSavesContent();
if (offlineContent?.saves == null) return;

offlineContent.saves = offlineContent.saves.Where((save) => !saveIds.Contains(save.id)).ToArray();
WriteOfflineSavesContent(offlineContent);
}

public void DeleteSave(int saveId)
{
_allSaves = _allSaves.Where((existingSave) => existingSave.id != saveId).ToList();
Expand All @@ -138,23 +151,6 @@ public void DeleteSave(int saveId)
}
}

public async Task<GameSave[]> SyncOfflineSaves(GameSave[] offlineSaves)
{
var newSaves = new List<GameSave>();

foreach (var offlineSave in offlineSaves)
{
if (offlineSave.id < 0)
{
var save = await Talo.Saves.CreateSave(offlineSave.name, offlineSave.content);
DeleteOfflineSave(offlineSave.id);
newSaves.Add(save);
}
}

return newSaves.ToArray();
}

public async Task<GameSave> SyncSave(GameSave onlineSave, GameSave offlineSave)
{
var onlineUpdatedAt = DateTime.Parse(onlineSave.updatedAt);
Expand Down