This commit is contained in:
2025-06-30 16:24:20 +08:00
commit 68de5eb048
454 changed files with 56921 additions and 0 deletions
@@ -0,0 +1,685 @@
// ignore_for_file: deprecated_member_use
import 'dart:math';
import 'package:flutter/foundation.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimAdvancedMsgListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimSimpleMsgListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/get_group_message_read_member_list_filter.dart';
import 'package:tencent_cloud_chat_sdk/enum/history_msg_get_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_priority_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/offlinePushInfo.dart';
import 'package:tencent_cloud_chat_sdk/enum/receive_message_opt_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_message_read_member_list.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_message_read_member_list.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_change_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_change_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_list_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_list_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_online_url.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_online_url.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_receipt.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_receipt.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_msg_create_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_msg_create_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_callback.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_conversation_view_model.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart';
import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart';
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/error_message_converter.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart';
class MessageServiceImpl extends MessageService {
final CoreServicesImpl _coreService = serviceLocator<CoreServicesImpl>();
final Map<String, List<V2TimMessage>> messageListMap = {};
final Map<String, List<V2TimMessage>> sendingMessage = {};
@override
Future<MessageListResponse> getHistoryMessageListV2({
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq = -1,
required int count,
String? lastMsgID,
List<int>? messageTypeList,
}) async {
bool haveMoreData = true;
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().getHistoryMessageList(
count: count,
getType: getType,
userID: userID,
groupID: groupID,
lastMsgID: lastMsgID,
lastMsgSeq: lastMsgSeq,
messageTypeList: messageTypeList);
final List<V2TimMessage> responseMessageList = res.data ?? [];
final conversationID = userID ?? groupID;
final cachedMessageList = messageListMap[conversationID];
List<V2TimMessage> combinedMessageList = [];
// 加载更多
if (lastMsgID != null && cachedMessageList != null) {
combinedMessageList = [...cachedMessageList, ...responseMessageList];
// 首次加载
} else {
final bool existSendingMessage =
sendingMessage[conversationID] != null && sendingMessage[conversationID]!.isNotEmpty;
// 存在未发送完成的消息
if (existSendingMessage) {
combinedMessageList = [...sendingMessage[conversationID]!, ...responseMessageList];
} else {
sendingMessage.remove(conversationID);
combinedMessageList = responseMessageList;
}
}
if (res.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
}
if (responseMessageList.isEmpty ||
(!PlatformUtils().isWeb && responseMessageList.length < count) ||
(PlatformUtils().isWeb && responseMessageList.length < min(count, 20))) {
haveMoreData = false;
} else {
haveMoreData = true;
}
return MessageListResponse(haveMoreData: haveMoreData, data: combinedMessageList);
}
@override
Future<List<V2TimMessage>> getHistoryMessageList({
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq = -1,
required int count,
String? lastMsgID,
List<int>? messageTypeList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().getHistoryMessageList(
count: count,
getType: getType,
userID: userID,
groupID: groupID,
lastMsgID: lastMsgID,
lastMsgSeq: lastMsgSeq,
messageTypeList: messageTypeList);
final reponseMessageList = res.data ?? [];
if (res.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
}
return reponseMessageList;
}
@override
Future<V2TimMessageListResult?> getHistoryMessageListWithComplete({
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq = 0,
required int count,
String? lastMsgID,
List<int>? messageTypeList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().getHistoryMessageListV2(
count: count,
getType: getType,
userID: userID,
groupID: groupID,
lastMsgID: lastMsgID,
lastMsgSeq: lastMsgSeq,
messageTypeList: messageTypeList);
final responseMessageList = res.data;
if (res.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
}
return responseMessageList;
}
@override
Future addSimpleMsgListener({
required V2TimSimpleMsgListener listener,
}) async {
return TencentImSDKPlugin.v2TIMManager.addSimpleMsgListener(listener: listener);
}
@override
Future<void> removeSimpleMsgListener({V2TimSimpleMsgListener? listener}) {
return TencentImSDKPlugin.v2TIMManager.removeSimpleMsgListener(listener: listener);
}
@override
Future<void> addAdvancedMsgListener({
required V2TimAdvancedMsgListener listener,
}) {
return TencentImSDKPlugin.v2TIMManager.getMessageManager().addAdvancedMsgListener(listener: listener);
}
@override
Future<V2TimValueCallback<V2TimGroupMessageReadMemberList>> getGroupMessageReadMemberList({
required String messageID,
required GetGroupMessageReadMemberListFilter filter,
int nextSeq = 0,
int count = 100,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.getGroupMessageReadMemberList(messageID: messageID, filter: filter, nextSeq: nextSeq, count: count);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimValueCallback<List<V2TimMessageReceipt>>> getMessageReadReceipts({
required List<String> messageIDList,
}) async {
final result =
await TencentImSDKPlugin.v2TIMManager.getMessageManager().getMessageReadReceipts(messageIDList: messageIDList);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> sendMessageReadReceipts({
required List<String> messageIDList,
}) async {
return _retryMarkMessageAsRead(action: () {
return TencentImSDKPlugin.v2TIMManager.getMessageManager().sendMessageReadReceipts(messageIDList: messageIDList);
});
}
@override
Future<V2TimMsgCreateInfoResult?> createTextMessage({required String text}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createTextMessage(text: text);
if (res.code == 0) {
final messageResult = res.data;
return messageResult;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimMsgCreateInfoResult?> createCustomMessage({required String data}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createCustomMessage(data: data);
if (res.code == 0) {
final messageResult = res.data;
return messageResult;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimMsgCreateInfoResult?> createFaceMessage({required int index, required String data}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createFaceMessage(index: index, data: data);
if (res.code == 0) {
final messageResult = res.data;
return messageResult;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimValueCallback<V2TimMessage>> reSendMessage({required String msgID, bool? onlineUserOnly}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.reSendMessage(msgID: msgID, onlineUserOnly: onlineUserOnly ?? false);
if (res.code != 0) {
String recommendText = ErrorMessageConverter.getErrorMessage(res.code);
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code, infoRecommendText: recommendText));
}
return res;
}
@override
Future<V2TimMsgCreateInfoResult?> createTextAtMessage(
{required String text, required List<String> atUserList}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createTextAtMessage(text: text, atUserList: atUserList);
if (res.code == 0) {
final messageResult = res.data;
return messageResult;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimMsgCreateInfoResult?> createImageMessage(
{String? imageName, String? imagePath, dynamic inputElement}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createImageMessage(imageName: imageName, imagePath: imagePath ?? "", inputElement: inputElement);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimMsgCreateInfoResult?> createSoundMessage({
required String soundPath,
required int duration,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createSoundMessage(soundPath: soundPath, duration: duration);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimValueCallback<V2TimMessage>> sendMessage({
required String id, // 自己创建的ID
required String receiver,
required String groupID,
MessagePriorityEnum priority = MessagePriorityEnum.V2TIM_PRIORITY_NORMAL,
bool onlineUserOnly = false,
bool isExcludedFromUnreadCount = false,
bool needReadReceipt = false,
OfflinePushInfo? offlinePushInfo,
String? cloudCustomData,
String? localCustomData,
bool isExcludedFromContentModeration = false,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().sendMessage(
id: id,
receiver: receiver,
groupID: groupID,
priority: priority,
onlineUserOnly: onlineUserOnly,
offlinePushInfo: offlinePushInfo,
needReadReceipt: needReadReceipt,
localCustomData: localCustomData,
cloudCustomData: cloudCustomData,
isExcludedFromContentModeration: isExcludedFromContentModeration,
);
if (result.code != 0) {
String recommendText = ErrorMessageConverter.getErrorMessage(result.code);
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code,
infoRecommendText: recommendText));
}
return result;
}
@override
Future<V2TimCallback> deleteMessageFromLocalStorage({
required String msgID,
Object? webMessageInstance,
}) async {
V2TimCallback result;
if (kIsWeb) {
result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.deleteMessages(msgIDs: [], webMessageInstanceList: [webMessageInstance]);
} else {
result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().deleteMessageFromLocalStorage(msgID: msgID);
}
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> revokeMessage({required String msgID, Object? webMessageInstance}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.revokeMessage(msgID: msgID, webMessageInstatnce: webMessageInstance);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> clearC2CHistoryMessage({
required String userID,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().clearC2CHistoryMessage(userID: userID);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> clearGroupHistoryMessage({
required String groupID,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().clearGroupHistoryMessage(groupID: groupID);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
Future<V2TimCallback> _retryMarkMessageAsRead({
required Future<V2TimCallback> Function() action,
int retries = 3,
}) async {
V2TimCallback result;
int attempts = 0;
do {
result = await action();
if (result.code == 0) {
return result;
}
attempts++;
await Future.delayed(const Duration(milliseconds: 500));
} while (attempts < retries);
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
return result;
}
@override
Future<V2TimCallback> markC2CMessageAsRead({
required String userID,
}) {
return _retryMarkMessageAsRead(action: () {
return TencentImSDKPlugin.v2TIMManager.getConversationManager().cleanConversationUnreadMessageCount(
conversationID: "${TUIConversationViewModel.conversationC2CPrefix}$userID",
cleanTimestamp: 0,
cleanSequence: 0,
);
});
}
@override
Future<V2TimCallback> markGroupMessageAsRead({
required String groupID,
}) {
return _retryMarkMessageAsRead(action: () {
return TencentImSDKPlugin.v2TIMManager.getConversationManager().cleanConversationUnreadMessageCount(
conversationID: "${TUIConversationViewModel.conversationGroupPrefix}$groupID",
cleanTimestamp: 0,
cleanSequence: 0,
);
});
}
@override
Future<void> removeAdvancedMsgListener({V2TimAdvancedMsgListener? listener}) async {
final result =
await TencentImSDKPlugin.v2TIMManager.getMessageManager().removeAdvancedMsgListener(listener: listener);
return result;
}
@override
Future<List<V2TimMessage>?> downloadMergerMessage({
required String msgID,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().downloadMergerMessage(msgID: msgID);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimMsgCreateInfoResult?> createForwardMessage({
required String msgID,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createForwardMessage(msgID: msgID);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimMsgCreateInfoResult?> createMergerMessage({
required List<String> msgIDList,
required String title,
required List<String> abstractList,
required String compatibleText,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createMergerMessage(
msgIDList: msgIDList, title: title, abstractList: abstractList, compatibleText: compatibleText);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimCallback> deleteMessages({required List<String> msgIDs, List<dynamic>? webMessageInstanceList}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.deleteMessages(msgIDs: msgIDs, webMessageInstanceList: webMessageInstanceList);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimMsgCreateInfoResult?> createVideoMessage(
{String? videoPath, String? type, int? duration, String? snapshotPath, dynamic inputElement}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createVideoMessage(
videoFilePath: videoPath ?? "",
type: type ?? "",
duration: duration ?? 1,
snapshotPath: snapshotPath ?? "",
inputElement: inputElement);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimValueCallback<V2TimMessage>> sendReplyMessage({
required String id, // 自己创建的ID
required String receiver,
required String groupID,
OfflinePushInfo? offlinePushInfo,
bool needReadReceipt = false,
required V2TimMessage replyMessage, // 被回复的消息
}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().sendReplyMessage(
id: id,
receiver: receiver,
offlinePushInfo: offlinePushInfo,
groupID: groupID,
needReadReceipt: needReadReceipt,
replyMessage: replyMessage);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimMsgCreateInfoResult?> createFileMessage(
{String? filePath, required String fileName, dynamic inputElement}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createFileMessage(filePath: filePath ?? "", fileName: fileName, inputElement: inputElement);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimMsgCreateInfoResult?> createLocationMessage(
{required String desc, required double longitude, required double latitude}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createLocationMessage(desc: desc, longitude: longitude, latitude: latitude);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimValueCallback<V2TimMessageSearchResult>> searchLocalMessages(
{required V2TimMessageSearchParam searchParam}) async {
final result =
await TencentImSDKPlugin.v2TIMManager.getMessageManager().searchLocalMessages(searchParam: searchParam);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<List<V2TimMessage>?> findMessages({
required List<String> messageIDList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().findMessages(messageIDList: messageIDList);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimCallback> setLocalCustomInt({required String msgID, required int localCustomInt}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.setLocalCustomInt(msgID: msgID, localCustomInt: localCustomInt);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> setC2CReceiveMessageOpt({
required List<String> userIDList,
required ReceiveMsgOptEnum opt,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.setC2CReceiveMessageOpt(userIDList: userIDList, opt: opt);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> setGroupReceiveMessageOpt({
required String groupID,
required ReceiveMsgOptEnum opt,
}) async {
final result =
await TencentImSDKPlugin.v2TIMManager.getMessageManager().setGroupReceiveMessageOpt(groupID: groupID, opt: opt);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimValueCallback<V2TimMessageChangeInfo>> modifyMessage({required V2TimMessage message}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().modifyMessage(message: message);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> setLocalCustomData({required String msgID, required String localCustomData}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.setLocalCustomData(msgID: msgID, localCustomData: localCustomData);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimValueCallback<V2TimMessageOnlineUrl>> getMessageOnlineUrl({required String msgID}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().getMessageOnlineUrl(msgID: msgID);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> downloadMessage(
{required String msgID, required int messageType, required int imageType, required bool isSnapshot}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.downloadMessage(msgID: msgID, messageType: messageType, imageType: imageType, isSnapshot: isSnapshot);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<String> translateText(String text, String target) async {
final result =
await TencentImSDKPlugin.v2TIMManager.getMessageManager().translateText(texts: [text], targetLanguage: target);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result.data?[text] ?? "";
}
}
@@ -0,0 +1,220 @@
import 'package:tencent_cloud_chat_sdk/enum/V2TimAdvancedMsgListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimSimpleMsgListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/get_group_message_read_member_list_filter.dart';
import 'package:tencent_cloud_chat_sdk/enum/history_msg_get_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_priority_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/offlinePushInfo.dart';
import 'package:tencent_cloud_chat_sdk/enum/receive_message_opt_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_message_read_member_list.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_message_read_member_list.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_change_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_change_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_list_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_list_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_online_url.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_online_url.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_receipt.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_receipt.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_msg_create_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_msg_create_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
class MessageListResponse {
final bool haveMoreData;
final List<V2TimMessage> data;
MessageListResponse({required this.haveMoreData, required this.data});
}
abstract class MessageService {
Future<List<V2TimMessage>> getHistoryMessageList({
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq,
required int count,
String? lastMsgID,
List<int>? messageTypeList,
});
Future<V2TimMessageListResult?> getHistoryMessageListWithComplete({
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq,
required int count,
String? lastMsgID,
List<int>? messageTypeList,
});
Future<MessageListResponse> getHistoryMessageListV2({
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq,
required int count,
String? lastMsgID,
List<int>? messageTypeList,
});
Future addSimpleMsgListener({
required V2TimSimpleMsgListener listener,
});
Future addAdvancedMsgListener({
required V2TimAdvancedMsgListener listener,
});
Future<void> removeSimpleMsgListener({V2TimSimpleMsgListener? listener});
Future<V2TimMsgCreateInfoResult?> createTextMessage({required String text});
Future<V2TimMsgCreateInfoResult?> createFaceMessage({required int index, required String data});
Future<V2TimMsgCreateInfoResult?> createCustomMessage({required String data});
Future<V2TimMsgCreateInfoResult?> createTextAtMessage({required String text, required List<String> atUserList});
Future<V2TimValueCallback<V2TimMessage>> sendMessage(
{required String id, // 自己创建的ID
required String receiver,
required String groupID,
MessagePriorityEnum priority = MessagePriorityEnum.V2TIM_PRIORITY_NORMAL,
bool onlineUserOnly = false,
bool isExcludedFromUnreadCount = false,
bool needReadReceipt = false,
OfflinePushInfo? offlinePushInfo,
String? cloudCustomData, // 云自定义消息字段,只能在消息发送前添加
String? localCustomData,
bool isExcludedFromContentModeration});
Future<V2TimValueCallback<V2TimMessage>> sendReplyMessage({
required String id, // 自己创建的ID
required String receiver,
required String groupID,
OfflinePushInfo? offlinePushInfo,
bool needReadReceipt = false,
required V2TimMessage replyMessage, // 被回复的消息
});
Future<V2TimValueCallback<V2TimMessage>> reSendMessage({required String msgID, bool onlineUserOnly});
Future<V2TimValueCallback<V2TimMessageChangeInfo>> modifyMessage({required V2TimMessage message});
Future<V2TimMsgCreateInfoResult?> createImageMessage({String? imageName, String? imagePath, dynamic inputElement});
Future<V2TimMsgCreateInfoResult?> createVideoMessage(
{String? videoPath = "", String? type = "", int? duration = 0, String? snapshotPath = "", dynamic inputElement});
Future<V2TimMsgCreateInfoResult?> createFileMessage(
{String? filePath, required String fileName, dynamic inputElement});
Future<V2TimMsgCreateInfoResult?> createLocationMessage(
{required String desc, required double longitude, required double latitude});
Future<V2TimMsgCreateInfoResult?> createSoundMessage({
required String soundPath,
required int duration,
});
Future<V2TimMsgCreateInfoResult?> createForwardMessage({
required String msgID,
});
Future<V2TimMsgCreateInfoResult?> createMergerMessage({
required List<String> msgIDList,
required String title,
required List<String> abstractList,
required String compatibleText,
});
Future<V2TimCallback> deleteMessageFromLocalStorage({
required String msgID,
Object? webMessageInstance,
});
Future<V2TimCallback> revokeMessage({required String msgID, Object? webMessageInstance});
Future<V2TimCallback> clearC2CHistoryMessage({
required String userID,
});
Future<V2TimCallback> clearGroupHistoryMessage({
required String groupID,
});
Future<V2TimCallback> markC2CMessageAsRead({
required String userID,
});
Future<V2TimCallback> markGroupMessageAsRead({
required String groupID,
});
Future<void> removeAdvancedMsgListener({V2TimAdvancedMsgListener? listener});
Future<List<V2TimMessage>?> downloadMergerMessage({
required String msgID,
});
Future<V2TimCallback> deleteMessages({required List<String> msgIDs, List<dynamic>? webMessageInstanceList});
Future<List<V2TimMessage>?> findMessages({
required List<String> messageIDList,
});
Future<V2TimValueCallback<V2TimMessageSearchResult>> searchLocalMessages({
required V2TimMessageSearchParam searchParam,
});
Future<V2TimCallback> setLocalCustomInt({required String msgID, required int localCustomInt});
Future<V2TimCallback> setLocalCustomData({required String msgID, required String localCustomData});
Future<V2TimCallback> setC2CReceiveMessageOpt({
required List<String> userIDList,
required ReceiveMsgOptEnum opt,
});
Future<V2TimCallback> setGroupReceiveMessageOpt({
required String groupID,
required ReceiveMsgOptEnum opt,
});
Future<V2TimValueCallback<V2TimGroupMessageReadMemberList>> getGroupMessageReadMemberList({
required String messageID,
required GetGroupMessageReadMemberListFilter filter,
int nextSeq = 0,
int count = 100,
});
Future<V2TimValueCallback<List<V2TimMessageReceipt>>> getMessageReadReceipts({
required List<String> messageIDList,
});
Future<V2TimCallback> sendMessageReadReceipts({
required List<String> messageIDList,
});
Future<V2TimValueCallback<V2TimMessageOnlineUrl>> getMessageOnlineUrl({
required String msgID,
});
Future<V2TimCallback> downloadMessage({
required String msgID,
required int messageType,
required int imageType, // 图片类型,仅messageType为图片消息是有效
required bool isSnapshot, // 是否是视频封面,仅messageType为视频消息是有效
});
Future<String> translateText(String text, String target);
}