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
46 changes: 30 additions & 16 deletions Assets/Talo Game Services/Talo/Runtime/APIs/PlayersAPI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ private async Task<Player> HandleIdentifySuccess(PlayerAlias alias, string socke
Talo.Socket.SetSocketToken(socketToken);
}

WriteOfflineAlias();
InvokeIdentifiedEvent();

return alias.player;
Expand All @@ -45,16 +44,7 @@ public async Task<Player> Identify(string service, string identifier)

if (Talo.IsOffline())
{
var offlineAlias = GetOfflineAlias();
if (offlineAlias != null)
{
return await HandleIdentifySuccess(offlineAlias);
}
else
{
OnIdentificationFailed?.Invoke();
throw new Exception("No offline player alias found.");
}
return await IdentifyOffline(service, identifier);
}

var uri = new Uri($"{baseUrl}/identify?service={service}&identifier={identifier}");
Expand All @@ -64,7 +54,9 @@ public async Task<Player> Identify(string service, string identifier)
var json = await Call(uri, "GET");

var res = JsonUtility.FromJson<PlayersIdentifyResponse>(json);
return await HandleIdentifySuccess(res.alias, res.socketToken);
var alias = res.alias;
WriteOfflineAlias(alias);
return await HandleIdentifySuccess(alias, res.socketToken);
}
catch
{
Expand Down Expand Up @@ -96,7 +88,7 @@ public async Task<Player> Update()

var res = JsonUtility.FromJson<PlayersUpdateResponse>(json);
Talo.CurrentPlayer = res.player;
WriteOfflineAlias();
WriteOfflineAlias(Talo.CurrentAlias);

return Talo.CurrentPlayer;
}
Expand All @@ -120,15 +112,37 @@ public async Task<Player> Find(string playerId)
return res.player;
}

private void WriteOfflineAlias()
private async Task<Player> IdentifyOffline(string service, string identifier)
{
var offlineAlias = GetOfflineAlias();
if (offlineAlias != null && offlineAlias.MatchesIdentifyRequest(service, identifier))
{
return await HandleIdentifySuccess(offlineAlias);
}
else
{
try
{
File.Delete(_offlineDataPath);
}
finally
{
OnIdentificationFailed?.Invoke();
throw new Exception("No offline player alias found.");
}
}
}

private void WriteOfflineAlias(PlayerAlias alias)
{
var content = JsonUtility.ToJson(Talo.CurrentAlias);
if (!Talo.Settings.cachePlayerOnIdentify) return;
var content = JsonUtility.ToJson(alias);
Talo.Crypto.WriteFileContent(_offlineDataPath, content);
}

private PlayerAlias GetOfflineAlias()
{
if (!File.Exists(_offlineDataPath)) return null;
if (!Talo.Settings.cachePlayerOnIdentify || !File.Exists(_offlineDataPath)) return null;
return JsonUtility.FromJson<PlayerAlias>(Talo.Crypto.ReadFileContent(_offlineDataPath));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,10 @@ public class PlayerAlias
public string service, identifier;
public Player player;
public string lastSeenAt, createdAt, updatedAt;

public bool MatchesIdentifyRequest(string service, string identifier)
{
return this.service == service && this.identifier == identifier;
}
}
}
3 changes: 3 additions & 0 deletions Assets/Talo Game Services/Talo/Runtime/TaloSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,8 @@ public class TaloSettings : ScriptableObject

[Tooltip("If a valid session token is found, automatically authenticate the player")]
public bool autoStartSession = true;

[Tooltip("If enabled, Talo will automatically cache the player after a successful online identification for use in later offline sessions")]
public bool cachePlayerOnIdentify = true;
}
}