ok i guess i'm ready for a beta test of new design

This commit is contained in:
dan63047 2024-12-13 01:52:39 +03:00
parent 0dae5a73d6
commit c1b9db3b15
7 changed files with 57 additions and 34 deletions

View File

@ -4,9 +4,9 @@
/// To regenerate, run: `dart run slang` /// To regenerate, run: `dart run slang`
/// ///
/// Locales: 2 /// Locales: 2
/// Strings: 1526 (763 per locale) /// Strings: 1528 (764 per locale)
/// ///
/// Built on 2024-12-12 at 15:53 UTC /// Built on 2024-12-12 at 21:30 UTC
// coverage:ignore-file // coverage:ignore-file
// ignore_for_file: type=lint // ignore_for_file: type=lint
@ -771,6 +771,7 @@ class _StringsRankViewEn {
String underpopulated({required Object players}) => 'Underpopulated by a ${players}'; String underpopulated({required Object players}) => 'Underpopulated by a ${players}';
String get PlayersEqualSupposedToBe => 'cute'; String get PlayersEqualSupposedToBe => 'cute';
String get avgStats => 'Average Stats'; String get avgStats => 'Average Stats';
String avgForRank({required Object rank}) => 'Average for ${rank} rank';
String get avgNerdStats => 'Average Nerd Stats'; String get avgNerdStats => 'Average Nerd Stats';
String get minimums => 'Minimums'; String get minimums => 'Minimums';
String get maximums => 'Maximums'; String get maximums => 'Maximums';
@ -2309,6 +2310,7 @@ class _StringsRankViewRuRu implements _StringsRankViewEn {
@override String underpopulated({required Object players}) => 'Не хватает ${players}'; @override String underpopulated({required Object players}) => 'Не хватает ${players}';
@override String get PlayersEqualSupposedToBe => 'лол'; @override String get PlayersEqualSupposedToBe => 'лол';
@override String get avgStats => 'Средние значения'; @override String get avgStats => 'Средние значения';
@override String avgForRank({required Object rank}) => 'Среднее для ${rank} ранга';
@override String get avgNerdStats => 'Средние задротские значения'; @override String get avgNerdStats => 'Средние задротские значения';
@override String get minimums => 'Минимумы'; @override String get minimums => 'Минимумы';
@override String get maximums => 'Максимумы'; @override String get maximums => 'Максимумы';
@ -3419,6 +3421,7 @@ extension on Translations {
case 'rankView.underpopulated': return ({required Object players}) => 'Underpopulated by a ${players}'; case 'rankView.underpopulated': return ({required Object players}) => 'Underpopulated by a ${players}';
case 'rankView.PlayersEqualSupposedToBe': return 'cute'; case 'rankView.PlayersEqualSupposedToBe': return 'cute';
case 'rankView.avgStats': return 'Average Stats'; case 'rankView.avgStats': return 'Average Stats';
case 'rankView.avgForRank': return ({required Object rank}) => 'Average for ${rank} rank';
case 'rankView.avgNerdStats': return 'Average Nerd Stats'; case 'rankView.avgNerdStats': return 'Average Nerd Stats';
case 'rankView.minimums': return 'Minimums'; case 'rankView.minimums': return 'Minimums';
case 'rankView.maximums': return 'Maximums'; case 'rankView.maximums': return 'Maximums';
@ -4231,6 +4234,7 @@ extension on _StringsRuRu {
case 'rankView.underpopulated': return ({required Object players}) => 'Не хватает ${players}'; case 'rankView.underpopulated': return ({required Object players}) => 'Не хватает ${players}';
case 'rankView.PlayersEqualSupposedToBe': return 'лол'; case 'rankView.PlayersEqualSupposedToBe': return 'лол';
case 'rankView.avgStats': return 'Средние значения'; case 'rankView.avgStats': return 'Средние значения';
case 'rankView.avgForRank': return ({required Object rank}) => 'Среднее для ${rank} ранга';
case 'rankView.avgNerdStats': return 'Средние задротские значения'; case 'rankView.avgNerdStats': return 'Средние задротские значения';
case 'rankView.minimums': return 'Минимумы'; case 'rankView.minimums': return 'Минимумы';
case 'rankView.maximums': return 'Максимумы'; case 'rankView.maximums': return 'Максимумы';

View File

@ -35,6 +35,7 @@ import 'package:tetra_stats/services/sqlite_db_controller.dart';
import 'package:csv/csv.dart'; import 'package:csv/csv.dart';
const String dbName = "TetraStats.db"; const String dbName = "TetraStats.db";
const String webVersionDomain = "tsbeta.dan63.by";
const String tetrioUsersTable = "tetrioUsers"; const String tetrioUsersTable = "tetrioUsers";
const String tetrioUsersToTrackTable = "tetrioUsersToTrack"; const String tetrioUsersToTrackTable = "tetrioUsersToTrack";
const String tetraLeagueMatchesTable = "tetrioAlphaLeagueMathces"; const String tetraLeagueMatchesTable = "tetrioAlphaLeagueMathces";
@ -289,7 +290,7 @@ class TetrioService extends DB {
// If failed, actually trying to retrieve // If failed, actually trying to retrieve
Uri url; Uri url;
if (kIsWeb) { // Web version sends every request through my php script at the same domain, where Tetra Stats located because of CORS if (kIsWeb) { // Web version sends every request through my php script at the same domain, where Tetra Stats located because of CORS
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "tetrioReplay", "replayid": replayID}); url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "tetrioReplay", "replayid": replayID});
} else { // Actually going to hit inoue } else { // Actually going to hit inoue
url = Uri.https('inoue.szy.lol', '/api/replay/$replayID'); url = Uri.https('inoue.szy.lol', '/api/replay/$replayID');
} }
@ -385,7 +386,7 @@ class TetrioService extends DB {
Uri url; Uri url;
if (kIsWeb) { if (kIsWeb) {
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "singleplayerStream", "user": userID.toLowerCase().trim(), "stream": stream}); url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "singleplayerStream", "user": userID.toLowerCase().trim(), "stream": stream});
} else { } else {
url = Uri.https('ch.tetr.io', 'api/users/${userID.toLowerCase().trim()}/records/$stream'); url = Uri.https('ch.tetr.io', 'api/users/${userID.toLowerCase().trim()}/records/$stream');
} }
@ -433,7 +434,7 @@ class TetrioService extends DB {
Uri url; Uri url;
if (kIsWeb) { // Web version sends every request through my php script at the same domain, where Tetra Stats located because of CORS if (kIsWeb) { // Web version sends every request through my php script at the same domain, where Tetra Stats located because of CORS
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "PeakTR", "user": id}); url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "PeakTR", "user": id});
} else { // Actually going to hit p1nkl0bst3r api } else { // Actually going to hit p1nkl0bst3r api
url = Uri.https('api.p1nkl0bst3r.xyz', 'toptr/$id'); url = Uri.https('api.p1nkl0bst3r.xyz', 'toptr/$id');
} }
@ -484,7 +485,7 @@ class TetrioService extends DB {
Uri url; Uri url;
if (kIsWeb) { if (kIsWeb) {
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "cutoffs"}); url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "cutoffs"});
} else { } else {
url = Uri.https('ch.tetr.io', 'api/labs/league_ranks'); url = Uri.https('ch.tetr.io', 'api/labs/league_ranks');
} }
@ -528,7 +529,7 @@ class TetrioService extends DB {
Cutoffs? cached = _cache.get("CutoffsTetrioleague_ranks", Cutoffs); Cutoffs? cached = _cache.get("CutoffsTetrioleague_ranks", Cutoffs);
if (cached != null) return cached; if (cached != null) return cached;
Uri url = Uri.https('ts.dan63.by', 'beanserver_blaster/cutoffs.json'); Uri url = Uri.https(webVersionDomain, 'beanserver_blaster/cutoffs.json');
try{ try{
final response = await client.get(url); final response = await client.get(url);
@ -572,7 +573,7 @@ class TetrioService extends DB {
} }
Future<List<Cutoffs>> fetchCutoffsHistory() async { Future<List<Cutoffs>> fetchCutoffsHistory() async {
Uri url = Uri.https('ts.dan63.by', 'beanserver_blaster/history.csv'); Uri url = Uri.https(webVersionDomain, 'beanserver_blaster/history.csv');
try{ try{
final response = await client.get(url); final response = await client.get(url);
@ -632,7 +633,7 @@ class TetrioService extends DB {
Uri url; Uri url;
if (kIsWeb) { if (kIsWeb) {
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "TLTopOne"}); url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "TLTopOne"});
} else { } else {
url = Uri.https('ch.tetr.io', 'api/users/by/league', {"after": "25000:0:0", "limit": "1"}); url = Uri.https('ch.tetr.io', 'api/users/by/league', {"after": "25000:0:0", "limit": "1"});
} }
@ -676,7 +677,7 @@ class TetrioService extends DB {
// TODO: find le way to get season 2 history // TODO: find le way to get season 2 history
Uri url; Uri url;
if (kIsWeb) { if (kIsWeb) {
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "TLHistory", "user": id}); url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "TLHistory", "user": id});
} else { } else {
url = Uri.https('api.p1nkl0bst3r.xyz', 'tlhist/$id'); url = Uri.https('api.p1nkl0bst3r.xyz', 'tlhist/$id');
} }
@ -748,7 +749,7 @@ class TetrioService extends DB {
Future<TetraLeagueAlphaStream> fetchAndSaveOldTLmatches(String userID) async { Future<TetraLeagueAlphaStream> fetchAndSaveOldTLmatches(String userID) async {
Uri url; Uri url;
if (kIsWeb) { if (kIsWeb) {
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "TLMatches", "user": userID}); url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "TLMatches", "user": userID});
} else { } else {
url = Uri.https('api.p1nkl0bst3r.xyz', 'tlmatches/$userID', {"before": "0", "count": "9000"}); url = Uri.https('api.p1nkl0bst3r.xyz', 'tlmatches/$userID', {"before": "0", "count": "9000"});
} }
@ -790,7 +791,7 @@ class TetrioService extends DB {
TetrioPlayersLeaderboard? cached = _cache.get("league", TetrioPlayersLeaderboard); TetrioPlayersLeaderboard? cached = _cache.get("league", TetrioPlayersLeaderboard);
if (cached != null) return cached; if (cached != null) return cached;
Uri url = Uri.https('ts.dan63.by', 'beanserver_blaster/leaderboard.json'); Uri url = Uri.https(webVersionDomain, 'beanserver_blaster/leaderboard.json');
try{ try{
final response = await client.get(url); final response = await client.get(url);
@ -830,7 +831,7 @@ class TetrioService extends DB {
Uri url; Uri url;
if (kIsWeb) { if (kIsWeb) {
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "TLLeaderboard"}); url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "TLLeaderboard"});
} else { } else {
url = Uri.https('ch.tetr.io', 'api/users/by/${lb??"league"}', { url = Uri.https('ch.tetr.io', 'api/users/by/${lb??"league"}', {
"limit": "100", "limit": "100",
@ -882,7 +883,7 @@ class TetrioService extends DB {
Future<List<RecordSingle>> fetchTetrioRecordsLeaderboard({String? prisecter, String? lb, String? country}) 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(webVersionDomain, '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",
@ -942,7 +943,7 @@ class TetrioService extends DB {
Uri url; Uri url;
if (kIsWeb) { if (kIsWeb) {
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "tetrioNews", "user": userID.toLowerCase().trim(), "limit": "100"}); url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "tetrioNews", "user": userID.toLowerCase().trim(), "limit": "100"});
} else { } else {
url = Uri.https('ch.tetr.io', 'api/news/user_${userID.toLowerCase().trim()}', {"limit": "100"}); url = Uri.https('ch.tetr.io', 'api/news/user_${userID.toLowerCase().trim()}', {"limit": "100"});
} }
@ -990,7 +991,7 @@ class TetrioService extends DB {
Uri url; Uri url;
if (kIsWeb) { if (kIsWeb) {
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "tetrioUserTL", "user": userID.toLowerCase().trim()}); url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "tetrioUserTL", "user": userID.toLowerCase().trim()});
} else { } else {
url = Uri.https('ch.tetr.io', 'api/users/${userID.toLowerCase().trim()}/records/league/recent'); url = Uri.https('ch.tetr.io', 'api/users/${userID.toLowerCase().trim()}/records/league/recent');
} }
@ -1120,7 +1121,7 @@ class TetrioService extends DB {
Uri url; Uri url;
if (kIsWeb) { if (kIsWeb) {
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "tetrioUserRecords", "user": userID.toLowerCase().trim()}); url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "tetrioUserRecords", "user": userID.toLowerCase().trim()});
} else { } else {
url = Uri.https('ch.tetr.io', 'api/users/${userID.toLowerCase().trim()}/records'); url = Uri.https('ch.tetr.io', 'api/users/${userID.toLowerCase().trim()}/records');
} }
@ -1173,7 +1174,7 @@ class TetrioService extends DB {
Uri url; Uri url;
if (kIsWeb) { if (kIsWeb) {
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "Summaries", "id": id}); url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "Summaries", "id": id});
} else { } else {
url = Uri.https('ch.tetr.io', 'api/users/$id/summaries'); url = Uri.https('ch.tetr.io', 'api/users/$id/summaries');
} }
@ -1311,7 +1312,7 @@ class TetrioService extends DB {
// trying to find player with given discord id // trying to find player with given discord id
Uri dUrl; Uri dUrl;
if (kIsWeb) { if (kIsWeb) {
dUrl = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "tetrioUserByDiscordID", "user": user.toLowerCase().trim()}); dUrl = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "tetrioUserByDiscordID", "user": user.toLowerCase().trim()});
} else { } else {
dUrl = Uri.https('ch.tetr.io', 'api/users/search/discord:${user.toLowerCase().trim()}'); dUrl = Uri.https('ch.tetr.io', 'api/users/search/discord:${user.toLowerCase().trim()}');
} }
@ -1356,7 +1357,7 @@ class TetrioService extends DB {
// finally going to obtain // finally going to obtain
Uri url; Uri url;
if (kIsWeb) { if (kIsWeb) {
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "tetrioUser", "user": user.toLowerCase().trim()}); url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "tetrioUser", "user": user.toLowerCase().trim()});
} else { } else {
url = Uri.https('ch.tetr.io', 'api/users/${user.toLowerCase().trim()}'); url = Uri.https('ch.tetr.io', 'api/users/${user.toLowerCase().trim()}');
} }

