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
998 changes: 953 additions & 45 deletions Assets/Samples/Playground/Scenes/Playground.unity

Large diffs are not rendered by default.

27 changes: 27 additions & 0 deletions Assets/Samples/Playground/Scripts/Stats/GetAllStats.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using System;
using System.Linq;
using UnityEngine;
using TaloGameServices;

public class GetAllStats : MonoBehaviour
{
public void OnButtonClick()
{
FetchStats();
}

private async void FetchStats()
{
try
{
var res = await Talo.Stats.GetStats();
var internalNames = res.Length > 0 ? string.Join(", ", res.Select((item) => item.internalName)) : "no stats";
ResponseMessage.SetText($"Stats: {internalNames}");
}
catch (Exception err)
{
ResponseMessage.SetText(err.Message);
throw err;
}
}
}
2 changes: 2 additions & 0 deletions Assets/Samples/Playground/Scripts/Stats/GetAllStats.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 34 additions & 0 deletions Assets/Samples/Playground/Scripts/Stats/GetGlobalHistory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using System;
using UnityEngine;
using TaloGameServices;

public class GetGlobalHistory : MonoBehaviour
{
public string statInternalName;

public void OnButtonClick()
{
FetchGlobalHistory();
}

private async void FetchGlobalHistory()
{
if (string.IsNullOrEmpty(statInternalName))
{
ResponseMessage.SetText("statInternalName not set on GetGlobalHistoryButton");
return;
}

try
{
var res = await Talo.Stats.GetGlobalHistory(statInternalName);

ResponseMessage.SetText($"Min: {res.globalValue.minValue}, max: {res.globalValue.maxValue}, median: {res.globalValue.medianValue}, average: {res.globalValue.averageValue}, average change: {res.globalValue.averageChange}");
}
catch (Exception err)
{
ResponseMessage.SetText(err.Message);
throw err;
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

33 changes: 33 additions & 0 deletions Assets/Samples/Playground/Scripts/Stats/GetStat.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using System;
using UnityEngine;
using TaloGameServices;

public class GetStat : MonoBehaviour
{
public string statInternalName;

public void OnButtonClick()
{
FetchStat();
}

private async void FetchStat()
{
if (string.IsNullOrEmpty(statInternalName))
{
ResponseMessage.SetText("statInternalName not set on GetStatButton");
return;
}

try
{
var res = await Talo.Stats.GetStat(statInternalName);
ResponseMessage.SetText($"{res.name} is{(res.global ? "" : " not")} a global stat, with a default value of {res.defaultValue}");
}
catch (Exception err)
{
ResponseMessage.SetText(err.Message);
throw err;
}
}
}
2 changes: 2 additions & 0 deletions Assets/Samples/Playground/Scripts/Stats/GetStat.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

36 changes: 36 additions & 0 deletions Assets/Samples/Playground/Scripts/Stats/GetStatHistory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System;
using UnityEngine;
using TaloGameServices;
using System.Linq;

public class GetStatHistory : MonoBehaviour
{
public string statInternalName;

public void OnButtonClick()
{
FetchHistory();
}

private async void FetchHistory()
{
if (string.IsNullOrEmpty(statInternalName))
{
ResponseMessage.SetText("statInternalName not set on GetStatHistoryButton");
return;
}

try
{
var res = await Talo.Stats.GetHistory(statInternalName);
var changeString = res.count > 0 ? string.Join(", ", res.history.Select((item) => item.change)) : "no changes";

ResponseMessage.SetText($"{statInternalName} changed by: {changeString}");
}
catch (Exception err)
{
ResponseMessage.SetText(err.Message);
throw err;
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Assets/Samples/Playground/Scripts/Stats/TrackStat.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ private async void Track()

try
{
await Talo.Stats.Track(statInternalName, change);
var res = await Talo.Stats.Track(statInternalName, change);

ResponseMessage.SetText($"{statInternalName} changed by {change}");
ResponseMessage.SetText($"{statInternalName} changed by {change}, new value is {res.playerStat.value}");
}
catch (Exception err)
{
Expand Down
68 changes: 66 additions & 2 deletions Packages/com.trytalo.talo/Runtime/APIs/StatsAPI.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;

Expand All @@ -8,14 +9,77 @@ public class StatsAPI : BaseAPI
{
public StatsAPI() : base("v1/game-stats") { }

public async Task Track(string internalName, float change = 1f)
public async Task<Stat[]> GetStats()
{
var uri = new Uri(baseUrl);
var json = await Call(uri, "GET");

var res = JsonUtility.FromJson<StatsIndexResponse>(json);
return res.stats;
}

public async Task<Stat> GetStat(string internalName)
{
var uri = new Uri($"{baseUrl}/{internalName}");
var json = await Call(uri, "GET");

var res = JsonUtility.FromJson<StatResponse>(json);
return res.stat;
}

public async Task<StatsPutResponse> Track(string internalName, float change = 1f)
{
Talo.IdentityCheck();

var uri = new Uri($"{baseUrl}/{internalName}");
var content = JsonUtility.ToJson(new StatsPutRequest { change = change });

await Call(uri, "PUT", content);
var json = await Call(uri, "PUT", content);
return JsonUtility.FromJson<StatsPutResponse>(json);
}

public async Task<StatsHistoryResponse> GetHistory(string internalName, int page = 0, DateTime? startDate = null, DateTime? endDate = null)
{
Talo.IdentityCheck();

var queryParams = new List<string> { $"page={page}" };
if (startDate.HasValue)
{
queryParams.Add($"startDate={Uri.EscapeDataString(startDate.Value.ToString("O"))}");
}
if (endDate.HasValue)
{
queryParams.Add($"endDate={Uri.EscapeDataString(endDate.Value.ToString("O"))}");
}

var queryString = string.Join("&", queryParams);
var uri = new Uri($"{baseUrl}/{internalName}/history?{queryString}");

var json = await Call(uri, "GET");
return JsonUtility.FromJson<StatsHistoryResponse>(json);
}

public async Task<StatsGlobalHistoryResponse> GetGlobalHistory(string internalName, int page = 0, string playerId = "", DateTime? startDate = null, DateTime? endDate = null)
{
var queryParams = new List<string> { $"page={page}" };
if (!string.IsNullOrEmpty(playerId))
{
queryParams.Add($"playerId={playerId}");
}
if (startDate.HasValue)
{
queryParams.Add($"startDate={Uri.EscapeDataString(startDate.Value.ToString("O"))}");
}
if (endDate.HasValue)
{
queryParams.Add($"endDate={Uri.EscapeDataString(endDate.Value.ToString("O"))}");
}

var queryString = string.Join("&", queryParams);
var uri = new Uri($"{baseUrl}/{internalName}/global-history?{queryString}");

var json = await Call(uri, "GET");
return JsonUtility.FromJson<StatsGlobalHistoryResponse>(json);
}
}
}
14 changes: 14 additions & 0 deletions Packages/com.trytalo.talo/Runtime/Entities/PlayerStat.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using System;

namespace TaloGameServices
{
[Serializable]
public class PlayerStat
{
public int id;
public Stat stat;
public float value;
public string createdAt;
public string updatedAt;
}
}
2 changes: 2 additions & 0 deletions Packages/com.trytalo.talo/Runtime/Entities/PlayerStat.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions Packages/com.trytalo.talo/Runtime/Entities/PlayerStatSnapshot.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using System;

namespace TaloGameServices
{
[Serializable]
public class PlayerStatSnapshot
{
public PlayerAlias playerAlias;
public float change;
public float value;
public float globalValue;
public string createdAt;
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 21 additions & 0 deletions Packages/com.trytalo.talo/Runtime/Entities/Stat.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using System;

namespace TaloGameServices
{
[Serializable]
public class Stat
{
public int id;
public string internalName;
public string name;
public bool global;
public float globalValue;
public float defaultValue;
public float maxChange;
public float? minValue;
public float? maxValue;
public int minTimeBetweenUpdates;
public string createdAt;
public string updatedAt;
}
}
2 changes: 2 additions & 0 deletions Packages/com.trytalo.talo/Runtime/Entities/Stat.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ public class ChannelsIndexResponse
{
public Channel[] channels;
public int count;
public int itemsPerPage;
public bool isLastPage;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@
[System.Serializable]
public class LeaderboardEntriesResponse
{
public LeaderboardEntry[] entries = new LeaderboardEntry[0];
public LeaderboardEntry[] entries;
public int count;
public bool isLastPage = true;
public int itemsPerPage;
public bool isLastPage;
}
}
8 changes: 8 additions & 0 deletions Packages/com.trytalo.talo/Runtime/Responses/StatResponse.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace TaloGameServices
{
[System.Serializable]
public class StatResponse
{
public Stat stat;
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using System;

namespace TaloGameServices
{
[Serializable]
public struct GlobalValueMetrics
{
public float minValue;
public float maxValue;
public float medianValue;
public float averageValue;
public float averageChange;
}

[Serializable]
public class StatsGlobalHistoryResponse
{
public PlayerStatSnapshot[] history;
public GlobalValueMetrics globalValue;
public int count;
public int itemsPerPage;
public bool isLastPage;
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace TaloGameServices
{
[System.Serializable]
public class StatsHistoryResponse
{
public PlayerStatSnapshot[] history;
public int count;
public int itemsPerPage;
public bool isLastPage;
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace TaloGameServices
{
[System.Serializable]
public class StatsIndexResponse
{
public Stat[] stats;
}
}
Loading