Files
PiliPlus/lib/utils/storage.dart
My-Responsitories f825f87dc1 opt: save reply (#1860)
* opt: save reply

* opt: reply save switch

* remove unneeded sort

* clear sub replies [skip ci]

---------

Co-authored-by: dom <githubaccount56556@proton.me>
2026-03-08 20:37:59 +08:00

155 lines
4.5 KiB
Dart

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_flutter/hive_flutter.dart';
import 'package:path/path.dart' as path;
abstract final class GStorage {
static late final Box<UserInfoData> userInfo;
static late final Box<dynamic> historyWord;
static late final Box<dynamic> localCache;
static late final Box<dynamic> setting;
static late final Box<dynamic> video;
static late final Box<int> watchProgress;
static late final Box<Uint8List>? reply;
static Future<void> init() async {
await Hive.initFlutter(path.join(appSupportDirPath, 'hive'));
regAdapter();
await Future.wait([
// 登录用户信息
Hive.openBox<UserInfoData>(
'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<int>(
'watchProgress',
keyComparator: _intStrKeyComparator,
compactionStrategy: (entries, deletedEntries) {
return deletedEntries > 4;
},
).then((res) => watchProgress = res),
]);
if (Pref.saveReply) {
reply = await Hive.openBox<Uint8List>(
'reply',
keyComparator: _intStrKeyComparator,
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<void> importAllSettings(String data) =>
importAllJsonSettings(jsonDecode(data));
static Future<bool> importAllJsonSettings(Map<String, dynamic> map) async {
await Future.wait([
setting.clear().then((_) => setting.putAll(map[setting.name])),
video.clear().then((_) => video.putAll(map[video.name])),
]);
return true;
}
static void regAdapter() {
Hive
..registerAdapter(OwnerAdapter())
..registerAdapter(UserInfoDataAdapter())
..registerAdapter(LevelInfoAdapter())
..registerAdapter(BiliCookieJarAdapter())
..registerAdapter(LoginAccountAdapter())
..registerAdapter(AccountTypeAdapter())
..registerAdapter(SetIntAdapter())
..registerAdapter(RuleFilterAdapter());
}
static Future<void> compact() async {
await Future.wait([
userInfo.compact(),
historyWord.compact(),
localCache.compact(),
setting.compact(),
video.compact(),
Accounts.account.compact(),
watchProgress.compact(),
?reply?.compact(),
]);
}
static Future<void> close() async {
await Future.wait([
userInfo.close(),
historyWord.close(),
localCache.close(),
setting.close(),
video.close(),
Accounts.account.close(),
watchProgress.close(),
?reply?.close(),
]);
}
static int _intStrKeyComparator(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;
}
}
}