diff --git a/lib/models/user/danmaku_rule.dart b/lib/models/user/danmaku_rule.dart index fb26d6e6..53ed84b6 100644 --- a/lib/models/user/danmaku_rule.dart +++ b/lib/models/user/danmaku_rule.dart @@ -31,9 +31,9 @@ class RuleFilter { RuleFilter.empty(); - bool retain(DanmakuElem elem) { - return !(dmUid.contains(elem.midHash) || + bool remove(DanmakuElem elem) { + return dmUid.contains(elem.midHash) || dmFilterString.any((i) => elem.content.contains(i)) || - dmRegExp.any((i) => i.hasMatch(elem.content))); + dmRegExp.any((i) => i.hasMatch(elem.content)); } } diff --git a/lib/pages/danmaku/controller.dart b/lib/pages/danmaku/controller.dart index f105d28a..1fe4f8db 100644 --- a/lib/pages/danmaku/controller.dart +++ b/lib/pages/danmaku/controller.dart @@ -55,16 +55,23 @@ class PlDanmakuController { }); } + final shouldFilter = plPlayerController.filters.count != 0; for (final element in data.elems) { + if (accountService.isLogin.value) { + element.isSelf = element.midHash == plPlayerController.midHash; + } + if (!element.isSelf) { + if (element.weight < plPlayerController.danmakuWeight || + (shouldFilter && plPlayerController.filters.remove(element))) { + continue; + } + } if (mergeDanmaku) { final count = counts[element.content]; if (count != 1) { element.count = count!; } } - if (accountService.isLogin.value) { - element.isSelf = element.midHash == plPlayerController.midHash; - } int pos = element.progress ~/ 100; //每0.1秒存储一次 (dmSegMap[pos] ??= []).add(element); } @@ -80,14 +87,6 @@ class PlDanmakuController { queryDanmaku(segmentIndex); return null; } - if (plPlayerController.danmakuWeight == 0 && - plPlayerController.filters.count == 0) { - return dmSegMap[progress ~/ 100]; - } else { - return dmSegMap[progress ~/ 100] - ?..retainWhere((element) => - element.weight >= plPlayerController.danmakuWeight && - plPlayerController.filters.retain(element)); - } + return dmSegMap[progress ~/ 100]; } }