Skip to content

Commit ad47f44

Browse files
authored
Merge pull request #161 from TaloDev/develop
Release 0.48.0
2 parents 8695fe2 + fd4747c commit ad47f44

File tree

22 files changed

+516
-56
lines changed

22 files changed

+516
-56
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ jobs:
2525
UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
2626
UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
2727
with:
28-
unityVersion: 6000.0.28f1
28+
unityVersion: 6000.0.59f2

Assets/Talo Game Services/Talo/Runtime/APIs/BaseAPI.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace TaloGameServices
99
public class BaseAPI
1010
{
1111
// automatically updated with a pre-commit hook
12-
private const string ClientVersion = "0.47.0";
12+
private const string ClientVersion = "0.48.0";
1313

1414
protected string baseUrl;
1515

@@ -101,6 +101,8 @@ protected async Task<string> Call(
101101
Debug.Log($"--> {method} {uri} [{www.responseCode}] {www.downloadHandler.text}");
102102
}
103103

104+
await Talo.Continuity.HandlePostResponseHealthCheck(uri.ToString(), www.result);
105+
104106
if (www.result == UnityWebRequest.Result.Success)
105107
{
106108
return www.downloadHandler.text;

Assets/Talo Game Services/Talo/Runtime/APIs/HealthCheckAPI.cs

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,60 @@
44

55
namespace TaloGameServices
66
{
7+
public enum HealthCheckStatus
8+
{
9+
OK,
10+
FAILED,
11+
UNKNOWN
12+
}
13+
714
public class HealthCheckAPI : BaseAPI
815
{
16+
private HealthCheckStatus lastHealthCheckStatus = HealthCheckStatus.UNKNOWN;
17+
918
public HealthCheckAPI() : base("v1/health-check") { }
1019

20+
public HealthCheckStatus GetLastStatus()
21+
{
22+
return lastHealthCheckStatus;
23+
}
24+
1125
public async Task<bool> Ping()
1226
{
1327
var uri = new Uri(baseUrl);
1428

29+
bool success;
1530
try
1631
{
1732
await Call(uri, "GET");
18-
return true;
19-
} catch
33+
success = true;
34+
}
35+
catch
2036
{
2137
Debug.LogWarning("Health check failed");
22-
return false;
38+
success = false;
2339
}
40+
41+
bool failedLastHealthCheck = lastHealthCheckStatus == HealthCheckStatus.FAILED;
42+
43+
if (success)
44+
{
45+
lastHealthCheckStatus = HealthCheckStatus.OK;
46+
if (failedLastHealthCheck)
47+
{
48+
Talo.InvokeConnectionRestored();
49+
}
50+
}
51+
else
52+
{
53+
lastHealthCheckStatus = HealthCheckStatus.FAILED;
54+
if (!failedLastHealthCheck)
55+
{
56+
Talo.InvokeConnectionLost();
57+
}
58+
}
59+
60+
return success;
2461
}
2562
}
2663
}

Assets/Talo Game Services/Talo/Runtime/APIs/PlayersAPI.cs

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,24 @@ public class PlayersAPI : BaseAPI
1414

1515
private readonly string offlineDataPath = Application.persistentDataPath + "/ta.bin";
1616

17-
public PlayersAPI() : base("v1/players") { }
17+
public PlayersAPI() : base("v1/players")
18+
{
19+
Talo.OnConnectionRestored += OnConnectionRestored;
20+
}
21+
22+
private async void OnConnectionRestored()
23+
{
24+
await Talo.Socket.ResetConnection();
25+
26+
if (Talo.HasIdentity())
27+
{
28+
var socketToken = await CreateSocketToken();
29+
if (!string.IsNullOrEmpty(socketToken))
30+
{
31+
Talo.Socket.SetSocketToken(socketToken);
32+
}
33+
}
34+
}
1835

1936
public void InvokeIdentifiedEvent()
2037
{
@@ -202,5 +219,24 @@ public async Task<PlayersSearchResponse> Search(string query)
202219
var res = JsonUtility.FromJson<PlayersSearchResponse>(json);
203220
return res;
204221
}
222+
223+
public async Task<string> CreateSocketToken()
224+
{
225+
Talo.IdentityCheck();
226+
227+
var uri = new Uri($"{baseUrl}/socket-token");
228+
229+
try
230+
{
231+
var json = await Call(uri, "POST");
232+
var res = JsonUtility.FromJson<PlayersSocketTokenResponse>(json);
233+
return res.socketToken;
234+
}
235+
catch (Exception ex)
236+
{
237+
Debug.LogWarning($"Failed to create socket token: {ex.Message}");
238+
return "";
239+
}
240+
}
205241
}
206242
}

