11using UnityEngine ;
22using TaloGameServices ;
33using UnityEngine . UIElements ;
4- using System . Collections . Generic ;
54using System . Threading . Tasks ;
6- using System . Linq ;
5+ using System ;
6+ using System . Collections . Generic ;
77
88public class LeaderboardUIController : MonoBehaviour
99{
@@ -13,17 +13,21 @@ public class LeaderboardUIController : MonoBehaviour
1313 private ListView entriesList ;
1414 private Label infoLabel ;
1515
16+ private int filterIdx ;
17+ private string filter = "All" ;
18+
1619 private async void Start ( )
1720 {
1821 root = GetComponent < UIDocument > ( ) . rootVisualElement ;
1922 root . Q < Button > ( "post-btn" ) . clicked += OnPostClick ;
23+ root . Q < Button > ( "filter-btn" ) . clicked += OnFilterClick ;
2024
2125 entriesList = root . Q < ListView > ( ) ;
2226 infoLabel = root . Q < Label > ( "info" ) ;
2327
2428 if ( string . IsNullOrEmpty ( leaderboardName ) )
2529 {
26- throw new System . Exception ( "Please create a leaderboard and set the leaderboard name to its internal name" ) ;
30+ throw new Exception ( "Please create a leaderboard and set the leaderboard name to its internal name" ) ;
2731 }
2832
2933 await LoadEntries ( ) ;
@@ -32,12 +36,17 @@ private async void Start()
3236 private async void OnPostClick ( )
3337 {
3438 var username = root . Q < TextField > ( ) . text ;
35- await Talo . Players . Identify ( "username" , username ) ;
39+ var score = UnityEngine . Random . Range ( 0 , 100 ) ;
40+ var team = UnityEngine . Random . Range ( 0 , 2 ) == 0 ? "Blue" : "Red" ;
3641
37- var score = Random . Range ( 0 , 100 ) ;
38- ( LeaderboardEntry entry , bool updated ) = await Talo . Leaderboards . AddEntry ( leaderboardName , score ) ;
42+ await Talo . Players . Identify ( "username" , username ) ;
43+ ( LeaderboardEntry entry , bool updated ) = await Talo . Leaderboards . AddEntry (
44+ leaderboardName ,
45+ score ,
46+ ( "team" , team )
47+ ) ;
3948
40- infoLabel . text = $ "You scored { score } .";
49+ infoLabel . text = $ "You scored { score } for the { team } team .";
4150 if ( updated ) infoLabel . text += " Your highscore was updated!" ;
4251
4352 entriesList . Rebuild ( ) ;
@@ -62,9 +71,26 @@ private async Task LoadEntries()
6271
6372 do
6473 {
65- var res = await Talo . Leaderboards . GetEntries ( leaderboardName , page ) ;
66- page ++ ;
67- done = res . isLastPage ;
74+ try
75+ {
76+ var res = await Talo . Leaderboards . GetEntries ( leaderboardName , page ) ;
77+ page ++ ;
78+ done = res . isLastPage ;
79+ }
80+ catch ( RequestException e )
81+ {
82+ if ( e . responseCode == 404 )
83+ {
84+ infoLabel . text = $ "Failed loading leaderboard { leaderboardName } . Does it exist?";
85+ }
86+ else
87+ {
88+ infoLabel . text = e . Message ;
89+ Debug . LogError ( e ) ;
90+ }
91+ return ;
92+ }
93+
6894 } while ( ! done ) ;
6995
7096 HandleListVisibility ( ) ;
@@ -78,13 +104,38 @@ private async Task LoadEntries()
78104 return label ;
79105 } ;
80106
81- var entries = Talo . Leaderboards . GetCachedEntries ( leaderboardName ) ;
82-
83107 entriesList . bindItem = ( e , i ) =>
84108 {
85- e . Q < Label > ( ) . text = $ "{ i + 1 } . { entries [ i ] . playerAlias . identifier } - { entries [ i ] . score } ";
109+ LeaderboardEntry entry = entriesList . itemsSource [ i ] as LeaderboardEntry ;
110+ e . Q < Label > ( ) . text = $ "{ i + 1 } . { entry . playerAlias . identifier } - { entry . score } ({ entry . GetProp ( "team" , "No" ) } team)";
86111 } ;
87112
88- entriesList . itemsSource = entries ;
113+ entriesList . itemsSource = Talo . Leaderboards . GetCachedEntries ( leaderboardName ) ;
114+ }
115+
116+ private string GetNextFilter ( int idx )
117+ {
118+ return new [ ] { "All" , "Blue" , "Red" } [ idx % 3 ] ;
119+ }
120+
121+ private void OnFilterClick ( )
122+ {
123+ filterIdx ++ ;
124+ filter = GetNextFilter ( filterIdx ) ;
125+
126+ infoLabel . text = $ "Filtering on { filter . ToLower ( ) } ";
127+ root . Q < Button > ( "filter-btn" ) . text = $ "{ GetNextFilter ( filterIdx + 1 ) } team scores";
128+
129+ if ( filter == "All" )
130+ {
131+ entriesList . itemsSource = Talo . Leaderboards . GetCachedEntries ( leaderboardName ) ;
132+ }
133+ else
134+ {
135+ entriesList . itemsSource = new List < LeaderboardEntry > ( Talo . Leaderboards . GetCachedEntries ( leaderboardName )
136+ . FindAll ( ( e ) => e . GetProp ( "team" , "" ) == filter ) ) ;
137+ }
138+
139+ entriesList . Rebuild ( ) ;
89140 }
90141}
0 commit comments