From 66acbc2d486d775d51f3250b0de81fe37ed0b17e Mon Sep 17 00:00:00 2001 From: dan63047 Date: Fri, 8 Mar 2024 02:06:35 +0300 Subject: [PATCH] Stats ranks for everyone --- lib/data_objects/tetrio.dart | 69 +++++++++++++++++++++++------------- lib/views/main_view.dart | 2 +- lib/widgets/tl_thingy.dart | 4 +-- 3 files changed, 47 insertions(+), 28 deletions(-) diff --git a/lib/data_objects/tetrio.dart b/lib/data_objects/tetrio.dart index c9fa2f3..f5cffb2 100644 --- a/lib/data_objects/tetrio.dart +++ b/lib/data_objects/tetrio.dart @@ -313,6 +313,10 @@ class TetrioPlayer { return tlSeason1.lessStrictCheck(other.tlSeason1); } + TetrioPlayerFromLeaderboard convertToPlayerFromLeaderboard() => TetrioPlayerFromLeaderboard( + userId, username, role, xp, country, supporterTier > 0, verified, state, gamesPlayed, gamesWon, + tlSeason1.rating, tlSeason1.glicko??0, tlSeason1.rd??noTrRd, tlSeason1.rank, tlSeason1.bestRank, tlSeason1.apm??0, tlSeason1.pps??0, tlSeason1.vs??0, tlSeason1.decaying); + @override String toString() { return "$username ($state)"; @@ -1140,23 +1144,23 @@ class News { } class PlayerLeaderboardPosition{ - late LeaderboardPosition apm; - late LeaderboardPosition pps; - late LeaderboardPosition vs; - late LeaderboardPosition gamesPlayed; - late LeaderboardPosition gamesWon; - late LeaderboardPosition winrate; - late LeaderboardPosition app; - late LeaderboardPosition vsapm; - late LeaderboardPosition dss; - late LeaderboardPosition dsp; - late LeaderboardPosition appdsp; - late LeaderboardPosition cheese; - late LeaderboardPosition gbe; - late LeaderboardPosition nyaapp; - late LeaderboardPosition area; - late LeaderboardPosition estTr; - late LeaderboardPosition accOfEst; + late LeaderboardPosition? apm; + late LeaderboardPosition? pps; + late LeaderboardPosition? vs; + late LeaderboardPosition? gamesPlayed; + late LeaderboardPosition? gamesWon; + late LeaderboardPosition? winrate; + late LeaderboardPosition? app; + late LeaderboardPosition? vsapm; + late LeaderboardPosition? dss; + late LeaderboardPosition? dsp; + late LeaderboardPosition? appdsp; + late LeaderboardPosition? cheese; + late LeaderboardPosition? gbe; + late LeaderboardPosition? nyaapp; + late LeaderboardPosition? area; + late LeaderboardPosition? estTr; + late LeaderboardPosition? accOfEst; PlayerLeaderboardPosition({ required this.apm, @@ -1178,7 +1182,7 @@ class PlayerLeaderboardPosition{ required this.accOfEst }); - PlayerLeaderboardPosition.fromSearchResults(List results){ + PlayerLeaderboardPosition.fromSearchResults(List results){ apm = results[0]; pps = results[1]; vs = results[2]; @@ -1834,15 +1838,26 @@ class TetrioPlayersLeaderboard { } } - PlayerLeaderboardPosition? getLeaderboardPosition(String userID) { - if (leaderboard.indexWhere((element) => element.userId == userID) == -1) return null; + PlayerLeaderboardPosition? getLeaderboardPosition(TetrioPlayer user) { + if (user.tlSeason1.gamesPlayed == 0) return null; + bool fakePositions = false; + late List copyOfLeaderboard; + if (leaderboard.indexWhere((element) => element.userId == user.userId) == -1){ + fakePositions =true; + copyOfLeaderboard = List.of(leaderboard); + copyOfLeaderboard.add(user.convertToPlayerFromLeaderboard()); + } List stats = [Stats.apm, Stats.pps, Stats.vs, Stats.gp, Stats.gw, Stats.wr, Stats.app, Stats.vsapm, Stats.dss, Stats.dsp, Stats.appdsp, Stats.cheese, Stats.gbe, Stats.nyaapp, Stats.area, Stats.eTR, Stats.acceTR]; - List results = []; + List results = []; for (Stats stat in stats) { - List sortedLeaderboard = getStatRanking(leaderboard, stat, reversed: false); - int position = sortedLeaderboard.indexWhere((element) => element.userId == userID) + 1; - results.add(LeaderboardPosition(position, position / sortedLeaderboard.length)); + List sortedLeaderboard = getStatRanking(fakePositions ? copyOfLeaderboard : leaderboard, stat, reversed: false); + int position = sortedLeaderboard.indexWhere((element) => element.userId == user.userId) + 1; + if (position == 0) { + results.add(null); + } else { + results.add(LeaderboardPosition(fakePositions ? 1001 : position, position / sortedLeaderboard.length)); + } } return PlayerLeaderboardPosition.fromSearchResults(results); } @@ -1921,7 +1936,11 @@ class TetrioPlayerFromLeaderboard { this.apm, this.pps, this.vs, - this.decaying); + this.decaying){ + nerdStats = NerdStats(apm, pps, vs); + estTr = EstTr(apm, pps, vs, nerdStats.app, nerdStats.dss, nerdStats.dsp, nerdStats.gbe); + playstyle = Playstyle(apm, pps, nerdStats.app, nerdStats.vsapm, nerdStats.dsp, nerdStats.gbe, estTr.srarea, estTr.statrank); + } double get winrate => gamesWon / gamesPlayed; double get esttracc => estTr.esttr - rating; diff --git a/lib/views/main_view.dart b/lib/views/main_view.dart index 740a8a7..1a576fd 100644 --- a/lib/views/main_view.dart +++ b/lib/views/main_view.dart @@ -174,7 +174,7 @@ class _MainState extends State with TickerProviderStateMixin { // Get tetra League leaderboard everyone = teto.getCachedLeaderboard(); everyone ??= await teto.fetchTLLeaderboard(); - meAmongEveryone = await compute(everyone!.getLeaderboardPosition, me.userId); + meAmongEveryone = await compute(everyone!.getLeaderboardPosition, me); if (meAmongEveryone != null) teto.cacheLeaderboardPositions(me.userId, meAmongEveryone!); } diff --git a/lib/widgets/tl_thingy.dart b/lib/widgets/tl_thingy.dart index dc59322..ecd13ee 100644 --- a/lib/widgets/tl_thingy.dart +++ b/lib/widgets/tl_thingy.dart @@ -302,7 +302,7 @@ class _TLThingyState extends State { color: oldTl!.estTr!.esttr > currentTl.estTr!.esttr ? Colors.redAccent : Colors.greenAccent ),), if (oldTl?.estTr?.esttr != null && widget.lbPositions?.estTr != null) const TextSpan(text: " • "), - if (widget.lbPositions?.estTr != null) TextSpan(text: widget.lbPositions!.estTr.position >= 1000 ? "Top ${f2.format(widget.lbPositions!.estTr.percentage*100)}%" : "№${widget.lbPositions!.estTr.position}") + if (widget.lbPositions?.estTr != null) TextSpan(text: widget.lbPositions!.estTr!.position >= 1000 ? "Top ${f2.format(widget.lbPositions!.estTr!.percentage*100)}%" : "№${widget.lbPositions!.estTr!.position}") ] ), ), @@ -328,7 +328,7 @@ class _TLThingyState extends State { color: oldTl!.esttracc! > currentTl.esttracc! ? Colors.redAccent : Colors.greenAccent ),), if (oldTl?.esttracc != null && widget.lbPositions?.accOfEst != null) const TextSpan(text: " • "), - if (widget.lbPositions?.accOfEst != null) TextSpan(text: widget.lbPositions!.accOfEst.position >= 1000 ? "Top ${f2.format(widget.lbPositions!.accOfEst.percentage*100)}%" : "№${widget.lbPositions!.accOfEst.position}") + if (widget.lbPositions?.accOfEst != null) TextSpan(text: widget.lbPositions!.accOfEst!.position >= 1000 ? "Top ${f2.format(widget.lbPositions!.accOfEst!.percentage*100)}%" : "№${widget.lbPositions!.accOfEst!.position}") ] ), ),