Assets/Talo Game Services/Talo/Runtime/APIs/SavesAPI.cs

Lines changed: 50 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,41 @@ public async Task<GameSave> ReplaceSaveWithOfflineSave(GameSave offlineSave)
6969
return res.save;
7070
}
7171

72+
private async Task<GameSave[]> SyncOfflineSaves(GameSave[] offlineSaves)
73+
{
74+
var offlineOnlySaves = offlineSaves.Where((save) => save.id < 0).ToArray();
75+
if (offlineOnlySaves.Length == 0) return Array.Empty<GameSave>();
76+
77+
Talo.IdentityCheck();
78+
79+
var tasks = offlineOnlySaves.Select(async (offlineSave) =>
80+
{
81+
try
82+
{
83+
var uri = new Uri(baseUrl);
84+
var json = await Call(uri, "POST", JsonUtility.ToJson(new SavesPostRequest
85+
{
86+
name = offlineSave.name,
87+
content = offlineSave.content
88+
}));
89+
90+
var res = JsonUtility.FromJson<SavesPostResponse>(json);
91+
return new { res.save, offlineId = offlineSave.id };
92+
}
93+
catch
94+
{
95+
return null;
96+
}
97+
});
98+
99+
var results = await Task.WhenAll(tasks);
100+
var successfulResults = results.Where((res) => res != null);
101+
var offlineIdsToDelete = successfulResults.Select((res) => res.offlineId).ToArray();
102+
savesManager.DeleteOfflineSaves(offlineIdsToDelete);
103+
104+
return successfulResults.Select((res) => res.save).ToArray();
105+
}
106+
72107
public async Task<GameSave[]> GetSaves()
73108
{
74109
var saves = new List<GameSave>();
@@ -88,27 +123,26 @@ public async Task<GameSave[]> GetSaves()
88123
var onlineSaves = res.saves;
89124

90125
if (offlineSaves != null)
126+
{
127+
var tasks = onlineSaves.Select(async (onlineSave) =>
91128
{
92-
var tasks = onlineSaves.Select(async (onlineSave) =>
93-
{
94-
var offlineSave = offlineSaves
95-
.FirstOrDefault((offlineSave) => offlineSave.id == onlineSave.id);
129+
var offlineSave = offlineSaves
130+
.FirstOrDefault((offlineSave) => offlineSave.id == onlineSave.id);
96131

97-
if (offlineSave != null)
98-
{
99-
return await savesManager.SyncSave(onlineSave, offlineSave);
100-
}
101-
return onlineSave;
102-
})
103-
.ToList();
132+
if (offlineSave != null)
133+
{
134+
return await savesManager.SyncSave(onlineSave, offlineSave);
135+
}
136+
return onlineSave;
137+
});
104138

105-
onlineSaves = await Task.WhenAll(tasks);
139+
onlineSaves = await Task.WhenAll(tasks);
106140

107-
var syncedSaves = await savesManager.SyncOfflineSaves(offlineSaves);
108-
saves.AddRange(syncedSaves);
109-
}
141+
var syncedSaves = await SyncOfflineSaves(offlineSaves);
142+
saves.AddRange(syncedSaves);
143+
}
110144

111-
saves.AddRange(onlineSaves);
145+
saves.AddRange(onlineSaves);
112146
}
113147

114148
savesManager.HandleSavesLoaded(saves);

Assets/Talo Game Services/Talo/Runtime/APIs/StatsAPI.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,17 @@ public async Task<PlayerStat> FindPlayerStat(string internalName)
4444
return res.playerStat;
4545
}
4646

47+
public async Task<PlayerStat[]> ListPlayerStats()
48+
{
49+
Talo.IdentityCheck();
50+
51+
var uri = new Uri($"{baseUrl}/player-stats");
52+
53+
var json = await Call(uri, "GET");
54+
var res = JsonUtility.FromJson<PlayerStatsListResponse>(json);
55+
return res.playerStats;
56+
}
57+
4758
public async Task<StatsPutResponse> Track(string internalName, float change = 1f)
4859
{
4960
Talo.IdentityCheck();
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace TaloGameServices
2+
{
3+
[System.Serializable]
4+
public class PlayerStatsListResponse
5+
{
6+
public PlayerStat[] playerStats;
7+
}
8+
}

Assets/Talo Game Services/Talo/Runtime/Responses/PlayerStatsListResponse.cs.meta

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace TaloGameServices
2+
{
3+
[System.Serializable]
4+
public class PlayersSocketTokenResponse
5+
{
6+
public string socketToken;
7+
}
8+
}

Assets/Talo Game Services/Talo/Runtime/Responses/PlayersSocketTokenResponse.cs.meta

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)