opt msg unread

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-06-08 15:23:36 +08:00
parent a6ac2c4522
commit 82b4f76b95
6 changed files with 167 additions and 27 deletions

View File

@@ -475,11 +475,11 @@ class Api {
// 获取未读私信数
// https://api.vc.bilibili.com/session_svr/v1/session_svr/single_unread
// static const String msgUnread =
// '${HttpString.tUrl}/session_svr/v1/session_svr/single_unread';
static const String msgUnread =
'${HttpString.tUrl}/session_svr/v1/session_svr/single_unread';
// 获取消息中心未读信息
// static const String msgFeedUnread = '/x/msgfeed/unread';
static const String msgFeedUnread = '/x/msgfeed/unread';
//https://api.bilibili.com/x/msgfeed/reply?platform=web&build=0&mobi_app=web
static const String msgFeedReply = '/x/msgfeed/reply';
//https://api.bilibili.com/x/msgfeed/at?platform=web&build=0&mobi_app=web

View File

@@ -9,6 +9,8 @@ import 'package:PiliPlus/models_new/msg/msg_like/data.dart';
import 'package:PiliPlus/models_new/msg/msg_reply/data.dart';
import 'package:PiliPlus/models_new/msg/msg_sys/data.dart';
import 'package:PiliPlus/models_new/msg/session_ss/data.dart';
import 'package:PiliPlus/models_new/msgfeed_unread/data.dart';
import 'package:PiliPlus/models_new/single_unread/data.dart';
import 'package:PiliPlus/models_new/upload_bfs/data.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/wbi_sign.dart';
@@ -556,4 +558,43 @@ class MsgHttp {
return Error(res.data['message']);
}
}
static Future msgUnread() async {
var res = await Request().get(
Api.msgUnread,
queryParameters: {
'build': 0,
'mobi_app': 'web',
'unread_type': 0,
'web_location': 333.1365,
},
);
if (res.data['code'] == 0) {
return {
'status': true,
'data': SingleUnreadData.fromJson(res.data['data'])
};
} else {
return {'status': false, 'data': res.data['message']};
}
}
static Future msgFeedUnread() async {
var res = await Request().get(
Api.msgFeedUnread,
queryParameters: {
'build': 0,
'mobi_app': 'web',
'web_location': 333.1365,
},
);
if (res.data['code'] == 0) {
return {
'status': true,
'data': MsgFeedUnreadData.fromJson(res.data['data'])
};
} else {
return {'status': false, 'data': res.data['message']};
}
}
}

View File

@@ -0,0 +1,42 @@
class MsgFeedUnreadData {
int at;
int coin;
int danmu;
int favorite;
int like;
int recvLike;
int recvReply;
int reply;
int sysMsg;
int sysMsgStyle;
int up;
MsgFeedUnreadData({
required this.at,
required this.coin,
required this.danmu,
required this.favorite,
required this.like,
required this.recvLike,
required this.recvReply,
required this.reply,
required this.sysMsg,
required this.sysMsgStyle,
required this.up,
});
factory MsgFeedUnreadData.fromJson(Map<String, dynamic> json) =>
MsgFeedUnreadData(
at: json['at'] ?? 0,
coin: json['coin'] ?? 0,
danmu: json['danmu'] ?? 0,
favorite: json['favorite'] ?? 0,
like: json['like'] ?? 0,
recvLike: json['recv_like'] ?? 0,
recvReply: json['recv_reply'] ?? 0,
reply: json['reply'] ?? 0,
sysMsg: json['sys_msg'] ?? 0,
sysMsgStyle: json['sys_msg_style'] ?? 0,
up: json['up'] ?? 0,
);
}

View File

@@ -0,0 +1,33 @@
class SingleUnreadData {
int unfollowUnread;
int followUnread;
int unfollowPushMsg;
int dustbinPushMsg;
int dustbinUnread;
int bizMsgUnfollowUnread;
int bizMsgFollowUnread;
int customUnread;
SingleUnreadData({
required this.unfollowUnread,
required this.followUnread,
required this.unfollowPushMsg,
required this.dustbinPushMsg,
required this.dustbinUnread,
required this.bizMsgUnfollowUnread,
required this.bizMsgFollowUnread,
required this.customUnread,
});
factory SingleUnreadData.fromJson(Map<String, dynamic> json) =>
SingleUnreadData(
unfollowUnread: json['unfollow_unread'] ?? 0,
followUnread: json['follow_unread'] ?? 0,
unfollowPushMsg: json['unfollow_push_msg'] ?? 0,
dustbinPushMsg: json['dustbin_push_msg'] ?? 0,
dustbinUnread: json['dustbin_unread'] ?? 0,
bizMsgUnfollowUnread: json['biz_msg_unfollow_unread'] ?? 0,
bizMsgFollowUnread: json['biz_msg_follow_unread'] ?? 0,
customUnread: json['custom_unread'] ?? 0,
);
}