View File

@ -58,7 +58,7 @@ class NerdStatsThingy extends StatelessWidget{
RichText( RichText(
textAlign: TextAlign.center, textAlign: TextAlign.center,
text: TextSpan( text: TextSpan(
style: const TextStyle(fontFamily: "Eurostile Round"), style: const TextStyle(fontFamily: "Eurostile Round", color: Colors.white),
children: [ children: [
TextSpan(text: "${t.stats.app.short}\n"), TextSpan(text: "${t.stats.app.short}\n"),
TextSpan(text: f3.format(nerdStats.app), style: TextStyle(fontSize: 25, fontFamily: "Eurostile Round Extended", fontWeight: FontWeight.w100, color: getStatColor(nerdStats.app, averages?.nerdStats?.app, true))), TextSpan(text: f3.format(nerdStats.app), style: TextStyle(fontSize: 25, fontFamily: "Eurostile Round Extended", fontWeight: FontWeight.w100, color: getStatColor(nerdStats.app, averages?.nerdStats?.app, true))),
@ -99,7 +99,7 @@ class NerdStatsThingy extends StatelessWidget{
RichText( RichText(
textAlign: TextAlign.center, textAlign: TextAlign.center,
text: TextSpan( text: TextSpan(
style: const TextStyle(fontFamily: "Eurostile Round"), style: const TextStyle(fontFamily: "Eurostile Round", color: Colors.white),
children: [ children: [
TextSpan(text: "${t.stats.vsapm.short}\n"), TextSpan(text: "${t.stats.vsapm.short}\n"),
TextSpan(text: f3.format(nerdStats.vsapm), style: TextStyle(fontSize: 25, fontFamily: "Eurostile Round Extended", fontWeight: FontWeight.w100, color: getStatColor(nerdStats.vsapm, averages?.nerdStats?.vsapm, true))), TextSpan(text: f3.format(nerdStats.vsapm), style: TextStyle(fontSize: 25, fontFamily: "Eurostile Round Extended", fontWeight: FontWeight.w100, color: getStatColor(nerdStats.vsapm, averages?.nerdStats?.vsapm, true))),

View File

@ -24,23 +24,29 @@ class TetraLeagueThingy extends StatelessWidget{
List<TableRow> secondColumn(){ List<TableRow> secondColumn(){
return [ return [
TableRow(children: [ TableRow(children: [
//Text("APM: ", style: TextStyle(fontSize: 21)),
Text(intf.format(league.gamesPlayed), textAlign: TextAlign.right, style: const TextStyle(fontSize: 21)), Text(intf.format(league.gamesPlayed), textAlign: TextAlign.right, style: const TextStyle(fontSize: 21)),
Text(" ${t.stats.gp.short}", style: TextStyle(fontSize: 21)), Tooltip(
message: "${t.stats.gp.full}",
child: Text(" ${t.stats.gp.short}", style: TextStyle(fontSize: 21))
),
if (toCompare != null) Text(" (${comparef2.format(league.gamesPlayed-toCompare!.gamesPlayed)})", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: Colors.grey)), if (toCompare != null) Text(" (${comparef2.format(league.gamesPlayed-toCompare!.gamesPlayed)})", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: Colors.grey)),
if (lbPos != null) Text(lbPos?.gamesPlayed != null ? (lbPos!.gamesPlayed!.position >= 1000 ? " (${t.top} ${f2.format(lbPos!.gamesPlayed!.percentage*100)}%)" : " (№ ${lbPos!.gamesPlayed!.position})") : "(№ ---)", style: TextStyle(color: lbPos?.gamesPlayed != null ? getColorOfRank(lbPos!.gamesPlayed!.position) : null)) if (lbPos != null) Text(lbPos?.gamesPlayed != null ? (lbPos!.gamesPlayed!.position >= 1000 ? " (${t.top} ${f2.format(lbPos!.gamesPlayed!.percentage*100)}%)" : " (№ ${lbPos!.gamesPlayed!.position})") : "(№ ---)", style: TextStyle(color: lbPos?.gamesPlayed != null ? getColorOfRank(lbPos!.gamesPlayed!.position) : null))
]), ]),
TableRow(children: [ TableRow(children: [
//Text("PPS: ", style: TextStyle(fontSize: 21)),
Text(intf.format(league.gamesWon), textAlign: TextAlign.right, style: const TextStyle(fontSize: 21)), Text(intf.format(league.gamesWon), textAlign: TextAlign.right, style: const TextStyle(fontSize: 21)),
Text(" ${t.stats.gw.short}", style: TextStyle(fontSize: 21)), Tooltip(
message: "${t.stats.gw.full}",
child: Text(" ${t.stats.gw.short}", style: TextStyle(fontSize: 21))
),
if (toCompare != null) Text(" (${comparef2.format(league.gamesWon-toCompare!.gamesWon)})", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: Colors.grey)), if (toCompare != null) Text(" (${comparef2.format(league.gamesWon-toCompare!.gamesWon)})", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: Colors.grey)),
if (lbPos != null) Text(lbPos?.gamesWon != null ? (lbPos!.gamesWon!.position >= 1000 ? " (${t.top} ${f2.format(lbPos!.gamesWon!.percentage*100)}%)" : " (№ ${lbPos!.gamesWon!.position})") : "(№ ---)", style: TextStyle(color: lbPos?.gamesWon != null ? getColorOfRank(lbPos!.gamesWon!.position) : null)) if (lbPos != null) Text(lbPos?.gamesWon != null ? (lbPos!.gamesWon!.position >= 1000 ? " (${t.top} ${f2.format(lbPos!.gamesWon!.percentage*100)}%)" : " (№ ${lbPos!.gamesWon!.position})") : "(№ ---)", style: TextStyle(color: lbPos?.gamesWon != null ? getColorOfRank(lbPos!.gamesWon!.position) : null))
]), ]),
TableRow(children: [ TableRow(children: [
//Text("VS: ", style: TextStyle(fontSize: 21)),
Tooltip(child: Text("${league.gxe.isNegative ? "---" : f3.format(league.gxe)}", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: league.gxe.isNegative ? Colors.grey : Colors.white)), message: "${f2.format(league.s1tr)} S1 TR"), Tooltip(child: Text("${league.gxe.isNegative ? "---" : f3.format(league.gxe)}", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: league.gxe.isNegative ? Colors.grey : Colors.white)), message: "${f2.format(league.s1tr)} S1 TR"),
Tooltip(child: Text(" ${t.stats.glixare.short}", style: TextStyle(fontSize: 21, color: league.gxe.isNegative ? Colors.grey : Colors.white)), message: "Glixare"), Tooltip(
message: "${t.stats.glixare.full}",
child: Tooltip(child: Text(" ${t.stats.glixare.short}", style: TextStyle(fontSize: 21, color: league.gxe.isNegative ? Colors.grey : Colors.white)), message: "Glixare")
),
if (toCompare != null) Text(" (${comparef.format(league.gxe-toCompare!.gxe)})", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: getDifferenceColor(league.gxe-toCompare!.gxe))), if (toCompare != null) Text(" (${comparef.format(league.gxe-toCompare!.gxe)})", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: getDifferenceColor(league.gxe-toCompare!.gxe))),
if (lbPos != null) Text(lbPos?.glixare != null ? (lbPos!.glixare!.position >= 1000 ? " (${t.top} ${f2.format(lbPos!.glixare!.percentage*100)}%)" : " (№ ${lbPos!.glixare!.position})") : "(№ ---)", style: TextStyle(color: lbPos?.glixare != null ? getColorOfRank(lbPos!.glixare!.position) : null)) if (lbPos != null) Text(lbPos?.glixare != null ? (lbPos!.glixare!.position >= 1000 ? " (${t.top} ${f2.format(lbPos!.glixare!.percentage*100)}%)" : " (№ ${lbPos!.glixare!.position})") : "(№ ---)", style: TextStyle(color: lbPos?.glixare != null ? getColorOfRank(lbPos!.glixare!.position) : null))
]), ]),
@ -75,19 +81,28 @@ class TetraLeagueThingy extends StatelessWidget{
children: [ children: [
TableRow(children: [ TableRow(children: [
Text(league.apm != null ? f2.format(league.apm) : "-.--", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: league.apm != null ? getStatColor(league.apm!, averages?.apm, true) : Colors.grey)), Text(league.apm != null ? f2.format(league.apm) : "-.--", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: league.apm != null ? getStatColor(league.apm!, averages?.apm, true) : Colors.grey)),
Text(" ${t.stats.apm.short}", style: TextStyle(fontSize: 21, color: league.apm != null ? getStatColor(league.apm!, averages?.apm, true) : Colors.grey)), Tooltip(
message: "${t.stats.apm.full}${(averages != null) ? "\n${t.rankView.avgForRank(rank: league.percentileRank.toUpperCase())}: ${f2.format(averages!.apm)} ${t.stats.apm.short}" : ""}",
child: Text(" ${t.stats.apm.short}", style: TextStyle(fontSize: 21, color: league.apm != null ? getStatColor(league.apm!, averages?.apm, true) : Colors.grey))
),
if (toCompare != null) Text(" (${comparef2.format(league.apm!-toCompare!.apm!)})", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: getDifferenceColor(league.apm!-toCompare!.apm!))), if (toCompare != null) Text(" (${comparef2.format(league.apm!-toCompare!.apm!)})", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: getDifferenceColor(league.apm!-toCompare!.apm!))),
if (lbPos != null) Text(lbPos?.apm != null ? (lbPos!.apm!.position >= 1000 ? " (${t.top} ${f2.format(lbPos!.apm!.percentage*100)}%)" : " (№ ${lbPos!.apm!.position})") : "(№ ---)", style: TextStyle(color: lbPos?.apm != null ? getColorOfRank(lbPos!.apm!.position) : null)) if (lbPos != null) Text(lbPos?.apm != null ? (lbPos!.apm!.position >= 1000 ? " (${t.top} ${f2.format(lbPos!.apm!.percentage*100)}%)" : " (№ ${lbPos!.apm!.position})") : "(№ ---)", style: TextStyle(color: lbPos?.apm != null ? getColorOfRank(lbPos!.apm!.position) : null))
]), ]),
TableRow(children: [ TableRow(children: [
Text(league.pps != null ? f2.format(league.pps) : "-.--", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: league.pps != null ? getStatColor(league.pps!, averages?.pps, true) : Colors.grey)), Text(league.pps != null ? f2.format(league.pps) : "-.--", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: league.pps != null ? getStatColor(league.pps!, averages?.pps, true) : Colors.grey)),
Text(" ${t.stats.pps.short}", style: TextStyle(fontSize: 21, color: league.pps != null ? getStatColor(league.pps!, averages?.pps, true) : Colors.grey)), Tooltip(
message: "${t.stats.pps.full}${(averages != null) ? "\n${t.rankView.avgForRank(rank: league.percentileRank.toUpperCase())}: ${f2.format(averages!.pps)} ${t.stats.pps.short}" : ""}",
child: Text(" ${t.stats.pps.short}", style: TextStyle(fontSize: 21, color: league.pps != null ? getStatColor(league.pps!, averages?.pps, true) : Colors.grey))
),
if (toCompare != null) Text(" (${comparef2.format(league.pps!-toCompare!.pps!)})", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: getDifferenceColor(league.pps!-toCompare!.pps!))), if (toCompare != null) Text(" (${comparef2.format(league.pps!-toCompare!.pps!)})", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: getDifferenceColor(league.pps!-toCompare!.pps!))),
if (lbPos != null) Text(lbPos?.pps != null ? (lbPos!.pps!.position >= 1000 ? " (${t.top} ${f2.format(lbPos!.pps!.percentage*100)}%)" : " (№ ${lbPos!.pps!.position})") : "(№ ---)", style: TextStyle(color: lbPos?.pps != null ? getColorOfRank(lbPos!.pps!.position) : null)) if (lbPos != null) Text(lbPos?.pps != null ? (lbPos!.pps!.position >= 1000 ? " (${t.top} ${f2.format(lbPos!.pps!.percentage*100)}%)" : " (№ ${lbPos!.pps!.position})") : "(№ ---)", style: TextStyle(color: lbPos?.pps != null ? getColorOfRank(lbPos!.pps!.position) : null))
]), ]),
TableRow(children: [ TableRow(children: [
Text(league.vs != null ? f2.format(league.vs) : "-.--", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: league.vs != null ? getStatColor(league.vs!, averages?.vs, true) : Colors.grey)), Text(league.vs != null ? f2.format(league.vs) : "-.--", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: league.vs != null ? getStatColor(league.vs!, averages?.vs, true) : Colors.grey)),
Text(" ${t.stats.vs.short}", style: TextStyle(fontSize: 21, color: league.vs != null ? getStatColor(league.vs!, averages?.vs, true) : Colors.grey)), Tooltip(
message: "${t.stats.vs.full}${(averages != null) ? "\n${t.rankView.avgForRank(rank: league.percentileRank.toUpperCase())}: ${f2.format(averages!.vs)} ${t.stats.vs.short}" : ""}",
child: Text(" ${t.stats.vs.short}", style: TextStyle(fontSize: 21, color: league.vs != null ? getStatColor(league.vs!, averages?.vs, true) : Colors.grey))
),
if (toCompare != null) Text(" (${comparef2.format(league.vs!-toCompare!.vs!)})", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: getDifferenceColor(league.vs!-toCompare!.vs!))), if (toCompare != null) Text(" (${comparef2.format(league.vs!-toCompare!.vs!)})", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: getDifferenceColor(league.vs!-toCompare!.vs!))),
if (lbPos != null) Text(lbPos?.vs != null ? (lbPos!.vs!.position >= 1000 ? " (${t.top} ${f2.format(lbPos!.vs!.percentage*100)}%)" : " (№ ${lbPos!.vs!.position})") : "(№ ---)", style: TextStyle(color: lbPos?.vs != null ? getColorOfRank(lbPos!.vs!.position) : null)) if (lbPos != null) Text(lbPos?.vs != null ? (lbPos!.vs!.position >= 1000 ? " (${t.top} ${f2.format(lbPos!.vs!.percentage*100)}%)" : " (№ ${lbPos!.vs!.position})") : "(№ ---)", style: TextStyle(color: lbPos?.vs != null ? getColorOfRank(lbPos!.vs!.position) : null))
]), ]),

View File

@ -133,6 +133,7 @@ class _UserThingyState extends State<UserThingy> with SingleTickerProviderStateM
child: RichText(text: TextSpan(text: widget.player.username, style: TextStyle( child: RichText(text: TextSpan(text: widget.player.username, style: TextStyle(
fontFamily: fontStyle(widget.player.username.length), fontFamily: fontStyle(widget.player.username.length),
fontSize: 28, fontSize: 28,
color: Colors.white
), ),
recognizer: TapGestureRecognizer()..onTap = (){ recognizer: TapGestureRecognizer()..onTap = (){
copyToClipboard(widget.player.userId); copyToClipboard(widget.player.userId);
@ -156,7 +157,7 @@ class _UserThingyState extends State<UserThingy> with SingleTickerProviderStateM
), ),
RichText( RichText(
text: TextSpan( text: TextSpan(
style: const TextStyle(fontFamily: "Eurostile Round"), style: const TextStyle(fontFamily: "Eurostile Round", color: Colors.white),
children: children:
[ [
if (widget.player.friendCount > 0) WidgetSpan(child: Tooltip(message: t.stats.followers, child: Icon(Icons.person)), alignment: PlaceholderAlignment.middle, baseline: TextBaseline.alphabetic), if (widget.player.friendCount > 0) WidgetSpan(child: Tooltip(message: t.stats.followers, child: Icon(Icons.person)), alignment: PlaceholderAlignment.middle, baseline: TextBaseline.alphabetic),
@ -176,7 +177,7 @@ class _UserThingyState extends State<UserThingy> with SingleTickerProviderStateM
width: 270, width: 270,
child: RichText( child: RichText(
text: TextSpan( text: TextSpan(
style: const TextStyle(fontFamily: "Eurostile Round"), style: const TextStyle(fontFamily: "Eurostile Round", color: Colors.white),
children: [ children: [
TextSpan(text: timestamp(widget.player.registrationTime), style: const TextStyle(color: Colors.grey)), TextSpan(text: timestamp(widget.player.registrationTime), style: const TextStyle(color: Colors.grey)),
if (widget.player.country != null) TextSpan(text: "${t.countries[widget.player.country]}") if (widget.player.country != null) TextSpan(text: "${t.countries[widget.player.country]}")
@ -191,7 +192,7 @@ class _UserThingyState extends State<UserThingy> with SingleTickerProviderStateM
child: RichText( child: RichText(
textAlign: TextAlign.end, textAlign: TextAlign.end,
text: TextSpan( text: TextSpan(
style: const TextStyle(fontFamily: "Eurostile Round"), style: const TextStyle(fontFamily: "Eurostile Round", color: Colors.white),
children: [ children: [
TextSpan(text: "Level ${(widget.player.level.isNegative || widget.player.level.isNaN) ? "---" : intf.format(widget.player.level.floor())}", style: TextStyle(decoration: (widget.player.level.isNegative || widget.player.level.isNaN) ? null : TextDecoration.underline, decorationColor: Colors.white70, decorationStyle: TextDecorationStyle.dotted, color: (widget.player.level.isNegative || widget.player.level.isNaN) ? Colors.grey : Colors.white), recognizer: (widget.player.level.isNegative || widget.player.level.isNaN) ? null : TapGestureRecognizer()?..onTap = (){ TextSpan(text: "Level ${(widget.player.level.isNegative || widget.player.level.isNaN) ? "---" : intf.format(widget.player.level.floor())}", style: TextStyle(decoration: (widget.player.level.isNegative || widget.player.level.isNaN) ? null : TextDecoration.underline, decorationColor: Colors.white70, decorationStyle: TextDecorationStyle.dotted, color: (widget.player.level.isNegative || widget.player.level.isNaN) ? Colors.grey : Colors.white), recognizer: (widget.player.level.isNegative || widget.player.level.isNaN) ? null : TapGestureRecognizer()?..onTap = (){
showDialog( showDialog(

View File

@ -216,6 +216,7 @@
"underpopulated": "Underpopulated by a $players", "underpopulated": "Underpopulated by a $players",
"PlayersEqualSupposedToBe": "cute", "PlayersEqualSupposedToBe": "cute",
"avgStats": "Average Stats", "avgStats": "Average Stats",
"avgForRank": "Average for $rank rank",
"avgNerdStats": "Average Nerd Stats", "avgNerdStats": "Average Nerd Stats",
"minimums": "Minimums", "minimums": "Minimums",
"maximums": "Maximums" "maximums": "Maximums"

View File

@ -216,6 +216,7 @@
"underpopulated": "Не хватает $players", "underpopulated": "Не хватает $players",
"PlayersEqualSupposedToBe": "лол", "PlayersEqualSupposedToBe": "лол",
"avgStats": "Средние значения", "avgStats": "Средние значения",
"avgForRank": "Среднее для $rank ранга",
"avgNerdStats": "Средние задротские значения", "avgNerdStats": "Средние задротские значения",
"minimums": "Минимумы", "minimums": "Минимумы",
"maximums": "Максимумы" "maximums": "Максимумы"