chatapp3-flutter/lib/services/audio/rtm_manager.dart
2026-04-15 14:44:27 +08:00

1498 lines
55 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:collection';
import 'dart:convert';
import 'dart:io';
import 'package:agora_rtc_engine/agora_rtc_engine.dart';
import 'package:extended_image/extended_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_debouncer/flutter_debouncer.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:yumi/ui_kit/components/sc_tts.dart';
import 'package:yumi/app/constants/sc_global_config.dart';
import 'package:yumi/shared/tools/sc_message_utils.dart';
import 'package:yumi/shared/tools/sc_path_utils.dart';
import 'package:yumi/shared/tools/sc_room_utils.dart';
import 'package:yumi/shared/data_sources/sources/local/floating_screen_manager.dart';
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/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';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_image_elem.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_receipt.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_msg_create_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_status.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/dialog/dialog_base.dart';
import 'package:yumi/app/constants/sc_room_msg_type.dart';
import 'package:yumi/shared/tools/sc_lk_event_bus.dart';
import 'package:yumi/shared/tools/sc_gift_vap_svga_manager.dart';
import 'package:yumi/shared/data_sources/sources/local/file_cache_manager.dart';
import 'package:yumi/shared/data_sources/sources/repositories/sc_config_repository_imp.dart';
import 'package:yumi/shared/data_sources/models/message/big_broadcast_group_message.dart';
import 'package:yumi/shared/data_sources/models/message/sc_floating_message.dart';
import 'package:yumi/shared/business_logic/models/res/sc_broad_cast_luck_gift_push.dart';
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_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';
import 'package:yumi/services/gift/gift_system_manager.dart';
import '../../shared/data_sources/models/enum/sc_gift_type.dart';
import '../../shared/data_sources/models/enum/sc_room_roles_type.dart';
typedef RoomNewMsgListener = Function(Msg msg);
typedef OnNewMessageListener = Function(V2TimMessage? message, {String? msgId});
typedef OnNewANMessageListener = Function(Records? message);
typedef OnRevokeMessageListener = Function(String msgId);
typedef OnNewGroupMessageListener =
Function(String groupID, V2TimMessage message);
typedef OnMessageRecvC2CReadListener = Function(List<String> messageIDList);
typedef RtmProvider = RealTimeMessagingManager;
class RealTimeMessagingManager extends ChangeNotifier {
BuildContext? context;
void _giftFxLog(String message) {
debugPrint('[GiftFX][RTM] $message');
}
///消息列表
List<Msg> roomAllMsgList = [];
List<Msg> roomChatMsgList = [];
List<Msg> roomGiftMsgList = [];
RoomNewMsgListener? msgAllListener;
RoomNewMsgListener? msgChatListener;
RoomNewMsgListener? msgGiftListener;
RoomNewMsgListener? msgFloatingGiftListener;
RoomNewMsgListener? msgUserJoinListener;
/// 当前会话
V2TimConversation? currentConversation;
/// 会话列表缓存
Map<String, V2TimConversation> conversationMap = {};
///消息已读监听
OnMessageRecvC2CReadListener? onMessageRecvC2CReadListener;
///消息被撤回监听
OnRevokeMessageListener? onRevokeMessageListener;
///新消息监听 单聊
OnNewMessageListener? onNewMessageCurrentConversationListener;
OnNewANMessageListener? onNewActivityMessageCurrentConversationListener;
OnNewANMessageListener? onNewNotifcationMessageCurrentConversationListener;
///新消息监听 群聊
Map<String, OnNewGroupMessageListener?> onNewMessageListenerGroupMap = {};
int allUnReadCount = 0;
int messageUnReadCount = 0;
int systemUnReadCount = 0;
int customerUnReadCount = 0;
int activityUnReadCount = 0;
int notifcationUnReadCount = 0;
SCBroadCastLuckGiftPush? currentPlayingLuckGift;
final Queue<SCBroadCastLuckGiftPush?> _luckGiftPushQueue = Queue();
Debouncer debouncer = Debouncer();
List<V2TimConversation> conversationList = [];
///客服
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<V2TimConversation> 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);
return true;
}
if (element.lastMessage == null) {
return true;
}
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 = _systemUnreadCount();
customerUnReadCount =
conversationMap["c2c_${customerInfo?.id}"]?.unreadCount ?? 0;
notifyListeners();
}
init(BuildContext context) async {
this.context = context;
V2TimSDKListener sdkListener = V2TimSDKListener(
onConnectFailed: (int code, String error) {
// 连接失败的回调函数
// code 错误码
// error 错误信息
},
onConnectSuccess: () {
// SDK 已经成功连接到腾讯云服务器
},
onConnecting: () {
// SDK 正在连接到腾讯云服务器
},
onKickedOffline: () {
// 当前用户被踢下线,此时可以 UI 提示用户,并再次调用 V2TIMManager 的 login() 函数重新登录。
},
onSelfInfoUpdated: (V2TimUserFullInfo info) {
// 登录用户的资料发生了更新
// info登录用户的资料
},
onUserSigExpired: () {
// 在线时票据过期:此时您需要生成新的 userSig 并再次调用 V2TIMManager 的 login() 函数重新登录。
},
onUserStatusChanged: (List<V2TimUserStatus> userStatusList) {
//用户状态变更通知
//userStatusList 用户状态变化的用户列表
//收到通知的情况:订阅过的用户发生了状态变更(包括在线状态和自定义状态),会触发该回调
//在 IM 控制台打开了好友状态通知开关,即使未主动订阅,当好友状态发生变更时,也会触发该回调
//同一个账号多设备登录,当其中一台设备修改了自定义状态,所有设备都会收到该回调
},
);
V2TimValueCallback<bool> initSDKRes = await TencentImSDKPlugin.v2TIMManager
.initSDK(
sdkAppID: int.parse(SCGlobalConfig.tencentImAppid), // SDKAppID
loglevel: LogLevelEnum.V2TIM_LOG_ALL, // 日志登记等级
listener: sdkListener, // 事件监听器
);
if (initSDKRes.code == 0) {}
try {
customerInfo = await SCConfigRepositoryImp().customerService();
} catch (e) {}
/// 登录
await loginTencetRtm(context);
/// 初始化会话列表
// _onRefreshConversationSub = FTIM.getContactManager().addRefreshConversationListener(_onRefreshConversation);
TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.addConversationListener(
listener: V2TimConversationListener(
onNewConversation: (conversationList) {
// _onRefreshConversation(conversationList);
initConversation();
},
onTotalUnreadMessageCountChanged: (int totalUnreadCount) {
messageUnReadCount = totalUnreadCount;
systemUnReadCount = _systemUnreadCount();
customerUnReadCount =
conversationMap["c2c_${customerInfo?.id}"]?.unreadCount ?? 0;
allUnReadCount =
messageUnReadCount +
notifcationUnReadCount +
activityUnReadCount;
notifyListeners();
},
),
);
TencentImSDKPlugin.v2TIMManager.addGroupListener(
listener: V2TimGroupListener(
onMemberEnter:
(String groupID, List<V2TimGroupMemberInfo> memberList) {},
onMemberLeave: (String groupID, V2TimGroupMemberInfo member) {
Provider.of<RealTimeCommunicationManager>(
context,
listen: false,
).removOnlineUser(groupID, member.userID!);
},
onMemberKicked: (
String groupID,
V2TimGroupMemberInfo opUser,
List<V2TimGroupMemberInfo> memberList,
) {
///踢出房间
if (memberList.isNotEmpty) {
if (memberList.first.userID ==
AccountStorage().getCurrentUser()?.userProfile?.id) {
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).engine?.setClientRole(role: ClientRoleType.clientRoleAudience);
///退出房间
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).exitCurrentVoiceRoomSession(false).whenComplete(() {
SCRoomUtils.closeAllDialogs();
SmartDialog.show(
tag: "showConfirmDialog",
alignment: Alignment.center,
debounce: true,
animationType: SmartAnimationType.fade,
builder: (_) {
return MsgDialog(
title: SCAppLocalizations.of(context)!.tips,
msg: SCAppLocalizations.of(context)!.kickRoomTips,
btnText: SCAppLocalizations.of(context)!.confirm,
onEnsure: () {},
);
},
);
});
}
}
},
),
);
/// 新消息监听
// FTIM.getMessageManager().addNewMessagesListener(_onNewMessage);
TencentImSDKPlugin.v2TIMManager.getMessageManager().addAdvancedMsgListener(
listener: V2TimAdvancedMsgListener(
onRecvC2CReadReceipt: (List<V2TimMessageReceipt> receiptList) {
//会话已读回调
},
onRecvMessageModified: (V2TimMessage message) {
// msg 为被修改之后的消息对象
},
onRecvMessageReadReceipts: (List<V2TimMessageReceipt> receiptList) {
//群聊/单聊已读回调
List<String> messageIDList = [];
for (var element in receiptList) {
messageIDList.add(element.msgID!);
}
onMessageRecvC2CReadListener?.call(messageIDList);
},
onRecvMessageRevoked: (String messageId) {
// 在本地维护的消息中处理被对方撤回的消息
TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.deleteMessages(msgIDs: [messageId])
.then((result) {
onRevokeMessageListener?.call(messageId);
for (var ms in conversationList) {
if (ms.lastMessage?.msgID == messageId) {
ms.lastMessage?.status =
MessageStatus.V2TIM_MSG_STATUS_LOCAL_REVOKED;
break;
}
}
notifyListeners();
});
},
onRecvNewMessage: (V2TimMessage message) async {
_onNewMessage(message);
},
onSendMessageProgress: (V2TimMessage message, int progress) {
//文件上传进度回调
},
),
);
getAllUnReadCount();
joinBigBroadcastGroup();
}
/// 初始化会话
/// 打开聊天界面的时候调用
int sTime = 0;
Future<bool> startConversation(V2TimConversation conversation) async {
assert(conversation != null);
int eTime = DateTime.now().millisecondsSinceEpoch;
if (eTime - sTime > 5000) {
sTime = eTime;
currentConversation = conversation;
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.markC2CMessageAsRead(userID: conversation.userID!);
notifyListeners();
return true;
} else {
return false;
}
}
///初始话会话
Future initConversation() async {
V2TimValueCallback<V2TimConversationResult> convList =
await TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.getConversationList(nextSeq: '0', count: 100);
List<V2TimConversation?>? conversationList =
convList.data?.conversationList;
print('conversationList:${conversationList?.length}');
conversationMap.clear();
if (conversationList != null) {
for (V2TimConversation? conversation in conversationList) {
conversationMap[conversation!.conversationID] = conversation;
}
}
getConversationList();
}
// /// 所有消息未读数
// int getAllUnReadCount() {
// allUnReadCount = 0;
// for (var value in conversationList) {
// allUnReadCount += value.unreadCount ?? 0;
// }
// // for (var value in systemConversationList) {
// // i += value.unreadMessageNum;
// // }
// notifyListeners();
// return allUnReadCount;
// }
/// 所有消息未读数
void getAllUnReadCount() async {
V2TimValueCallback<int> res =
await TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.getTotalUnreadMessageCount();
if (res.code == 0) {
print('初始未读总数: ${res.data}');
messageUnReadCount = res.data ?? 0;
allUnReadCount =
messageUnReadCount + activityUnReadCount + notifcationUnReadCount;
notifyListeners();
// 这里可以先用初始值更新UI
}
}
///登录IM
Future loginTencetRtm(BuildContext context) async {
SocialChatLoginRes? userModel = AccountStorage().getCurrentUser();
bool logined = false;
while (!logined && userModel != null) {
await Future.delayed(Duration(milliseconds: 550));
try {
if (userModel.userSig != null) {
V2TimCallback res = await TencentImSDKPlugin.v2TIMManager.login(
userID: userModel.userProfile?.id ?? "",
userSig: userModel.userSig ?? "",
);
print(
'tim voLogin:${res.code}${userModel.userProfile?.id},${userModel.userSig}',
);
if (res.code == 0) {
isLogout = false;
// 登录成功逻辑
logined = true;
print('tim 登录成功');
await initConversation();
} else {
// 登录失败逻辑
//print('timm 需要重新登录2');
print('tim 登录失败${res.code}');
SCTts.show('tim login fail');
}
} else {
//print('timm 需要重新登录sign');
SCTts.show('tim login fail');
}
} catch (e) {
//print('timm 登录异常:${e.toString()}');
SCTts.show('timm login fail${e.toString()}');
}
userModel = AccountStorage().getCurrentUser();
}
}
_onNewMessage(V2TimMessage message) {
if (message.groupID != null) {
///全服通知
if (message.groupID == SCGlobalConfig.bigBroadcastGroup) {
_newBroadCastMsgRecv(message.groupID!, message);
}
///群消息
for (var element in onNewMessageListenerGroupMap.values) {
element?.call(message.groupID!, message);
}
} else {
///单聊消息
_onNew1v1Message(message);
}
}
_onNew1v1Message(V2TimMessage? message, {String? msgId}) async {
for (var element in conversationList) {
if (message?.userID == element?.userID) {
element.lastMessage = message;
if (onNewMessageCurrentConversationListener == null) {
element.unreadCount = element.unreadCount! + 1;
}
}
}
if (message?.userID == customerInfo?.id) {
if (onNewMessageCurrentConversationListener == null) {
conversationMap["c2c_${customerInfo?.id}"]?.unreadCount =
(conversationMap["c2c_${customerInfo?.id}"]?.unreadCount ?? 0) + 1;
}
}
systemUnReadCount = _systemUnreadCount();
notifyListeners();
onNewMessageCurrentConversationListener?.call(message, msgId: msgId);
}
void _onRefreshConversation(List<V2TimConversation> conversations) {
for (V2TimConversation conversation in conversations) {
conversationMap[conversation.conversationID] = conversation;
}
getConversationList();
}
///创建房间im群聊
Future<V2TimValueCallback<String>> createRoomGroup(
String groupID,
String groupName,
) {
return V2TIMGroupManager().createGroup(
groupID: groupID,
groupType: GroupType.AVChatRoom,
groupName: groupName,
);
}
///加入房间的im群聊
Future<V2TimCallback> joinRoomGroup(String groupID, String message) async {
_luckGiftPushQueue.clear();
currentPlayingLuckGift = null;
var joinResult = await TencentImSDKPlugin.v2TIMManager.joinGroup(
groupID: groupID,
message: message,
);
if (joinResult.code == 0) {
onNewMessageListenerGroupMap[groupID] = _newGroupMsg;
}
return joinResult;
}
///发送文本消息
Future dispatchMessage(
Msg msg, {
bool showEmoticons = true,
bool addLocal = true,
}) async {
if (addLocal) {
addMsg(msg);
}
// 发送消息到腾讯云IM
if (msg.groupId != null) {
await _sendTencentMessage(msg);
}
notifyListeners();
}
// 发送腾讯云消息
Future<void> _sendTencentMessage(Msg msg) async {
try {
switch (msg.type) {
case SCRoomMsgType.text:
case SCRoomMsgType.shangMai:
case SCRoomMsgType.emoticons:
case SCRoomMsgType.xiaMai:
case SCRoomMsgType.killXiaMai:
case SCRoomMsgType.roomRoleChange:
case SCRoomMsgType.roomSettingUpdate:
case SCRoomMsgType.roomBGUpdate:
case SCRoomMsgType.qcfj:
case SCRoomMsgType.fengMai:
case SCRoomMsgType.jieFeng:
case SCRoomMsgType.joinRoom:
case SCRoomMsgType.gift:
case SCRoomMsgType.bsm:
case SCRoomMsgType.roomDice:
case SCRoomMsgType.roomRPS:
case SCRoomMsgType.roomLuckNumber:
case SCRoomMsgType.image:
case SCRoomMsgType.roomGameClose:
case SCRoomMsgType.roomGameCreate:
case SCRoomMsgType.luckGiftAnimOther:
_sendRoomMessage(msg);
break;
default:
break;
}
} catch (e) {
print('发送消息失败: $e');
// 处理发送失败的情况
}
}
///发送单聊文本消息
Future<void> sendC2CTextMsg(
String msg,
V2TimConversation toConversation,
) async {
// 创建文本消息
V2TimValueCallback<V2TimMsgCreateInfoResult> createTextMessageRes =
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createTextMessage(
text: msg, // 文本信息
);
if (createTextMessageRes.code == 0) {
// 文本信息创建成功
String id = createTextMessageRes.data!.id!;
// 发送文本消息
// 在sendMessage时若只填写receiver则发个人用户单聊消息
// 若只填写groupID则发群组消息
// 若填写了receiver与groupID则发群内的个人用户消息在群聊中显示只有指定receiver能看见
String receiveId = toConversation.userID!;
V2TimValueCallback<V2TimMessage> sendMessageRes = await TencentImSDKPlugin
.v2TIMManager
.getMessageManager()
.sendMessage(
id: id, // 创建的messageid
receiver: toConversation.userID!, // 接收人id
needReadReceipt: true,
groupID: '', // 是否需要已读回执
);
if (sendMessageRes.code == 0) {
// 发送成功
_onNew1v1Message(sendMessageRes.data);
} else {
SCTts.show(
'create fail,code:${sendMessageRes.code},${sendMessageRes.desc}',
);
}
}
}
///发送单聊自定义消息
Future<void> sendC2CCustomMsg(
String msg,
V2TimConversation toConversation,
String extension,
) async {
// 创建文本消息
V2TimValueCallback<V2TimMsgCreateInfoResult> createCustomMessageRes =
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createCustomMessage(
data: msg, // 文本信息
extension: extension,
);
if (createCustomMessageRes.code == 0) {
// 文本信息创建成功
String id = createCustomMessageRes.data!.id!;
// 发送文本消息
// 在sendMessage时若只填写receiver则发个人用户单聊消息
// 若只填写groupID则发群组消息
// 若填写了receiver与groupID则发群内的个人用户消息在群聊中显示只有指定receiver能看见
String receiveId = toConversation.userID!;
V2TimValueCallback<V2TimMessage> sendMessageRes = await TencentImSDKPlugin
.v2TIMManager
.getMessageManager()
.sendMessage(
id: id,
// 创建的messageid
receiver: toConversation.userID!,
// 接收人id
needReadReceipt: true,
isSupportMessageExtension: true,
groupID: '', // 是否需要已读回执
);
if (sendMessageRes.code == 0) {
// 发送成功
_onNew1v1Message(sendMessageRes.data);
} else {
SCTts.show(
'create fail,code:${sendMessageRes.code},${sendMessageRes.desc}',
);
}
}
}
///发送单聊图片消息
Future<void> sendImageMsg({
List<File>? selectedList,
File? file,
required V2TimConversation conversation,
}) async {
if (file != null) {
File newFile = await SCMessageUtils.createImageElem(file);
V2TimValueCallback<V2TimMsgCreateInfoResult> createImageMessageRes =
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createImageMessage(imagePath: newFile.path);
if (createImageMessageRes.code == 0) {
String id = createImageMessageRes.data!.id!;
V2TimValueCallback<V2TimMessage> sendMessageRes =
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.sendMessage(
id: id,
receiver: conversation.userID!,
needReadReceipt: true,
groupID: '',
);
if (sendMessageRes.code == 0) {
// 发送成功
_onNew1v1Message(sendMessageRes.data);
} else {
SCTts.show(
'create fail,code:${sendMessageRes.code},${sendMessageRes.desc}',
);
}
}
} else {
if (selectedList != null) {
for (File entity in selectedList) {
String id = "";
V2TimMessage? message;
//判断是视频或者图片消息
if (SCPathUtils.getFileType(entity.path) == "image") {
V2TimValueCallback<V2TimMsgCreateInfoResult> createImageMessageRes =
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createImageMessage(imagePath: entity.path);
if (createImageMessageRes.code == 0) {
message = createImageMessageRes.data?.messageInfo;
id = createImageMessageRes.data!.id!;
// 创建图片
File newFile = await SCMessageUtils.createImageElem(entity);
//发送
V2TimImageElem elem = V2TimImageElem(path: newFile.path);
message?.imageElem = elem;
}
} else if (SCPathUtils.getFileType(entity.path) == "video_pic") {
if (entity.lengthSync() > 50000000) {
SCTts.show(
SCAppLocalizations.of(context!)!.theVideoSizeCannotExceed,
);
return;
}
// 复制一份视频
String md5Str1 = keyToMd5(entity.path);
File newFile = File(
"${FileCacheManager.videoCachePath}/$md5Str1.mp4",
);
if (!newFile.existsSync()) {
await entity.copy(newFile.path);
}
// 创建缩略图
String? thumbImagePath = await SCMessageUtils.generateFileThumbnail(
newFile.path,
128,
);
V2TimValueCallback<V2TimMsgCreateInfoResult> createVideoMessageRes =
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createVideoMessage(
videoFilePath: entity.path,
type: "mp4",
duration: 0,
snapshotPath: thumbImagePath ?? "",
);
if (createVideoMessageRes.code == 0) {
message = createVideoMessageRes.data?.messageInfo;
id = createVideoMessageRes.data!.id!;
}
}
// 消息设置
message?.isSelf = true;
// message.conversation = conversation;
message?.status = MessageStatus.V2TIM_MSG_STATUS_SENDING;
print('组装完成,准备发送:${message?.toJson()}');
// String id = await FTIM.getMessageManager().sendMessage(message);
// message.msgId = id;
V2TimValueCallback<V2TimMessage> sendMessageRes =
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.sendMessage(
id: id,
receiver: conversation.userID!,
needReadReceipt: true,
groupID: '',
);
if (sendMessageRes.code == 0) {
// 发送成功
_onNew1v1Message(sendMessageRes.data);
} else {
SCTts.show(
'create fail,code:${sendMessageRes.code},${sendMessageRes.desc}',
);
}
}
}
}
notifyListeners();
}
// 发送消息(房间)
Future<void> _sendRoomMessage(Msg msg) async {
try {
if (msg.type == SCRoomMsgType.roomSettingUpdate) {
debugPrint(
"[Room Cover Sync] send roomSettingUpdate groupId=${msg.groupId ?? ""} roomId=${msg.msg ?? ""}",
);
}
var user = msg.user?.copyWith();
var toUser = msg.toUser?.copyWith();
user?.cleanWearHonor();
user?.cleanWearBadge();
user?.cleanPhotos();
toUser?.cleanWearHonor();
toUser?.cleanWearBadge();
toUser?.cleanUseProps();
toUser?.cleanPhotos();
msg.needUpDataUserInfo =
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).needUpDataUserInfo;
msg.user = user;
msg.toUser = toUser;
final textMsg = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createCustomMessage(data: jsonEncode(msg.toJson()));
if (textMsg.code != 0) return;
final sendResult = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.sendMessage(
id: textMsg.data!.id!,
groupID: msg.groupId!,
receiver: '',
);
if (sendResult.code == 0) {}
} catch (e) {
throw Exception("create fail: $e");
}
}
/// 添加消息
addMsg(Msg msg) {
roomAllMsgList.insert(0, msg);
if (roomAllMsgList.length > 250) {
print('大于200条消息');
roomAllMsgList.removeAt(roomAllMsgList.length - 1);
}
msgAllListener?.call(msg);
if (msg.type == SCRoomMsgType.text) {
roomChatMsgList.insert(0, msg);
if (roomChatMsgList.length > 250) {
print('大于200条消息');
roomChatMsgList.removeAt(roomChatMsgList.length - 1);
}
msgChatListener?.call(msg);
} else if (msg.type == SCRoomMsgType.image) {
roomChatMsgList.insert(0, msg);
if (roomChatMsgList.length > 250) {
print('大于200条消息');
roomChatMsgList.removeAt(roomChatMsgList.length - 1);
}
msgChatListener?.call(msg);
} else if (msg.type == SCRoomMsgType.gift) {
roomGiftMsgList.insert(0, msg);
if (roomGiftMsgList.length > 250) {
print('大于200条消息');
roomGiftMsgList.removeAt(roomGiftMsgList.length - 1);
}
msgGiftListener?.call(msg);
msgFloatingGiftListener?.call(msg);
}
}
bool isLogout = false;
logout() async {
V2TimCallback logoutRes = await TencentImSDKPlugin.v2TIMManager.logout();
TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.removeAdvancedMsgListener();
if (logoutRes.code == 0) {
isLogout = true;
}
}
///全服广播消息
_newBroadCastMsgRecv(String groupID, V2TimMessage message) {
try {
String? customData = message.customElem?.data;
if (customData != null && customData.isNotEmpty) {
final data = json.decode(customData);
var type = data["type"];
if (type == "SYS_ACTIVITY") {
if (onNewActivityMessageCurrentConversationListener != null) {
var recode = Records.fromJson(data["data"]);
onNewActivityMessageCurrentConversationListener?.call(recode);
} else {
activityUnReadCount = activityUnReadCount + 1;
allUnReadCount =
messageUnReadCount +
notifcationUnReadCount +
activityUnReadCount;
notifyListeners();
}
} else if (type == "SYS_ANNOUNCEMENT") {
if (onNewNotifcationMessageCurrentConversationListener != null) {
var recode = Records.fromJson(data["data"]);
onNewNotifcationMessageCurrentConversationListener?.call(recode);
} else {
notifcationUnReadCount = notifcationUnReadCount + 1;
allUnReadCount =
messageUnReadCount +
notifcationUnReadCount +
activityUnReadCount;
notifyListeners();
}
} else if (type == "GAME_BAISHUN_WIN") {
if (SCGlobalConfig.isReview) {
///审核状态不播放动画
return;
}
var fdata = data["data"];
var winCoins = fdata["currencyDiff"];
if (winCoins > 14999) {
///达到5000才飘屏
SCFloatingMessage msg = SCFloatingMessage(
type: 2,
userId: fdata["account"],
userAvatarUrl: fdata["userAvatar"],
userName: fdata["userNickname"],
giftUrl: fdata["gameUrl"],
roomId: fdata["roomId"],
coins: fdata["currencyDiff"],
);
OverlayManager().addMessage(msg);
}
} else if (type == "GAME_LUCKY_GIFT") {
} else if (type == "ROCKET_ENERGY_LAUNCH") {
///火箭触发飘屏
var fdata = data["data"];
SCFloatingMessage msg = SCFloatingMessage(
type: 3,
roomId: fdata["roomId"],
rocketLevel: fdata["fromLevel"],
userAvatarUrl: fdata["userAvatar"],
userName: fdata["nickname"],
userId: fdata["actualAccount"],
priority: 1000,
);
OverlayManager().addMessage(msg);
} else if (type == SCRoomMsgType.roomRedPacket) {
///红包触发飘屏
var fData = data["data"];
SCFloatingMessage msg = SCFloatingMessage(
type: 4,
roomId: fData["roomId"],
userAvatarUrl: fData["userAvatar"],
userName: fData["userNickname"],
userId: fData["actualAccount"],
toUserId: fData["packetId"],
priority: 1000,
);
if (msg.roomId ==
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).currenRoom?.roomProfile?.roomProfile?.id) {
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).loadRoomRedPacketList(1);
}
OverlayManager().addMessage(msg);
} else if (type == SCRoomMsgType.inviteRoom) {
///邀请进入房间
var fdata = data["data"];
SCFloatingMessage msg = SCFloatingMessage.fromJson(fdata);
if (msg.toUserId ==
AccountStorage().getCurrentUser()?.userProfile?.id &&
msg.roomId !=
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).currenRoom?.roomProfile?.roomProfile?.id) {
SmartDialog.dismiss(tag: "showInviteRoom");
SmartDialog.show(
tag: "showInviteRoom",
alignment: Alignment.center,
animationType: SmartAnimationType.fade,
builder: (_) {
return InviteRoomDialog(msg);
},
);
}
}
}
} catch (e) {}
}
_newGroupMsg(String groupID, V2TimMessage message) {
if (groupID !=
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).currenRoom?.roomProfile?.roomProfile?.roomAccount) {
return;
}
try {
String? customData = message.customElem?.data;
if (customData != null && customData.isNotEmpty) {
// 直接处理字符串格式的自定义数据
final data = json.decode(customData);
debugPrint(">>>>>>>>>>>>>>>>>>>消息类型${data["type"]}");
if (data["type"] == SCRoomMsgType.roomRedPacket) {
///房间红包
var fData = data["data"];
SCFloatingMessage msg = SCFloatingMessage(
type: 4,
roomId: fData["roomId"],
userAvatarUrl: fData["userAvatar"],
userName: fData["userNickname"],
userId: fData["actualAccount"],
toUserId: fData["packetId"],
priority: 1000,
);
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).loadRoomRedPacketList(1);
OverlayManager().addMessage(msg);
return;
}
Msg msg = Msg.fromJson(data);
if (msg.type == SCRoomMsgType.sendGift ||
msg.type == SCRoomMsgType.gameBurstCrystalSprint ||
msg.type == SCRoomMsgType.gameBurstCrystalBox) {
///这个消息暂时不监听
return;
}
if (msg.type == SCRoomMsgType.bsm) {
if (msg.toUser?.id ==
AccountStorage().getCurrentUser()?.userProfile?.id) {
SmartDialog.show(
tag: "showConfirmDialog",
alignment: Alignment.center,
debounce: true,
animationType: SmartAnimationType.fade,
builder: (_) {
return MsgDialog(
title: SCAppLocalizations.of(context!)!.tips,
msg: SCAppLocalizations.of(
context!,
)!.invitesYouToTheMicrophone(msg.msg ?? ""),
btnText: SCAppLocalizations.of(context!)!.confirm,
onEnsure: () {
///上麦
num index =
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).findWheat();
if (index > -1) {
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).shangMai(
index,
eventType: "INVITE",
inviterId: msg.role,
);
}
},
);
},
);
}
return;
}
if (msg.type == SCRoomMsgType.killXiaMai) {
///踢下麦
if (msg.msg == AccountStorage().getCurrentUser()?.userProfile?.id) {
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).engine?.setClientRole(role: ClientRoleType.clientRoleAudience);
}
// Provider.of<RealTimeCommunicationManager>(context!, listen: false).getMicList();
return;
}
if (msg.type == SCRoomMsgType.roomSettingUpdate) {
debugPrint(
"[Room Cover Sync] recv roomSettingUpdate groupId=$groupID roomId=${msg.msg ?? ""}",
);
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).loadRoomInfo(msg.msg ?? "");
return;
}
if (msg.type == SCRoomMsgType.roomBGUpdate) {
SCRoomThemeListRes res;
if ((msg.msg ?? "").isNotEmpty) {
res = SCRoomThemeListRes.fromJson(jsonDecode(msg.msg!));
} else {
res = SCRoomThemeListRes();
}
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).updateRoomBG(res);
return;
}
if (msg.type == SCRoomMsgType.emoticons) {
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).starPlayEmoji(msg);
return;
}
if (msg.type == SCRoomMsgType.micChange) {
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).micChange(BroadCastMicChangePush.fromJson(data).data?.mics);
} else if (msg.type == SCRoomMsgType.refreshOnlineUser) {
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).fetchOnlineUsersList();
} else if (msg.type == SCRoomMsgType.gameLuckyGift) {
var broadCastRes = SCBroadCastLuckGiftPush.fromJson(data);
msg.gift = SocialChatGiftRes(giftPhoto: broadCastRes.data?.giftCover);
msg.awardAmount = broadCastRes.data?.awardAmount;
msg.user = SocialChatUserProfile(
id: broadCastRes.data?.sendUserId,
userNickname: broadCastRes.data?.nickname,
);
msg.toUser = SocialChatUserProfile(
id: broadCastRes.data?.acceptUserId,
userNickname: broadCastRes.data?.acceptNickname,
);
addMsg(msg);
if ((broadCastRes.data?.multiple ?? 0) > 0) {
Msg msg2 = Msg(
groupId: '',
msg: '${broadCastRes.data?.multiple}',
type: SCRoomMsgType.gameLuckyGift_5,
);
///5倍率以上聊天页面需要发个消息
msg2.awardAmount = broadCastRes.data?.awardAmount;
msg2.user = SocialChatUserProfile(
id: broadCastRes.data?.sendUserId,
userNickname: broadCastRes.data?.nickname,
);
addMsg(msg2);
if ((broadCastRes.data?.multiple ?? 0) > 2) {
///3倍率
SCFloatingMessage msg = SCFloatingMessage(
type: 0,
userId: broadCastRes.data?.sendUserId,
roomId: broadCastRes.data?.roomId,
toUserId: broadCastRes.data?.acceptUserId,
userAvatarUrl: broadCastRes.data?.userAvatar,
userName: broadCastRes.data?.nickname,
toUserName: broadCastRes.data?.acceptNickname,
giftUrl: broadCastRes.data?.giftCover,
number: broadCastRes.data?.giftQuantity,
coins: broadCastRes.data?.awardAmount,
multiple: broadCastRes.data?.multiple,
);
OverlayManager().addMessage(msg);
addluckGiftPushQueue(broadCastRes);
}
}
if (broadCastRes.data?.sendUserId ==
AccountStorage().getCurrentUser()?.userProfile?.id) {
Provider.of<GiftProvider>(
context!,
listen: false,
).updateLuckyRewardAmount(msg.awardAmount ?? 0);
}
} else {
if (msg.type == SCRoomMsgType.joinRoom) {
if (msg.user != null) {
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).addOnlineUser(msg.groupId ?? "", msg.user!);
}
if (msgUserJoinListener != null) {
msgUserJoinListener!(msg);
}
///坐骑
if (msg.user?.getMountains() != null) {
if (SCGlobalConfig.isEntryVehicleAnimation) {
SCGiftVapSvgaManager().play(
msg.user?.getMountains()?.sourceUrl ?? "",
priority: 100,
type: 1,
);
}
}
} else if (msg.type == SCRoomMsgType.gift) {
final gift = msg.gift;
final special = gift?.special ?? "";
final giftSourceUrl = gift?.giftSourceUrl ?? "";
final hasSource = giftSourceUrl.isNotEmpty;
final hasAnimation = scGiftHasAnimationSpecial(special);
final hasGlobalGift = special.contains(SCGiftType.GLOBAL_GIFT.name);
final hasFullScreenEffect = scGiftHasFullScreenEffect(special);
_giftFxLog(
'recv gift msg '
'fromUserId=${msg.user?.id} '
'fromUserName=${msg.user?.userNickname} '
'toUserId=${msg.toUser?.id} '
'toUserName=${msg.toUser?.userNickname} '
'giftId=${gift?.id} '
'giftName=${gift?.giftName} '
'giftSourceUrl=$giftSourceUrl '
'special=$special '
'hasSource=$hasSource '
'hasAnimation=$hasAnimation '
'hasGlobalGift=$hasGlobalGift '
'hasFullScreenEffect=$hasFullScreenEffect '
'effectsEnabled=${SCGlobalConfig.isGiftSpecialEffects}',
);
if (msg.gift!.giftSourceUrl != null && msg.gift!.special != null) {
if (scGiftHasFullScreenEffect(msg.gift!.special)) {
if (SCGlobalConfig.isGiftSpecialEffects) {
_giftFxLog(
'trigger player play path=${msg.gift!.giftSourceUrl} '
'giftId=${msg.gift?.id} giftName=${msg.gift?.giftName}',
);
SCGiftVapSvgaManager().play(msg.gift!.giftSourceUrl!);
} else {
_giftFxLog(
'skip player play because isGiftSpecialEffects=false '
'giftId=${msg.gift?.id}',
);
}
} else {
_giftFxLog(
'skip player play because special does not include '
'${SCGiftType.ANIMSCION.name}/$kSCGiftAnimationSpecialAlias/${SCGiftType.GLOBAL_GIFT.name} '
'giftId=${msg.gift?.id} special=${msg.gift?.special}',
);
}
} else {
_giftFxLog(
'skip player play because giftSourceUrl or special is null '
'giftId=${msg.gift?.id} '
'giftSourceUrl=${msg.gift?.giftSourceUrl} '
'special=${msg.gift?.special}',
);
}
if (Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).currenRoom?.roomProfile?.roomSetting?.showHeartbeat ??
false) {
debouncer.debounce(
duration: Duration(milliseconds: 350),
onDebounce: () {
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).retrieveMicrophoneList();
},
);
}
num coins = msg.number! * msg.gift!.giftCandy!;
if (coins > 9999) {
OverlayManager().addMessage(
SCFloatingMessage(
type: 1,
userAvatarUrl: msg.user?.userAvatar ?? "",
userName: msg.user?.userNickname ?? "",
toUserName: msg.toUser?.userNickname ?? "",
toUserAvatarUrl: msg.toUser?.userAvatar ?? "",
giftUrl: msg.gift!.giftPhoto,
number: msg.number,
coins: coins,
roomId: msg.msg,
),
);
}
} else if (msg.type == SCRoomMsgType.luckGiftAnimOther) {
if (Provider.of<GiftProvider>(
context!,
listen: false,
).hideLGiftAnimal) {
return;
}
eventBus.fire(
GiveRoomLuckWithOtherEvent(
msg.gift?.giftPhoto ?? "",
(jsonDecode(msg.msg ?? "") as List)
.map((e) => e as String)
.toList(),
),
);
return;
} else if (msg.type == SCRoomMsgType.roomRoleChange) {
///房间身份变动
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).retrieveMicrophoneList();
if (msg.toUser?.id ==
AccountStorage().getCurrentUser()?.userProfile?.id) {
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).currenRoom?.entrants?.setRoles(msg.msg);
if (msg.msg == SCRoomRolesType.TOURIST.name &&
!(Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).currenRoom?.roomProfile?.roomSetting?.touristMike ??
false)) {
///如果变成了游客,房间又是禁止游客上麦,需要下麦
num index = Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).userOnMaiInIndex(
AccountStorage().getCurrentUser()?.userProfile?.id ?? "",
);
if (index > -1) {
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).xiaMai(index);
}
}
}
} else if (msg.type == SCRoomMsgType.roomDice) {
if ((msg.number ?? -1) > -1) {
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).starPlayEmoji(msg);
}
} else if (msg.type == SCRoomMsgType.roomRPS) {
if ((msg.number ?? -1) > -1) {
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).starPlayEmoji(msg);
}
}
addMsg(msg);
}
}
} catch (e) {
throw Exception("message parser fail: $e");
}
}
///加入全服广播群
joinBigBroadcastGroup() async {
bool joined = false;
while (!isLogout && !joined) {
await Future.delayed(Duration(milliseconds: 550));
try {
var joinResult = await TencentImSDKPlugin.v2TIMManager.joinGroup(
groupID: SCGlobalConfig.bigBroadcastGroup,
message: "",
);
if (joinResult.code == 0) {
joined = true;
}
} catch (e) {
//print('timm 登录异常:${e.toString()}');
SCTts.show('broadcastGroup join fail${e.toString()}');
}
}
}
///发送全服消息
sendBigBroadcastGroup(BigBroadcastGroupMessage msg) async {
try {
final textMsg = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createCustomMessage(data: jsonEncode(msg.toJson()));
if (textMsg.code != 0) return;
final sendResult = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.sendMessage(
id: textMsg.data!.id!,
groupID: SCGlobalConfig.bigBroadcastGroup,
receiver: '',
);
if (sendResult.code == 0) {}
} catch (e) {
throw Exception("create fail: $e");
}
}
Future quitGroup(String groupID) async {
await TencentImSDKPlugin.v2TIMManager.quitGroup(groupID: groupID);
}
///清屏
void clearMessage() {
roomAllMsgList.clear();
roomChatMsgList.clear();
roomGiftMsgList.clear();
msgChatListener?.call(Msg(groupId: "-1000", msg: "", type: ""));
msgAllListener?.call(Msg(groupId: "-1000", msg: "", type: ""));
msgGiftListener?.call(Msg(groupId: "-1000", msg: "", type: ""));
notifyListeners();
}
cleanRoomData() {
roomAllMsgList.clear();
roomGiftMsgList.clear();
roomChatMsgList.clear();
_luckGiftPushQueue.clear();
currentPlayingLuckGift = null;
onNewMessageListenerGroupMap.forEach((k, v) {
v = null;
});
onNewMessageListenerGroupMap.clear();
}
void addluckGiftPushQueue(SCBroadCastLuckGiftPush broadCastRes) {
if (SCGlobalConfig.isLuckGiftSpecialEffects) {
_luckGiftPushQueue.add(broadCastRes);
playLuckGiftBackCoins();
}
}
void cleanLuckGiftBackCoins() {
_luckGiftPushQueue.clear();
}
bool showLuckGiftBigHead = true;
void playLuckGiftBackCoins() {
if (currentPlayingLuckGift != null || _luckGiftPushQueue.isEmpty) {
return;
}
currentPlayingLuckGift = _luckGiftPushQueue.removeFirst();
notifyListeners();
Future.delayed(Duration(milliseconds: 2300), () {
showLuckGiftBigHead = false;
});
Future.delayed(Duration(milliseconds: 3000), () {
currentPlayingLuckGift = null;
showLuckGiftBigHead = true;
notifyListeners();
playLuckGiftBackCoins();
});
}
void updateNotificationCount(int count) {
notifcationUnReadCount = 0;
allUnReadCount =
messageUnReadCount + notifcationUnReadCount + activityUnReadCount;
notifyListeners();
}
void updateActivityCount(int count) {
activityUnReadCount = 0;
allUnReadCount =
messageUnReadCount + notifcationUnReadCount + activityUnReadCount;
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;
customerUnReadCount = 0;
notifyListeners();
}
void clearC2CHistoryMessage(String conversationID, bool needShowToast) async {
// 清空单聊本地及云端的消息(不删除会话)
V2TimCallback clearC2CHistoryMessageRes = await TencentImSDKPlugin
.v2TIMManager
.getConversationManager()
.deleteConversation(conversationID: conversationID); // 需要清空记录的用户id
if (clearC2CHistoryMessageRes.code == 0) {
// 清除成功
if (needShowToast) {
SCTts.show(SCAppLocalizations.of(context!)!.operationSuccessful);
}
initConversation();
} else {
// 清除失败,可以查看 clearC2CHistoryMessageRes.desc 获取错误描述
}
}
}