sendMessage method

Future<V2TimValueCallback<V2TimMessage>> sendMessage({
  1. String? id,
  2. V2TimMessage? message,
  3. void onSyncMsgID(
    1. String msgID
    )?,
  4. required String? receiver,
  5. required String? groupID,
  6. int priority = 0,
  7. bool onlineUserOnly = false,
  8. OfflinePushInfo? offlinePushInfo,
  9. bool? isExcludedFromUnreadCount,
  10. bool? isExcludedFromLastMessage,
  11. bool? isSupportMessageExtension,
  12. bool? isExcludedFromContentModeration,
  13. bool? needReadReceipt,
  14. String? cloudCustomData,
  15. String? localCustomData,
  16. bool? isDisableCloudMessagePreHook,
  17. bool? isDisableCloudMessagePostHook,
})

Implementation

Future<V2TimValueCallback<V2TimMessage>> sendMessage({
  String? id,
  V2TimMessage? message,
  void Function(String msgID)? onSyncMsgID,
  required String? receiver,
  required String? groupID,
  int priority = 0,
  bool onlineUserOnly = false,
  OfflinePushInfo? offlinePushInfo,
  bool? isExcludedFromUnreadCount,
  bool? isExcludedFromLastMessage,
  bool? isSupportMessageExtension,
  bool? isExcludedFromContentModeration,
  bool? needReadReceipt,
  String? cloudCustomData,
  String? localCustomData,
  bool? isDisableCloudMessagePreHook,
  bool? isDisableCloudMessagePostHook,
}) async {
  if (!TIMManager.instance.isInitSDK()) {
    return V2TimValueCallback<V2TimMessage>(code: TIMErrCode.ERR_SDK_NOT_INITIALIZED.value, desc: "sdk not init");
  }

  // 如果传入的 message 为空,则从 messageIDMap 中获取
  if (message == null) {
    if (id == null) {
      print('sendMessage, message and id are both empty');
      return V2TimValueCallback<V2TimMessage>.fromBool(false, 'message and id are both empty');
    }

    message = messageIDMap[id];
    if (message == null) {
      print('sendMessage, messageIDMap cannot find message of id: $id');
      return V2TimValueCallback<V2TimMessage>.fromBool(false, 'messageIDMap cannot find message');
    }
  }

  message.priority = priority;
  message.isOnlineOnly = onlineUserOnly;
  if (isExcludedFromUnreadCount != null) {
    message.isExcludedFromUnreadCount = isExcludedFromUnreadCount;
  }

  if (isExcludedFromLastMessage != null) {
    message.isExcludedFromLastMessage = isExcludedFromLastMessage;
  }

  if (isSupportMessageExtension != null) {
    message.isSupportMessageExtension = isSupportMessageExtension;
  }

  if (needReadReceipt != null) {
    message.needReadReceipt = needReadReceipt;
  }

  if (isDisableCloudMessagePreHook != null) {
    message.isDisableCloudMessagePreHook = isDisableCloudMessagePreHook;
  }

  if (isDisableCloudMessagePostHook != null) {
    message.isDisableCloudMessagePostHook = isDisableCloudMessagePostHook;
  }

  if (cloudCustomData != null) {
    message.cloudCustomData = cloudCustomData;
  }

  if (localCustomData != null) {
    message.localCustomData = localCustomData;
  }

  if (offlinePushInfo != null) {
    message.offlinePushInfo = offlinePushInfo;
  }

  if ((receiver == null || receiver.isEmpty) && (groupID == null || groupID.isEmpty)) {
    print('sendMessage, receiver and groupID cannot be empty at the same time');
    return V2TimValueCallback<V2TimMessage>.fromBool(
        false, 'sendMessage, receiver and groupID cannot be empty at the same time');
  }

  String convID = "";
  TIMConvType timConvType = TIMConvType.kTIMConv_Group;
  if (groupID != null && groupID.isNotEmpty) {
    convID = groupID;
    timConvType = TIMConvType.kTIMConv_Group;
  } else {
    convID = receiver!;
    timConvType = TIMConvType.kTIMConv_C2C;
  }

  String userData = Tools.generateUserData('sendMessage');
  Completer<V2TimValueCallback<V2TimMessage>> completer = Completer();
  void handleApiCallback(Map jsonResult) {
    V2TimValueCallback<V2TimMessage> callbackResult = V2TimValueCallback<V2TimMessage>.fromJson(jsonResult);
    if (callbackResult.data != null) {
      callbackResult.data!.id = id;
    }
    completer.complete(callbackResult);
  }

  NativeLibraryManager.timApiValueCallback2Future(userData, handleApiCallback);

  Pointer<Char> pConvID = Tools.string2PointerChar(convID);
  Pointer<Char> pMsgParam = Tools.string2PointerChar(json.encode(message!.toJson()));
  Pointer<Void> pUserData = Tools.string2PointerVoid(userData);
  Pointer<Char> pMessageID =
      NativeLibraryManager.bindings.DartSendMessage(pConvID, timConvType, pMsgParam, pUserData);
  String messageIDDart = Tools.pointerChar2String(pMessageID);
  if (onSyncMsgID != null) {
    onSyncMsgID.call(messageIDDart);
  }

  // 转发消息给多个人的时候,会重复使用一个 id
  if (false == (message.isForwardMessage ?? false)) {
    messageIDMap.remove(id);
  }

  return completer.future;
}