diff --git a/lib/data_objects/tetrio.dart b/lib/data_objects/tetrio.dart index 98e8290..4379a4a 100644 --- a/lib/data_objects/tetrio.dart +++ b/lib/data_objects/tetrio.dart @@ -265,6 +265,7 @@ class TetrioPlayer { List blitz = []; TetrioZen? zen; Distinguishment? distinguishment; + DateTime? cachedUntil; TetrioPlayer({ required this.userId, @@ -292,11 +293,12 @@ class TetrioPlayer { required this.blitz, this.zen, this.distinguishment, + this.cachedUntil }); double get level => pow((xp / 500), 0.6) + (xp / (5000 + (max(0, xp - 4 * pow(10, 6)) / 5000))) + 1; - TetrioPlayer.fromJson(Map json, DateTime stateTime, String id, String nick) { + TetrioPlayer.fromJson(Map json, DateTime stateTime, String id, String nick, [DateTime? cUntil]) { //developer.log("TetrioPlayer.fromJson $stateTime: $json", name: "data_objects/tetrio"); userId = id; username = nick; @@ -324,6 +326,7 @@ class TetrioPlayer { friendCount = json['friend_count'] ?? 0; badstanding = json['badstanding']; botmaster = json['botmaster']; + cachedUntil = cUntil; } Map toJson() { diff --git a/lib/main.dart b/lib/main.dart index f1d26fb..61378ae 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,9 +1,12 @@ +import 'dart:async'; import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'dart:developer' as developer; import 'package:package_info_plus/package_info_plus.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:tetra_stats/services/tetrio_crud.dart'; import 'package:tetra_stats/views/customization_view.dart'; import 'package:window_manager/window_manager.dart'; import 'package:sqflite_common_ffi/sqflite_ffi.dart'; @@ -18,6 +21,7 @@ import 'package:go_router/go_router.dart'; late final PackageInfo packageInfo; late SharedPreferences prefs; +late TetrioService teto; ColorScheme sheme = const ColorScheme.dark(primary: Colors.cyanAccent, secondary: Colors.white); void setAccentColor(Color color){ // does this thing work??? yes??? no??? @@ -77,6 +81,7 @@ void main() async { packageInfo = await PackageInfo.fromPlatform(); prefs = await SharedPreferences.getInstance(); + teto = TetrioService(); // Choosing the locale String? locale = prefs.getString("locale"); @@ -85,6 +90,12 @@ void main() async { }else{ LocaleSettings.setLocaleRaw(locale); } + + // I dont want to store old cache + Timer.periodic(Duration(minutes: 5), (Timer timer) { + teto.cacheRoutine(); + developer.log("Cache routine complete", name: "main"); + }); runApp(TranslationProvider( child: const MyApp(), diff --git a/lib/services/tetrio_crud.dart b/lib/services/tetrio_crud.dart index 61bd772..9041167 100644 --- a/lib/services/tetrio_crud.dart +++ b/lib/services/tetrio_crud.dart @@ -125,7 +125,7 @@ class CacheController { } void removeOld() async { - _cache.removeWhere((key, value) => DateTime.fromMillisecondsSinceEpoch(int.parse(key.substring(_getObjectId(value).length)), isUtc: true).isAfter(DateTime.now())); + _cache.removeWhere((key, value) => int.parse(key.substring(_getObjectId(value).length)) <= DateTime.now().millisecondsSinceEpoch); } void reset(){ @@ -210,6 +210,10 @@ class TetrioService extends DB { return _lbPositions[userID]; } + void cacheRoutine(){ + _cache.removeOld(); + } + /// Downloads replay from inoue (szy API). Requiers [replayID]. If request have /// different from 200 statusCode, it will throw an excepction. Returns list, that contains same replay /// as string and as binary. @@ -1110,7 +1114,7 @@ class TetrioService extends DB { var json = jsonDecode(response.body); if (json['success']) { // parse and count stats - TetrioPlayer player = TetrioPlayer.fromJson(json['data']['user'], DateTime.fromMillisecondsSinceEpoch(json['cache']['cached_at'], isUtc: true), json['data']['user']['_id'], json['data']['user']['username']); + TetrioPlayer player = TetrioPlayer.fromJson(json['data']['user'], DateTime.fromMillisecondsSinceEpoch(json['cache']['cached_at'], isUtc: true), json['data']['user']['_id'], json['data']['user']['username'], DateTime.fromMillisecondsSinceEpoch(json['cache']['cached_until'], isUtc: true)); _cache.store(player, json['cache']['cached_until']); developer.log("fetchPlayer: $user retrieved and cached", name: "services/tetrio_crud"); return player; diff --git a/lib/views/compare_view.dart b/lib/views/compare_view.dart index 3129ea8..5eb3109 100644 --- a/lib/views/compare_view.dart +++ b/lib/views/compare_view.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; import 'package:tetra_stats/gen/strings.g.dart'; -import 'package:tetra_stats/services/tetrio_crud.dart'; +import 'package:tetra_stats/main.dart' show teto; import 'package:tetra_stats/widgets/vs_graphs.dart'; import 'package:window_manager/window_manager.dart'; @@ -18,7 +18,6 @@ Mode greenSideMode = Mode.player; List theGreenSide = [null, null, null]; // TetrioPlayer?, List>?, TetraLeagueAlpha? Mode redSideMode = Mode.player; List theRedSide = [null, null, null]; -final TetrioService teto = TetrioService(); final DateFormat dateFormat = DateFormat.yMd(LocaleSettings.currentLocale.languageCode).add_Hm(); var numbersReg = RegExp(r'\d+(\.\d*)*'); late String oldWindowTitle; diff --git a/lib/views/main_view.dart b/lib/views/main_view.dart index 2df9b71..092de49 100644 --- a/lib/views/main_view.dart +++ b/lib/views/main_view.dart @@ -1,5 +1,6 @@ // ignore_for_file: type_literal_in_constant_pattern +import 'dart:async'; import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; @@ -13,8 +14,7 @@ import 'package:syncfusion_flutter_charts/charts.dart'; import 'package:tetra_stats/data_objects/tetra_stats.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; import 'package:tetra_stats/gen/strings.g.dart'; -import 'package:tetra_stats/services/tetrio_crud.dart'; -import 'package:tetra_stats/main.dart' show prefs; +import 'package:tetra_stats/main.dart' show prefs, teto; import 'package:tetra_stats/services/crud_exceptions.dart'; import 'package:tetra_stats/utils/numers_formats.dart'; import 'package:tetra_stats/utils/text_shadow.dart'; @@ -33,7 +33,6 @@ import 'package:window_manager/window_manager.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:go_router/go_router.dart'; -final TetrioService teto = TetrioService(); // thing, that manadge our local DB int _chartsIndex = 0; bool _gamesPlayedInsteadOfDateAndTime = false; late ZoomPanBehavior _zoomPanBehavior; @@ -95,6 +94,7 @@ class _MainState extends State with TickerProviderStateMixin { //var tableData = []; final bodyGlobalKey = GlobalKey(); bool _showSearchBar = false; + Timer backgroundUpdate = Timer(Duration(days: 365), (){}); bool _TLHistoryWasFetched = false; late TabController _tabController; late TabController _wideScreenTabController; @@ -159,6 +159,7 @@ class _MainState extends State with TickerProviderStateMixin { Future fetch(String nickOrID, {bool fetchHistory = false, bool fetchTLmatches = false}) async { TetrioPlayer me; _TLHistoryWasFetched = false; + backgroundUpdate.cancel(); // If user trying to search with discord id if (nickOrID.startsWith("ds:")){ @@ -309,6 +310,11 @@ class _MainState extends State with TickerProviderStateMixin { compareWith = null; chartsData = []; } + + backgroundUpdate = Timer(me.cachedUntil!.difference(DateTime.now()), () { + changePlayer(me.userId); + }); + return [me, records, states, tlMatches, compareWith, isTracking, news, topTR]; } diff --git a/lib/views/mathes_view.dart b/lib/views/mathes_view.dart index 0a1c3f5..8f03a82 100644 --- a/lib/views/mathes_view.dart +++ b/lib/views/mathes_view.dart @@ -2,12 +2,11 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; -import 'package:tetra_stats/services/tetrio_crud.dart'; +import 'package:tetra_stats/main.dart' show teto; import 'package:tetra_stats/gen/strings.g.dart'; import 'package:tetra_stats/views/tl_match_view.dart'; import 'package:window_manager/window_manager.dart'; -final TetrioService teto = TetrioService(); late String oldWindowTitle; class MatchesView extends StatefulWidget { diff --git a/lib/views/ranks_averages_view.dart b/lib/views/ranks_averages_view.dart index e45e512..5b481b3 100644 --- a/lib/views/ranks_averages_view.dart +++ b/lib/views/ranks_averages_view.dart @@ -5,7 +5,7 @@ import 'package:tetra_stats/gen/strings.g.dart'; import 'package:tetra_stats/utils/numers_formats.dart'; import 'package:tetra_stats/views/rank_averages_view.dart'; import 'package:window_manager/window_manager.dart'; -import 'main_view.dart'; // lol +import 'package:tetra_stats/main.dart' show teto; class RankAveragesView extends StatefulWidget { const RankAveragesView({super.key}); diff --git a/lib/views/settings_view.dart b/lib/views/settings_view.dart index fae31a5..ecb8ef3 100644 --- a/lib/views/settings_view.dart +++ b/lib/views/settings_view.dart @@ -1,7 +1,7 @@ import 'dart:io'; import 'package:go_router/go_router.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; -import 'package:tetra_stats/main.dart' show packageInfo; +import 'package:tetra_stats/main.dart' show packageInfo, teto; import 'package:file_selector/file_selector.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/foundation.dart'; @@ -10,7 +10,6 @@ import 'package:path_provider/path_provider.dart'; 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:tetra_stats/utils/open_in_browser.dart'; import 'package:window_manager/window_manager.dart'; @@ -25,7 +24,6 @@ class SettingsView extends StatefulWidget { class SettingsState extends State { late SharedPreferences prefs; - final TetrioService teto = TetrioService(); String defaultNickname = "Checking..."; late bool showPositions; final TextEditingController _playertext = TextEditingController(); diff --git a/lib/views/states_view.dart b/lib/views/states_view.dart index 964cb6a..2ceaec9 100644 --- a/lib/views/states_view.dart +++ b/lib/views/states_view.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; import 'package:tetra_stats/gen/strings.g.dart'; +import 'package:tetra_stats/main.dart' show teto; import 'package:tetra_stats/views/mathes_view.dart'; import 'package:tetra_stats/views/state_view.dart'; import 'package:window_manager/window_manager.dart'; diff --git a/lib/views/tl_match_view.dart b/lib/views/tl_match_view.dart index 9dc15b9..ad54107 100644 --- a/lib/views/tl_match_view.dart +++ b/lib/views/tl_match_view.dart @@ -6,7 +6,8 @@ import 'package:tetra_stats/services/crud_exceptions.dart'; import 'package:tetra_stats/views/compare_view.dart' show CompareThingy, CompareBoolThingy; import 'package:tetra_stats/widgets/list_tile_trailing_stats.dart'; import 'package:tetra_stats/widgets/vs_graphs.dart'; -import 'main_view.dart' show teto, secs; +import 'main_view.dart' show secs; +import 'package:tetra_stats/main.dart' show teto; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; diff --git a/lib/views/tracked_players_view.dart b/lib/views/tracked_players_view.dart index 2b11976..8738be5 100644 --- a/lib/views/tracked_players_view.dart +++ b/lib/views/tracked_players_view.dart @@ -4,12 +4,11 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; import 'package:tetra_stats/gen/strings.g.dart'; -import 'package:tetra_stats/services/tetrio_crud.dart'; +import 'package:tetra_stats/main.dart' show teto; import 'package:tetra_stats/utils/filesizes_converter.dart'; import 'package:tetra_stats/views/states_view.dart'; import 'package:window_manager/window_manager.dart'; -final TetrioService teto = TetrioService(); late String oldWindowTitle; class TrackedPlayersView extends StatefulWidget { diff --git a/lib/widgets/user_thingy.dart b/lib/widgets/user_thingy.dart index c99a53e..2bb572e 100644 --- a/lib/widgets/user_thingy.dart +++ b/lib/widgets/user_thingy.dart @@ -4,6 +4,7 @@ import 'package:flutter/services.dart'; import 'package:syncfusion_flutter_gauges/gauges.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; import 'package:tetra_stats/gen/strings.g.dart'; +import 'package:tetra_stats/main.dart' show teto; import 'package:tetra_stats/views/compare_view.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/utils/text_shadow.dart';