Replay analyze error handling

This commit is contained in:
dan63047 2024-01-22 22:39:28 +03:00
parent e26ae3a6b8
commit 556667d811
6 changed files with 39 additions and 6 deletions

View File

@ -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<AppLocale, Translations> {
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 'Играл в Тетра Лигу';

View File

@ -30,6 +30,8 @@ class SzyForbidden implements Exception {}
class SzyNotFound implements Exception {}
class ReplayNotAvalable implements Exception {}
class TetrioReplayAlreadyExist implements Exception {}
class P1nkl0bst3rInternalProblem implements Exception {}

View File

@ -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<ReplayData> analyzeReplay(String replayID) async{
Future<ReplayData> 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<String, dynamic> toAnalyze = jsonDecode((await szyGetReplay(replayID))[0]);
ReplayData data = ReplayData.fromJson(toAnalyze);
saveReplayStats(data);

View File

@ -44,7 +44,7 @@ class TlMatchResultState extends State<TlMatchResultView> {
_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<TlMatchResultView> {
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);
}
}

View File

@ -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",

View File

@ -119,6 +119,8 @@
"statsFor": "Статистика за",
"matchLength": "Продолжительность матча",
"roundLength": "Продолжительность раунда",
"replayIssue": "Ошибка обработки повтора",
"matchIsTooOld": "Информация о повторе недоступна",
"winner": "Победитель",
"registred": "Зарегистрирован",
"playedTL": "Играл в Тетра Лигу",