diff --git a/lib/http/dynamics.dart b/lib/http/dynamics.dart index ac008c28..9d1e026f 100644 --- a/lib/http/dynamics.dart +++ b/lib/http/dynamics.dart @@ -16,6 +16,9 @@ import 'package:PiliPlus/utils/wbi_sign.dart'; import 'package:dio/dio.dart'; class DynamicsHttp { + static RegExp banWordForDyn = + RegExp(GStorage.banWordForDyn, caseSensitive: false); + static Future> followDynamic({ DynamicsTabType type = DynamicsTabType.all, String? offset, @@ -35,15 +38,30 @@ class DynamicsHttp { if (res.data['code'] == 0) { try { DynamicsDataModel data = DynamicsDataModel.fromJson(res.data['data']); - if (GStorage.antiGoodsDyn) { - data.items?.removeWhere( - (item) => - item.orig?.modules.moduleDynamic?.additional?.type == - 'ADDITIONAL_TYPE_GOODS' || - item.modules.moduleDynamic?.additional?.type == - 'ADDITIONAL_TYPE_GOODS', - ); - } + final antiGoodsDyn = GStorage.antiGoodsDyn; + final filterWord = banWordForDyn.pattern.isNotEmpty; + + data.items?.removeWhere( + (item) => + (antiGoodsDyn && + (item.orig?.modules.moduleDynamic?.additional?.type == + 'ADDITIONAL_TYPE_GOODS' || + item.modules.moduleDynamic?.additional?.type == + 'ADDITIONAL_TYPE_GOODS')) || + (filterWord && + (item.orig?.modules.moduleDynamic?.major?.opus?.summary?.text + ?.contains(banWordForDyn) == + true || + item.modules.moduleDynamic?.major?.opus?.summary?.text + ?.contains(banWordForDyn) == + true || + item.orig?.modules.moduleDynamic?.desc?.text + ?.contains(banWordForDyn) == + true || + item.modules.moduleDynamic?.desc?.text + ?.contains(banWordForDyn) == + true)), + ); return Success(data); } catch (err) { return Error(err.toString()); diff --git a/lib/pages/dynamics/widgets/up_panel.dart b/lib/pages/dynamics/widgets/up_panel.dart index 3c845525..373a388a 100644 --- a/lib/pages/dynamics/widgets/up_panel.dart +++ b/lib/pages/dynamics/widgets/up_panel.dart @@ -59,7 +59,7 @@ class _UpPanelState extends State { children: [ TextSpan( text: - 'Live(${widget.dynamicsController.upData.value.liveUsers?.count})', + 'Live(${widget.dynamicsController.upData.value.liveUsers?.count ?? "0"})', ), if (!isTop) ...[ const TextSpan(text: '\n'), diff --git a/lib/pages/setting/widgets/model.dart b/lib/pages/setting/widgets/model.dart index ea646c1c..83f10af7 100644 --- a/lib/pages/setting/widgets/model.dart +++ b/lib/pages/setting/widgets/model.dart @@ -4,6 +4,7 @@ import 'dart:math'; import 'package:PiliPlus/common/widgets/pendant_avatar.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart' show kDragContainerExtentPercentage, displacement; +import 'package:PiliPlus/http/dynamics.dart'; import 'package:PiliPlus/http/reply.dart'; import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/main.dart'; @@ -1800,6 +1801,14 @@ List get extraSettings => [ ReplyHttp.replyRegExp = value; }, ), + _getBanwordModel( + context: Get.context!, + title: '动态关键词过滤', + key: SettingBoxKey.banWordForDyn, + callback: (value) { + DynamicsHttp.banWordForDyn = value; + }, + ), SettingsModel( settingsType: SettingsType.sw1tch, title: '使用外部浏览器打开链接', diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 5811ea08..421947a5 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -493,6 +493,9 @@ class GStorage { return isTablet; } + static String get banWordForDyn => + GStorage.setting.get(SettingBoxKey.banWordForDyn, defaultValue: ''); + static List get dynamicDetailRatio => List.from(setting .get(SettingBoxKey.dynamicDetailRatio, defaultValue: const [60.0, 40.0])); @@ -789,6 +792,7 @@ class SettingBoxKey { showPgcTimeline = 'showPgcTimeline', pageTransition = 'pageTransition', optTabletNav = 'optTabletNav', + banWordForDyn = 'banWordForDyn', // WebDAV webdavUri = 'webdavUri',