feat: bili comm antifraud

Closes #275

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-02-17 18:45:08 +08:00
parent 957c326148
commit 7ddc3adfaa
15 changed files with 196 additions and 112 deletions

View File

@@ -4,25 +4,21 @@ import 'package:PiliPlus/models/common/reply_type.dart';
import 'package:PiliPlus/pages/common/reply_controller.dart';
import 'package:PiliPlus/http/reply.dart';
import 'package:PiliPlus/utils/global_data.dart';
import 'package:PiliPlus/utils/id_utils.dart';
import 'package:fixnum/fixnum.dart' as $fixnum;
class VideoReplyController extends ReplyController {
VideoReplyController(
this.aid,
this.rpid,
this.replyLevel,
);
VideoReplyController({required this.aid});
// 视频aid 请求时使用的oid
int? aid;
// 层级 2为楼中楼
String? replyLevel;
// rpid 请求楼中楼回复
String? rpid;
int aid;
@override
dynamic get sourceId => IdUtils.av2bv(aid);
@override
Future<LoadingState> customGetData() => GlobalData().grpcReply
? ReplyHttp.replyListGrpc(
oid: aid!,
oid: aid,
cursor: CursorReq(
next: cursor?.next ?? $fixnum.Int64(0),
mode: mode.value,
@@ -32,7 +28,7 @@ class VideoReplyController extends ReplyController {
)
: ReplyHttp.replyList(
isLogin: isLogin,
oid: aid!,
oid: aid,
nextOffset: nextOffset,
type: ReplyType.video.index,
sort: sortType.value.index,

View File

@@ -14,12 +14,11 @@ import 'package:get/get.dart';
import 'package:PiliPlus/common/skeleton/video_reply.dart';
import 'package:PiliPlus/models/common/reply_type.dart';
import 'package:PiliPlus/utils/feed_back.dart';
import 'package:PiliPlus/utils/id_utils.dart';
import 'controller.dart';
class VideoReplyPanel extends StatefulWidget {
final String? bvid;
final int? oid;
final int oid;
final int rpid;
final String? replyLevel;
final String heroTag;
@@ -31,7 +30,7 @@ class VideoReplyPanel extends StatefulWidget {
const VideoReplyPanel({
super.key,
this.bvid,
this.oid,
required this.oid,
this.rpid = 0,
this.replyLevel,
required this.heroTag,
@@ -65,13 +64,7 @@ class _VideoReplyPanelState extends State<VideoReplyPanel>
// heroTag = Get.arguments['heroTag'];
heroTag = widget.heroTag;
replyLevel = widget.replyLevel ?? '1';
if (replyLevel == '2') {
_videoReplyController = Get.put(
VideoReplyController(widget.oid, widget.rpid.toString(), replyLevel),
tag: widget.rpid.toString());
} else {
_videoReplyController = Get.find<VideoReplyController>(tag: heroTag);
}
_videoReplyController = Get.find<VideoReplyController>(tag: heroTag);
fabAnimationCtr = AnimationController(
vsync: this, duration: const Duration(milliseconds: 100));
@@ -196,11 +189,9 @@ class _VideoReplyPanelState extends State<VideoReplyPanel>
heroTag: null,
onPressed: () {
feedBack();
dynamic oid = _videoReplyController.aid ??
IdUtils.bv2av(Get.parameters['bvid']!);
_videoReplyController.onReply(
context,
oid: oid,
oid: _videoReplyController.aid,
replyType: ReplyType.video,
);
},

View File

@@ -3,6 +3,7 @@ import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/video/reply/item.dart';
import 'package:PiliPlus/pages/common/reply_controller.dart';
import 'package:PiliPlus/utils/global_data.dart';
import 'package:PiliPlus/utils/id_utils.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
@@ -27,9 +28,9 @@ class VideoReplyReplyController extends ReplyController
bool hasRoot = false;
int? id;
// 视频aid 请求时使用的oid
int? oid;
int oid;
// rpid 请求楼中楼回复
int? rpid;
int rpid;
ReplyType replyType; // = ReplyType.video;
int? upMid;
@@ -42,6 +43,10 @@ class VideoReplyReplyController extends ReplyController
late final horizontalPreview = GStorage.horizontalPreview;
@override
dynamic get sourceId =>
replyType == ReplyType.video ? IdUtils.av2bv(oid) : oid;
@override
void onInit() {
super.onInit();
@@ -49,26 +54,6 @@ class VideoReplyReplyController extends ReplyController
queryData();
}
@override
Future queryData([bool isRefresh = true]) async {
// if (GlobalData().grpcReply &&
// !isDialogue &&
// currentPage == 1 &&
// !hasRoot &&
// firstFloor == null &&
// rpid != null) {
// await GrpcRepo.replyInfo(
// rpid: rpid!,
// ).then((res) {
// if (res['status'] && (res['data']?.mid ?? -1) > 0) {
// firstFloor = res['data'];
// hasRoot = true;
// }
// });
// }
return super.queryData(isRefresh);
}
@override
Future onRefresh() {
cursor = null;
@@ -177,8 +162,8 @@ class VideoReplyReplyController extends ReplyController
Future<LoadingState> customGetData() => isDialogue
? ReplyHttp.dialogListGrpc(
type: replyType.index,
oid: oid!,
root: rpid!,
oid: oid,
root: rpid,
rpid: dialog!,
cursor: CursorReq(
next: cursor?.next,
@@ -190,8 +175,8 @@ class VideoReplyReplyController extends ReplyController
: GlobalData().grpcReply
? ReplyHttp.replyReplyListGrpc(
type: replyType.index,
oid: oid!,
root: rpid!,
oid: oid,
root: rpid,
rpid: id ?? 0,
cursor: CursorReq(
next: cursor?.next,
@@ -202,8 +187,8 @@ class VideoReplyReplyController extends ReplyController
)
: ReplyHttp.replyReplyList(
isLogin: isLogin,
oid: oid!,
root: rpid!,
oid: oid,
root: rpid,
pageNum: currentPage,
type: replyType.index,
banWordForReply: banWordForReply,

View File

@@ -22,8 +22,8 @@ class VideoReplyReplyPanel extends StatefulWidget {
const VideoReplyReplyPanel({
super.key,
this.id,
this.oid,
this.rpid,
required this.oid,
required this.rpid,
this.dialog,
this.firstFloor,
this.source,
@@ -34,8 +34,8 @@ class VideoReplyReplyPanel extends StatefulWidget {
this.onDismissed,
});
final int? id;
final int? oid;
final int? rpid;
final int oid;
final int rpid;
final int? dialog;
final dynamic firstFloor;
final String? source;
@@ -366,12 +366,20 @@ class _VideoReplyReplyPanelState extends State<VideoReplyReplyPanel>
LoadingState.success(list);
if (_videoReplyReplyController.enableCommAntifraud && mounted) {
_videoReplyReplyController.checkReply(
context,
oid,
root,
widget.replyType.index,
replyInfo.id.toInt(),
replyInfo.content.message,
context: context,
oid: oid,
rpid: root,
replyType: widget.replyType.index,
replyId: replyInfo.id.toInt(),
message: replyInfo.content.message,
//
root: replyInfo.root.toInt(),
parent: replyInfo.parent.toInt(),
ctime: replyInfo.ctime.toInt(),
pictures: replyInfo.content.pictures
.map((item) => item.toProto3Json())
.toList(),
mid: replyInfo.mid.toInt(),
);
}
} else {
@@ -386,12 +394,18 @@ class _VideoReplyReplyPanelState extends State<VideoReplyReplyPanel>
LoadingState.success(list);
if (_videoReplyReplyController.enableCommAntifraud && mounted) {
_videoReplyReplyController.checkReply(
context,
oid,
root,
widget.replyType.index,
replyInfo.rpid ?? 0,
replyInfo.content?.message ?? '',
context: context,
oid: oid,
rpid: root,
replyType: widget.replyType.index,
replyId: replyInfo.rpid ?? 0,
message: replyInfo.content?.message ?? '',
//
root: replyInfo.root,
parent: replyInfo.parent,
ctime: replyInfo.ctime,
pictures: replyInfo.content?.pictures,
mid: replyInfo.mid,
);
}
}

View File

@@ -121,8 +121,9 @@ class _VideoDetailPageState extends State<VideoDetailPage>
if (videoDetailController.showReply) {
_videoReplyController = Get.put(
VideoReplyController(videoDetailController.oid.value, '0', '1'),
tag: heroTag);
VideoReplyController(aid: videoDetailController.oid.value),
tag: heroTag,
);
}
videoIntroController = Get.put(VideoIntroController(), tag: heroTag);
_listenerDetail = videoIntroController.videoDetail.listen((value) {