Sorting functions for LB's (works kinda meh...)

This commit is contained in:
dan63047 2024-10-02 00:46:43 +03:00
parent af1dec56bc
commit ba78d50f21
6 changed files with 80 additions and 18 deletions

View File

@ -38,6 +38,25 @@ class TetrioPlayersLeaderboard {
return lb; return lb;
} }
List<TetrioPlayerFromLeaderboard> getStatRankingFromLB(Stats stat, {bool reversed = false, String country = ""}){
List<TetrioPlayerFromLeaderboard> lb = List.from(leaderboard);
if (country.isNotEmpty){
lb.removeWhere((element) => element.country != country);
}
lb.sort(((a, b) {
if (a.getStatByEnum(stat).isNaN) return 1;
if (b.getStatByEnum(stat).isNaN) return -1;
if (a.getStatByEnum(stat) > b.getStatByEnum(stat)){
return reversed ? 1 : -1;
}else if (a.getStatByEnum(stat) == b.getStatByEnum(stat)){
return 0;
}else{
return reversed ? -1 : 1;
}
}));
return lb;
}
List<dynamic> getAverageOfRank(String rank){ // i tried to refactor it and that's was terrible List<dynamic> getAverageOfRank(String rank){ // i tried to refactor it and that's was terrible
if (rank.isNotEmpty && !rankCutoffs.keys.contains(rank)) throw Exception("Invalid rank"); if (rank.isNotEmpty && !rankCutoffs.keys.contains(rank)) throw Exception("Invalid rank");
List<TetrioPlayerFromLeaderboard> filtredLeaderboard = List.from(leaderboard); List<TetrioPlayerFromLeaderboard> filtredLeaderboard = List.from(leaderboard);

View File

@ -6,7 +6,7 @@
/// Locales: 3 /// Locales: 3
/// Strings: 1818 (606 per locale) /// Strings: 1818 (606 per locale)
/// ///
/// Built on 2024-09-12 at 20:23 UTC /// Built on 2024-09-30 at 21:23 UTC
// coverage:ignore-file // coverage:ignore-file
// ignore_for_file: type=lint // ignore_for_file: type=lint
@ -396,7 +396,7 @@ class Translations implements BaseTranslations<AppLocale, Translations> {
late final _StringsPopupActionsEn popupActions = _StringsPopupActionsEn._(_root); late final _StringsPopupActionsEn popupActions = _StringsPopupActionsEn._(_root);
late final _StringsErrorsEn errors = _StringsErrorsEn._(_root); late final _StringsErrorsEn errors = _StringsErrorsEn._(_root);
Map<String, String> get countries => { Map<String, String> get countries => {
'': 'Not selected', '': 'Worldwide',
'AF': 'Afghanistan', 'AF': 'Afghanistan',
'AX': 'Åland Islands', 'AX': 'Åland Islands',
'AL': 'Albania', 'AL': 'Albania',
@ -1108,7 +1108,7 @@ class _StringsRu implements Translations {
@override late final _StringsPopupActionsRu popupActions = _StringsPopupActionsRu._(_root); @override late final _StringsPopupActionsRu popupActions = _StringsPopupActionsRu._(_root);
@override late final _StringsErrorsRu errors = _StringsErrorsRu._(_root); @override late final _StringsErrorsRu errors = _StringsErrorsRu._(_root);
@override Map<String, String> get countries => { @override Map<String, String> get countries => {
'': 'Не выбрана', '': 'Во всём мире',
'AF': 'Афганистан', 'AF': 'Афганистан',
'AX': 'Аландские острова', 'AX': 'Аландские острова',
'AL': 'Албания', 'AL': 'Албания',
@ -2628,7 +2628,7 @@ extension on Translations {
case 'errors.replayAlreadySaved': return 'Replay already saved'; case 'errors.replayAlreadySaved': return 'Replay already saved';
case 'errors.replayExpired': return 'Replay expired and not available anymore'; case 'errors.replayExpired': return 'Replay expired and not available anymore';
case 'errors.replayRejected': return 'Third party API blocked your IP address'; case 'errors.replayRejected': return 'Third party API blocked your IP address';
case 'countries.': return 'Not selected'; case 'countries.': return 'Worldwide';
case 'countries.AF': return 'Afghanistan'; case 'countries.AF': return 'Afghanistan';
case 'countries.AX': return 'Åland Islands'; case 'countries.AX': return 'Åland Islands';
case 'countries.AL': return 'Albania'; case 'countries.AL': return 'Albania';
@ -3256,7 +3256,7 @@ extension on _StringsRu {
case 'errors.replayAlreadySaved': return 'Повтор уже сохранён'; case 'errors.replayAlreadySaved': return 'Повтор уже сохранён';
case 'errors.replayExpired': return 'Повтор истёк и больше недоступен'; case 'errors.replayExpired': return 'Повтор истёк и больше недоступен';
case 'errors.replayRejected': return 'Стороннее API заблокировало ваш IP адрес'; case 'errors.replayRejected': return 'Стороннее API заблокировало ваш IP адрес';
case 'countries.': return 'Не выбрана'; case 'countries.': return 'Во всём мире';
case 'countries.AF': return 'Афганистан'; case 'countries.AF': return 'Афганистан';
case 'countries.AX': return 'Аландские острова'; case 'countries.AX': return 'Аландские острова';
case 'countries.AL': return 'Албания'; case 'countries.AL': return 'Албания';

View File

@ -853,14 +853,15 @@ class TetrioService extends DB {
} }
} }
Future<List<RecordSingle>> fetchTetrioRecordsLeaderboard({String? prisecter, String? lb}) async{ Future<List<RecordSingle>> fetchTetrioRecordsLeaderboard({String? prisecter, String? lb, String? country}) async{
Uri url; Uri url;
if (kIsWeb) { if (kIsWeb) {
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "TLLeaderboard"}); url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "TLLeaderboard"});
} else { } else {
url = Uri.https('ch.tetr.io', 'api/records/${lb??"40l_global"}', { url = Uri.https('ch.tetr.io', 'api/records/${lb??"40l_global"}', {
"limit": "100", "limit": "100",
if (prisecter != null) "after": prisecter if (prisecter != null) "after": prisecter,
if (country != null) "country": country
}); });
} }
try{ try{

View File

@ -1099,6 +1099,10 @@ class _DestinationLeaderboardsState extends State<DestinationLeaderboards> {
List<dynamic> list = []; List<dynamic> list = [];
bool _isFetchingData = false; bool _isFetchingData = false;
String? prisecter; String? prisecter;
List<DropdownMenuEntry> _countries = [for (MapEntry e in t.countries.entries) DropdownMenuEntry(value: e.key, label: e.value)];
List<DropdownMenuEntry> _stats = [for (MapEntry e in chartsShortTitles.entries) DropdownMenuEntry(value: e.key, label: e.value)];
String? _country;
Stats stat = Stats.tr;
Future<void> _fetchData() async { Future<void> _fetchData() async {
if (_isFetchingData) { if (_isFetchingData) {
@ -1110,14 +1114,14 @@ class _DestinationLeaderboardsState extends State<DestinationLeaderboards> {
setState(() {}); setState(() {});
final items = switch(_currentLb){ final items = switch(_currentLb){
Leaderboards.tl => await teto.fetchTetrioLeaderboard(prisecter: prisecter), Leaderboards.tl => await teto.fetchTetrioLeaderboard(prisecter: prisecter, country: _country),
Leaderboards.fullTL => (await teto.fetchTLLeaderboard()).leaderboard, Leaderboards.fullTL => (await teto.fetchTLLeaderboard()).getStatRankingFromLB(stat, country: _country??""),
Leaderboards.xp => await teto.fetchTetrioLeaderboard(prisecter: prisecter, lb: "xp"), Leaderboards.xp => await teto.fetchTetrioLeaderboard(prisecter: prisecter, lb: "xp", country: _country),
Leaderboards.ar => await teto.fetchTetrioLeaderboard(prisecter: prisecter, lb: "ar"), Leaderboards.ar => await teto.fetchTetrioLeaderboard(prisecter: prisecter, lb: "ar", country: _country),
Leaderboards.sprint => await teto.fetchTetrioRecordsLeaderboard(prisecter: prisecter), Leaderboards.sprint => await teto.fetchTetrioRecordsLeaderboard(prisecter: prisecter, country: _country),
Leaderboards.blitz => await teto.fetchTetrioRecordsLeaderboard(prisecter: prisecter, lb: "blitz_global"), Leaderboards.blitz => await teto.fetchTetrioRecordsLeaderboard(prisecter: prisecter, lb: "blitz_global", country: _country),
Leaderboards.zenith => await teto.fetchTetrioRecordsLeaderboard(prisecter: prisecter, lb: "zenith_global"), Leaderboards.zenith => await teto.fetchTetrioRecordsLeaderboard(prisecter: prisecter, lb: "zenith_global", country: _country),
Leaderboards.zenithex => await teto.fetchTetrioRecordsLeaderboard(prisecter: prisecter, lb: "zenithex_global"), Leaderboards.zenithex => await teto.fetchTetrioRecordsLeaderboard(prisecter: prisecter, lb: "zenithex_global", country: _country),
}; };
list.addAll(items); list.addAll(items);
@ -1211,6 +1215,44 @@ class _DestinationLeaderboardsState extends State<DestinationLeaderboards> {
return Column( return Column(
children: [ children: [
Text(leaderboards[_currentLb]!, style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: 28, height: 0.9)), Text(leaderboards[_currentLb]!, style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: 28, height: 0.9)),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
DropdownMenu(
leadingIcon: Icon(Icons.public),
inputDecorationTheme: InputDecorationTheme(
isDense: true,
),
textStyle: TextStyle(fontSize: 14, height: 0.9),
dropdownMenuEntries: _countries,
initialSelection: "",
onSelected: ((value) {
_country = value as String?;
list.clear();
prisecter = null;
_isFetchingData = false;
setState((){_fetchData();});
})
),
if (_currentLb == Leaderboards.fullTL) SizedBox(width: 5.0),
if (_currentLb == Leaderboards.fullTL) DropdownMenu(
leadingIcon: Icon(Icons.sort),
inputDecorationTheme: InputDecorationTheme(
isDense: true,
),
textStyle: TextStyle(fontSize: 14, height: 0.9),
dropdownMenuEntries: _stats,
initialSelection: stat,
onSelected: ((value) {
stat = value;
list.clear();
prisecter = null;
_isFetchingData = false;
setState((){_fetchData();});
})
)
],
),
const Divider(color: Color.fromARGB(50, 158, 158, 158)), const Divider(color: Color.fromARGB(50, 158, 158, 158)),
Expanded( Expanded(
child: ListView.builder( child: ListView.builder(
@ -4257,7 +4299,7 @@ class FutureError extends StatelessWidget{
Text(snapshot.error.toString(), style: const TextStyle(fontFamily: "Eurostile Round", fontSize: 42, fontWeight: FontWeight.bold), textAlign: TextAlign.center), Text(snapshot.error.toString(), style: const TextStyle(fontFamily: "Eurostile Round", fontSize: 42, fontWeight: FontWeight.bold), textAlign: TextAlign.center),
Padding( Padding(
padding: const EdgeInsets.only(top: 8.0), padding: const EdgeInsets.only(top: 8.0),
child: Text(snapshot.stackTrace.toString(), textAlign: TextAlign.center), child: Text(snapshot.stackTrace.toString(), textAlign: TextAlign.left, style: TextStyle(fontFamily: "Monospace")),
), ),
Spacer() Spacer()
], ],

View File

@ -377,7 +377,7 @@
"replayRejected": "Third party API blocked your IP address" "replayRejected": "Third party API blocked your IP address"
}, },
"countries(map)": { "countries(map)": {
"": "Not selected", "": "Worldwide",
"AF": "Afghanistan", "AF": "Afghanistan",
"AX": "\u00c5land Islands", "AX": "\u00c5land Islands",

View File

@ -377,7 +377,7 @@
"replayRejected": "Стороннее API заблокировало ваш IP адрес" "replayRejected": "Стороннее API заблокировало ваш IP адрес"
}, },
"countries(map)": { "countries(map)": {
"": "Не выбрана", "": "Во всём мире",
"AF": "Афганистан", "AF": "Афганистан",
"AX": "Аландские острова", "AX": "Аландские острова",