invoke method

Future<Map> invoke(
  1. String method, {
  2. Map? parameters,
  3. required int clientId,
  4. bool isVoid = false,
  5. Duration? delayDuration,
  6. Duration? invokeTimeOut,
  7. bool? isUseCache,
  8. Duration? durationCacheExpire,
  9. String? extra,
  10. bool? isAutoGetChat,
  11. bool? isInvokeThrowOnError,
  12. FutureOr<String> onGenerateExtraInvoke(
    1. int client_id,
    2. TdlibNative libTdJson
    )?,
  13. FutureOr<Map> onGetInvokeData(
    1. String extra,
    2. int client_id,
    3. TdlibNative libTdJson
    )?,
})

call api latest Tdlib-Methods example:

tg.invoke(
 "getChat",
 parameters: {
   "chat_id": 0,
 },
 clientId: tg.client_id,
);

Implementation

Future<Map> invoke(
  String method, {
  Map? parameters,
  required int clientId,
  bool isVoid = false,
  Duration? delayDuration,
  Duration? invokeTimeOut,
  bool? isUseCache,
  Duration? durationCacheExpire,
  String? extra,
  bool? isAutoGetChat,
  bool? isInvokeThrowOnError,
  FutureOr<String> Function(int client_id, TdlibNative libTdJson)?
      onGenerateExtraInvoke,
  FutureOr<Map> Function(String extra, int client_id, TdlibNative libTdJson)?
      onGetInvokeData,
}) async {
  isUseCache ??= false;
  isInvokeThrowOnError ??= is_invoke_throw_on_error;
  onGetInvokeData ??= on_get_invoke_data;
  onGenerateExtraInvoke ??= on_generate_extra_invoke;
  isAutoGetChat ??= is_auto_get_chat;

  invokeTimeOut ??= invoke_time_out;
  parameters ??= {};

  String extra_id = "";

  bool is_set_extra_from_function = false;
  if (parameters["@extra"] is String == false) {
    if (extra != null) {
      extra_id = extra;
    } else if (onGenerateExtraInvoke != null) {
      extra_id = (await onGenerateExtraInvoke(clientId, this));
      is_set_extra_from_function = true;
    } else {
      extra_id = generateUuid(15);
    }
    parameters["@extra"] = extra_id;
  } else {
    extra_id = parameters["@extra"];
  }

  if (extra_id.isEmpty) {
    if (is_set_extra_from_function == false) {
      if (onGenerateExtraInvoke != null) {
        extra_id = (await onGenerateExtraInvoke(clientId, this));
      }
    }
  }
  if (extra_id.isEmpty) {
    extra_id = generateUuid(15);
    parameters["@extra"] = extra_id;
  }

  if (isAutoGetChat &&
      RegExp(r"^(sendMessage|getChatMember)$", caseSensitive: false)
          .hashData(method)) {
    if (parameters["chat_id"] is int) {
      td_send(
        clientId,
        {
          "@type": "getChat",
          "chat_id": parameters["chat_id"],
        },
      );
    }
    if (parameters["user_id"] is int) {
      td_send(
        clientId,
        {
          "@type": "getUser",
          "user_id": parameters["user_id"],
        },
      );
    }
  }

  Map requestMethod = {
    "@type": method,
    "client_id": clientId,
    ...parameters,
  };

  if (isVoid) {
    td_send(
      clientId,
      requestMethod,
    );
    return {
      "@type": "ok",
      "@extra": extra,
    };
  }
  Map result = {};
  if (onGetInvokeData != null) {
    td_send(
      clientId,
      requestMethod,
    );
    return await onGetInvokeData(extra_id, clientId, this);
  }
  on(event_invoke, (UpdateTd update) async {
    try {
      if (update.client_id == clientId) {
        Map updateOrigin = update.raw;
        if (updateOrigin["@extra"] == extra_id) {
          updateOrigin.remove("@extra");
          updateOrigin.remove("@client_id");
          result = updateOrigin;
        }
      }
    } catch (e) {
      result["@type"] = "error";
    }
  });
  td_send(
    clientId,
    requestMethod,
  );
  task_increase();
  throw result;
}