View File

@@ -2,10 +2,12 @@ import 'dart:async';
import 'dart:math' show max;
import 'package:PiliPlus/grpc/dyn.dart';
import 'package:PiliPlus/grpc/im.dart';
import 'package:PiliPlus/http/msg.dart';
import 'package:PiliPlus/models/common/dynamic/dynamic_badge_mode.dart';
import 'package:PiliPlus/models/common/msg/msg_unread_type.dart';
import 'package:PiliPlus/models/common/nav_bar_config.dart';
import 'package:PiliPlus/models_new/msgfeed_unread/data.dart';
import 'package:PiliPlus/models_new/single_unread/data.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:flutter/material.dart';
@@ -83,45 +85,65 @@ class MainController extends GetxController
}
}
Future<void> queryUnreadMsg() async {
if (!isLogin.value || homeIndex == -1 || msgUnReadTypes.isEmpty) {
msgUnReadCount.value = '';
return;
Future<int> _msgUnread() async {
if (msgUnReadTypes.contains(MsgUnReadType.pm)) {
var res = await MsgHttp.msgUnread();
if (res['status']) {
SingleUnreadData data = res['data'];
return data.followUnread +
data.unfollowUnread +
data.bizMsgFollowUnread +
data.bizMsgUnfollowUnread +
data.unfollowPushMsg +
data.customUnread;
}
}
return 0;
}
Future<int> _msgFeedUnread() async {
int count = 0;
final res = await ImGrpc.getTotalUnread();
if (res.isSuccess) {
final data = res.data;
if (msgUnReadTypes.length == MsgUnReadType.values.length) {
count = data.hasTotalUnread() ? data.totalUnread : 0;
} else {
final msgUnread = data.msgFeedUnread.unread;
for (final item in msgUnReadTypes) {
var remainTypes = Set<MsgUnReadType>.from(msgUnReadTypes)
..remove(MsgUnReadType.pm);
if (remainTypes.isNotEmpty) {
var res = await MsgHttp.msgFeedUnread();
if (res['status']) {
MsgFeedUnreadData data = res['data'];
for (var item in remainTypes) {
switch (item) {
case MsgUnReadType.pm:
final pmUnread = data.sessionSingleUnread;
count += (pmUnread.followUnread +
pmUnread.unfollowUnread +
pmUnread.dustbinUnread)
.toInt();
break;
case MsgUnReadType.reply:
count += msgUnread['reply']?.toInt() ?? 0;
count += data.reply;
break;
case MsgUnReadType.at:
count += msgUnread['at']?.toInt() ?? 0;
count += data.at;
break;
case MsgUnReadType.like:
count += msgUnread['like']?.toInt() ?? 0;
count += data.like;
break;
case MsgUnReadType.sysMsg:
count += msgUnread['sys_msg']?.toInt() ?? 0;
count += data.sysMsg;
break;
}
}
}
}
return count;
}
Future<void> queryUnreadMsg([bool isChangeType = false]) async {
if (!isLogin.value ||
homeIndex == -1 ||
msgUnReadTypes.isEmpty ||
msgBadgeMode == DynamicBadgeMode.hidden) {
msgUnReadCount.value = '';
return;
}
var res = await Future.wait([_msgUnread(), _msgFeedUnread()]);
int count = res.fold(0, (prev, e) => prev + e);
final countStr = count == 0
? ''
@@ -129,7 +151,9 @@ class MainController extends GetxController
? '99+'
: count.toString();
if (msgUnReadCount.value == countStr) {
msgUnReadCount.refresh();
if (isChangeType) {
msgUnReadCount.refresh();
}
} else {
msgUnReadCount.value = countStr;
}

View File

@@ -373,7 +373,7 @@ List<SettingsModel> get styleSettings => [
MainController mainController = Get.put(MainController())
..msgBadgeMode = DynamicBadgeMode.values[result.index];
if (mainController.msgBadgeMode != DynamicBadgeMode.hidden) {
mainController.queryUnreadMsg();
mainController.queryUnreadMsg(true);
} else {
mainController.msgUnReadCount.value = '';
}