diff --git a/lib/grpc/bilibili/community/service/dm/v1.pb.dart b/lib/grpc/bilibili/community/service/dm/v1.pb.dart index 6551127c..116bb489 100644 --- a/lib/grpc/bilibili/community/service/dm/v1.pb.dart +++ b/lib/grpc/bilibili/community/service/dm/v1.pb.dart @@ -1243,6 +1243,8 @@ class DanmakuElem extends $pb.GeneratedMessage { $core.int? type, $fixnum.Int64? oid, DmFromType? dmFrom, + $core.int? count, + $core.bool? isSelf, }) { final $result = create(); if (id != null) { @@ -1302,6 +1304,12 @@ class DanmakuElem extends $pb.GeneratedMessage { if (dmFrom != null) { $result.dmFrom = dmFrom; } + if (count != null) { + $result.count = count; + } + if (isSelf != null) { + $result.isSelf = isSelf; + } return $result; } DanmakuElem._() : super(); @@ -1328,6 +1336,8 @@ class DanmakuElem extends $pb.GeneratedMessage { ..a<$core.int>(25, _omitFieldNames ? '' : 'type', $pb.PbFieldType.O3) ..aInt64(26, _omitFieldNames ? '' : 'oid') ..e(27, _omitFieldNames ? '' : 'dmFrom', $pb.PbFieldType.OE, defaultOrMaker: DmFromType.DmFromUnknown, valueOf: DmFromType.valueOf, enumValues: DmFromType.values) + ..a<$core.int>(28, _omitFieldNames ? '' : 'count', $pb.PbFieldType.O3) + ..aOB(29, _omitFieldNames ? '' : 'isSelf', protoName: 'isSelf') ..hasRequiredFields = false ; @@ -1522,6 +1532,24 @@ class DanmakuElem extends $pb.GeneratedMessage { $core.bool hasDmFrom() => $_has(18); @$pb.TagNumber(27) void clearDmFrom() => $_clearField(27); + + @$pb.TagNumber(28) + $core.int get count => $_getIZ(19); + @$pb.TagNumber(28) + set count($core.int v) { $_setSignedInt32(19, v); } + @$pb.TagNumber(28) + $core.bool hasCount() => $_has(19); + @$pb.TagNumber(28) + void clearCount() => $_clearField(28); + + @$pb.TagNumber(29) + $core.bool get isSelf => $_getBF(20); + @$pb.TagNumber(29) + set isSelf($core.bool v) { $_setBool(20, v); } + @$pb.TagNumber(29) + $core.bool hasIsSelf() => $_has(20); + @$pb.TagNumber(29) + void clearIsSelf() => $_clearField(29); } class DanmakuFlag extends $pb.GeneratedMessage { diff --git a/lib/grpc/bilibili/community/service/dm/v1.pbjson.dart b/lib/grpc/bilibili/community/service/dm/v1.pbjson.dart index d6b0a7f1..50845c0f 100644 --- a/lib/grpc/bilibili/community/service/dm/v1.pbjson.dart +++ b/lib/grpc/bilibili/community/service/dm/v1.pbjson.dart @@ -513,6 +513,12 @@ const DanmakuElem$json = { {'1': 'type', '3': 25, '4': 1, '5': 5, '10': 'type'}, {'1': 'oid', '3': 26, '4': 1, '5': 3, '10': 'oid'}, {'1': 'dm_from', '3': 27, '4': 1, '5': 14, '6': '.bilibili.community.service.dm.v1.DmFromType', '10': 'dmFrom'}, + {'1': 'count', '3': 28, '4': 1, '5': 5, '9': 0, '10': 'count', '17': true}, + {'1': 'isSelf', '3': 29, '4': 1, '5': 8, '9': 1, '10': 'isSelf', '17': true}, + ], + '8': [ + {'1': '_count'}, + {'1': '_isSelf'}, ], }; @@ -527,7 +533,9 @@ final $typed_data.Uint8List danmakuElemDescriptor = $convert.base64Decode( 'CWFuaW1hdGlvbhIUCgVleHRyYRgXIAEoCVIFZXh0cmESTAoIY29sb3JmdWwYGCABKA4yMC5iaW' 'xpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbUNvbG9yZnVsVHlwZVIIY29sb3JmdWwS' 'EgoEdHlwZRgZIAEoBVIEdHlwZRIQCgNvaWQYGiABKANSA29pZBJFCgdkbV9mcm9tGBsgASgOMi' - 'wuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1Gcm9tVHlwZVIGZG1Gcm9t'); + 'wuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1Gcm9tVHlwZVIGZG1Gcm9tEhkK' + 'BWNvdW50GBwgASgFSABSBWNvdW50iAEBEhsKBmlzU2VsZhgdIAEoCEgBUgZpc1NlbGaIAQFCCA' + 'oGX2NvdW50QgkKB19pc1NlbGY='); @$core.Deprecated('Use danmakuFlagDescriptor instead') const DanmakuFlag$json = { diff --git a/lib/pages/danmaku/controller.dart b/lib/pages/danmaku/controller.dart index a6d1e07c..2022a963 100644 --- a/lib/pages/danmaku/controller.dart +++ b/lib/pages/danmaku/controller.dart @@ -55,11 +55,12 @@ class PlDanmakuController { if (mergeDanmaku) { final count = counts[element.content]; if (count != 1) { - element.attr = count!; - } else { - element.clearAttr(); + element.count = count!; } } + if (plPlayerController.isLogin) { + element.isSelf = element.midHash == plPlayerController.midHash; + } int pos = element.progress ~/ 100; //每0.1秒存储一次 (dmSegMap[pos] ??= []).add(element); } diff --git a/lib/pages/danmaku/view.dart b/lib/pages/danmaku/view.dart index d8c6964a..3351e0dd 100644 --- a/lib/pages/danmaku/view.dart +++ b/lib/pages/danmaku/view.dart @@ -130,9 +130,8 @@ class _PlDanmakuState extends State { e.colorful == DmColorfulType.VipGradualColor ? true : null, - count: widget.playerController.mergeDanmaku && e.hasAttr() - ? e.attr - : null, + count: e.hasCount() ? e.count : null, + selfSend: e.isSelf, ), ); } diff --git a/lib/pages/live_room/controller.dart b/lib/pages/live_room/controller.dart index 559f5be6..1fedf033 100644 --- a/lib/pages/live_room/controller.dart +++ b/lib/pages/live_room/controller.dart @@ -49,13 +49,14 @@ class LiveRoomController extends GetxController { String? savedDanmaku; late final isLogin = Accounts.main.isLogin; + late final mid = Accounts.main.mid; @override void onInit() { super.onInit(); roomId = int.parse(Get.parameters['roomid']!); queryLiveInfoH5(); - if (Accounts.main.isLogin && !MineController.anonymity.value) { + if (isLogin && !MineController.anonymity.value) { VideoHttp.roomEntryAction(roomId: roomId); } } @@ -221,9 +222,10 @@ class LiveRoomController extends GetxController { final content = first[15]; final extra = jsonDecode(content['extra']); final user = content['user']; + final uid = user['uid']; messages.add({ 'name': user['base']['name'], - 'uid': user['uid'], + 'uid': uid, 'text': info[1], 'emots': extra['emots'], 'uemote': first[13], @@ -234,6 +236,7 @@ class LiveRoomController extends GetxController { extra['content'], color: DmUtils.decimalToColor(extra['color']), type: DmUtils.getPosition(extra['mode']), + selfSend: uid == mid, ), ); WidgetsBinding.instance diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index ab957165..2f67f75f 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -27,6 +27,7 @@ import 'package:PiliPlus/utils/page_utils.dart' show PageUtils; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:canvas_danmaku/canvas_danmaku.dart'; +import 'package:crclib/catalog.dart'; import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; @@ -256,6 +257,8 @@ class PlPlayerController { } } + late final isLogin = Accounts.main.isLogin; + /// 弹幕权重 int danmakuWeight = 0; late RuleFilter filters; @@ -264,6 +267,9 @@ class PlPlayerController { bool showDanmaku = true; Set dmState = {}; late final mergeDanmaku = GStorage.mergeDanmaku; + late final String midHash = Crc32Xz() + .convert(utf8.encode(Accounts.main.mid.toString())) + .toRadixString(16); // 弹幕相关配置 late Set blockTypes; late double showArea; diff --git a/pubspec.lock b/pubspec.lock index 51d5aa9d..379df3a5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -361,6 +361,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.8" + crclib: + dependency: "direct main" + description: + name: crclib + sha256: "800f2226cd90c900ddcaaccb79449eabe690627ee8c7046737458f1a2509043d" + url: "https://pub.dev" + source: hosted + version: "3.0.0" cross_file: dependency: transitive description: @@ -1832,6 +1840,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.2" + tuple: + dependency: transitive + description: + name: tuple + sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151 + url: "https://pub.dev" + source: hosted + version: "2.0.2" typed_data: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index f5487e6e..7365b545 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -200,6 +200,7 @@ dependencies: git: url: https://github.com/bggRGjQaUbCoE/flutter_sortable_wrap.git ref: master + crclib: ^3.0.0 vector_math: any fixnum: any