mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-05-16 22:24:04 +08:00
* mod: pgc episode title * opt: ColorScheme.of * mod: mpv api version * opt: log handler * opt: ext
95 lines
2.9 KiB
Dart
95 lines
2.9 KiB
Dart
import 'package:PiliPlus/http/init.dart';
|
|
import 'package:PiliPlus/models/common/account_type.dart';
|
|
import 'package:PiliPlus/pages/mine/controller.dart';
|
|
import 'package:PiliPlus/utils/accounts/account.dart';
|
|
import 'package:PiliPlus/utils/login_utils.dart';
|
|
import 'package:hive_ce/hive.dart';
|
|
|
|
abstract final class Accounts {
|
|
static late final Box<LoginAccount> account;
|
|
static final List<Account> accountMode = List.filled(
|
|
AccountType.values.length,
|
|
AnonymousAccount(),
|
|
);
|
|
static bool get mainEqVideo => main == video;
|
|
static Account get main => accountMode[AccountType.main.index];
|
|
static Account get video => accountMode[AccountType.video.index];
|
|
static Account get heartbeat => accountMode[AccountType.heartbeat.index];
|
|
static Account get history {
|
|
final heartbeat = Accounts.heartbeat;
|
|
if (heartbeat is AnonymousAccount) {
|
|
return Accounts.main;
|
|
}
|
|
return heartbeat;
|
|
}
|
|
// static set main(Account account) => set(AccountType.main, account);
|
|
|
|
static Future<void> init() async {
|
|
account = await Hive.openBox(
|
|
'account',
|
|
compactionStrategy: (int entries, int deletedEntries) {
|
|
return deletedEntries > 2;
|
|
},
|
|
);
|
|
}
|
|
|
|
static Future<void> refresh() {
|
|
for (final a in account.values) {
|
|
for (final t in a.type) {
|
|
accountMode[t.index] = a;
|
|
}
|
|
}
|
|
return Future.wait(
|
|
(accountMode.toSet()..removeWhere((i) => i.activated)).map(
|
|
Request.buvidActive,
|
|
),
|
|
);
|
|
}
|
|
|
|
static Future<void> clear() async {
|
|
await account.clear();
|
|
for (int i = 0; i < AccountType.values.length; i++) {
|
|
accountMode[i] = AnonymousAccount();
|
|
}
|
|
await AnonymousAccount().delete();
|
|
Request.buvidActive(AnonymousAccount());
|
|
}
|
|
|
|
static Future<void> deleteAll(Set<Account> accounts) async {
|
|
final isLoginMain = Accounts.main.isLogin;
|
|
for (int i = 0; i < AccountType.values.length; i++) {
|
|
if (accounts.contains(accountMode[i])) {
|
|
accountMode[i] = AnonymousAccount();
|
|
}
|
|
}
|
|
await Future.wait(accounts.map((i) => i.delete()));
|
|
if (isLoginMain && !Accounts.main.isLogin) {
|
|
await LoginUtils.onLogoutMain();
|
|
}
|
|
}
|
|
|
|
static Future<void> set(AccountType key, Account account) async {
|
|
final oldAccount = accountMode[key.index]..type.remove(key);
|
|
accountMode[key.index] = account..type.add(key);
|
|
await Future.wait([?account.onChange(), ?oldAccount.onChange()]);
|
|
if (!account.activated) await Request.buvidActive(account);
|
|
switch (key) {
|
|
case AccountType.main:
|
|
await (account.isLogin
|
|
? LoginUtils.onLoginMain()
|
|
: LoginUtils.onLogoutMain());
|
|
break;
|
|
case AccountType.heartbeat:
|
|
MineController.anonymity.value = !account.isLogin;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
@pragma("vm:prefer-inline")
|
|
static Account get(AccountType key) {
|
|
return accountMode[key.index];
|
|
}
|
|
}
|