diff --git a/td/telegram/BotCommandScope.cpp b/td/telegram/BotCommandScope.cpp index 74c3ac29b..6445e7ac6 100644 --- a/td/telegram/BotCommandScope.cpp +++ b/td/telegram/BotCommandScope.cpp @@ -100,7 +100,9 @@ telegram_api::object_ptr BotCommandScope::get_inp const Td *td) const { auto input_peer = dialog_id_.is_valid() ? td->messages_manager_->get_input_peer(dialog_id_, AccessRights::Read) : nullptr; - auto input_user = user_id_.is_valid() ? td->contacts_manager_->get_input_user(user_id_) : nullptr; + auto input_user = td->contacts_manager_->have_input_user(user_id_) + ? td->contacts_manager_->get_input_user(user_id_).move_as_ok() + : nullptr; switch (type_) { case Type::Default: return telegram_api::make_object(); diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index 50613e0c9..00f03f5b1 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -1431,8 +1431,8 @@ class GetExportedChatInvitesQuery final : public Td::ResultHandler { return on_error(Status::Error(400, "Can't access the chat")); } - auto input_user = td_->contacts_manager_->get_input_user(creator_user_id); - CHECK(input_user != nullptr); + auto r_input_user = td_->contacts_manager_->get_input_user(creator_user_id); + CHECK(r_input_user.is_ok()); int32 flags = 0; if (!offset_invite_link.empty() || offset_date != 0) { @@ -1442,9 +1442,9 @@ class GetExportedChatInvitesQuery final : public Td::ResultHandler { if (is_revoked) { flags |= telegram_api::messages_getExportedChatInvites::REVOKED_MASK; } - send_query(G()->net_query_creator().create( - telegram_api::messages_getExportedChatInvites(flags, false /*ignored*/, std::move(input_peer), - std::move(input_user), offset_date, offset_invite_link, limit))); + send_query(G()->net_query_creator().create(telegram_api::messages_getExportedChatInvites( + flags, false /*ignored*/, std::move(input_peer), r_input_user.move_as_ok(), offset_date, offset_invite_link, + limit))); } void on_result(BufferSlice packet) final { @@ -1548,15 +1548,15 @@ class GetChatInviteImportersQuery final : public Td::ResultHandler { return on_error(Status::Error(400, "Can't access the chat")); } - auto input_user = td_->contacts_manager_->get_input_user(offset_user_id); - if (input_user == nullptr) { - input_user = make_tl_object(); + auto r_input_user = td_->contacts_manager_->get_input_user(offset_user_id); + if (r_input_user.is_error()) { + r_input_user = make_tl_object(); } int32 flags = telegram_api::messages_getChatInviteImporters::LINK_MASK; send_query(G()->net_query_creator().create( telegram_api::messages_getChatInviteImporters(flags, false /*ignored*/, std::move(input_peer), invite_link, - string(), offset_date, std::move(input_user), limit))); + string(), offset_date, r_input_user.move_as_ok(), limit))); } void on_result(BufferSlice packet) final { @@ -1619,9 +1619,9 @@ class GetChatJoinRequestsQuery final : public Td::ResultHandler { return on_error(Status::Error(400, "Can't access the chat")); } - auto input_user = td_->contacts_manager_->get_input_user(offset_user_id); - if (input_user == nullptr) { - input_user = make_tl_object(); + auto r_input_user = td_->contacts_manager_->get_input_user(offset_user_id); + if (r_input_user.is_error()) { + r_input_user = make_tl_object(); } int32 flags = telegram_api::messages_getChatInviteImporters::REQUESTED_MASK; @@ -1633,7 +1633,7 @@ class GetChatJoinRequestsQuery final : public Td::ResultHandler { } send_query(G()->net_query_creator().create( telegram_api::messages_getChatInviteImporters(flags, false /*ignored*/, std::move(input_peer), invite_link, - query, offset_date, std::move(input_user), limit))); + query, offset_date, r_input_user.move_as_ok(), limit))); } void on_result(BufferSlice packet) final { @@ -1696,9 +1696,9 @@ class HideChatJoinRequestQuery final : public Td::ResultHandler { return on_error(Status::Error(400, "Can't access the chat")); } - auto input_user = td_->contacts_manager_->get_input_user(user_id); - if (input_user == nullptr) { - return on_error(Status::Error(400, "Can't find user")); + auto r_input_user = td_->contacts_manager_->get_input_user(user_id); + if (r_input_user.is_error()) { + return on_error(r_input_user.move_as_error()); } int32 flags = 0; @@ -1706,7 +1706,7 @@ class HideChatJoinRequestQuery final : public Td::ResultHandler { flags |= telegram_api::messages_hideChatJoinRequest::APPROVED_MASK; } send_query(G()->net_query_creator().create(telegram_api::messages_hideChatJoinRequest( - flags, false /*ignored*/, std::move(input_peer), std::move(input_user)))); + flags, false /*ignored*/, std::move(input_peer), r_input_user.move_as_ok()))); } void on_result(BufferSlice packet) final { @@ -1893,11 +1893,11 @@ class DeleteRevokedExportedChatInvitesQuery final : public Td::ResultHandler { return on_error(Status::Error(400, "Can't access the chat")); } - auto input_user = td_->contacts_manager_->get_input_user(creator_user_id); - CHECK(input_user != nullptr); + auto r_input_user = td_->contacts_manager_->get_input_user(creator_user_id); + CHECK(r_input_user.is_ok()); send_query(G()->net_query_creator().create( - telegram_api::messages_deleteRevokedExportedChatInvites(std::move(input_peer), std::move(input_user)))); + telegram_api::messages_deleteRevokedExportedChatInvites(std::move(input_peer), r_input_user.move_as_ok()))); } void on_result(BufferSlice packet) final { @@ -2208,10 +2208,10 @@ class CanEditChannelCreatorQuery final : public Td::ResultHandler { } void send() { - auto input_user = td_->contacts_manager_->get_input_user(td_->contacts_manager_->get_my_id()); - CHECK(input_user != nullptr); + auto r_input_user = td_->contacts_manager_->get_input_user(td_->contacts_manager_->get_my_id()); + CHECK(r_input_user.is_ok()); send_query(G()->net_query_creator().create(telegram_api::channels_editCreator( - telegram_api::make_object(), std::move(input_user), + telegram_api::make_object(), r_input_user.move_as_ok(), make_tl_object()))); } @@ -2246,12 +2246,12 @@ class EditChannelCreatorQuery final : public Td::ResultHandler { if (input_channel == nullptr) { return promise_.set_error(Status::Error(400, "Have no access to the chat")); } - auto input_user = td_->contacts_manager_->get_input_user(user_id); - if (input_user == nullptr) { - return promise_.set_error(Status::Error(400, "Have no access to the user")); + auto r_input_user = td_->contacts_manager_->get_input_user(user_id); + if (r_input_user.is_error()) { + return promise_.set_error(r_input_user.move_as_error()); } send_query(G()->net_query_creator().create(telegram_api::channels_editCreator( - std::move(input_channel), std::move(input_user), std::move(input_check_password)))); + std::move(input_channel), r_input_user.move_as_ok(), std::move(input_check_password)))); } void on_result(BufferSlice packet) final { @@ -4359,17 +4359,20 @@ void ContactsManager::SecretChat::parse(ParserT &parser) { } } -tl_object_ptr ContactsManager::get_input_user(UserId user_id) const { +Result> ContactsManager::get_input_user(UserId user_id) const { if (user_id == get_my_id()) { return make_tl_object(); } const User *u = get_user(user_id); - if (u == nullptr || u->access_hash == -1 || u->is_min_access_hash) { + if (u == nullptr) { + return Status::Error(400, "User not found"); + } + if (u->access_hash == -1 || u->is_min_access_hash) { if (td_->auth_manager_->is_bot() && user_id.is_valid()) { return make_tl_object(user_id.get(), 0); } - return nullptr; + return Status::Error(400, "Have no access to the user"); } return make_tl_object(user_id.get(), u->access_hash); @@ -5166,13 +5169,13 @@ void ContactsManager::add_contact(Contact contact, bool share_phone_number, Prom LOG(INFO) << "Add " << contact << " with share_phone_number = " << share_phone_number; auto user_id = contact.get_user_id(); - auto input_user = get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "User not found")); + auto r_input_user = get_input_user(user_id); + if (r_input_user.is_error()) { + return promise.set_error(r_input_user.move_as_error()); } td_->create_handler(std::move(promise)) - ->send(user_id, std::move(input_user), contact, share_phone_number); + ->send(user_id, r_input_user.move_as_ok(), contact, share_phone_number); } std::pair, vector> ContactsManager::import_contacts(const vector &contacts, @@ -5302,10 +5305,10 @@ void ContactsManager::remove_contacts(const vector &user_ids, Promiseis_contact) { - auto input_user = get_input_user(user_id); - if (input_user != nullptr) { + auto r_input_user = get_input_user(user_id); + if (r_input_user.is_ok()) { to_delete_user_ids.push_back(user_id); - input_users.push_back(std::move(input_user)); + input_users.push_back(r_input_user.move_as_ok()); } } } @@ -5652,14 +5655,14 @@ void ContactsManager::share_phone_number(UserId user_id, Promise &&promise } LOG(INFO) << "Share phone number with " << user_id; - auto input_user = get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "User not found")); + auto r_input_user = get_input_user(user_id); + if (r_input_user.is_error()) { + return promise.set_error(r_input_user.move_as_error()); } td_->messages_manager_->hide_dialog_action_bar(DialogId(user_id)); - td_->create_handler(std::move(promise))->send(user_id, std::move(input_user)); + td_->create_handler(std::move(promise))->send(user_id, r_input_user.move_as_ok()); } void ContactsManager::search_dialogs_nearby(const Location &location, @@ -6773,13 +6776,13 @@ void ContactsManager::add_chat_participant(ChatId chat_id, UserId user_id, int32 } // TODO upper bound on forward_limit - auto input_user = get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "User not found")); + auto r_input_user = get_input_user(user_id); + if (r_input_user.is_error()) { + return promise.set_error(r_input_user.move_as_error()); } // TODO invoke after - td_->create_handler(std::move(promise))->send(chat_id, std::move(input_user), forward_limit); + td_->create_handler(std::move(promise))->send(chat_id, r_input_user.move_as_ok(), forward_limit); } void ContactsManager::add_channel_participant(ChannelId channel_id, UserId user_id, @@ -6792,9 +6795,9 @@ void ContactsManager::add_channel_participant(ChannelId channel_id, UserId user_ if (c == nullptr) { return promise.set_error(Status::Error(400, "Chat info not found")); } - auto input_user = get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "User not found")); + auto r_input_user = get_input_user(user_id); + if (r_input_user.is_error()) { + return promise.set_error(r_input_user.move_as_error()); } if (user_id == get_my_id()) { @@ -6814,7 +6817,7 @@ void ContactsManager::add_channel_participant(ChannelId channel_id, UserId user_ speculative_add_channel_user(channel_id, user_id, DialogParticipantStatus::Member(), old_status); vector> input_users; - input_users.push_back(std::move(input_user)); + input_users.push_back(r_input_user.move_as_ok()); td_->create_handler(std::move(promise))->send(channel_id, std::move(input_users)); } @@ -6835,16 +6838,16 @@ void ContactsManager::add_channel_participants(ChannelId channel_id, const vecto vector> input_users; for (auto user_id : user_ids) { - auto input_user = get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "User not found")); + auto r_input_user = get_input_user(user_id); + if (r_input_user.is_error()) { + return promise.set_error(r_input_user.move_as_error()); } if (user_id == get_my_id()) { // can't invite self continue; } - input_users.push_back(std::move(input_user)); + input_users.push_back(r_input_user.move_as_ok()); } if (input_users.empty()) { @@ -6921,9 +6924,10 @@ void ContactsManager::set_channel_participant_status_impl(ChannelId channel_id, } if (status.is_member() == old_status.is_member()) { // change rank and is_anonymous - auto input_user = get_input_user(get_my_id()); - CHECK(input_user != nullptr); - td_->create_handler(std::move(promise))->send(channel_id, std::move(input_user), status); + auto r_input_user = get_input_user(get_my_id()); + CHECK(r_input_user.is_ok()); + td_->create_handler(std::move(promise)) + ->send(channel_id, r_input_user.move_as_ok(), status); return; } if (status.is_member()) { @@ -7002,13 +7006,13 @@ void ContactsManager::promote_channel_participant(ChannelId channel_id, UserId u CHECK(!status.is_creator()); } - auto input_user = get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "User not found")); + auto r_input_user = get_input_user(user_id); + if (r_input_user.is_error()) { + return promise.set_error(r_input_user.move_as_error()); } speculative_add_channel_user(channel_id, user_id, status, old_status); - td_->create_handler(std::move(promise))->send(channel_id, std::move(input_user), status); + td_->create_handler(std::move(promise))->send(channel_id, r_input_user.move_as_ok(), status); } void ContactsManager::set_chat_participant_status(ChatId chat_id, UserId user_id, DialogParticipantStatus status, @@ -7080,12 +7084,13 @@ void ContactsManager::set_chat_participant_status(ChatId chat_id, UserId user_id void ContactsManager::send_edit_chat_admin_query(ChatId chat_id, UserId user_id, bool is_administrator, Promise &&promise) { - auto input_user = get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "User not found")); + auto r_input_user = get_input_user(user_id); + if (r_input_user.is_error()) { + return promise.set_error(r_input_user.move_as_error()); } - td_->create_handler(std::move(promise))->send(chat_id, std::move(input_user), is_administrator); + td_->create_handler(std::move(promise)) + ->send(chat_id, r_input_user.move_as_ok(), is_administrator); } void ContactsManager::can_transfer_ownership(Promise &&promise) { @@ -7472,13 +7477,14 @@ void ContactsManager::delete_chat_participant(ChatId chat_id, UserId user_id, bo } } } - auto input_user = get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "User not found")); + auto r_input_user = get_input_user(user_id); + if (r_input_user.is_error()) { + return promise.set_error(r_input_user.move_as_error()); } // TODO invoke after - td_->create_handler(std::move(promise))->send(chat_id, std::move(input_user), revoke_messages); + td_->create_handler(std::move(promise)) + ->send(chat_id, r_input_user.move_as_ok(), revoke_messages); } void ContactsManager::restrict_channel_participant(ChannelId channel_id, DialogId participant_dialog_id, @@ -13956,14 +13962,14 @@ bool ContactsManager::get_user(UserId user_id, int left_tries, Promise &&p std::move(promise)); return false; } - auto input_user = get_input_user(user_id); - if (left_tries == 1 || input_user == nullptr) { - promise.set_error(Status::Error(400, "User not found")); + auto r_input_user = get_input_user(user_id); + if (left_tries == 1 || r_input_user.is_error()) { + promise.set_error(r_input_user.move_as_error()); return false; } vector> users; - users.push_back(std::move(input_user)); + users.push_back(r_input_user.move_as_ok()); td_->create_handler(std::move(promise))->send(std::move(users)); return false; } @@ -14014,14 +14020,14 @@ void ContactsManager::reload_user(UserId user_id, Promise &&promise) { } have_user_force(user_id); - auto input_user = get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "User info not found")); + auto r_input_user = get_input_user(user_id); + if (r_input_user.is_error()) { + return promise.set_error(r_input_user.move_as_error()); } // there is no much reason to combine different requests into one request vector> users; - users.push_back(std::move(input_user)); + users.push_back(r_input_user.move_as_ok()); td_->create_handler(std::move(promise))->send(std::move(users)); } @@ -14033,30 +14039,30 @@ void ContactsManager::load_user_full(UserId user_id, bool force, Promise & auto user_full = get_user_full_force(user_id); if (user_full == nullptr) { - auto input_user = get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "Can't get info about inaccessible user")); + auto r_input_user = get_input_user(user_id); + if (r_input_user.is_error()) { + return promise.set_error(r_input_user.move_as_error()); } - return send_get_user_full_query(user_id, std::move(input_user), std::move(promise), source); + return send_get_user_full_query(user_id, r_input_user.move_as_ok(), std::move(promise), source); } if (user_full->is_expired()) { - auto input_user = get_input_user(user_id); - CHECK(input_user != nullptr); + auto r_input_user = get_input_user(user_id); + CHECK(r_input_user.is_ok()); if (td_->auth_manager_->is_bot() && !force) { - return send_get_user_full_query(user_id, std::move(input_user), std::move(promise), "load expired user_full"); + return send_get_user_full_query(user_id, r_input_user.move_as_ok(), std::move(promise), "load expired user_full"); } - send_get_user_full_query(user_id, std::move(input_user), Auto(), "load expired user_full"); + send_get_user_full_query(user_id, r_input_user.move_as_ok(), Auto(), "load expired user_full"); } promise.set_value(Unit()); } void ContactsManager::reload_user_full(UserId user_id) { - auto input_user = get_input_user(user_id); - if (input_user != nullptr) { - send_get_user_full_query(user_id, std::move(input_user), Auto(), "reload_user_full"); + auto r_input_user = get_input_user(user_id); + if (r_input_user.is_ok()) { + send_get_user_full_query(user_id, r_input_user.move_as_ok(), Auto(), "reload_user_full"); } } @@ -14089,9 +14095,9 @@ std::pair> ContactsManager::get_user_profile_photos limit = MAX_GET_PROFILE_PHOTOS; } - auto input_user = get_input_user(user_id); - if (input_user == nullptr) { - promise.set_error(Status::Error(400, "User not found")); + auto r_input_user = get_input_user(user_id); + if (r_input_user.is_error()) { + promise.set_error(r_input_user.move_as_error()); return result; } @@ -14141,20 +14147,22 @@ std::pair> ContactsManager::get_user_profile_photos limit = MAX_GET_PROFILE_PHOTOS / 5; // make limit reasonable } - td_->create_handler(std::move(promise))->send(user_id, std::move(input_user), offset, limit, 0); + td_->create_handler(std::move(promise)) + ->send(user_id, r_input_user.move_as_ok(), offset, limit, 0); return result; } void ContactsManager::reload_user_profile_photo(UserId user_id, int64 photo_id, Promise &&promise) { get_user_force(user_id); - auto input_user = get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "User info not found")); + auto r_input_user = get_input_user(user_id); + if (r_input_user.is_error()) { + return promise.set_error(r_input_user.move_as_error()); } // this request will be needed only to download the photo, // so there is no reason to combine different requests for a photo into one request - td_->create_handler(std::move(promise))->send(user_id, std::move(input_user), -1, 1, photo_id); + td_->create_handler(std::move(promise)) + ->send(user_id, r_input_user.move_as_ok(), -1, 1, photo_id); } FileSourceId ContactsManager::get_user_profile_photo_file_source_id(UserId user_id, int64 photo_id) { @@ -15154,9 +15162,9 @@ void ContactsManager::get_channel_participant(ChannelId channel_id, DialogId par Promise &&promise) { LOG(INFO) << "Trying to get " << participant_dialog_id << " as member of " << channel_id; - auto input_peer = td_->messages_manager_->get_input_peer(participant_dialog_id, AccessRights::Read); + auto input_peer = td_->messages_manager_->get_input_peer(participant_dialog_id, AccessRights::Know); if (input_peer == nullptr) { - return promise.set_error(Status::Error(400, "User not found")); + return promise.set_error(Status::Error(400, "Member not found")); } if (have_channel_participant_cache(channel_id)) { diff --git a/td/telegram/ContactsManager.h b/td/telegram/ContactsManager.h index 4b589aafb..fc54082f5 100644 --- a/td/telegram/ContactsManager.h +++ b/td/telegram/ContactsManager.h @@ -72,7 +72,7 @@ class ContactsManager final : public Actor { static ChatId get_chat_id(const tl_object_ptr &chat); static ChannelId get_channel_id(const tl_object_ptr &chat); - tl_object_ptr get_input_user(UserId user_id) const; + Result> get_input_user(UserId user_id) const; bool have_input_user(UserId user_id) const; // TODO get_input_chat ??? diff --git a/td/telegram/DialogEventLog.cpp b/td/telegram/DialogEventLog.cpp index e6b96efd1..bc4be6089 100644 --- a/td/telegram/DialogEventLog.cpp +++ b/td/telegram/DialogEventLog.cpp @@ -488,11 +488,11 @@ void get_dialog_event_log(Td *td, DialogId dialog_id, const string &query, int64 vector> input_users; for (auto user_id : user_ids) { - auto input_user = td->contacts_manager_->get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "User not found")); + auto r_input_user = td->contacts_manager_->get_input_user(user_id); + if (r_input_user.is_error()) { + return promise.set_error(r_input_user.move_as_error()); } - input_users.push_back(std::move(input_user)); + input_users.push_back(r_input_user.move_as_ok()); } td->create_handler(std::move(promise)) diff --git a/td/telegram/Game.cpp b/td/telegram/Game.cpp index 436c7fdc2..a5467597e 100644 --- a/td/telegram/Game.cpp +++ b/td/telegram/Game.cpp @@ -90,10 +90,10 @@ bool Game::has_input_media() const { } tl_object_ptr Game::get_input_media_game(const Td *td) const { - auto input_user = td->contacts_manager_->get_input_user(bot_user_id_); - CHECK(input_user != nullptr); + auto r_input_user = td->contacts_manager_->get_input_user(bot_user_id_); + CHECK(r_input_user.is_ok()); return make_tl_object( - make_tl_object(std::move(input_user), short_name_)); + make_tl_object(r_input_user.move_as_ok(), short_name_)); } bool operator==(const Game &lhs, const Game &rhs) { diff --git a/td/telegram/GameManager.cpp b/td/telegram/GameManager.cpp index 81bbfb482..648397930 100644 --- a/td/telegram/GameManager.cpp +++ b/td/telegram/GameManager.cpp @@ -217,9 +217,9 @@ void GameManager::set_game_score(FullMessageId full_message_id, bool edit_messag return promise.set_error(Status::Error(400, "Can't access the chat")); } - auto input_user = td_->contacts_manager_->get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "Invalid user identifier specified")); + auto r_input_user = td_->contacts_manager_->get_input_user(user_id); + if (r_input_user.is_error()) { + return promise.set_error(r_input_user.move_as_error()); } if (!td_->messages_manager_->can_set_game_score(full_message_id)) { @@ -234,7 +234,7 @@ void GameManager::set_game_score(FullMessageId full_message_id, bool edit_messag send_closure(actor_id, &GameManager::on_set_game_score, full_message_id, std::move(promise)); }); send_closure(td_->create_net_actor(std::move(query_promise)), &SetGameScoreActor::send, dialog_id, - full_message_id.get_message_id(), edit_message, std::move(input_user), score, force, + full_message_id.get_message_id(), edit_message, r_input_user.move_as_ok(), score, force, MessagesManager::get_sequence_dispatcher_id(dialog_id, MessageContentType::None)); } @@ -252,13 +252,13 @@ void GameManager::set_inline_game_score(const string &inline_message_id, bool ed return promise.set_error(Status::Error(400, "Invalid inline message identifier specified")); } - auto input_user = td_->contacts_manager_->get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "Wrong user identifier specified")); + auto r_input_user = td_->contacts_manager_->get_input_user(user_id); + if (r_input_user.is_error()) { + return promise.set_error(r_input_user.move_as_error()); } td_->create_handler(std::move(promise)) - ->send(std::move(input_bot_inline_message_id), edit_message, std::move(input_user), score, force); + ->send(std::move(input_bot_inline_message_id), edit_message, r_input_user.move_as_ok(), score, force); } void GameManager::get_game_high_scores(FullMessageId full_message_id, UserId user_id, @@ -278,12 +278,13 @@ void GameManager::get_game_high_scores(FullMessageId full_message_id, UserId use return promise.set_error(Status::Error(400, "Wrong message identifier specified")); } - auto input_user = td_->contacts_manager_->get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "Wrong user identifier specified")); + auto r_input_user = td_->contacts_manager_->get_input_user(user_id); + if (r_input_user.is_error()) { + return promise.set_error(r_input_user.move_as_error()); } - td_->create_handler(std::move(promise))->send(dialog_id, message_id, std::move(input_user)); + td_->create_handler(std::move(promise)) + ->send(dialog_id, message_id, r_input_user.move_as_ok()); } void GameManager::get_inline_game_high_scores(const string &inline_message_id, UserId user_id, @@ -295,13 +296,13 @@ void GameManager::get_inline_game_high_scores(const string &inline_message_id, U return promise.set_error(Status::Error(400, "Invalid inline message identifier specified")); } - auto input_user = td_->contacts_manager_->get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "Wrong user identifier specified")); + auto r_input_user = td_->contacts_manager_->get_input_user(user_id); + if (r_input_user.is_error()) { + return promise.set_error(r_input_user.move_as_error()); } td_->create_handler(std::move(promise)) - ->send(std::move(input_bot_inline_message_id), std::move(input_user)); + ->send(std::move(input_bot_inline_message_id), r_input_user.move_as_ok()); } td_api::object_ptr GameManager::get_game_high_scores_object( diff --git a/td/telegram/GroupCallManager.cpp b/td/telegram/GroupCallManager.cpp index 9beec6c29..8d27acb30 100644 --- a/td/telegram/GroupCallManager.cpp +++ b/td/telegram/GroupCallManager.cpp @@ -3329,16 +3329,16 @@ void GroupCallManager::invite_group_call_participants(GroupCallId group_call_id, vector> input_users; auto my_user_id = td_->contacts_manager_->get_my_id(); for (auto user_id : user_ids) { - auto input_user = td_->contacts_manager_->get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "User not found")); + auto r_input_user = td_->contacts_manager_->get_input_user(user_id); + if (r_input_user.is_error()) { + return promise.set_error(r_input_user.move_as_error()); } if (user_id == my_user_id) { // can't invite self continue; } - input_users.push_back(std::move(input_user)); + input_users.push_back(r_input_user.move_as_ok()); } if (input_users.empty()) { diff --git a/td/telegram/InlineQueriesManager.cpp b/td/telegram/InlineQueriesManager.cpp index a74f2c824..575cd5d60 100644 --- a/td/telegram/InlineQueriesManager.cpp +++ b/td/telegram/InlineQueriesManager.cpp @@ -876,17 +876,17 @@ void InlineQueriesManager::loop() { auto now = Time::now(); if (now >= next_inline_query_time_) { LOG(INFO) << "Send inline query " << pending_inline_query_->query_hash; - auto bot_input_user = td_->contacts_manager_->get_input_user(pending_inline_query_->bot_user_id); - if (bot_input_user != nullptr) { + auto r_bot_input_user = td_->contacts_manager_->get_input_user(pending_inline_query_->bot_user_id); + if (r_bot_input_user.is_ok()) { if (!sent_query_.empty()) { LOG(INFO) << "Cancel inline query request"; cancel_query(sent_query_); } - sent_query_ = - td_->create_handler(std::move(pending_inline_query_->promise)) - ->send(pending_inline_query_->bot_user_id, pending_inline_query_->dialog_id, std::move(bot_input_user), - std::move(pending_inline_query_->input_peer), pending_inline_query_->user_location, - pending_inline_query_->query, pending_inline_query_->offset, pending_inline_query_->query_hash); + sent_query_ = td_->create_handler(std::move(pending_inline_query_->promise)) + ->send(pending_inline_query_->bot_user_id, pending_inline_query_->dialog_id, + r_bot_input_user.move_as_ok(), std::move(pending_inline_query_->input_peer), + pending_inline_query_->user_location, pending_inline_query_->query, + pending_inline_query_->offset, pending_inline_query_->query_hash); next_inline_query_time_ = now + INLINE_QUERY_DELAY_MS * 1e-3; } diff --git a/td/telegram/MessageEntity.cpp b/td/telegram/MessageEntity.cpp index af43bad42..c6c274ae3 100644 --- a/td/telegram/MessageEntity.cpp +++ b/td/telegram/MessageEntity.cpp @@ -4171,10 +4171,10 @@ vector> get_input_message_entities(co make_tl_object(entity.offset, entity.length, entity.argument)); break; case MessageEntity::Type::MentionName: { - auto input_user = contacts_manager->get_input_user(entity.user_id); - LOG_CHECK(input_user != nullptr) << source; + auto r_input_user = contacts_manager->get_input_user(entity.user_id); + LOG_CHECK(r_input_user.is_ok()) << source << ' ' << r_input_user.error(); result.push_back(make_tl_object(entity.offset, entity.length, - std::move(input_user))); + r_input_user.move_as_ok())); break; } default: diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index d9648170e..ffb47bd5c 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -837,11 +837,11 @@ class GetCommonDialogsQuery final : public Td::ResultHandler { user_id_ = user_id; offset_chat_id_ = offset_chat_id; - auto input_user = td_->contacts_manager_->get_input_user(user_id); - CHECK(input_user != nullptr); + auto r_input_user = td_->contacts_manager_->get_input_user(user_id); + CHECK(r_input_user.is_ok()); send_query(G()->net_query_creator().create( - telegram_api::messages_getCommonChats(std::move(input_user), offset_chat_id, limit))); + telegram_api::messages_getCommonChats(r_input_user.move_as_ok(), offset_chat_id, limit))); } void on_result(BufferSlice packet) final { @@ -19661,12 +19661,12 @@ DialogId MessagesManager::create_new_group_chat(const vector &user_ids, vector> input_users; for (auto user_id : user_ids) { - auto input_user = td_->contacts_manager_->get_input_user(user_id); - if (input_user == nullptr) { - promise.set_error(Status::Error(400, "User not found")); + auto r_input_user = td_->contacts_manager_->get_input_user(user_id); + if (r_input_user.is_error()) { + promise.set_error(r_input_user.move_as_error()); return DialogId(); } - input_users.push_back(std::move(input_user)); + input_users.push_back(r_input_user.move_as_ok()); } do { @@ -19720,11 +19720,14 @@ DialogId MessagesManager::create_new_channel_chat(const string &title, bool is_m } void MessagesManager::create_new_secret_chat(UserId user_id, Promise &&promise) { - auto user_base = td_->contacts_manager_->get_input_user(user_id); - if (user_base == nullptr || user_base->get_id() != telegram_api::inputUser::ID) { - return promise.set_error(Status::Error(400, "User not found")); + auto r_input_user = td_->contacts_manager_->get_input_user(user_id); + if (r_input_user.is_error()) { + return promise.set_error(r_input_user.move_as_error()); } - auto user = move_tl_object_as(user_base); + if (r_input_user.ok()->get_id() != telegram_api::inputUser::ID) { + return promise.set_error(Status::Error(400, "Can't create secret chat with self")); + } + auto user = static_cast(r_input_user.ok().get()); send_closure(G()->secret_chats_manager(), &SecretChatsManager::create_chat, UserId(user->user_id_), user->access_hash_, std::move(promise)); @@ -25276,12 +25279,12 @@ void MessagesManager::do_send_bot_start_message(UserId bot_user_id, DialogId dia if (input_peer == nullptr) { return on_send_message_fail(random_id, Status::Error(400, "Have no info about the chat")); } - auto bot_input_user = td_->contacts_manager_->get_input_user(bot_user_id); - if (bot_input_user == nullptr) { - return on_send_message_fail(random_id, Status::Error(400, "Have no info about the bot")); + auto r_bot_input_user = td_->contacts_manager_->get_input_user(bot_user_id); + if (r_bot_input_user.is_error()) { + return on_send_message_fail(random_id, r_bot_input_user.move_as_error()); } - m->send_query_ref = td_->create_handler()->send(std::move(bot_input_user), dialog_id, + m->send_query_ref = td_->create_handler()->send(r_bot_input_user.move_as_ok(), dialog_id, std::move(input_peer), parameter, random_id); } diff --git a/td/telegram/PrivacyManager.cpp b/td/telegram/PrivacyManager.cpp index 6355fba9d..c8d8f0241 100644 --- a/td/telegram/PrivacyManager.cpp +++ b/td/telegram/PrivacyManager.cpp @@ -318,9 +318,9 @@ Result PrivacyManager::UserPrivacySettin vector> PrivacyManager::UserPrivacySettingRule::get_input_users() const { vector> result; for (auto user_id : user_ids_) { - auto input_user = G()->td().get_actor_unsafe()->contacts_manager_->get_input_user(user_id); - if (input_user != nullptr) { - result.push_back(std::move(input_user)); + auto r_input_user = G()->td().get_actor_unsafe()->contacts_manager_->get_input_user(user_id); + if (r_input_user.is_ok()) { + result.push_back(r_input_user.move_as_ok()); } else { LOG(ERROR) << "Have no access to " << user_id; } diff --git a/td/telegram/ReplyMarkup.cpp b/td/telegram/ReplyMarkup.cpp index b7d3cb441..83d06c5f2 100644 --- a/td/telegram/ReplyMarkup.cpp +++ b/td/telegram/ReplyMarkup.cpp @@ -700,25 +700,26 @@ static tl_object_ptr get_inline_keyboard_button( if (!keyboard_button.forward_text.empty()) { flags |= telegram_api::inputKeyboardButtonUrlAuth::FWD_TEXT_MASK; } - auto input_user = G()->td().get_actor_unsafe()->contacts_manager_->get_input_user(UserId(bot_user_id)); - if (input_user == nullptr) { - LOG(ERROR) << "Failed to get InputUser for " << bot_user_id; + auto r_input_user = G()->td().get_actor_unsafe()->contacts_manager_->get_input_user(UserId(bot_user_id)); + if (r_input_user.is_error()) { + LOG(ERROR) << "Failed to get InputUser for " << bot_user_id << ": " << r_input_user.error(); return make_tl_object(keyboard_button.text, keyboard_button.data); } return make_tl_object(flags, false /*ignored*/, keyboard_button.text, keyboard_button.forward_text, - keyboard_button.data, std::move(input_user)); + keyboard_button.data, r_input_user.move_as_ok()); } case InlineKeyboardButton::Type::CallbackWithPassword: UNREACHABLE(); break; case InlineKeyboardButton::Type::User: { - auto input_user = G()->td().get_actor_unsafe()->contacts_manager_->get_input_user(keyboard_button.user_id); - if (input_user == nullptr) { - LOG(ERROR) << "Failed to get InputUser for " << keyboard_button.user_id; - input_user = make_tl_object(); + auto r_input_user = G()->td().get_actor_unsafe()->contacts_manager_->get_input_user(keyboard_button.user_id); + if (r_input_user.is_error()) { + LOG(ERROR) << "Failed to get InputUser for " << keyboard_button.user_id << ": " << r_input_user.error(); + r_input_user = make_tl_object(); } - return make_tl_object(keyboard_button.text, std::move(input_user)); + return make_tl_object(keyboard_button.text, + r_input_user.move_as_ok()); } default: UNREACHABLE(); diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index 0080bee2c..5fd9e4d7a 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -5453,15 +5453,9 @@ FileId StickersManager::upload_sticker_file(UserId user_id, tl_object_ptrcontacts_manager_->get_my_id(); } - auto input_user = td_->contacts_manager_->get_input_user(user_id); - if (input_user == nullptr) { - promise.set_error(Status::Error(400, "User not found")); - return FileId(); - } - DialogId dialog_id(user_id); - auto input_peer = td_->messages_manager_->get_input_peer(dialog_id, AccessRights::Write); - if (input_peer == nullptr) { - promise.set_error(Status::Error(400, "Have no access to the user")); + auto r_input_user = td_->contacts_manager_->get_input_user(user_id); + if (r_input_user.is_error()) { + promise.set_error(r_input_user.move_as_error()); return FileId(); } @@ -5579,15 +5573,8 @@ void StickersManager::create_new_sticker_set(UserId user_id, string &title, stri if (!is_bot) { user_id = td_->contacts_manager_->get_my_id(); } - auto input_user = td_->contacts_manager_->get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "User not found")); - } - DialogId dialog_id(user_id); - auto input_peer = td_->messages_manager_->get_input_peer(dialog_id, AccessRights::Write); - if (input_peer == nullptr) { - return promise.set_error(Status::Error(400, "Have no access to the user")); - } + + TRY_RESULT_PROMISE(promise, input_user, td_->contacts_manager_->get_input_user(user_id)); title = strip_empty_characters(title, MAX_STICKER_SET_TITLE_LENGTH); if (title.empty()) { @@ -5804,10 +5791,8 @@ void StickersManager::on_new_stickers_uploaded(int64 random_id, Result res CHECK(pending_new_sticker_set->upload_files_multipromise.promise_count() == 0); - auto input_user = td_->contacts_manager_->get_input_user(pending_new_sticker_set->user_id); - if (input_user == nullptr) { - return pending_new_sticker_set->promise.set_error(Status::Error(400, "User not found")); - } + auto &promise = pending_new_sticker_set->promise; + TRY_RESULT_PROMISE(promise, input_user, td_->contacts_manager_->get_input_user(pending_new_sticker_set->user_id)); bool is_masks = pending_new_sticker_set->is_masks; bool is_animated = pending_new_sticker_set->is_animated; @@ -5827,15 +5812,7 @@ void StickersManager::on_new_stickers_uploaded(int64 random_id, Result res void StickersManager::add_sticker_to_set(UserId user_id, string &short_name, tl_object_ptr &&sticker, Promise &&promise) { - auto input_user = td_->contacts_manager_->get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "User not found")); - } - DialogId dialog_id(user_id); - auto input_peer = td_->messages_manager_->get_input_peer(dialog_id, AccessRights::Write); - if (input_peer == nullptr) { - return promise.set_error(Status::Error(400, "Have no access to the user")); - } + TRY_RESULT_PROMISE(promise, input_user, td_->contacts_manager_->get_input_user(user_id)); short_name = strip_empty_characters(short_name, MAX_STICKER_SET_SHORT_NAME_LENGTH); if (short_name.empty()) { @@ -5896,15 +5873,7 @@ void StickersManager::on_added_sticker_uploaded(int64 random_id, Result re void StickersManager::set_sticker_set_thumbnail(UserId user_id, string &short_name, tl_object_ptr &&thumbnail, Promise &&promise) { - auto input_user = td_->contacts_manager_->get_input_user(user_id); - if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "User not found")); - } - DialogId dialog_id(user_id); - auto input_peer = td_->messages_manager_->get_input_peer(dialog_id, AccessRights::Write); - if (input_peer == nullptr) { - return promise.set_error(Status::Error(400, "Have no access to the user")); - } + TRY_RESULT_PROMISE(promise, input_user, td_->contacts_manager_->get_input_user(user_id)); short_name = clean_username(strip_empty_characters(short_name, MAX_STICKER_SET_SHORT_NAME_LENGTH)); if (short_name.empty()) { diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index da9c01fe0..7bc1d69e6 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -5606,9 +5606,9 @@ void Td::on_request(uint64 id, const td_api::createCall &request) { } UserId user_id(request.user_id_); - auto input_user = contacts_manager_->get_input_user(user_id); - if (input_user == nullptr) { - return send_error_raw(id, 400, "User not found"); + auto r_input_user = contacts_manager_->get_input_user(user_id); + if (r_input_user.is_error()) { + return send_error_raw(id, r_input_user.error().code(), r_input_user.error().message()); } if (!G()->shared_config().get_option_boolean("calls_enabled")) { @@ -5623,7 +5623,7 @@ void Td::on_request(uint64 id, const td_api::createCall &request) { promise.set_value(result.ok().get_call_id_object()); } }); - send_closure(G()->call_manager(), &CallManager::create_call, user_id, std::move(input_user), + send_closure(G()->call_manager(), &CallManager::create_call, user_id, r_input_user.move_as_ok(), CallProtocol(*request.protocol_), request.is_video_, std::move(query_promise)); } @@ -7317,13 +7317,12 @@ void Td::on_request(uint64 id, const td_api::deletePassportElement &request) { void Td::on_request(uint64 id, td_api::setPassportElementErrors &request) { CHECK_IS_BOT(); - UserId user_id(request.user_id_); - auto input_user = contacts_manager_->get_input_user(user_id); - if (input_user == nullptr) { - return send_error_raw(id, 400, "User not found"); + auto r_input_user = contacts_manager_->get_input_user(UserId(request.user_id_)); + if (r_input_user.is_error()) { + return send_error_raw(id, r_input_user.error().code(), r_input_user.error().message()); } CREATE_OK_REQUEST_PROMISE(); - send_closure(secure_manager_, &SecureManager::set_secure_value_errors, this, std::move(input_user), + send_closure(secure_manager_, &SecureManager::set_secure_value_errors, this, r_input_user.move_as_ok(), std::move(request.errors_), std::move(promise)); }