diff --git a/lib/http/reply.dart b/lib/http/reply.dart index 0e7a6945e..fba2bd71c 100644 --- a/lib/http/reply.dart +++ b/lib/http/reply.dart @@ -13,7 +13,7 @@ import 'package:dio/dio.dart'; class ReplyHttp { static final Options options = Options( headers: {...Constants.baseHeaders, 'cookie': ''}, - extra: {'account': NoAccount()}, + extra: {'account': const NoAccount()}, ); static Future replyList({ diff --git a/lib/utils/accounts/account.dart b/lib/utils/accounts/account.dart index 668066f61..bd952313e 100644 --- a/lib/utils/accounts/account.dart +++ b/lib/utils/accounts/account.dart @@ -5,41 +5,52 @@ import 'package:PiliPlus/utils/id_utils.dart'; import 'package:cookie_jar/cookie_jar.dart'; import 'package:hive/hive.dart'; -abstract class Account { - final bool isLogin = false; - late final DefaultCookieJar cookieJar; - String? accessKey; - String? refresh; - late final Set type; +sealed class Account { + Map? toJson() => null; - final int mid = 0; - late String csrf; - final Map headers = const {}; + Future onChange() => Future.value(); - bool activited = false; + Set get type => const {}; - Future delete(); - Future onChange(); + bool get activited => false; - Map? toJson(); + set activited(bool value) => throw UnimplementedError(); + + String? get accessKey => throw UnimplementedError(); + + DefaultCookieJar get cookieJar => throw UnimplementedError(); + + String get csrf => throw UnimplementedError(); + + Future delete() => throw UnimplementedError(); + + Map get headers => throw UnimplementedError(); + + bool get isLogin => throw UnimplementedError(); + + int get mid => throw UnimplementedError(); + + String? get refresh => throw UnimplementedError(); + + const Account(); } @HiveType(typeId: 9) -class LoginAccount implements Account { +class LoginAccount extends Account { @override final bool isLogin = true; @override @HiveField(0) - late final DefaultCookieJar cookieJar; + final DefaultCookieJar cookieJar; @override @HiveField(1) - String? accessKey; + final String? accessKey; @override @HiveField(2) - String? refresh; + final String? refresh; @override @HiveField(3) - late final Set type; + final Set type; @override bool activited = false; @@ -55,7 +66,7 @@ class LoginAccount implements Account { }; @override - late String csrf = + late final String csrf = cookieJar.domainCookies['bilibili.com']!['/']!['bili_jct']!.cookie.value; @override @@ -88,16 +99,12 @@ class LoginAccount implements Account { cookieJar.setBuvid3(); } - LoginAccount.fromJson(Map json) { - cookieJar = BiliCookieJar.fromJson(json['cookies'])..setBuvid3(); - accessKey = json['accessKey']; - refresh = json['refresh']; - type = - (json['type'] as Iterable?) - ?.map((i) => AccountType.values[i]) - .toSet() ?? - {}; - } + factory LoginAccount.fromJson(Map json) => LoginAccount( + BiliCookieJar.fromJson(json['cookies']), + json['accessKey'], + json['refresh'], + (json['type'] as Iterable?)?.map((i) => AccountType.values[i]).toSet(), + ); @override int get hashCode => mid.hashCode; @@ -107,21 +114,21 @@ class LoginAccount implements Account { identical(this, other) || (other is LoginAccount && mid == other.mid); } -class AnonymousAccount implements Account { +class AnonymousAccount extends Account { @override final bool isLogin = false; @override - late final DefaultCookieJar cookieJar; + final DefaultCookieJar cookieJar = DefaultCookieJar()..setBuvid3(); @override - String? accessKey; + final String? accessKey = null; @override - String? refresh; + final String? refresh = null; @override - Set type = {}; + final Set type = {}; @override final int mid = 0; @override - String csrf = ''; + final String csrf = ''; @override final Map headers = Constants.baseHeaders; @@ -134,17 +141,9 @@ class AnonymousAccount implements Account { cookieJar.setBuvid3(); } - @override - Future onChange() async {} - - @override - Map? toJson() => null; - static final _instance = AnonymousAccount._(); - AnonymousAccount._() { - cookieJar = DefaultCookieJar(ignoreExpires: true)..setBuvid3(); - } + AnonymousAccount._(); factory AnonymousAccount() => _instance; @@ -179,8 +178,9 @@ extension BiliCookieJar on DefaultCookieJar { []; void setBuvid3() { - domainCookies['bilibili.com'] ??= {'/': {}}; - domainCookies['bilibili.com']!['/']!['buvid3'] ??= SerializableCookie( + (domainCookies['bilibili.com'] ??= { + '/': {}, + })['/']!['buvid3'] ??= SerializableCookie( Cookie('buvid3', IdUtils.genBuvid3())..setBiliDomain(), ); } @@ -208,52 +208,6 @@ extension BiliCookieJar on DefaultCookieJar { }; } -class NoAccount implements Account { - @override - String? accessKey; - - @override - bool activited = false; - - @override - DefaultCookieJar cookieJar = DefaultCookieJar(); - - @override - String csrf = ''; - - @override - String? refresh; - - @override - Set type = const {}; - - @override - Future delete() { - return Future.value(); - } - - @override - final Map headers = const {}; - - @override - bool isLogin = false; - - @override - int mid = 0; - - @override - Future onChange() { - return Future.value(); - } - - @override - Map? toJson() { - return null; - } - - NoAccount._(); - - static final _instance = NoAccount._(); - - factory NoAccount() => _instance; +final class NoAccount extends Account { + const NoAccount(); } diff --git a/lib/utils/accounts/account_manager/account_mgr.dart b/lib/utils/accounts/account_manager/account_mgr.dart index 84d02cb6e..afe4b5ce9 100644 --- a/lib/utils/accounts/account_manager/account_mgr.dart +++ b/lib/utils/accounts/account_manager/account_mgr.dart @@ -118,7 +118,7 @@ class AccountManager extends Interceptor { late final Account account = options.extra['account'] ?? _findAccount(path); - if (_skipCookie(path) || account is NoAccount) return handler.next(options); + if (account is NoAccount || _skipCookie(path)) return handler.next(options); if (!account.isLogin && path == Api.heartBeat) { return handler.reject( diff --git a/lib/utils/update.dart b/lib/utils/update.dart index b77268f2d..86d330f71 100644 --- a/lib/utils/update.dart +++ b/lib/utils/update.dart @@ -25,7 +25,7 @@ abstract class Update { Api.latestApp, options: Options( headers: {'user-agent': UaType.mob.ua}, - extra: {'account': NoAccount()}, + extra: {'account': const NoAccount()}, ), ); if (res.data is Map || res.data.isEmpty) {