mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-04-20 11:08:03 +08:00
169 lines
4.7 KiB
Dart
169 lines
4.7 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_ce/hive.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 {
|
|
Hive.init(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: _intStrDescKeyComparator,
|
|
compactionStrategy: (entries, deletedEntries) {
|
|
return deletedEntries > 4;
|
|
},
|
|
).then((res) => watchProgress = res),
|
|
]);
|
|
|
|
if (Pref.saveReply) {
|
|
reply = await Hive.openBox<Uint8List>(
|
|
'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<void> importAllSettings(String data) =>
|
|
importAllJsonSettings(jsonDecode(data));
|
|
|
|
static Future<List<void>> importAllJsonSettings(
|
|
Map<String, dynamic> 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<List<void>> compact() {
|
|
return Future.wait([
|
|
userInfo.compact(),
|
|
historyWord.compact(),
|
|
localCache.compact(),
|
|
setting.compact(),
|
|
video.compact(),
|
|
Accounts.account.compact(),
|
|
watchProgress.compact(),
|
|
?reply?.compact(),
|
|
]);
|
|
}
|
|
|
|
static Future<List<void>> close() {
|
|
return Future.wait([
|
|
userInfo.close(),
|
|
historyWord.close(),
|
|
localCache.close(),
|
|
setting.close(),
|
|
video.close(),
|
|
Accounts.account.close(),
|
|
watchProgress.close(),
|
|
?reply?.close(),
|
|
]);
|
|
}
|
|
|
|
static Future<List<void>> 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;
|
|
}
|
|
}
|
|
}
|