Release... i think?...

This commit is contained in:
dan63047 2023-07-20 23:56:00 +03:00
parent 248b708276
commit 0e251bd01c
19 changed files with 12042 additions and 118 deletions

View File

@ -38,7 +38,7 @@ jobs:
discussionCategory: autobuilded-releases
artifacts: "build/windows/runner/Release/TetraStats-${{github.ref_name}}-windows.zip"
tag: Auto-${{ github.run_number }}
body: This build was builded with GitHub Action workflow
body: Builded with GitHub Action workflow
token: ${{ secrets.TOKEN }}
build-and-release-android:
name: Build Android App
@ -63,5 +63,5 @@ jobs:
discussionCategory: autobuilded-releases
artifacts: "build/app/outputs/flutter-apk/*"
tag: Auto-${{ github.run_number }}
body: This build was builded with GitHub Action workflow
body: Builded with GitHub Action workflow
token: ${{ secrets.TOKEN }}

View File

@ -2,29 +2,22 @@
<center>Track your and other players stats in TETR.IO</center>
![Screenshot of the app](https://imgur.com/eAtFeBF.png)
![Screenshot of the app](https://imgur.com/CKGYyBg.png)
# Development Roadmap
- ~~Ability to fetch player~~
- ~~Serialization/Deserialization~~
- ~~Sqlite Database and service, that can work with it~~ *v0.0.2*
- ~~Ability to track player~~
- ~~Ability to compare 2 players~~ *v0.1.0*
- ~~Stats Calculator~~
- ~~Ability to compare player with himself in past~~
- ~~Tetra League matches history~~
- ~~Tetra League historic charts for tracked players~~
- ~~Better UI with delta and hints for stats~~ *v0.2.0, we are here*
- ~~Ability to compare player with APM-PPS-VS stats~~
- ~~Ability to fetch Tetra League leaderboard~~
- ~~Average stats for ranks~~
- ~~Ability to compare player with avgRank~~
- UI Animations *lol*
- ~~i18n, EN and RU locales~~ *dev build are here*
- ~~Talk with osk about CORS and EndContext in TL matches~~ *k*
- storeState becomes slow when there a lot of entries, needs to fix
You can [try it out right now](https://ts.dan63.by)!!! (web version)
If you want an app, you can find it [here](https://github.com/dan63047/TetraStats/releases)!
# Available functionality
- Advanced stats for players
- Rank cutoffs and averages
- Sqlite Database and service, that can work with it
- Comparison to players, rank averages, and player stats from the past
- Stats Calculator
- Player history in charts
# I forgor💀 to do
- UI Animations
- im still not rendering distinguishment
- RELEASE ??? *that will be v1.0.0*
---

View File

@ -1,9 +1,12 @@
/// Generated file. Do not edit.
///
/// Locales: 2
/// Strings: 850 (425 per locale)
/// Original: res/i18n
/// To regenerate, run: `dart run slang`
///
/// Built on 2023-07-17 at 17:33 UTC
/// Locales: 2
/// Strings: 856 (428 per locale)
///
/// Built on 2023-07-20 at 16:26 UTC
// coverage:ignore-file
// ignore_for_file: type=lint
@ -162,6 +165,7 @@ class _StringsEn implements BaseTranslations<AppLocale, _StringsEn> {
String get openSearch => 'Search player';
String get closeSearch => 'Close search';
String get refresh => 'Refresh';
String get fetchAndsaveTLHistory => 'Get player history';
String get showStoredData => 'Show stored data';
String get statsCalc => 'Stats Calculator';
String get settings => 'Settings';
@ -215,7 +219,7 @@ class _StringsEn implements BaseTranslations<AppLocale, _StringsEn> {
String get yourIDText => 'Every time when app loads, stats of that player will be fetched. Please prefer ID over nickname because nickname can be changed.';
String get language => 'Language';
String get aboutApp => 'About app';
String aboutAppText({required Object appName, required Object packageName, required Object version, required Object buildNumber}) => '${appName} (${packageName}) Version ${version} Build ${buildNumber}\n\nDeveloped by dan63047\nFormulas provided by kerrmunism';
String aboutAppText({required Object appName, required Object packageName, required Object version, required Object buildNumber}) => '${appName} (${packageName}) Version ${version} Build ${buildNumber}\n\nDeveloped by dan63047\nFormulas provided by kerrmunism\nHistory provided by p1nkl0bst3r';
String stateViewTitle({required Object nickname, required Object date}) => '${nickname} account on ${date}';
String statesViewTitle({required Object number, required Object nickname}) => '${number} states of ${nickname} account';
String statesViewEntry({required Object level, required Object gameTime, required Object friends, required Object rd}) => 'Level ${level}, ${gameTime} of gametime, ${friends} friends, ${rd} RD';
@ -250,6 +254,7 @@ class _StringsEn implements BaseTranslations<AppLocale, _StringsEn> {
String get lbViewOneEntry => 'There is only one player... What?';
String lbViewManyEntrys({required Object numberOfPlayers}) => 'There are ${numberOfPlayers} ranked players.';
String get p1nkl0bst3rAlert => 'That data was retrived from third party API maintained by p1nkl0bst3r';
String get notForWeb => 'Function is not available for web version';
late final _StringsStatCellNumEn statCellNum = _StringsStatCellNumEn._(_root);
Map<String, String> get playerRole => {
'user': 'User',
@ -542,6 +547,7 @@ class _StringsStatCellNumEn {
String get friends => 'Friends';
String get apm => 'Attack\nPer Minute';
String get vs => 'Versus\nScore';
String get recordLB => 'Leaderboard placement';
String get lbp => 'Leaderboard\nplacement';
String get lbpShort => '№ in LB';
String get lbpc => 'Country LB\nplacement';
@ -660,6 +666,7 @@ class _StringsRu implements _StringsEn {
@override String get openSearch => 'Искать игрока';
@override String get closeSearch => 'Закрыть поиск';
@override String get refresh => 'Обновить';
@override String get fetchAndsaveTLHistory => 'Получить историю игрока';
@override String get showStoredData => 'Показать сохранённые данные';
@override String get statsCalc => 'Калькулятор статистики';
@override String get settings => 'Настройки';
@ -713,7 +720,7 @@ class _StringsRu implements _StringsEn {
@override String get yourIDText => 'Каждый раз, когда приложение запускается, приложение будет получать статистику этого игрока. Пожалуйста, отдайте предпочтение ID, так как никнейм можно изменить.';
@override String get language => 'Язык (Language)';
@override String get aboutApp => 'О приложении';
@override String aboutAppText({required Object appName, required Object packageName, required Object version, required Object buildNumber}) => '${appName} (${packageName}) Версия ${version} Сборка ${buildNumber}\n\nРазработал dan63047\nФормулы предоставил kerrmunism';
@override String aboutAppText({required Object appName, required Object packageName, required Object version, required Object buildNumber}) => '${appName} (${packageName}) Версия ${version} Сборка ${buildNumber}\n\nРазработал dan63047\nФормулы предоставил kerrmunism\nИсторию предоставляет p1nkl0bst3r';
@override String stateViewTitle({required Object nickname, required Object date}) => 'Аккаунт ${nickname} ${date}';
@override String statesViewTitle({required Object number, required Object nickname}) => '${number} состояний аккаунта ${nickname}';
@override String statesViewEntry({required Object level, required Object gameTime, required Object friends, required Object rd}) => '${level} уровень, ${gameTime} сыграно, ${friends} друзей, ${rd} RD';
@ -748,6 +755,7 @@ class _StringsRu implements _StringsEn {
@override String get lbViewOneEntry => 'В рейтинговой таблице всего один игрок... Чего?';
@override String lbViewManyEntrys({required Object numberOfPlayers}) => 'В рейтинговой таблице находится ${numberOfPlayers} игроков.';
@override String get p1nkl0bst3rAlert => 'Эти данные были получены из стороннего API, который поддерживается p1nkl0bst3r';
@override String get notForWeb => 'Функция недоступна для веб версии';
@override late final _StringsStatCellNumRu statCellNum = _StringsStatCellNumRu._(_root);
@override Map<String, String> get playerRole => {
'user': 'Пользователь',
@ -1040,6 +1048,7 @@ class _StringsStatCellNumRu implements _StringsStatCellNumEn {
@override String get friends => 'Друзей';
@override String get apm => 'Атака в\nМинуту';
@override String get vs => 'Показатель\nVersus';
@override String get recordLB => 'Место в таблице';
@override String get lbp => 'Положение\nв рейтинге';
@override String get lbpShort => '№ в рейтинге';
@override String get lbpc => 'Положение\nв рейтинге страны';
@ -1137,6 +1146,7 @@ extension on _StringsEn {
case 'openSearch': return 'Search player';
case 'closeSearch': return 'Close search';
case 'refresh': return 'Refresh';
case 'fetchAndsaveTLHistory': return 'Get player history';
case 'showStoredData': return 'Show stored data';
case 'statsCalc': return 'Stats Calculator';
case 'settings': return 'Settings';
@ -1190,7 +1200,7 @@ extension on _StringsEn {
case 'yourIDText': return 'Every time when app loads, stats of that player will be fetched. Please prefer ID over nickname because nickname can be changed.';
case 'language': return 'Language';
case 'aboutApp': return 'About app';
case 'aboutAppText': return ({required Object appName, required Object packageName, required Object version, required Object buildNumber}) => '${appName} (${packageName}) Version ${version} Build ${buildNumber}\n\nDeveloped by dan63047\nFormulas provided by kerrmunism';
case 'aboutAppText': return ({required Object appName, required Object packageName, required Object version, required Object buildNumber}) => '${appName} (${packageName}) Version ${version} Build ${buildNumber}\n\nDeveloped by dan63047\nFormulas provided by kerrmunism\nHistory provided by p1nkl0bst3r';
case 'stateViewTitle': return ({required Object nickname, required Object date}) => '${nickname} account on ${date}';
case 'statesViewTitle': return ({required Object number, required Object nickname}) => '${number} states of ${nickname} account';
case 'statesViewEntry': return ({required Object level, required Object gameTime, required Object friends, required Object rd}) => 'Level ${level}, ${gameTime} of gametime, ${friends} friends, ${rd} RD';
@ -1225,6 +1235,7 @@ extension on _StringsEn {
case 'lbViewOneEntry': return 'There is only one player... What?';
case 'lbViewManyEntrys': return ({required Object numberOfPlayers}) => 'There are ${numberOfPlayers} ranked players.';
case 'p1nkl0bst3rAlert': return 'That data was retrived from third party API maintained by p1nkl0bst3r';
case 'notForWeb': return 'Function is not available for web version';
case 'statCellNum.xpLevel': return 'XP Level';
case 'statCellNum.xpProgress': return 'Progress to next level';
case 'statCellNum.xpFrom0To5000': return 'Progress from 0 XP to level 5000';
@ -1234,6 +1245,7 @@ extension on _StringsEn {
case 'statCellNum.friends': return 'Friends';
case 'statCellNum.apm': return 'Attack\nPer Minute';
case 'statCellNum.vs': return 'Versus\nScore';
case 'statCellNum.recordLB': return 'Leaderboard placement';
case 'statCellNum.lbp': return 'Leaderboard\nplacement';
case 'statCellNum.lbpShort': return '№ in LB';
case 'statCellNum.lbpc': return 'Country LB\nplacement';
@ -1570,6 +1582,7 @@ extension on _StringsRu {
case 'openSearch': return 'Искать игрока';
case 'closeSearch': return 'Закрыть поиск';
case 'refresh': return 'Обновить';
case 'fetchAndsaveTLHistory': return 'Получить историю игрока';
case 'showStoredData': return 'Показать сохранённые данные';
case 'statsCalc': return 'Калькулятор статистики';
case 'settings': return 'Настройки';
@ -1623,7 +1636,7 @@ extension on _StringsRu {
case 'yourIDText': return 'Каждый раз, когда приложение запускается, приложение будет получать статистику этого игрока. Пожалуйста, отдайте предпочтение ID, так как никнейм можно изменить.';
case 'language': return 'Язык (Language)';
case 'aboutApp': return 'О приложении';
case 'aboutAppText': return ({required Object appName, required Object packageName, required Object version, required Object buildNumber}) => '${appName} (${packageName}) Версия ${version} Сборка ${buildNumber}\n\nРазработал dan63047\nФормулы предоставил kerrmunism';
case 'aboutAppText': return ({required Object appName, required Object packageName, required Object version, required Object buildNumber}) => '${appName} (${packageName}) Версия ${version} Сборка ${buildNumber}\n\nРазработал dan63047\nФормулы предоставил kerrmunism\nИсторию предоставляет p1nkl0bst3r';
case 'stateViewTitle': return ({required Object nickname, required Object date}) => 'Аккаунт ${nickname} ${date}';
case 'statesViewTitle': return ({required Object number, required Object nickname}) => '${number} состояний аккаунта ${nickname}';
case 'statesViewEntry': return ({required Object level, required Object gameTime, required Object friends, required Object rd}) => '${level} уровень, ${gameTime} сыграно, ${friends} друзей, ${rd} RD';
@ -1658,6 +1671,7 @@ extension on _StringsRu {
case 'lbViewOneEntry': return 'В рейтинговой таблице всего один игрок... Чего?';
case 'lbViewManyEntrys': return ({required Object numberOfPlayers}) => 'В рейтинговой таблице находится ${numberOfPlayers} игроков.';
case 'p1nkl0bst3rAlert': return 'Эти данные были получены из стороннего API, который поддерживается p1nkl0bst3r';
case 'notForWeb': return 'Функция недоступна для веб версии';
case 'statCellNum.xpLevel': return 'Уровень\nопыта';
case 'statCellNum.xpProgress': return 'Прогресс до следующего уровня';
case 'statCellNum.xpFrom0To5000': return 'Прогресс от 0 XP до 5000 уровня';
@ -1667,6 +1681,7 @@ extension on _StringsRu {
case 'statCellNum.friends': return 'Друзей';
case 'statCellNum.apm': return 'Атака в\nМинуту';
case 'statCellNum.vs': return 'Показатель\nVersus';
case 'statCellNum.recordLB': return 'Место в таблице';
case 'statCellNum.lbp': return 'Положение\nв рейтинге';
case 'statCellNum.lbpShort': return '№ в рейтинге';
case 'statCellNum.lbpc': return 'Положение\nв рейтинге страны';

View File

@ -1,7 +1,10 @@
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'package:sqflite_common_ffi_web/sqflite_ffi_web.dart';
import 'package:tetra_stats/gen/strings.g.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:tetra_stats/views/main_view.dart';
@ -10,7 +13,10 @@ import 'package:tetra_stats/views/tracked_players_view.dart';
import 'package:tetra_stats/views/calc_view.dart';
void main() async {
if (Platform.isWindows || Platform.isLinux || Platform.isMacOS) {
if (kIsWeb) {
sqfliteFfiInit();
databaseFactory = databaseFactoryFfiWeb;
} else if (Platform.isWindows || Platform.isLinux || Platform.isMacOS) {
sqfliteFfiInit();
databaseFactory = databaseFactoryFfi;
}
@ -33,7 +39,11 @@ class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "Tetra Stats",
home: const MainView(),
scrollBehavior: MaterialScrollBehavior().copyWith(
dragDevices: {PointerDeviceKind.mouse, PointerDeviceKind.touch, PointerDeviceKind.stylus, PointerDeviceKind.unknown},
),
locale: TranslationProvider.of(context).flutterLocale,
supportedLocales: AppLocaleUtils.supportedLocales,
localizationsDelegates: GlobalMaterialLocalizations.delegates,

View File

@ -1,4 +1,5 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart' show MissingPlatformDirectoryException, getApplicationDocumentsDirectory;
import 'package:tetra_stats/services/crud_exceptions.dart';
@ -14,8 +15,13 @@ class DB {
throw DatabaseAlreadyOpen();
}
try {
final docsPath = await getApplicationDocumentsDirectory();
final dbPath = join(docsPath.path, dbName);
String dbPath;
if (kIsWeb) {
dbPath = dbName;
} else {
final docsPath = await getApplicationDocumentsDirectory();
dbPath = join(docsPath.path, dbName);
}
final db = await openDatabase(dbPath);
_db = db;
await db.execute(createTetrioUsersTable);

View File

@ -1,6 +1,7 @@
import 'dart:async';
import 'dart:convert';
import 'dart:developer' as developer;
import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;
import 'package:tetra_stats/services/crud_exceptions.dart';
import 'package:tetra_stats/services/sqlite_db_controller.dart';
@ -97,7 +98,12 @@ class TetrioService extends DB {
}
Future<List<TetrioPlayer>> fetchAndsaveTLHistory(String id) async {
var url = Uri.https('api.p1nkl0bst3r.xyz', 'tlhist/$id');
Uri url;
if (kIsWeb) {
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "TLHistory", "user": id});
} else {
url = Uri.https('api.p1nkl0bst3r.xyz', 'tlhist/$id');
}
final response = await http.get(url);
if (response.statusCode == 200) {
List<List<dynamic>> csv = const CsvToListConverter().convert(response.body)..removeAt(0);
@ -162,8 +168,12 @@ class TetrioService extends DB {
}catch(e){
developer.log("fetchTLLeaderboard: Trying to retrieve leaderboard", name: "services/tetrio_crud");
}
var url = Uri.https('ch.tetr.io', 'api/users/lists/league/all');
Uri url;
if (kIsWeb) {
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "TLLeaderboard"});
} else {
url = Uri.https('ch.tetr.io', 'api/users/lists/league/all');
}
final response = await http.get(url);
if (response.statusCode == 200) {
var rawJson = jsonDecode(response.body);
@ -196,7 +206,12 @@ class TetrioService extends DB {
developer.log("getTLStream: Trying to retrieve stream $userID", name: "services/tetrio_crud");
}
var url = Uri.https('ch.tetr.io', 'api/streams/league_userrecent_${userID.toLowerCase().trim()}');
Uri url;
if (kIsWeb) {
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "tetrioUserTL", "user": userID.toLowerCase().trim()});
} else {
url = Uri.https('ch.tetr.io', 'api/streams/league_userrecent_${userID.toLowerCase().trim()}');
}
final response = await http.get(url);
if (response.statusCode == 200) {
@ -251,7 +266,12 @@ class TetrioService extends DB {
developer.log("fetchRecords: Trying to retrieve $userID records", name: "services/tetrio_crud");
}
var url = Uri.https('ch.tetr.io', 'api/users/${userID.toLowerCase().trim()}/records');
Uri url;
if (kIsWeb) {
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "tetrioUserRecords", "user": userID.toLowerCase().trim()});
} else {
url = Uri.https('ch.tetr.io', 'api/users/${userID.toLowerCase().trim()}/records');
}
final response = await http.get(url);
if (response.statusCode == 200) {
@ -406,7 +426,12 @@ class TetrioService extends DB {
developer.log("fetchPlayer: Trying to retrieve $user", name: "services/tetrio_crud");
}
var url = Uri.https('ch.tetr.io', 'api/users/${user.toLowerCase().trim()}');
Uri url;
if (kIsWeb) {
url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "tetrioUser", "user": user.toLowerCase().trim()});
} else {
url = Uri.https('ch.tetr.io', 'api/users/${user.toLowerCase().trim()}');
}
final response = await http.get(url);
if (response.statusCode == 200) {

View File

@ -1,4 +1,5 @@
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'dart:math';
@ -15,7 +16,7 @@ import 'package:tetra_stats/widgets/stat_sell_num.dart';
import 'package:tetra_stats/widgets/tl_thingy.dart';
import 'package:tetra_stats/widgets/user_thingy.dart';
late Future<List> me;
Future<List> me = Future.delayed(const Duration(seconds: 60), () => [null, null, null, null, null, null]);
String _searchFor = "6098518e3d5155e6ec429cdc";
String _titleNickname = "dan63047";
final TetrioService teto = TetrioService();
@ -120,8 +121,8 @@ class _MainState extends State<MainView> with SingleTickerProviderStateMixin {
List<TetrioPlayer> states = [];
TetraLeagueAlpha? compareWith;
var uniqueTL = <dynamic>{};
states.addAll(await teto.getPlayer(me.userId));
if(fetchHistory) await teto.fetchAndsaveTLHistory(_searchFor);
states.addAll(await teto.getPlayer(me.userId));
for (var element in states) {
if (uniqueTL.isNotEmpty && uniqueTL.last != element.tlSeason1) uniqueTL.add(element.tlSeason1);
if (uniqueTL.isEmpty) uniqueTL.add(element.tlSeason1);
@ -222,14 +223,14 @@ class _MainState extends State<MainView> with SingleTickerProviderStateMixin {
),
PopupMenuButton(
itemBuilder: (BuildContext context) => <PopupMenuEntry>[
PopupMenuItem(
value: "test",
child: Text("fetchAndsaveTLHistory"),
),
PopupMenuItem(
value: "refresh",
child: Text(t.refresh),
),
PopupMenuItem(
value: "test",
child: Text(t.fetchAndsaveTLHistory),
),
PopupMenuItem(
value: "/states",
child: Text(t.showStoredData),
@ -271,7 +272,7 @@ class _MainState extends State<MainView> with SingleTickerProviderStateMixin {
},
notificationPredicate: (notification) {
// with NestedScrollView local(depth == 2) OverscrollNotification are not sent
if (notification is OverscrollNotification || Platform.isIOS) {
if (!kIsWeb && (notification is OverscrollNotification || Platform.isIOS)) {
return notification.depth == 2;
}
return notification.depth == 0;

View File

@ -1,6 +1,7 @@
import 'dart:io';
import 'package:file_selector/file_selector.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:path_provider/path_provider.dart';
@ -8,6 +9,7 @@ import 'package:shared_preferences/shared_preferences.dart';
import 'package:tetra_stats/gen/strings.g.dart';
import 'package:tetra_stats/services/crud_exceptions.dart';
import 'package:tetra_stats/services/tetrio_crud.dart';
import 'package:url_launcher/url_launcher.dart';
class SettingsView extends StatefulWidget {
const SettingsView({Key? key}) : super(key: key);
@ -41,6 +43,15 @@ class SettingsState extends State<SettingsView> {
});
}
Future<void> _launchInBrowser(Uri url) async {
if (!await launchUrl(
url,
mode: LaunchMode.externalApplication,
)) {
throw Exception('Could not launch $url');
}
}
Future<void> _getPreferences() async {
prefs = await SharedPreferences.getInstance();
_setDefaultNickname(prefs.getString("player"));
@ -84,29 +95,9 @@ class SettingsState extends State<SettingsView> {
title: Text(t.exportDB),
subtitle: Text(t.exportDBDescription),
onTap: () {
if (Platform.isLinux || Platform.isWindows) {
showDialog(
context: context,
builder: (BuildContext context) => AlertDialog(
title: Text(t.desktopExportAlertTitle,
style: const TextStyle(
fontFamily: "Eurostile Round Extended")),
content: SingleChildScrollView(
child: ListBody(children: [
Text(t.desktopExportText)
]),
),
actions: <Widget>[
TextButton(
child: Text(t.popupActions.ok),
onPressed: () {
Navigator.of(context).pop();
},
),
],
));
}
if (Platform.isAndroid){
if (kIsWeb){
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(t.notForWeb)));
} else if (Platform.isAndroid){
var downloadFolder = Directory("/storage/emulated/0/Download");
File exportedDB = File("${downloadFolder.path}/TetraStats.db");
getApplicationDocumentsDirectory().then((value) {
@ -130,6 +121,27 @@ class SettingsState extends State<SettingsView> {
],
));
});
} else if (Platform.isLinux || Platform.isWindows) {
showDialog(
context: context,
builder: (BuildContext context) => AlertDialog(
title: Text(t.desktopExportAlertTitle,
style: const TextStyle(
fontFamily: "Eurostile Round Extended")),
content: SingleChildScrollView(
child: ListBody(children: [
Text(t.desktopExportText)
]),
),
actions: <Widget>[
TextButton(
child: Text(t.popupActions.ok),
onPressed: () {
Navigator.of(context).pop();
},
),
],
));
}
},
),
@ -137,7 +149,9 @@ class SettingsState extends State<SettingsView> {
title: Text(t.importDB),
subtitle: Text(t.importDBDescription),
onTap: () {
if(Platform.isAndroid){
if (kIsWeb){
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(t.notForWeb)));
}else if(Platform.isAndroid){
FilePicker.platform.pickFiles(
type: FileType.any,
).then((value){
@ -233,6 +247,9 @@ class SettingsState extends State<SettingsView> {
),
const Divider(),
ListTile(
onTap: (){
_launchInBrowser(Uri.https("github.com", "dan63047/TetraStats"));
},
title: Text(t.aboutApp),
subtitle: Text(t.aboutAppText(appName: _packageInfo.appName, packageName: _packageInfo.packageName, version: _packageInfo.version, buildNumber: _packageInfo.buildNumber)),
),

View File

@ -8,6 +8,7 @@
#include <file_selector_linux/file_selector_plugin.h>
#include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h>
#include <url_launcher_linux/url_launcher_plugin.h>
void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) file_selector_linux_registrar =
@ -16,4 +17,7 @@ void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) sqlite3_flutter_libs_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "Sqlite3FlutterLibsPlugin");
sqlite3_flutter_libs_plugin_register_with_registrar(sqlite3_flutter_libs_registrar);
g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);
}

View File

@ -5,6 +5,7 @@
list(APPEND FLUTTER_PLUGIN_LIST
file_selector_linux
sqlite3_flutter_libs
url_launcher_linux
)
list(APPEND FLUTTER_FFI_PLUGIN_LIST

View File

@ -11,6 +11,7 @@ import path_provider_foundation
import shared_preferences_foundation
import sqflite
import sqlite3_flutter_libs
import url_launcher_macos
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
@ -19,4 +20,5 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
Sqlite3FlutterLibsPlugin.register(with: registry.registrar(forPlugin: "Sqlite3FlutterLibsPlugin"))
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
}

View File

@ -1,6 +1,22 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
_fe_analyzer_shared:
dependency: transitive
description:
name: _fe_analyzer_shared
sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a
url: "https://pub.dev"
source: hosted
version: "61.0.0"
analyzer:
dependency: transitive
description:
name: analyzer
sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562
url: "https://pub.dev"
source: hosted
version: "5.13.0"
archive:
dependency: transitive
description:
@ -41,6 +57,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.0"
charcode:
dependency: transitive
description:
name: charcode
sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306
url: "https://pub.dev"
source: hosted
version: "1.3.1"
checked_yaml:
dependency: transitive
description:
@ -81,6 +105,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.1.1"
coverage:
dependency: transitive
description:
name: coverage
sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097"
url: "https://pub.dev"
source: hosted
version: "1.6.3"
cross_file:
dependency: transitive
description:
@ -113,6 +145,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.5"
dev_test:
dependency: transitive
description:
name: dev_test
sha256: "0d49b920844062a518edb79fc1dbf9ff6d9bf3c9ab600e3847b7502c27c0caab"
url: "https://pub.dev"
source: hosted
version: "0.16.1+4"
equatable:
dependency: transitive
description:
@ -157,10 +197,18 @@ packages:
dependency: "direct main"
description:
name: file_selector
sha256: "2b9acc3587127132da2a8d88d069172c49e32f977211cdf8f61f4b8e68e2a165"
sha256: "1d2fde93dddf634a9c3c0faa748169d7ac0d83757135555707e52f02c017ad4f"
url: "https://pub.dev"
source: hosted
version: "0.9.4"
version: "0.9.5"
file_selector_android:
dependency: transitive
description:
name: file_selector_android
sha256: "43e5c719f671b9181bef1bf2851135c3ad993a9a6c804a4ccb07579cfee84e34"
url: "https://pub.dev"
source: hosted
version: "0.5.0+2"
file_selector_ios:
dependency: transitive
description:
@ -181,10 +229,10 @@ packages:
dependency: transitive
description:
name: file_selector_macos
sha256: "7a6f1ae6107265664f3f7f89a66074882c4d506aef1441c9af313c1f7e6f41ce"
sha256: "4ada532862917bf16e3adb3891fe3a5917a58bae03293e497082203a80909412"
url: "https://pub.dev"
source: hosted
version: "0.9.3"
version: "0.9.3+1"
file_selector_platform_interface:
dependency: transitive
description:
@ -197,10 +245,10 @@ packages:
dependency: transitive
description:
name: file_selector_web
sha256: a890ca514f053e976ad7632cd1e665e2c4543d5acd82ec352a8d5709c55d6363
sha256: e292740c469df0aeeaba0895bf622bea351a05e87d22864c826bf21c4780e1d7
url: "https://pub.dev"
source: hosted
version: "0.9.1"
version: "0.9.2"
file_selector_windows:
dependency: transitive
description:
@ -234,10 +282,10 @@ packages:
dependency: "direct dev"
description:
name: flutter_lints
sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c
sha256: "2118df84ef0c3ca93f96123a616ae8540879991b8b57af2f81b76a7ada49b2a4"
url: "https://pub.dev"
source: hosted
version: "2.0.1"
version: "2.0.2"
flutter_localizations:
dependency: "direct main"
description: flutter
@ -261,14 +309,38 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
frontend_server_client:
dependency: transitive
description:
name: frontend_server_client
sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612"
url: "https://pub.dev"
source: hosted
version: "3.2.0"
glob:
dependency: transitive
description:
name: glob
sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
http:
dependency: "direct main"
description:
name: http
sha256: "4c3f04bfb64d3efd508d06b41b825542f08122d30bda4933fb95c069d22a4fa3"
sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
version: "1.1.0"
http_multi_server:
dependency: transitive
description:
name: http_multi_server
sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b"
url: "https://pub.dev"
source: hosted
version: "3.2.1"
http_parser:
dependency: transitive
description:
@ -293,6 +365,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.18.0"
io:
dependency: transitive
description:
name: io
sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e"
url: "https://pub.dev"
source: hosted
version: "1.0.4"
js:
dependency: transitive
description:
@ -325,6 +405,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.1"
logging:
dependency: transitive
description:
name: logging
sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340"
url: "https://pub.dev"
source: hosted
version: "1.2.0"
matcher:
dependency: transitive
description:
@ -349,6 +437,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.9.1"
mime:
dependency: transitive
description:
name: mime
sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e
url: "https://pub.dev"
source: hosted
version: "1.0.4"
node_preamble:
dependency: transitive
description:
name: node_preamble
sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db"
url: "https://pub.dev"
source: hosted
version: "2.0.2"
package_config:
dependency: transitive
description:
name: package_config
sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
url: "https://pub.dev"
source: hosted
version: "2.1.0"
package_info_plus:
dependency: "direct main"
description:
@ -393,10 +505,10 @@ packages:
dependency: transitive
description:
name: path_provider_foundation
sha256: "1995d88ec2948dac43edf8fe58eb434d35d22a2940ecee1a9fefcd62beee6eb3"
sha256: "916731ccbdce44d545414dd9961f26ba5fbaa74bcbb55237d8e65a623a8c7297"
url: "https://pub.dev"
source: hosted
version: "2.2.3"
version: "2.2.4"
path_provider_linux:
dependency: transitive
description:
@ -453,70 +565,118 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.7.3"
process:
pool:
dependency: transitive
description:
name: process
sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09"
name: pool
sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
url: "https://pub.dev"
source: hosted
version: "4.2.4"
version: "1.5.1"
process_run:
dependency: transitive
description:
name: process_run
sha256: "0071cece7ca0fdf4aaf2cf84ee3082f3043f18afc7fcfd51f53f9424a8072c04"
url: "https://pub.dev"
source: hosted
version: "0.13.0"
pub_semver:
dependency: transitive
description:
name: pub_semver
sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
shared_preferences:
dependency: "direct main"
description:
name: shared_preferences
sha256: "396f85b8afc6865182610c0a2fc470853d56499f75f7499e2a73a9f0539d23d0"
sha256: "0344316c947ffeb3a529eac929e1978fcd37c26be4e8468628bac399365a3ca1"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
version: "2.2.0"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
sha256: "6478c6bbbecfe9aced34c483171e90d7c078f5883558b30ec3163cf18402c749"
sha256: fe8401ec5b6dcd739a0fe9588802069e608c3fdbfd3c3c93e546cf2f90438076
url: "https://pub.dev"
source: hosted
version: "2.1.4"
version: "2.2.0"
shared_preferences_foundation:
dependency: transitive
description:
name: shared_preferences_foundation
sha256: e014107bb79d6d3297196f4f2d0db54b5d1f85b8ea8ff63b8e8b391a02700feb
sha256: f39696b83e844923b642ce9dd4bd31736c17e697f6731a5adf445b1274cf3cd4
url: "https://pub.dev"
source: hosted
version: "2.2.2"
version: "2.3.2"
shared_preferences_linux:
dependency: transitive
description:
name: shared_preferences_linux
sha256: "9d387433ca65717bbf1be88f4d5bb18f10508917a8fa2fb02e0fd0d7479a9afa"
sha256: "71d6806d1449b0a9d4e85e0c7a917771e672a3d5dc61149cc9fac871115018e1"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
version: "2.3.0"
shared_preferences_platform_interface:
dependency: transitive
description:
name: shared_preferences_platform_interface
sha256: fb5cf25c0235df2d0640ac1b1174f6466bd311f621574997ac59018a6664548d
sha256: "23b052f17a25b90ff2b61aad4cc962154da76fb62848a9ce088efe30d7c50ab1"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
version: "2.3.0"
shared_preferences_web:
dependency: transitive
description:
name: shared_preferences_web
sha256: "74083203a8eae241e0de4a0d597dbedab3b8fef5563f33cf3c12d7e93c655ca5"
sha256: "7347b194fb0bbeb4058e6a4e87ee70350b6b2b90f8ac5f8bd5b3a01548f6d33a"
url: "https://pub.dev"
source: hosted
version: "2.1.0"
version: "2.2.0"
shared_preferences_windows:
dependency: transitive
description:
name: shared_preferences_windows
sha256: "5e588e2efef56916a3b229c3bfe81e6a525665a454519ca51dbcc4236a274173"
sha256: f95e6a43162bce43c9c3405f3eb6f39e5b5d11f65fab19196cf8225e2777624d
url: "https://pub.dev"
source: hosted
version: "2.2.0"
version: "2.3.0"
shelf:
dependency: transitive
description:
name: shelf
sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
url: "https://pub.dev"
source: hosted
version: "1.4.1"
shelf_packages_handler:
dependency: transitive
description:
name: shelf_packages_handler
sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e"
url: "https://pub.dev"
source: hosted
version: "3.0.2"
shelf_static:
dependency: transitive
description:
name: shelf_static
sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e
url: "https://pub.dev"
source: hosted
version: "1.1.2"
shelf_web_socket:
dependency: transitive
description:
name: shelf_web_socket
sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1"
url: "https://pub.dev"
source: hosted
version: "1.0.4"
sky_engine:
dependency: transitive
description: flutter
@ -526,18 +686,34 @@ packages:
dependency: "direct main"
description:
name: slang
sha256: a90af3c2a70ae7d302f47717c0578370e5b2e6040c84280c3e11c9221c2a34ae
sha256: "68162dc10567b44ef39e8c5ed5a066d7c9b078c8b1b10ee49f713faa43e89a07"
url: "https://pub.dev"
source: hosted
version: "3.20.0"
version: "3.21.0"
slang_flutter:
dependency: "direct main"
description:
name: slang_flutter
sha256: f3fb0ffabc5119dbe39fb8ef134d0415a27b1da816f32f1f55c8b67d4e2ac1af
sha256: b9c63bf4b0088edde5a09264ac86304f0acec9015aea743f9fa08946d08b832f
url: "https://pub.dev"
source: hosted
version: "3.20.0"
version: "3.21.0"
source_map_stack_trace:
dependency: transitive
description:
name: source_map_stack_trace
sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
source_maps:
dependency: transitive
description:
name: source_maps
sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703"
url: "https://pub.dev"
source: hosted
version: "0.10.12"
source_span:
dependency: transitive
description:
@ -570,14 +746,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.2.5"
sqflite_common_ffi_web:
dependency: "direct main"
description:
name: sqflite_common_ffi_web
sha256: eb8cd50fa1451e8fa5edf5860d68d504572afaf1e68079933f95e95bf273d445
url: "https://pub.dev"
source: hosted
version: "0.3.6"
sqlite3:
dependency: transitive
description:
name: sqlite3
sha256: "281b672749af2edf259fc801f0fcba092257425bcd32a0ce1c8237130bc934c7"
sha256: f7511ddd6a2dda8ded9d849f8a925bb6020e0faa59db2443debc18d484e59401
url: "https://pub.dev"
source: hosted
version: "1.11.2"
version: "2.0.0"
sqlite3_flutter_libs:
dependency: "direct main"
description:
@ -614,18 +798,18 @@ packages:
dependency: transitive
description:
name: syncfusion_flutter_core
sha256: "952f5ee970bc3fba2db95a8dac71a295d9a70ad2c0993c7279e3a883c3e1459f"
sha256: "83e0937c1d747003e7d2514d093a28101953737a155ad7a1465006a95aa78cd4"
url: "https://pub.dev"
source: hosted
version: "22.1.34"
version: "22.1.39"
syncfusion_flutter_gauges:
dependency: "direct main"
description:
name: syncfusion_flutter_gauges
sha256: "623c61387a425755819a659bb20b64845328bdbb60130c13c37896a7f61db8a7"
sha256: eb2b8dbe39b82224d8e6fcce359d5f463e49e74f00854bb0e0db43736b7e504e
url: "https://pub.dev"
source: hosted
version: "22.1.34"
version: "22.1.39"
synchronized:
dependency: transitive
description:
@ -642,6 +826,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.2.1"
test:
dependency: transitive
description:
name: test
sha256: "3dac9aecf2c3991d09b9cdde4f98ded7b30804a88a0d7e4e7e1678e78d6b97f4"
url: "https://pub.dev"
source: hosted
version: "1.24.1"
test_api:
dependency: transitive
description:
@ -650,6 +842,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.5.1"
test_core:
dependency: transitive
description:
name: test_core
sha256: "5138dbffb77b2289ecb12b81c11ba46036590b72a64a7a90d6ffb880f1a29e93"
url: "https://pub.dev"
source: hosted
version: "0.5.1"
typed_data:
dependency: transitive
description:
@ -658,6 +858,70 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.2"
url_launcher:
dependency: "direct main"
description:
name: url_launcher
sha256: "781bd58a1eb16069412365c98597726cd8810ae27435f04b3b4d3a470bacd61e"
url: "https://pub.dev"
source: hosted
version: "6.1.12"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
sha256: "15f5acbf0dce90146a0f5a2c4a002b1814a6303c4c5c075aa2623b2d16156f03"
url: "https://pub.dev"
source: hosted
version: "6.0.36"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2"
url: "https://pub.dev"
source: hosted
version: "6.1.4"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
sha256: "207f4ddda99b95b4d4868320a352d374b0b7e05eefad95a4a26f57da413443f5"
url: "https://pub.dev"
source: hosted
version: "3.0.5"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
sha256: "1c4fdc0bfea61a70792ce97157e5cc17260f61abbe4f39354513f39ec6fd73b1"
url: "https://pub.dev"
source: hosted
version: "3.0.6"
url_launcher_platform_interface:
dependency: transitive
description:
name: url_launcher_platform_interface
sha256: bfdfa402f1f3298637d71ca8ecfe840b4696698213d5346e9d12d4ab647ee2ea
url: "https://pub.dev"
source: hosted
version: "2.1.3"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
sha256: cc26720eefe98c1b71d85f9dc7ef0cada5132617046369d9dc296b3ecaa5cbb4
url: "https://pub.dev"
source: hosted
version: "2.0.18"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
sha256: "7967065dd2b5fccc18c653b97958fdf839c5478c28e767c61ee879f4e7882422"
url: "https://pub.dev"
source: hosted
version: "3.0.7"
vector_math:
dependency: "direct main"
description:
@ -666,6 +930,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.4"
vm_service:
dependency: transitive
description:
name: vm_service
sha256: ada49637c27973c183dad90beb6bd781eea4c9f5f955d35da172de0af7bd3440
url: "https://pub.dev"
source: hosted
version: "11.8.0"
watcher:
dependency: transitive
description:
@ -674,22 +946,38 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.1.0"
web_socket_channel:
dependency: transitive
description:
name: web_socket_channel
sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b
url: "https://pub.dev"
source: hosted
version: "2.4.0"
webkit_inspection_protocol:
dependency: transitive
description:
name: webkit_inspection_protocol
sha256: "67d3a8b6c79e1987d19d848b0892e582dbb0c66c57cc1fef58a177dd2aa2823d"
url: "https://pub.dev"
source: hosted
version: "1.2.0"
win32:
dependency: transitive
description:
name: win32
sha256: "7dacfda1edcca378031db9905ad7d7bd56b29fd1a90b0908b71a52a12c41e36b"
sha256: dfdf0136e0aa7a1b474ea133e67cb0154a0acd2599c4f3ada3b49d38d38793ee
url: "https://pub.dev"
source: hosted
version: "5.0.3"
version: "5.0.5"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1
sha256: e0b1147eec179d3911f1f19b59206448f78195ca1d20514134e10641b7d7fbff
url: "https://pub.dev"
source: hosted
version: "1.0.0"
version: "1.0.1"
xml:
dependency: transitive
description:
@ -708,4 +996,4 @@ packages:
version: "3.1.2"
sdks:
dart: ">=3.0.0 <4.0.0"
flutter: ">=3.3.0"
flutter: ">=3.10.0"

View File

@ -2,7 +2,7 @@ name: tetra_stats
description: Track your and other player stats in TETR.IO
publish_to: 'none'
version: 0.2.0+4
version: 1.0.0+5
environment:
sdk: '>=2.19.6 <3.0.0'
@ -24,6 +24,7 @@ dependencies:
sqflite: ^2.2.8+2
sqflite_common_ffi: any
sqlite3_flutter_libs: ^0.5.15
sqflite_common_ffi_web: '>=0.1.0-dev.1'
path_provider: ^2.0.15
path: ^1.8.2
fl_chart: ^0.62.0
@ -36,6 +37,7 @@ dependencies:
slang: ^3.20.0
slang_flutter: ^3.20.0
csv: ^5.0.2
url_launcher: ^6.1.12
dev_dependencies:
flutter_test:

View File

@ -14,6 +14,7 @@
"openSearch": "Search player",
"closeSearch": "Close search",
"refresh": "Refresh",
"fetchAndsaveTLHistory": "Get player history",
"showStoredData": "Show stored data",
"statsCalc": "Stats Calculator",
"settings": "Settings",
@ -67,7 +68,7 @@
"yourIDText": "Every time when app loads, stats of that player will be fetched. Please prefer ID over nickname because nickname can be changed.",
"language": "Language",
"aboutApp": "About app",
"aboutAppText": "${appName} (${packageName}) Version ${version} Build ${buildNumber}\n\nDeveloped by dan63047\nFormulas provided by kerrmunism",
"aboutAppText": "${appName} (${packageName}) Version ${version} Build ${buildNumber}\n\nDeveloped by dan63047\nFormulas provided by kerrmunism\nHistory provided by p1nkl0bst3r",
"stateViewTitle": "${nickname} account on ${date}",
"statesViewTitle": "${number} states of ${nickname} account",
"statesViewEntry": "Level ${level}, ${gameTime} of gametime, ${friends} friends, ${rd} RD",
@ -102,6 +103,7 @@
"lbViewOneEntry": "There is only one player... What?",
"lbViewManyEntrys": "There are ${numberOfPlayers} ranked players.",
"p1nkl0bst3rAlert": "That data was retrived from third party API maintained by p1nkl0bst3r",
"notForWeb": "Function is not available for web version",
"statCellNum":{
"xpLevel": "XP Level",
"xpProgress": "Progress to next level",
@ -112,6 +114,7 @@
"friends": "Friends",
"apm": "Attack\nPer Minute",
"vs": "Versus\nScore",
"recordLB": "Leaderboard placement",
"lbp": "Leaderboard\nplacement",
"lbpShort": "№ in LB",
"lbpc": "Country LB\nplacement",

View File

@ -14,6 +14,7 @@
"openSearch": "Искать игрока",
"closeSearch": "Закрыть поиск",
"refresh": "Обновить",
"fetchAndsaveTLHistory": "Получить историю игрока",
"showStoredData": "Показать сохранённые данные",
"statsCalc": "Калькулятор статистики",
"settings": "Настройки",
@ -67,7 +68,7 @@
"yourIDText": "Каждый раз, когда приложение запускается, приложение будет получать статистику этого игрока. Пожалуйста, отдайте предпочтение ID, так как никнейм можно изменить.",
"language": "Язык (Language)",
"aboutApp": "О приложении",
"aboutAppText": "${appName} (${packageName}) Версия ${version} Сборка ${buildNumber}\n\nРазработал dan63047\nФормулы предоставил kerrmunism",
"aboutAppText": "${appName} (${packageName}) Версия ${version} Сборка ${buildNumber}\n\nРазработал dan63047\nФормулы предоставил kerrmunism\nИсторию предоставляет p1nkl0bst3r",
"stateViewTitle": "Аккаунт ${nickname} ${date}",
"statesViewTitle": "${number} состояний аккаунта ${nickname}",
"statesViewEntry": "${level} уровень, ${gameTime} сыграно, ${friends} друзей, ${rd} RD",
@ -102,6 +103,7 @@
"lbViewOneEntry": "В рейтинговой таблице всего один игрок... Чего?",
"lbViewManyEntrys": "В рейтинговой таблице находится ${numberOfPlayers} игроков.",
"p1nkl0bst3rAlert": "Эти данные были получены из стороннего API, который поддерживается p1nkl0bst3r",
"notForWeb": "Функция недоступна для веб версии",
"statCellNum": {
"xpLevel": "Уровень\nопыта",
"xpProgress": "Прогресс до следующего уровня",
@ -112,6 +114,7 @@
"friends": "Друзей",
"apm": "Атака в\nМинуту",
"vs": "Показатель\nVersus",
"recordLB": "Место в таблице",
"lbp": "Положение\nв рейтинге",
"lbpShort": "№ в рейтинге",
"lbpc": "Положение\nв рейтинге страны",

11550
web/sqflite_sw.js Normal file

File diff suppressed because one or more lines are too long

BIN
web/sqlite3.wasm Normal file

Binary file not shown.

View File

@ -8,10 +8,13 @@
#include <file_selector_windows/file_selector_windows.h>
#include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h>
#include <url_launcher_windows/url_launcher_windows.h>
void RegisterPlugins(flutter::PluginRegistry* registry) {
FileSelectorWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FileSelectorWindows"));
Sqlite3FlutterLibsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin"));
UrlLauncherWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
}

View File

@ -5,6 +5,7 @@
list(APPEND FLUTTER_PLUGIN_LIST
file_selector_windows
sqlite3_flutter_libs
url_launcher_windows
)
list(APPEND FLUTTER_FFI_PLUGIN_LIST