From 9cd4812987f4ced1aaec943b6fffec989d495f5e Mon Sep 17 00:00:00 2001 From: ZuoZuo <68836346+Mrz-sakura@users.noreply.github.com> Date: Tue, 14 Apr 2026 14:50:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=B8=AA=E7=A1=AC?= =?UTF-8?q?=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/app/constants/sc_global_config.dart | 55 +++++++- lib/modules/chat/message/sc_message_page.dart | 37 ++--- lib/modules/chat/message_chat_page.dart | 23 ++-- lib/services/audio/rtm_manager.dart | 129 +++++++++++------- ...bottom_message_conversation_list_page.dart | 53 +++---- .../msg/message_conversation_list_page.dart | 55 ++++---- .../.gradle/5.4.1/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/5.4.1/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../android/.gradle/5.4.1/gc.properties | 0 9 files changed, 206 insertions(+), 146 deletions(-) create mode 100644 local_packages/image_cropper-5.0.1-patched/android/.gradle/5.4.1/fileChanges/last-build.bin create mode 100644 local_packages/image_cropper-5.0.1-patched/android/.gradle/5.4.1/fileHashes/fileHashes.lock create mode 100644 local_packages/image_cropper-5.0.1-patched/android/.gradle/5.4.1/gc.properties diff --git a/lib/app/constants/sc_global_config.dart b/lib/app/constants/sc_global_config.dart index 7bb2acf..56a6e53 100644 --- a/lib/app/constants/sc_global_config.dart +++ b/lib/app/constants/sc_global_config.dart @@ -48,13 +48,54 @@ class SCGlobalConfig { static num get gameAppid => AppConfig.current.gameAppid; static String get gameAppChannel => AppConfig.current.gameAppChannel; - ///全服广播大群 - static String get bigBroadcastGroup => AppConfig.current.bigBroadcastGroup; - - static String get imAdmin => AppConfig.current.imAdmin; - - ///财富榜单 - static String get wealthRankUrl => AppConfig.current.wealthRankUrl; + ///全服广播大群 + static String get bigBroadcastGroup => AppConfig.current.bigBroadcastGroup; + + static String get imAdmin => AppConfig.current.imAdmin; + static const Set _extraSystemUserIds = {"yuminotice"}; + + static String _normalizeConversationUserId(String conversationId) { + return conversationId.startsWith("c2c_") + ? conversationId.replaceFirst("c2c_", "") + : conversationId; + } + + static Set get systemUserIds { + return { + "administrator", + _normalizeConversationUserId(imAdmin), + ..._extraSystemUserIds, + }.where((element) => element.isNotEmpty).toSet(); + } + + static Set get systemConversationIds { + return { + "administrator", + ...systemUserIds + .where((element) => element != "administrator") + .map((element) => "c2c_$element"), + }; + } + + static String get primarySystemUserId => _normalizeConversationUserId(imAdmin); + static String get primarySystemConversationId => "c2c_$primarySystemUserId"; + + static bool isSystemConversationId(String? conversationId) { + if (conversationId == null || conversationId.isEmpty) { + return false; + } + return systemConversationIds.contains(conversationId); + } + + static bool isSystemUserId(String? userId) { + if (userId == null || userId.isEmpty) { + return false; + } + return systemUserIds.contains(userId); + } + + ///财富榜单 + static String get wealthRankUrl => AppConfig.current.wealthRankUrl; ///魅力榜 static String get charmRankUrl => AppConfig.current.charmRankUrl; diff --git a/lib/modules/chat/message/sc_message_page.dart b/lib/modules/chat/message/sc_message_page.dart index ac08e68..b0aebf3 100644 --- a/lib/modules/chat/message/sc_message_page.dart +++ b/lib/modules/chat/message/sc_message_page.dart @@ -4,20 +4,17 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:yumi/app_localizations.dart'; import 'package:yumi/ui_kit/components/sc_debounce_widget.dart'; import 'package:yumi/ui_kit/components/text/sc_text.dart'; -import 'package:yumi/services/audio/rtm_manager.dart'; -import 'package:provider/provider.dart'; -import 'package:tencent_cloud_chat_sdk/enum/conversation_type.dart'; -import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'; -import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'; -import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart'; -import 'package:yumi/app/constants/sc_global_config.dart'; +import 'package:yumi/services/audio/rtm_manager.dart'; +import 'package:provider/provider.dart'; +import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'; +import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart'; +import 'package:yumi/app/constants/sc_global_config.dart'; import 'package:yumi/app/config/business_logic_strategy.dart'; import 'package:yumi/app/routes/sc_fluro_navigator.dart'; -import 'package:yumi/shared/data_sources/sources/local/data_persistence.dart'; -import 'package:yumi/shared/data_sources/sources/local/user_manager.dart'; -import 'package:yumi/ui_kit/theme/socialchat_theme.dart'; -import 'package:yumi/ui_kit/widgets/msg/message_conversation_list_page.dart'; -import 'package:yumi/modules/chat/message/sc_message_friends_page.dart'; +import 'package:yumi/shared/data_sources/sources/local/data_persistence.dart'; +import 'package:yumi/shared/data_sources/sources/local/user_manager.dart'; +import 'package:yumi/ui_kit/theme/socialchat_theme.dart'; +import 'package:yumi/ui_kit/widgets/msg/message_conversation_list_page.dart'; import '../../index/main_route.dart'; import '../chat_route.dart'; @@ -326,16 +323,12 @@ class _MessagePageState extends State { ), ), ], - ), - onTap: () async { - var conversation = V2TimConversation( - type: ConversationType.V2TIM_C2C, - userID: SCGlobalConfig.imAdmin.replaceFirst('c2c_', ''), - conversationID: SCGlobalConfig.imAdmin, - ); - provider.updateSystemCount(0); - var bool = await provider.startConversation(conversation); - if (!bool) return; + ), + onTap: () async { + var conversation = provider.getPreferredSystemConversation(); + provider.updateSystemCount(0); + var bool = await provider.startConversation(conversation); + if (!bool) return; var json = jsonEncode(conversation.toJson()); SCNavigatorUtils.push( context, diff --git a/lib/modules/chat/message_chat_page.dart b/lib/modules/chat/message_chat_page.dart index d550eea..2fc38e1 100644 --- a/lib/modules/chat/message_chat_page.dart +++ b/lib/modules/chat/message_chat_page.dart @@ -258,9 +258,10 @@ class _SCMessageChatPageState extends State { top: false, child: Column( children: [ - if (currentConversation?.conversationID != - "administrator") - _input(), + if (!SCGlobalConfig.isSystemConversationId( + currentConversation?.conversationID, + )) + _input(), _tools(provider), _emoji(), // _fahongbao(), @@ -279,12 +280,16 @@ class _SCMessageChatPageState extends State { ); } - void loadFriend() { - SCLoadingManager.show(); - Future.wait([ - SCAccountRepository().loadUserInfo("${currentConversation?.userID}"), - SCAccountRepository().friendRelationCheck( - "${currentConversation?.userID}", + void loadFriend() { + if (SCGlobalConfig.isSystemConversationId(currentConversation?.conversationID) || + SCGlobalConfig.isSystemUserId(currentConversation?.userID)) { + return; + } + SCLoadingManager.show(); + Future.wait([ + SCAccountRepository().loadUserInfo("${currentConversation?.userID}"), + SCAccountRepository().friendRelationCheck( + "${currentConversation?.userID}", ), ]) .then((result) { diff --git a/lib/services/audio/rtm_manager.dart b/lib/services/audio/rtm_manager.dart index af4a47c..cda221d 100644 --- a/lib/services/audio/rtm_manager.dart +++ b/lib/services/audio/rtm_manager.dart @@ -16,11 +16,12 @@ import 'package:yumi/shared/data_sources/sources/local/floating_screen_manager.d import 'package:yumi/shared/data_sources/sources/local/user_manager.dart'; import 'package:yumi/services/audio/rtc_manager.dart'; import 'package:provider/provider.dart'; -import 'package:tencent_cloud_chat_sdk/enum/V2TimAdvancedMsgListener.dart'; -import 'package:tencent_cloud_chat_sdk/enum/V2TimConversationListener.dart'; -import 'package:tencent_cloud_chat_sdk/enum/V2TimGroupListener.dart'; -import 'package:tencent_cloud_chat_sdk/enum/V2TimSDKListener.dart'; -import 'package:tencent_cloud_chat_sdk/enum/group_type.dart'; +import 'package:tencent_cloud_chat_sdk/enum/V2TimAdvancedMsgListener.dart'; +import 'package:tencent_cloud_chat_sdk/enum/V2TimConversationListener.dart'; +import 'package:tencent_cloud_chat_sdk/enum/V2TimGroupListener.dart'; +import 'package:tencent_cloud_chat_sdk/enum/V2TimSDKListener.dart'; +import 'package:tencent_cloud_chat_sdk/enum/conversation_type.dart'; +import 'package:tencent_cloud_chat_sdk/enum/group_type.dart'; import 'package:tencent_cloud_chat_sdk/enum/log_level_enum.dart'; import 'package:tencent_cloud_chat_sdk/enum/message_status.dart'; import 'package:tencent_cloud_chat_sdk/manager/v2_tim_group_manager.dart'; @@ -49,8 +50,7 @@ import 'package:yumi/shared/business_logic/models/res/sc_broad_cast_luck_gift_pu import 'package:yumi/shared/business_logic/models/res/broad_cast_mic_change_push.dart'; import 'package:yumi/shared/business_logic/models/res/gift_res.dart'; import 'package:yumi/shared/business_logic/models/res/sc_public_message_page_res.dart'; -import 'package:yumi/shared/business_logic/models/res/sc_room_rocket_status_res.dart'; -import 'package:yumi/shared/business_logic/models/res/sc_room_theme_list_res.dart'; +import 'package:yumi/shared/business_logic/models/res/sc_room_theme_list_res.dart'; import 'package:yumi/ui_kit/widgets/room/invite/invite_room_dialog.dart'; import 'package:yumi/ui_kit/widgets/room/room_msg_item.dart'; import 'package:yumi/shared/business_logic/models/res/login_res.dart'; @@ -113,18 +113,48 @@ class RealTimeMessagingManager extends ChangeNotifier { Debouncer debouncer = Debouncer(); List conversationList = []; - ///客服 - SocialChatUserProfile? customerInfo; - - void getConversationList() { - List list = conversationMap?.values?.toList() ?? []; - list.removeWhere((element) { - if (element.conversationID == SCGlobalConfig.imAdmin) { - return true; - } - if (element.conversationID == "c2c_${customerInfo?.id}") { - return true; - } + ///客服 + SocialChatUserProfile? customerInfo; + + int _systemUnreadCount() { + int count = 0; + for (final conversationId in SCGlobalConfig.systemConversationIds) { + count += conversationMap[conversationId]?.unreadCount ?? 0; + } + return count; + } + + V2TimConversation getPreferredSystemConversation() { + final systemConversations = + conversationMap.values + .where( + (element) => + SCGlobalConfig.isSystemConversationId(element.conversationID), + ) + .toList() + ..sort((e1, e2) { + final time1 = e1.lastMessage?.timestamp ?? 0; + final time2 = e2.lastMessage?.timestamp ?? 0; + return time2.compareTo(time1); + }); + + if (systemConversations.isNotEmpty) { + return systemConversations.first; + } + + return V2TimConversation( + type: ConversationType.V2TIM_C2C, + userID: SCGlobalConfig.primarySystemUserId, + conversationID: SCGlobalConfig.primarySystemConversationId, + ); + } + + void getConversationList() { + List list = conversationMap.values.toList(); + list.removeWhere((element) { + if (element.conversationID == "c2c_${customerInfo?.id}") { + return true; + } if (element.conversationID == "c2c_atyou-newsletter") { ///删除这个会话,后台乱发的联系人。。防止无效未读数 clearC2CHistoryMessage(element.conversationID, false); @@ -135,16 +165,15 @@ class RealTimeMessagingManager extends ChangeNotifier { } return false; }); - list?.sort((e1, e2) { - int time1 = e1.lastMessage?.timestamp ?? 0; - int time2 = e2.lastMessage?.timestamp ?? 0; - return time2.compareTo(time1); - }); - conversationList = list; - systemUnReadCount = - conversationMap[SCGlobalConfig.imAdmin]?.unreadCount ?? 0; - customerUnReadCount = - conversationMap["c2c_${customerInfo?.id}"]?.unreadCount ?? 0; + list.sort((e1, e2) { + int time1 = e1.lastMessage?.timestamp ?? 0; + int time2 = e2.lastMessage?.timestamp ?? 0; + return time2.compareTo(time1); + }); + conversationList = list; + systemUnReadCount = _systemUnreadCount(); + customerUnReadCount = + conversationMap["c2c_${customerInfo?.id}"]?.unreadCount ?? 0; notifyListeners(); } @@ -205,12 +234,11 @@ class RealTimeMessagingManager extends ChangeNotifier { // _onRefreshConversation(conversationList); initConversation(); }, - onTotalUnreadMessageCountChanged: (int totalUnreadCount) { - messageUnReadCount = totalUnreadCount; - systemUnReadCount = - conversationMap[SCGlobalConfig.imAdmin]?.unreadCount ?? 0; - customerUnReadCount = - conversationMap["c2c_${customerInfo?.id}"]?.unreadCount ?? 0; + onTotalUnreadMessageCountChanged: (int totalUnreadCount) { + messageUnReadCount = totalUnreadCount; + systemUnReadCount = _systemUnreadCount(); + customerUnReadCount = + conversationMap["c2c_${customerInfo?.id}"]?.unreadCount ?? 0; allUnReadCount = messageUnReadCount + notifcationUnReadCount + @@ -450,21 +478,16 @@ class RealTimeMessagingManager extends ChangeNotifier { } } } - if (message?.userID == customerInfo?.id) { - if (onNewMessageCurrentConversationListener == null) { - conversationMap["c2c_${customerInfo?.id}"]?.unreadCount = - (conversationMap["c2c_${customerInfo?.id}"]?.unreadCount ?? 0) + 1; - } - } - if (message?.userID == SCGlobalConfig.imAdmin.replaceFirst('c2c_', '')) { + if (message?.userID == customerInfo?.id) { if (onNewMessageCurrentConversationListener == null) { - conversationMap[SCGlobalConfig.imAdmin]?.unreadCount = - (conversationMap[SCGlobalConfig.imAdmin]?.unreadCount ?? 0) + 1; + conversationMap["c2c_${customerInfo?.id}"]?.unreadCount = + (conversationMap["c2c_${customerInfo?.id}"]?.unreadCount ?? 0) + 1; } } - notifyListeners(); - onNewMessageCurrentConversationListener?.call(message, msgId: msgId); - } + systemUnReadCount = _systemUnreadCount(); + notifyListeners(); + onNewMessageCurrentConversationListener?.call(message, msgId: msgId); + } void _onRefreshConversation(List conversations) { for (V2TimConversation conversation in conversations) { @@ -1366,11 +1389,13 @@ class RealTimeMessagingManager extends ChangeNotifier { notifyListeners(); } - void updateSystemCount(int count) { - conversationMap[SCGlobalConfig.imAdmin]?.unreadCount = 0; - systemUnReadCount = 0; - notifyListeners(); - } + void updateSystemCount(int count) { + for (final conversationId in SCGlobalConfig.systemConversationIds) { + conversationMap[conversationId]?.unreadCount = 0; + } + systemUnReadCount = 0; + notifyListeners(); + } void updateCustomerCount(int count) { conversationMap["c2c_${customerInfo?.id}"]?.unreadCount = 0; diff --git a/lib/ui_kit/widgets/msg/bottom_message_conversation_list_page.dart b/lib/ui_kit/widgets/msg/bottom_message_conversation_list_page.dart index fc67a5c..00ec476 100644 --- a/lib/ui_kit/widgets/msg/bottom_message_conversation_list_page.dart +++ b/lib/ui_kit/widgets/msg/bottom_message_conversation_list_page.dart @@ -1,24 +1,19 @@ -import 'dart:convert'; -import 'dart:ui' as ui; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_debouncer/flutter_debouncer.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:yumi/shared/data_sources/sources/local/data_persistence.dart'; -import 'package:yumi/shared/data_sources/sources/local/user_manager.dart'; -import 'package:provider/provider.dart'; -import 'package:tencent_cloud_chat_sdk/enum/conversation_type.dart'; -import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'; -import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'; -import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart'; - -import 'package:yumi/app_localizations.dart'; -import 'package:yumi/ui_kit/components/sc_debounce_widget.dart'; -import 'package:yumi/ui_kit/components/text/sc_text.dart'; -import 'package:yumi/app/constants/sc_global_config.dart'; -import 'package:yumi/app/routes/sc_fluro_navigator.dart'; -import 'package:yumi/services/audio/rtm_manager.dart'; +import 'dart:convert'; +import 'dart:ui' as ui; + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:yumi/shared/data_sources/sources/local/data_persistence.dart'; +import 'package:yumi/shared/data_sources/sources/local/user_manager.dart'; +import 'package:provider/provider.dart'; +import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'; +import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart'; + +import 'package:yumi/app_localizations.dart'; +import 'package:yumi/ui_kit/components/sc_debounce_widget.dart'; +import 'package:yumi/ui_kit/components/text/sc_text.dart'; +import 'package:yumi/app/routes/sc_fluro_navigator.dart'; +import 'package:yumi/services/audio/rtm_manager.dart'; import 'package:yumi/ui_kit/widgets/msg/message_conversation_list_page.dart'; import '../../../modules/chat/chat_route.dart'; @@ -347,16 +342,12 @@ class _BottomMessageConversationListPageState fontWeight: FontWeight.bold, ), ], - ), - onTap: () async { - var conversation = V2TimConversation( - type: ConversationType.V2TIM_C2C, - userID: SCGlobalConfig.imAdmin.replaceFirst('c2c_', ''), - conversationID: SCGlobalConfig.imAdmin, - ); - provider.updateSystemCount(0); - var bool = await provider.startConversation(conversation); - if (!bool) return; + ), + onTap: () async { + var conversation = provider.getPreferredSystemConversation(); + provider.updateSystemCount(0); + var bool = await provider.startConversation(conversation); + if (!bool) return; var json = jsonEncode(conversation.toJson()); SCNavigatorUtils.push( context, diff --git a/lib/ui_kit/widgets/msg/message_conversation_list_page.dart b/lib/ui_kit/widgets/msg/message_conversation_list_page.dart index 01bdc26..612fb44 100644 --- a/lib/ui_kit/widgets/msg/message_conversation_list_page.dart +++ b/lib/ui_kit/widgets/msg/message_conversation_list_page.dart @@ -13,10 +13,11 @@ import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'; import 'package:tencent_cloud_chat_sdk/models/v2_tim_custom_elem.dart'; import 'package:tencent_cloud_chat_sdk/models/v2_tim_text_elem.dart'; import 'package:yumi/app_localizations.dart'; -import 'package:yumi/ui_kit/components/dialog/dialog_base.dart'; -import 'package:yumi/ui_kit/components/sc_compontent.dart'; -import 'package:yumi/ui_kit/components/text/sc_text.dart'; -import 'package:yumi/app/routes/sc_fluro_navigator.dart'; +import 'package:yumi/ui_kit/components/dialog/dialog_base.dart'; +import 'package:yumi/ui_kit/components/sc_compontent.dart'; +import 'package:yumi/ui_kit/components/text/sc_text.dart'; +import 'package:yumi/app/constants/sc_global_config.dart'; +import 'package:yumi/app/routes/sc_fluro_navigator.dart'; import 'package:yumi/shared/tools/sc_date_utils.dart'; import 'package:yumi/shared/data_sources/sources/repositories/sc_user_repository_impl.dart'; import 'package:yumi/shared/business_logic/models/res/login_res.dart'; @@ -347,21 +348,25 @@ class _ConversationItemState extends State { }*/ // print('time :${Platform.isAndroid ? (conversation.lastMsg?.timestamp ?? 0) * 1000 : conversation.lastMsg?.timestamp}'); return GestureDetector( - onTap: () async { - if (conversation != null) { - conversation.unreadCount = 0; - var bool = await Provider.of( - context, + onTap: () async { + if (conversation != null) { + conversation.unreadCount = 0; + var bool = await Provider.of( + context, listen: false, - ).startConversation(conversation); - if (!bool) return; - var json = jsonEncode(widget.conversation.toJson()); - SCNavigatorUtils.push( - context, - "${SCChatRouter.chat}?conversation=${Uri.encodeComponent(json)}", - ); - } - }, + ).startConversation(conversation); + if (!bool) return; + var json = jsonEncode(widget.conversation.toJson()); + final route = + SCGlobalConfig.isSystemConversationId(conversation.conversationID) + ? SCChatRouter.systemChat + : SCChatRouter.chat; + SCNavigatorUtils.push( + context, + "$route?conversation=${Uri.encodeComponent(json)}", + ); + } + }, onLongPress: () { showDeleteConfirm(); }, @@ -521,13 +526,13 @@ class _ConversationItemState extends State { ); } - void loadUserInfo() { - if (conversation.conversationID != "administrator" && - conversation.conversationID != "customer" && - conversation.conversationID != "article") { - SCAccountRepository().loadUserInfo("${conversation.userID}").then((value) { - user = value; - setState(() {}); + void loadUserInfo() { + if (!SCGlobalConfig.isSystemConversationId(conversation.conversationID) && + conversation.conversationID != "customer" && + conversation.conversationID != "article") { + SCAccountRepository().loadUserInfo("${conversation.userID}").then((value) { + user = value; + setState(() {}); }); } } diff --git a/local_packages/image_cropper-5.0.1-patched/android/.gradle/5.4.1/fileChanges/last-build.bin b/local_packages/image_cropper-5.0.1-patched/android/.gradle/5.4.1/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/local_packages/image_cropper-5.0.1-patched/android/.gradle/5.4.1/fileHashes/fileHashes.lock b/local_packages/image_cropper-5.0.1-patched/android/.gradle/5.4.1/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..e7d920b3ff0805616c224f60064cf3ba59a7a737 GIT binary patch literal 17 TcmZQ(`jWcFihtW$1}FdkEr0{J literal 0 HcmV?d00001 diff --git a/local_packages/image_cropper-5.0.1-patched/android/.gradle/5.4.1/gc.properties b/local_packages/image_cropper-5.0.1-patched/android/.gradle/5.4.1/gc.properties new file mode 100644 index 0000000..e69de29