From 556667d8119af9b520a791e7b2c30d71db2e07e4 Mon Sep 17 00:00:00 2001 From: dan63047 Date: Mon, 22 Jan 2024 22:39:28 +0300 Subject: [PATCH] Replay analyze error handling --- lib/gen/strings.g.dart | 12 ++++++++++-- lib/services/crud_exceptions.dart | 2 ++ lib/services/tetrio_crud.dart | 5 +++-- lib/views/tl_match_view.dart | 22 ++++++++++++++++++++-- res/i18n/strings.i18n.json | 2 ++ res/i18n/strings_ru.i18n.json | 2 ++ 6 files changed, 39 insertions(+), 6 deletions(-) diff --git a/lib/gen/strings.g.dart b/lib/gen/strings.g.dart index 67be3b4..7b9f9dc 100644 --- a/lib/gen/strings.g.dart +++ b/lib/gen/strings.g.dart @@ -4,9 +4,9 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 2 -/// Strings: 1004 (502 per locale) +/// Strings: 1008 (504 per locale) /// -/// Built on 2024-01-22 at 17:10 UTC +/// Built on 2024-01-22 at 19:27 UTC // coverage:ignore-file // ignore_for_file: type=lint @@ -254,6 +254,8 @@ class Translations implements BaseTranslations { String get statsFor => 'Stats for'; String get matchLength => 'Match Length'; String get roundLength => 'Round Length'; + String get replayIssue => 'Can\'t process replay'; + String get matchIsTooOld => 'Replay is not available'; String get winner => 'Winner'; String get registred => 'Registred'; String get playedTL => 'Played Tetra League'; @@ -840,6 +842,8 @@ class _StringsRu implements Translations { @override String get statsFor => 'Статистика за'; @override String get matchLength => 'Продолжительность матча'; @override String get roundLength => 'Продолжительность раунда'; + @override String get replayIssue => 'Ошибка обработки повтора'; + @override String get matchIsTooOld => 'Информация о повторе недоступна'; @override String get winner => 'Победитель'; @override String get registred => 'Зарегистрирован'; @override String get playedTL => 'Играл в Тетра Лигу'; @@ -1418,6 +1422,8 @@ extension on Translations { case 'statsFor': return 'Stats for'; case 'matchLength': return 'Match Length'; case 'roundLength': return 'Round Length'; + case 'replayIssue': return 'Can\'t process replay'; + case 'matchIsTooOld': return 'Replay is not available'; case 'winner': return 'Winner'; case 'registred': return 'Registred'; case 'playedTL': return 'Played Tetra League'; @@ -1930,6 +1936,8 @@ extension on _StringsRu { case 'statsFor': return 'Статистика за'; case 'matchLength': return 'Продолжительность матча'; case 'roundLength': return 'Продолжительность раунда'; + case 'replayIssue': return 'Ошибка обработки повтора'; + case 'matchIsTooOld': return 'Информация о повторе недоступна'; case 'winner': return 'Победитель'; case 'registred': return 'Зарегистрирован'; case 'playedTL': return 'Играл в Тетра Лигу'; diff --git a/lib/services/crud_exceptions.dart b/lib/services/crud_exceptions.dart index b019bd4..303eaa0 100644 --- a/lib/services/crud_exceptions.dart +++ b/lib/services/crud_exceptions.dart @@ -30,6 +30,8 @@ class SzyForbidden implements Exception {} class SzyNotFound implements Exception {} +class ReplayNotAvalable implements Exception {} + class TetrioReplayAlreadyExist implements Exception {} class P1nkl0bst3rInternalProblem implements Exception {} diff --git a/lib/services/tetrio_crud.dart b/lib/services/tetrio_crud.dart index 8a97d77..8ff51fd 100644 --- a/lib/services/tetrio_crud.dart +++ b/lib/services/tetrio_crud.dart @@ -57,7 +57,7 @@ const String createTetrioTLReplayStats = ''' CREATE TABLE IF NOT EXISTS "tetrioTLReplayStats" ( "id" TEXT NOT NULL, "data" TEXT NOT NULL, - "freyhoe" TEXT NOT NULL, + "freyhoe" TEXT, PRIMARY KEY("id") ) '''; @@ -193,11 +193,12 @@ class TetrioService extends DB { return replayFile.path; } - Future analyzeReplay(String replayID) async{ + Future analyzeReplay(String replayID, bool isAvailable) async{ await ensureDbIsOpen(); final db = getDatabaseOrThrow(); final results = await db.query(tetrioTLReplayStatsTable, where: '$idCol = ?', whereArgs: [replayID]); if (results.isNotEmpty) return ReplayData.fromJson(jsonDecode(results.first["data"].toString())); + if (!isAvailable) throw ReplayNotAvalable(); Map toAnalyze = jsonDecode((await szyGetReplay(replayID))[0]); ReplayData data = ReplayData.fromJson(toAnalyze); saveReplayStats(data); diff --git a/lib/views/tl_match_view.dart b/lib/views/tl_match_view.dart index 383f104..b353179 100644 --- a/lib/views/tl_match_view.dart +++ b/lib/views/tl_match_view.dart @@ -44,7 +44,7 @@ class TlMatchResultState extends State { _scrollController = ScrollController(); rounds = [DropdownMenuItem(value: -1, child: Text(t.match))]; rounds.addAll([for (int i = 0; i < widget.record.endContext.first.secondaryTracking.length; i++) DropdownMenuItem(value: i, child: Text(t.roundNumber(n: i+1)))]); - replayData = teto.analyzeReplay(widget.record.replayId); + replayData = teto.analyzeReplay(widget.record.replayId, widget.record.replayAvalable); if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS){ windowManager.getTitle().then((value) => oldWindowTitle = value); windowManager.setTitle("Tetra Stats: ${widget.record.endContext.firstWhere((element) => element.userId == widget.initPlayerId).username.toUpperCase()} ${t.vs} ${widget.record.endContext.firstWhere((element) => element.userId != widget.initPlayerId).username.toUpperCase()} ${t.inTLmatch} ${dateFormat.format(widget.record.timestamp)}"); @@ -211,7 +211,25 @@ class TlMatchResultState extends State { return Center(child: Text("${t.roundLength}: ${time.inMinutes}:${secs.format(time.inMicroseconds /1000000 % 60)}\n${t.winner}: ${snapshot.data!.roundWinners[roundSelector][1]}", textAlign: TextAlign.center,)); } }else{ - return Text("${snapshot.error.toString()}\n${snapshot.stackTrace}", textAlign: TextAlign.center); + String reason; + switch (snapshot.error.runtimeType){ + case ReplayNotAvalable: + reason = t.matchIsTooOld; + break; + case SzyNotFound: + reason = t.matchIsTooOld; + break; + case SzyForbidden: + reason = t.errors.replayRejected; + break; + case SzyTooManyRequests: + reason = t.errors.tooManyRequests; + break; + default: + reason = snapshot.error.toString(); + break; + } + return Text("${t.replayIssue}: $reason", textAlign: TextAlign.center); } } diff --git a/res/i18n/strings.i18n.json b/res/i18n/strings.i18n.json index 9ecf2f5..b186ea9 100644 --- a/res/i18n/strings.i18n.json +++ b/res/i18n/strings.i18n.json @@ -119,6 +119,8 @@ "statsFor": "Stats for", "matchLength": "Match Length", "roundLength": "Round Length", + "replayIssue": "Can't process replay", + "matchIsTooOld": "Replay is not available", "winner": "Winner", "registred": "Registred", "playedTL": "Played Tetra League", diff --git a/res/i18n/strings_ru.i18n.json b/res/i18n/strings_ru.i18n.json index 8b9772a..25f4ffd 100644 --- a/res/i18n/strings_ru.i18n.json +++ b/res/i18n/strings_ru.i18n.json @@ -119,6 +119,8 @@ "statsFor": "Статистика за", "matchLength": "Продолжительность матча", "roundLength": "Продолжительность раунда", + "replayIssue": "Ошибка обработки повтора", + "matchIsTooOld": "Информация о повторе недоступна", "winner": "Победитель", "registred": "Зарегистрирован", "playedTL": "Играл в Тетра Лигу",