import 'dart:convert'; import 'dart:typed_data'; import 'package:PiliPlus/models/model_owner.dart'; import 'package:PiliPlus/models/user/danmaku_rule_adapter.dart'; import 'package:PiliPlus/models/user/info.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/accounts/account_adapter.dart'; import 'package:PiliPlus/utils/accounts/account_type_adapter.dart'; import 'package:PiliPlus/utils/accounts/cookie_jar_adapter.dart'; import 'package:PiliPlus/utils/path_utils.dart'; import 'package:PiliPlus/utils/set_int_adapter.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:hive_ce/hive.dart'; import 'package:path/path.dart' as path; abstract final class GStorage { static late final Box userInfo; static late final Box historyWord; static late final Box localCache; static late final Box setting; static late final Box video; static late final Box watchProgress; static late final Box? reply; static Future init() async { Hive.init(path.join(appSupportDirPath, 'hive')); regAdapter(); await Future.wait([ // 登录用户信息 Hive.openBox( 'userInfo', compactionStrategy: (int entries, int deletedEntries) { return deletedEntries > 2; }, ).then((res) => userInfo = res), // 本地缓存 Hive.openBox( 'localCache', compactionStrategy: (int entries, int deletedEntries) { return deletedEntries > 4; }, ).then((res) => localCache = res), // 设置 Hive.openBox('setting').then((res) => setting = res), // 搜索历史 Hive.openBox( 'historyWord', compactionStrategy: (int entries, int deletedEntries) { return deletedEntries > 10; }, ).then((res) => historyWord = res), // 视频设置 Hive.openBox('video').then((res) => video = res), Accounts.init(), Hive.openBox( 'watchProgress', keyComparator: _intStrDescKeyComparator, compactionStrategy: (entries, deletedEntries) { return deletedEntries > 4; }, ).then((res) => watchProgress = res), ]); if (Pref.saveReply) { reply = await Hive.openBox( 'reply', keyComparator: _intStrDescKeyComparator, compactionStrategy: (entries, deletedEntries) { return deletedEntries > 10; }, ); } else { reply = null; } } static String exportAllSettings() { return Utils.jsonEncoder.convert({ setting.name: setting.toMap(), video.name: video.toMap(), }); } static Future importAllSettings(String data) => importAllJsonSettings(jsonDecode(data)); static Future> importAllJsonSettings( Map map, ) { return Future.wait([ setting.clear().then((_) => setting.putAll(map[setting.name])), video.clear().then((_) => video.putAll(map[video.name])), ]); } static void regAdapter() { Hive ..registerAdapter(OwnerAdapter()) ..registerAdapter(UserInfoDataAdapter()) ..registerAdapter(LevelInfoAdapter()) ..registerAdapter(BiliCookieJarAdapter()) ..registerAdapter(LoginAccountAdapter()) ..registerAdapter(AccountTypeAdapter()) ..registerAdapter(SetIntAdapter()) ..registerAdapter(RuleFilterAdapter()); } static Future> compact() { return Future.wait([ userInfo.compact(), historyWord.compact(), localCache.compact(), setting.compact(), video.compact(), Accounts.account.compact(), watchProgress.compact(), ?reply?.compact(), ]); } static Future> close() { return Future.wait([ userInfo.close(), historyWord.close(), localCache.close(), setting.close(), video.close(), Accounts.account.close(), watchProgress.close(), ?reply?.close(), ]); } static Future> clear() { return Future.wait([ userInfo.clear(), historyWord.clear(), localCache.clear(), setting.clear(), video.clear(), Accounts.clear(), watchProgress.clear(), ?reply?.clear(), ]); } static int _intStrDescKeyComparator(dynamic k1, dynamic k2) { if (k1 is int) { if (k2 is int) { return k2.compareTo(k1); } else { return -1; } } else if (k2 is String) { final lenCompare = k2.length.compareTo((k1 as String).length); if (lenCompare == 0) { return k2.compareTo(k1); } else { return lenCompare; } } else { return 1; } } }