Add Dialog.has_bots flag.

This commit is contained in:
levlam 2021-07-22 04:10:40 +03:00
parent a393bc5f71
commit cf579c761a
2 changed files with 67 additions and 11 deletions

View File

@ -5300,6 +5300,7 @@ void MessagesManager::Dialog::store(StorerT &storer) const {
last_database_message = get_message(this, last_database_message_id);
}
auto dialog_type = dialog_id.get_type();
bool has_draft_message = draft_message != nullptr;
bool has_last_database_message = last_database_message != nullptr;
bool has_first_database_message_id = first_database_message_id.is_valid();
@ -5329,6 +5330,7 @@ void MessagesManager::Dialog::store(StorerT &storer) const {
bool has_active_group_call_id = active_group_call_id.is_valid();
bool has_message_ttl_setting = !message_ttl_setting.is_empty();
bool has_default_join_group_call_as_dialog_id = default_join_group_call_as_dialog_id.is_valid();
bool store_has_bots = dialog_type == DialogType::Chat || dialog_type == DialogType::Channel;
BEGIN_STORE_FLAGS();
STORE_FLAG(has_draft_message);
STORE_FLAG(has_last_database_message);
@ -5391,6 +5393,8 @@ void MessagesManager::Dialog::store(StorerT &storer) const {
STORE_FLAG(has_message_ttl_setting);
STORE_FLAG(is_message_ttl_setting_inited);
STORE_FLAG(has_default_join_group_call_as_dialog_id);
STORE_FLAG(store_has_bots ? has_bots : false);
STORE_FLAG(store_has_bots ? is_has_bots_inited : false); // 26
END_STORE_FLAGS();
}
@ -5578,6 +5582,8 @@ void MessagesManager::Dialog::parse(ParserT &parser) {
PARSE_FLAG(has_message_ttl_setting);
PARSE_FLAG(is_message_ttl_setting_inited);
PARSE_FLAG(has_default_join_group_call_as_dialog_id);
PARSE_FLAG(has_bots);
PARSE_FLAG(is_has_bots_inited);
END_PARSE_FLAGS();
} else {
is_folder_id_inited = false;
@ -5598,6 +5604,8 @@ void MessagesManager::Dialog::parse(ParserT &parser) {
is_group_call_empty = false;
can_invite_members = false;
is_message_ttl_setting_inited = false;
has_bots = false;
is_has_bots_inited = false;
}
parse(last_new_message_id, parser);
@ -14397,6 +14405,11 @@ void MessagesManager::on_get_dialogs(FolderId folder_id, vector<tl_object_ptr<te
// TODO add is_blocked to telegram_api::dialog
get_dialog_info_full(dialog_id, Auto());
}
if (!d->is_has_bots_inited && !td_->auth_manager_->is_bot()) {
// asynchronously get has_bots from the server
// TODO add has_bots to telegram_api::dialog
get_dialog_info_full(dialog_id, Auto());
}
if (!d->is_last_pinned_message_id_inited && !td_->auth_manager_->is_bot()) {
// asynchronously get dialog pinned message from the server
get_dialog_pinned_message(dialog_id, Auto());
@ -29641,15 +29654,33 @@ void MessagesManager::on_dialog_bots_updated(DialogId dialog_id, vector<UserId>
}
auto d = from_database ? get_dialog(dialog_id) : get_dialog_force(dialog_id, "on_dialog_bots_updated");
if (d == nullptr || d->reply_markup_message_id == MessageId()) {
if (d == nullptr) {
return;
}
const Message *m = get_message_force(d, d->reply_markup_message_id, "on_dialog_bots_updated");
if (m == nullptr || (m->sender_user_id.is_valid() && !td::contains(bot_user_ids, m->sender_user_id))) {
LOG(INFO) << "Remove reply markup in " << dialog_id << ", because bot "
<< (m == nullptr ? UserId() : m->sender_user_id) << " isn't a member of the chat";
set_dialog_reply_markup(d, MessageId());
bool has_bots = !bot_user_ids.empty();
if (!d->is_has_bots_inited || d->has_bots != has_bots) {
d->is_has_bots_inited = true;
set_dialog_has_bots(d, has_bots);
on_dialog_updated(dialog_id, "on_dialog_bots_updated");
}
if (d->reply_markup_message_id != MessageId()) {
const Message *m = get_message_force(d, d->reply_markup_message_id, "on_dialog_bots_updated");
if (m == nullptr || (m->sender_user_id.is_valid() && !td::contains(bot_user_ids, m->sender_user_id))) {
LOG(INFO) << "Remove reply markup in " << dialog_id << ", because bot "
<< (m == nullptr ? UserId() : m->sender_user_id) << " isn't a member of the chat";
set_dialog_reply_markup(d, MessageId());
}
}
}
void MessagesManager::set_dialog_has_bots(Dialog *d, bool has_bots) {
CHECK(d != nullptr);
d->has_bots = has_bots;
LOG(INFO) << "Set " << d->dialog_id << " has_bots to " << has_bots;
LOG_CHECK(d->is_update_new_chat_sent) << "Wrong " << d->dialog_id << " in set_dialog_has_bots";
}
void MessagesManager::on_dialog_photo_updated(DialogId dialog_id) {
@ -29735,7 +29766,7 @@ void MessagesManager::on_dialog_user_is_deleted_updated(DialogId dialog_id, bool
if (!dialog_filters_.empty() && d->order != DEFAULT_ORDER) {
update_dialog_lists(d, get_dialog_positions(d), true, false, "on_dialog_user_is_deleted_updated");
td_->contacts_manager_->for_each_secret_chat_with_user(
d->dialog_id.get_user_id(), [this](SecretChatId secret_chat_id) {
dialog_id.get_user_id(), [this](SecretChatId secret_chat_id) {
DialogId dialog_id(secret_chat_id);
auto d = get_dialog(dialog_id); // must not create the dialog
if (d != nullptr && d->is_update_new_chat_sent && d->order != DEFAULT_ORDER) {
@ -29743,6 +29774,18 @@ void MessagesManager::on_dialog_user_is_deleted_updated(DialogId dialog_id, bool
}
});
}
if (is_deleted && d->has_bots) {
set_dialog_has_bots(d, false);
td_->contacts_manager_->for_each_secret_chat_with_user(
dialog_id.get_user_id(), [this](SecretChatId secret_chat_id) {
DialogId dialog_id(secret_chat_id);
auto d = get_dialog(dialog_id); // must not create the dialog
if (d != nullptr && d->is_update_new_chat_sent && d->has_bots) {
set_dialog_has_bots(d, false);
}
});
}
}
}
@ -33570,6 +33613,8 @@ MessagesManager::Dialog *MessagesManager::add_new_dialog(unique_ptr<Dialog> &&d,
d->last_read_inbox_message_id = d->last_new_message_id;
d->last_read_outbox_message_id = d->last_new_message_id;
}
d->has_bots = td_->contacts_manager_->is_user_bot(dialog_id.get_user_id());
d->is_has_bots_inited = true;
break;
case DialogType::Chat:
d->is_is_blocked_inited = true;
@ -33592,7 +33637,7 @@ MessagesManager::Dialog *MessagesManager::add_new_dialog(unique_ptr<Dialog> &&d,
}
case DialogType::SecretChat:
if (d->last_new_message_id.get() <= MessageId::min().get()) {
LOG(INFO) << "Set " << d->dialog_id << " last new message in add_new_dialog from " << source;
LOG(INFO) << "Set " << dialog_id << " last new message in add_new_dialog from " << source;
d->last_new_message_id = MessageId::min().get_next_message_id(MessageType::Local);
}
@ -33600,7 +33645,7 @@ MessagesManager::Dialog *MessagesManager::add_new_dialog(unique_ptr<Dialog> &&d,
d->notification_settings.use_default_show_preview = true;
d->notification_settings.show_preview = false;
d->notification_settings.is_secret_chat_show_preview_fixed = true;
on_dialog_updated(d->dialog_id, "fix secret chat show preview");
on_dialog_updated(dialog_id, "fix secret chat show preview");
}
d->have_full_history = true;
@ -33616,6 +33661,9 @@ MessagesManager::Dialog *MessagesManager::add_new_dialog(unique_ptr<Dialog> &&d,
d->message_ttl_setting =
MessageTtlSetting(td_->contacts_manager_->get_secret_chat_ttl(dialog_id.get_secret_chat_id()));
d->is_message_ttl_setting_inited = true;
d->has_bots = td_->contacts_manager_->is_user_bot(
td_->contacts_manager_->get_secret_chat_user_id(dialog_id.get_secret_chat_id()));
d->is_has_bots_inited = true;
break;
case DialogType::None:
@ -33644,10 +33692,10 @@ MessagesManager::Dialog *MessagesManager::add_new_dialog(unique_ptr<Dialog> &&d,
}
if (d->message_notification_group.group_id.is_valid()) {
notification_group_id_to_dialog_id_.emplace(d->message_notification_group.group_id, d->dialog_id);
notification_group_id_to_dialog_id_.emplace(d->message_notification_group.group_id, dialog_id);
}
if (d->mention_notification_group.group_id.is_valid()) {
notification_group_id_to_dialog_id_.emplace(d->mention_notification_group.group_id, d->dialog_id);
notification_group_id_to_dialog_id_.emplace(d->mention_notification_group.group_id, dialog_id);
}
if (pending_dialog_group_call_updates_.count(dialog_id) > 0) {
auto it = pending_dialog_group_call_updates_.find(dialog_id);
@ -33715,6 +33763,10 @@ void MessagesManager::fix_new_dialog(Dialog *d, unique_ptr<Message> &&last_datab
// asynchronously get is_blocked from the server
get_dialog_info_full(dialog_id, Auto());
}
if (being_added_dialog_id_ != dialog_id && !d->is_has_bots_inited && !td_->auth_manager_->is_bot()) {
// asynchronously get has_bots from the server
get_dialog_info_full(dialog_id, Auto());
}
if (being_added_dialog_id_ != dialog_id && !d->is_last_pinned_message_id_inited && !td_->auth_manager_->is_bot()) {
// asynchronously get dialog pinned message from the server
get_dialog_pinned_message(dialog_id, Auto());

View File

@ -1229,6 +1229,8 @@ class MessagesManager final : public Actor {
bool is_group_call_empty = false;
bool is_message_ttl_setting_inited = false;
bool has_expected_active_group_call_id = false;
bool has_bots = false;
bool is_has_bots_inited = false;
bool increment_view_counter = false;
@ -2316,6 +2318,8 @@ class MessagesManager final : public Actor {
void set_dialog_is_blocked(Dialog *d, bool is_blocked);
void set_dialog_has_bots(Dialog *d, bool has_bots);
void set_dialog_last_pinned_message_id(Dialog *d, MessageId last_pinned_message_id);
void drop_dialog_last_pinned_message_id(Dialog *d);