Return failed to add members in createNewBasicGroupChat.
This commit is contained in:
parent
69257ffa6a
commit
27721159bd
@ -1855,6 +1855,10 @@ failedToAddMember user_id:int53 premium_would_allow_invite:Bool premium_required
|
|||||||
failedToAddMembers failed_to_add_members:vector<failedToAddMember> = FailedToAddMembers;
|
failedToAddMembers failed_to_add_members:vector<failedToAddMember> = FailedToAddMembers;
|
||||||
|
|
||||||
|
|
||||||
|
//@description Contains information about a newly created basic group chat @chat_id Chat identifier @failed_to_add_members Information about failed to add members
|
||||||
|
createdBasicGroupChat chat_id:int53 failed_to_add_members:failedToAddMembers = CreatedBasicGroupChat;
|
||||||
|
|
||||||
|
|
||||||
//@description Describes a chat located nearby @chat_id Chat identifier @distance Distance to the chat location, in meters
|
//@description Describes a chat located nearby @chat_id Chat identifier @distance Distance to the chat location, in meters
|
||||||
chatNearby chat_id:int53 distance:int32 = ChatNearby;
|
chatNearby chat_id:int53 distance:int32 = ChatNearby;
|
||||||
|
|
||||||
@ -8538,11 +8542,11 @@ createSupergroupChat supergroup_id:int53 force:Bool = Chat;
|
|||||||
//@description Returns an existing chat corresponding to a known secret chat @secret_chat_id Secret chat identifier
|
//@description Returns an existing chat corresponding to a known secret chat @secret_chat_id Secret chat identifier
|
||||||
createSecretChat secret_chat_id:int32 = Chat;
|
createSecretChat secret_chat_id:int32 = Chat;
|
||||||
|
|
||||||
//@description Creates a new basic group and sends a corresponding messageBasicGroupChatCreate. Returns the newly created chat
|
//@description Creates a new basic group and sends a corresponding messageBasicGroupChatCreate. Returns information about the newly created chat
|
||||||
//@user_ids Identifiers of users to be added to the basic group; may be empty to create a basic group without other members
|
//@user_ids Identifiers of users to be added to the basic group; may be empty to create a basic group without other members
|
||||||
//@title Title of the new basic group; 1-128 characters
|
//@title Title of the new basic group; 1-128 characters
|
||||||
//@message_auto_delete_time Message auto-delete time value, in seconds; must be from 0 up to 365 * 86400 and be divisible by 86400. If 0, then messages aren't deleted automatically
|
//@message_auto_delete_time Message auto-delete time value, in seconds; must be from 0 up to 365 * 86400 and be divisible by 86400. If 0, then messages aren't deleted automatically
|
||||||
createNewBasicGroupChat user_ids:vector<int53> title:string message_auto_delete_time:int32 = Chat;
|
createNewBasicGroupChat user_ids:vector<int53> title:string message_auto_delete_time:int32 = CreatedBasicGroupChat;
|
||||||
|
|
||||||
//@description Creates a new supergroup or channel and sends a corresponding messageSupergroupChatCreate. Returns the newly created chat
|
//@description Creates a new supergroup or channel and sends a corresponding messageSupergroupChatCreate. Returns the newly created chat
|
||||||
//@title Title of the new chat; 1-128 characters
|
//@title Title of the new chat; 1-128 characters
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include "td/telegram/MessageTtl.h"
|
#include "td/telegram/MessageTtl.h"
|
||||||
#include "td/telegram/MinChannel.h"
|
#include "td/telegram/MinChannel.h"
|
||||||
#include "td/telegram/misc.h"
|
#include "td/telegram/misc.h"
|
||||||
|
#include "td/telegram/MissingInvitee.h"
|
||||||
#include "td/telegram/net/NetQuery.h"
|
#include "td/telegram/net/NetQuery.h"
|
||||||
#include "td/telegram/OptionManager.h"
|
#include "td/telegram/OptionManager.h"
|
||||||
#include "td/telegram/PeerColor.h"
|
#include "td/telegram/PeerColor.h"
|
||||||
@ -71,10 +72,11 @@
|
|||||||
namespace td {
|
namespace td {
|
||||||
|
|
||||||
class CreateChatQuery final : public Td::ResultHandler {
|
class CreateChatQuery final : public Td::ResultHandler {
|
||||||
Promise<td_api::object_ptr<td_api::chat>> promise_;
|
Promise<td_api::object_ptr<td_api::createdBasicGroupChat>> promise_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit CreateChatQuery(Promise<td_api::object_ptr<td_api::chat>> &&promise) : promise_(std::move(promise)) {
|
explicit CreateChatQuery(Promise<td_api::object_ptr<td_api::createdBasicGroupChat>> &&promise)
|
||||||
|
: promise_(std::move(promise)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void send(vector<tl_object_ptr<telegram_api::InputUser>> &&input_users, const string &title, MessageTtl message_ttl) {
|
void send(vector<tl_object_ptr<telegram_api::InputUser>> &&input_users, const string &title, MessageTtl message_ttl) {
|
||||||
@ -91,7 +93,8 @@ class CreateChatQuery final : public Td::ResultHandler {
|
|||||||
|
|
||||||
auto ptr = result_ptr.move_as_ok();
|
auto ptr = result_ptr.move_as_ok();
|
||||||
LOG(INFO) << "Receive result for CreateChatQuery: " << to_string(ptr);
|
LOG(INFO) << "Receive result for CreateChatQuery: " << to_string(ptr);
|
||||||
td_->messages_manager_->on_create_new_dialog(std::move(ptr->updates_), DialogType::Chat, std::move(promise_));
|
td_->messages_manager_->on_create_new_dialog(
|
||||||
|
std::move(ptr->updates_), MissingInvitees(std::move(ptr->missing_invitees_)), std::move(promise_), Auto());
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_error(Status status) final {
|
void on_error(Status status) final {
|
||||||
@ -134,7 +137,7 @@ class CreateChannelQuery final : public Td::ResultHandler {
|
|||||||
return on_error(result_ptr.move_as_error());
|
return on_error(result_ptr.move_as_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
td_->messages_manager_->on_create_new_dialog(result_ptr.move_as_ok(), DialogType::Channel, std::move(promise_));
|
td_->messages_manager_->on_create_new_dialog(result_ptr.move_as_ok(), Auto(), Auto(), std::move(promise_));
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_error(Status status) final {
|
void on_error(Status status) final {
|
||||||
@ -7459,7 +7462,7 @@ FileSourceId ChatManager::get_channel_full_file_source_id(ChannelId channel_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ChatManager::create_new_chat(const vector<UserId> &user_ids, const string &title, MessageTtl message_ttl,
|
void ChatManager::create_new_chat(const vector<UserId> &user_ids, const string &title, MessageTtl message_ttl,
|
||||||
Promise<td_api::object_ptr<td_api::chat>> &&promise) {
|
Promise<td_api::object_ptr<td_api::createdBasicGroupChat>> &&promise) {
|
||||||
auto new_title = clean_name(title, MAX_TITLE_LENGTH);
|
auto new_title = clean_name(title, MAX_TITLE_LENGTH);
|
||||||
if (new_title.empty()) {
|
if (new_title.empty()) {
|
||||||
return promise.set_error(Status::Error(400, "Title must be non-empty"));
|
return promise.set_error(Status::Error(400, "Title must be non-empty"));
|
||||||
@ -7467,11 +7470,8 @@ void ChatManager::create_new_chat(const vector<UserId> &user_ids, const string &
|
|||||||
|
|
||||||
vector<telegram_api::object_ptr<telegram_api::InputUser>> input_users;
|
vector<telegram_api::object_ptr<telegram_api::InputUser>> input_users;
|
||||||
for (auto user_id : user_ids) {
|
for (auto user_id : user_ids) {
|
||||||
auto r_input_user = td_->user_manager_->get_input_user(user_id);
|
TRY_RESULT_PROMISE(promise, input_user, td_->user_manager_->get_input_user(user_id));
|
||||||
if (r_input_user.is_error()) {
|
input_users.push_back(std::move(input_user));
|
||||||
return promise.set_error(r_input_user.move_as_error());
|
|
||||||
}
|
|
||||||
input_users.push_back(r_input_user.move_as_ok());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
td_->create_handler<CreateChatQuery>(std::move(promise))->send(std::move(input_users), new_title, message_ttl);
|
td_->create_handler<CreateChatQuery>(std::move(promise))->send(std::move(input_users), new_title, message_ttl);
|
||||||
|
@ -297,7 +297,7 @@ class ChatManager final : public Actor {
|
|||||||
vector<DialogId> get_inactive_channels(Promise<Unit> &&promise);
|
vector<DialogId> get_inactive_channels(Promise<Unit> &&promise);
|
||||||
|
|
||||||
void create_new_chat(const vector<UserId> &user_ids, const string &title, MessageTtl message_ttl,
|
void create_new_chat(const vector<UserId> &user_ids, const string &title, MessageTtl message_ttl,
|
||||||
Promise<td_api::object_ptr<td_api::chat>> &&promise);
|
Promise<td_api::object_ptr<td_api::createdBasicGroupChat>> &&promise);
|
||||||
|
|
||||||
bool have_chat(ChatId chat_id) const;
|
bool have_chat(ChatId chat_id) const;
|
||||||
bool have_chat_force(ChatId chat_id, const char *source);
|
bool have_chat_force(ChatId chat_id, const char *source);
|
||||||
|
@ -55,6 +55,7 @@
|
|||||||
#include "td/telegram/MessageReplyInfo.hpp"
|
#include "td/telegram/MessageReplyInfo.hpp"
|
||||||
#include "td/telegram/MessageSender.h"
|
#include "td/telegram/MessageSender.h"
|
||||||
#include "td/telegram/misc.h"
|
#include "td/telegram/misc.h"
|
||||||
|
#include "td/telegram/MissingInvitee.h"
|
||||||
#include "td/telegram/net/DcId.h"
|
#include "td/telegram/net/DcId.h"
|
||||||
#include "td/telegram/NotificationGroupInfo.hpp"
|
#include "td/telegram/NotificationGroupInfo.hpp"
|
||||||
#include "td/telegram/NotificationGroupType.h"
|
#include "td/telegram/NotificationGroupType.h"
|
||||||
@ -13720,7 +13721,12 @@ MessageFullId MessagesManager::on_get_message(MessageInfo &&message_info, const
|
|||||||
auto pending_created_dialog = std::move(it->second);
|
auto pending_created_dialog = std::move(it->second);
|
||||||
pending_created_dialogs_.erase(it);
|
pending_created_dialogs_.erase(it);
|
||||||
|
|
||||||
pending_created_dialog.promise_.set_value(get_chat_object(d, "on_get_message"));
|
if (pending_created_dialog.chat_promise_) {
|
||||||
|
pending_created_dialog.chat_promise_.set_value(td_api::make_object<td_api::createdBasicGroupChat>(
|
||||||
|
get_chat_id_object(dialog_id, "on_get_message"), std::move(pending_created_dialog.failed_to_add_members_)));
|
||||||
|
} else {
|
||||||
|
pending_created_dialog.channel_promise_.set_value(get_chat_object(d, "on_get_message"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -30891,15 +30897,20 @@ void MessagesManager::set_dialog_message_ttl(Dialog *d, MessageTtl message_ttl)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MessagesManager::on_create_new_dialog(telegram_api::object_ptr<telegram_api::Updates> &&updates,
|
void MessagesManager::on_create_new_dialog(telegram_api::object_ptr<telegram_api::Updates> &&updates,
|
||||||
DialogType expected_type,
|
MissingInvitees &&missing_invitees,
|
||||||
Promise<td_api::object_ptr<td_api::chat>> &&promise) {
|
Promise<td_api::object_ptr<td_api::createdBasicGroupChat>> &&chat_promise,
|
||||||
|
Promise<td_api::object_ptr<td_api::chat>> &&channel_promise) {
|
||||||
LOG(INFO) << "Receive result for creation of a chat: " << to_string(updates);
|
LOG(INFO) << "Receive result for creation of a chat: " << to_string(updates);
|
||||||
|
|
||||||
|
auto fail = [&](Slice message) {
|
||||||
|
chat_promise.set_error(Status::Error(500, message));
|
||||||
|
channel_promise.set_error(Status::Error(500, message));
|
||||||
|
};
|
||||||
auto sent_messages = UpdatesManager::get_new_messages(updates.get());
|
auto sent_messages = UpdatesManager::get_new_messages(updates.get());
|
||||||
auto sent_messages_random_ids = UpdatesManager::get_sent_messages_random_ids(updates.get());
|
auto sent_messages_random_ids = UpdatesManager::get_sent_messages_random_ids(updates.get());
|
||||||
if (sent_messages.size() != 1u || sent_messages_random_ids.size() != 1u) {
|
if (sent_messages.size() != 1u || sent_messages_random_ids.size() != 1u) {
|
||||||
LOG(ERROR) << "Receive wrong result for create group or channel chat " << oneline(to_string(updates));
|
LOG(ERROR) << "Receive wrong result for create group or channel chat " << oneline(to_string(updates));
|
||||||
return promise.set_error(Status::Error(500, "Unsupported server response"));
|
return fail("Unsupported server response");
|
||||||
}
|
}
|
||||||
|
|
||||||
auto *message = sent_messages.begin()->first;
|
auto *message = sent_messages.begin()->first;
|
||||||
@ -30907,20 +30918,21 @@ void MessagesManager::on_create_new_dialog(telegram_api::object_ptr<telegram_api
|
|||||||
// TODO check that message_random_id equals random_id after messages_createChat will be updated
|
// TODO check that message_random_id equals random_id after messages_createChat will be updated
|
||||||
|
|
||||||
if (sent_messages.begin()->second) {
|
if (sent_messages.begin()->second) {
|
||||||
return promise.set_error(Status::Error(500, "Scheduled message received"));
|
return fail("Scheduled message received");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto expected_type = chat_promise ? DialogType::Chat : DialogType::Channel;
|
||||||
auto dialog_id = DialogId::get_message_dialog_id(message);
|
auto dialog_id = DialogId::get_message_dialog_id(message);
|
||||||
if (dialog_id.get_type() != expected_type) {
|
if (dialog_id.get_type() != expected_type) {
|
||||||
return promise.set_error(Status::Error(500, "Chat of wrong type has been created"));
|
return fail("Chat of wrong type has been created");
|
||||||
}
|
}
|
||||||
if (message->get_id() != telegram_api::messageService::ID) {
|
if (message->get_id() != telegram_api::messageService::ID) {
|
||||||
return promise.set_error(Status::Error(500, "Invalid message received"));
|
return fail("Invalid message received");
|
||||||
}
|
}
|
||||||
auto action_id = static_cast<const telegram_api::messageService *>(message)->action_->get_id();
|
auto action_id = static_cast<const telegram_api::messageService *>(message)->action_->get_id();
|
||||||
if (action_id != telegram_api::messageActionChatCreate::ID &&
|
if (action_id != telegram_api::messageActionChatCreate::ID &&
|
||||||
action_id != telegram_api::messageActionChannelCreate::ID) {
|
action_id != telegram_api::messageActionChannelCreate::ID) {
|
||||||
return promise.set_error(Status::Error(500, "Invalid service message received"));
|
return fail("Invalid service message received");
|
||||||
}
|
}
|
||||||
|
|
||||||
const Dialog *d = get_dialog(dialog_id);
|
const Dialog *d = get_dialog(dialog_id);
|
||||||
@ -30928,16 +30940,25 @@ void MessagesManager::on_create_new_dialog(telegram_api::object_ptr<telegram_api
|
|||||||
// dialog have been already created and at least one non-temporary message was added,
|
// dialog have been already created and at least one non-temporary message was added,
|
||||||
// i.e. we are not interested in the creation of dialog by searchMessages
|
// i.e. we are not interested in the creation of dialog by searchMessages
|
||||||
// then messages have already been added, so just set promise
|
// then messages have already been added, so just set promise
|
||||||
return promise.set_value(get_chat_object(d, "on_create_new_dialog"));
|
if (chat_promise) {
|
||||||
|
return chat_promise.set_value(td_api::make_object<td_api::createdBasicGroupChat>(
|
||||||
|
get_chat_id_object(dialog_id, "on_create_new_dialog"),
|
||||||
|
missing_invitees.get_failed_to_add_members_object(td_->user_manager_.get())));
|
||||||
|
} else {
|
||||||
|
return channel_promise.set_value(get_chat_object(d, "on_create_new_dialog"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pending_created_dialogs_.count(dialog_id) == 0) {
|
if (pending_created_dialogs_.count(dialog_id) == 0) {
|
||||||
PendingCreatedDialog pending_created_dialog;
|
PendingCreatedDialog pending_created_dialog;
|
||||||
pending_created_dialog.promise_ = std::move(promise);
|
pending_created_dialog.failed_to_add_members_ =
|
||||||
|
missing_invitees.get_failed_to_add_members_object(td_->user_manager_.get());
|
||||||
|
pending_created_dialog.chat_promise_ = std::move(chat_promise);
|
||||||
|
pending_created_dialog.channel_promise_ = std::move(channel_promise);
|
||||||
pending_created_dialogs_.emplace(dialog_id, std::move(pending_created_dialog));
|
pending_created_dialogs_.emplace(dialog_id, std::move(pending_created_dialog));
|
||||||
} else {
|
} else {
|
||||||
LOG(ERROR) << "Receive twice " << dialog_id << " as result of chat creation";
|
LOG(ERROR) << "Receive twice " << dialog_id << " as result of chat creation";
|
||||||
return promise.set_error(Status::Error(500, "Chat was created earlier"));
|
return fail("Chat was created earlier");
|
||||||
}
|
}
|
||||||
|
|
||||||
td_->updates_manager_->on_get_updates(std::move(updates), Promise<Unit>());
|
td_->updates_manager_->on_get_updates(std::move(updates), Promise<Unit>());
|
||||||
|
@ -114,6 +114,7 @@ struct InputMessageContent;
|
|||||||
class MessageContent;
|
class MessageContent;
|
||||||
class MessageForwardInfo;
|
class MessageForwardInfo;
|
||||||
struct MessageReactions;
|
struct MessageReactions;
|
||||||
|
class MissingInvitees;
|
||||||
class Td;
|
class Td;
|
||||||
class Usernames;
|
class Usernames;
|
||||||
|
|
||||||
@ -888,8 +889,10 @@ class MessagesManager final : public Actor {
|
|||||||
|
|
||||||
void on_upload_message_media_fail(DialogId dialog_id, MessageId message_id, Status error);
|
void on_upload_message_media_fail(DialogId dialog_id, MessageId message_id, Status error);
|
||||||
|
|
||||||
void on_create_new_dialog(telegram_api::object_ptr<telegram_api::Updates> &&updates, DialogType expected_type,
|
void on_create_new_dialog(telegram_api::object_ptr<telegram_api::Updates> &&updates,
|
||||||
Promise<td_api::object_ptr<td_api::chat>> &&promise);
|
MissingInvitees &&missing_invitees,
|
||||||
|
Promise<td_api::object_ptr<td_api::createdBasicGroupChat>> &&chat_promise,
|
||||||
|
Promise<td_api::object_ptr<td_api::chat>> &&channel_promise);
|
||||||
|
|
||||||
void on_get_channel_difference(DialogId dialog_id, int32 request_pts, int32 request_limit,
|
void on_get_channel_difference(DialogId dialog_id, int32 request_pts, int32 request_limit,
|
||||||
tl_object_ptr<telegram_api::updates_ChannelDifference> &&difference_ptr,
|
tl_object_ptr<telegram_api::updates_ChannelDifference> &&difference_ptr,
|
||||||
@ -3210,7 +3213,9 @@ class MessagesManager final : public Actor {
|
|||||||
vector<ChannelId> created_public_broadcasts_;
|
vector<ChannelId> created_public_broadcasts_;
|
||||||
|
|
||||||
struct PendingCreatedDialog {
|
struct PendingCreatedDialog {
|
||||||
Promise<td_api::object_ptr<td_api::chat>> promise_;
|
td_api::object_ptr<td_api::failedToAddMembers> failed_to_add_members_;
|
||||||
|
Promise<td_api::object_ptr<td_api::createdBasicGroupChat>> chat_promise_;
|
||||||
|
Promise<td_api::object_ptr<td_api::chat>> channel_promise_;
|
||||||
};
|
};
|
||||||
FlatHashMap<DialogId, PendingCreatedDialog, DialogIdHash> pending_created_dialogs_;
|
FlatHashMap<DialogId, PendingCreatedDialog, DialogIdHash> pending_created_dialogs_;
|
||||||
|
|
||||||
|
@ -42,6 +42,8 @@ class MissingInvitees {
|
|||||||
friend StringBuilder &operator<<(StringBuilder &string_builder, const MissingInvitees &invitees);
|
friend StringBuilder &operator<<(StringBuilder &string_builder, const MissingInvitees &invitees);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
MissingInvitees() = default;
|
||||||
|
|
||||||
explicit MissingInvitees(vector<telegram_api::object_ptr<telegram_api::missingInvitee>> &&invitees);
|
explicit MissingInvitees(vector<telegram_api::object_ptr<telegram_api::missingInvitee>> &&invitees);
|
||||||
|
|
||||||
td_api::object_ptr<td_api::failedToAddMembers> get_failed_to_add_members_object(UserManager *user_manager) const;
|
td_api::object_ptr<td_api::failedToAddMembers> get_failed_to_add_members_object(UserManager *user_manager) const;
|
||||||
|
Loading…
Reference in New Issue
Block a user