Better removing of reply markup after bot has left.
GitOrigin-RevId: 11971b4485fc89fc663afaf5f30ef0f4a88e6d2e
This commit is contained in:
parent
b4c0d1b876
commit
ccb2649306
@ -6386,12 +6386,18 @@ void ContactsManager::update_chat_full(ChatFull *chat_full, ChatId chat_id) {
|
|||||||
CHECK(chat_full != nullptr);
|
CHECK(chat_full != nullptr);
|
||||||
if (chat_full->is_changed) {
|
if (chat_full->is_changed) {
|
||||||
vector<UserId> administrator_user_ids;
|
vector<UserId> administrator_user_ids;
|
||||||
|
vector<UserId> bot_user_ids;
|
||||||
for (auto &participant : chat_full->participants) {
|
for (auto &participant : chat_full->participants) {
|
||||||
|
auto user_id = participant.user_id;
|
||||||
if (participant.status.is_administrator()) {
|
if (participant.status.is_administrator()) {
|
||||||
administrator_user_ids.push_back(participant.user_id);
|
administrator_user_ids.push_back(user_id);
|
||||||
|
}
|
||||||
|
if (is_user_bot(user_id)) {
|
||||||
|
bot_user_ids.push_back(user_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
on_update_dialog_administrators(DialogId(chat_id), std::move(administrator_user_ids), chat_full->version != -1);
|
on_update_dialog_administrators(DialogId(chat_id), std::move(administrator_user_ids), chat_full->version != -1);
|
||||||
|
td_->messages_manager_->on_dialog_bots_updated(DialogId(chat_id), std::move(bot_user_ids));
|
||||||
|
|
||||||
chat_full->is_changed = false;
|
chat_full->is_changed = false;
|
||||||
send_closure(
|
send_closure(
|
||||||
@ -7281,10 +7287,15 @@ void ContactsManager::on_get_channel_participants_success(
|
|||||||
result.push_back(get_dialog_participant(channel_id, std::move(participant_ptr)));
|
result.push_back(get_dialog_participant(channel_id, std::move(participant_ptr)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filter.is_administrators() && offset == 0 && static_cast<int32>(participants.size()) < limit) {
|
if (offset == 0 && static_cast<int32>(participants.size()) < limit) {
|
||||||
on_update_dialog_administrators(
|
if (filter.is_administrators() || filter.is_bots()) {
|
||||||
DialogId(channel_id),
|
auto user_ids = transform(result, [](const DialogParticipant &participant) { return participant.user_id; });
|
||||||
transform(result, [](const DialogParticipant &participant) { return participant.user_id; }), true);
|
if (filter.is_administrators()) {
|
||||||
|
on_update_dialog_administrators(DialogId(channel_id), std::move(user_ids), true);
|
||||||
|
} else {
|
||||||
|
td_->messages_manager_->on_dialog_bots_updated(DialogId(channel_id), std::move(user_ids));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -258,6 +258,10 @@ class ChannelParticipantsFilter {
|
|||||||
bool is_administrators() const {
|
bool is_administrators() const {
|
||||||
return type == Type::Administrators;
|
return type == Type::Administrators;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_bots() const {
|
||||||
|
return type == Type::Bots;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class DialogParticipantsFilter : int32 { Administrators, Members, Restricted, Banned, Bots };
|
enum class DialogParticipantsFilter : int32 { Administrators, Members, Restricted, Banned, Bots };
|
||||||
|
@ -10474,13 +10474,15 @@ bool MessagesManager::can_unload_message(const Dialog *d, const Message *m) cons
|
|||||||
// don't want to unload messages from opened dialogs
|
// don't want to unload messages from opened dialogs
|
||||||
// don't want to unload messages to which there are replies in yet unsent messages
|
// don't want to unload messages to which there are replies in yet unsent messages
|
||||||
// don't want to unload messages with pending web pages
|
// don't want to unload messages with pending web pages
|
||||||
|
// don't want to unload message with active reply markup
|
||||||
// can't unload from memory last dialog, last database messages, yet unsent messages, being edited media messages and active live locations
|
// can't unload from memory last dialog, last database messages, yet unsent messages, being edited media messages and active live locations
|
||||||
// can't unload messages in dialog with active suffix load query
|
// can't unload messages in dialog with active suffix load query
|
||||||
FullMessageId full_message_id{d->dialog_id, m->message_id};
|
FullMessageId full_message_id{d->dialog_id, m->message_id};
|
||||||
return !d->is_opened && m->message_id != d->last_message_id && m->message_id != d->last_database_message_id &&
|
return !d->is_opened && m->message_id != d->last_message_id && m->message_id != d->last_database_message_id &&
|
||||||
!m->message_id.is_yet_unsent() && active_live_location_full_message_ids_.count(full_message_id) == 0 &&
|
!m->message_id.is_yet_unsent() && active_live_location_full_message_ids_.count(full_message_id) == 0 &&
|
||||||
replied_by_yet_unsent_messages_.count(full_message_id) == 0 && m->edited_content == nullptr &&
|
replied_by_yet_unsent_messages_.count(full_message_id) == 0 && m->edited_content == nullptr &&
|
||||||
waiting_for_web_page_messages_.count(full_message_id) == 0 && d->suffix_load_queries_.empty();
|
waiting_for_web_page_messages_.count(full_message_id) == 0 && d->suffix_load_queries_.empty() &&
|
||||||
|
m->message_id != d->reply_markup_message_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessagesManager::unload_message(Dialog *d, MessageId message_id) {
|
void MessagesManager::unload_message(Dialog *d, MessageId message_id) {
|
||||||
@ -19273,6 +19275,23 @@ void MessagesManager::on_create_new_dialog_fail(int64 random_id, Status error, P
|
|||||||
td_->updates_manager_->get_difference("on_create_new_dialog_fail");
|
td_->updates_manager_->get_difference("on_create_new_dialog_fail");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MessagesManager::on_dialog_bots_updated(DialogId dialog_id, vector<UserId> bot_user_ids) {
|
||||||
|
if (td_->auth_manager_->is_bot()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto d = get_dialog_force(dialog_id);
|
||||||
|
if (d->reply_markup_message_id == MessageId()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const Message *m = get_message_force(d, d->reply_markup_message_id);
|
||||||
|
if (m == nullptr || std::find(bot_user_ids.begin(), bot_user_ids.end(), m->sender_user_id) == bot_user_ids.end()) {
|
||||||
|
LOG(INFO) << "Remove reply markup in " << dialog_id << ", because bot " << m->sender_user_id
|
||||||
|
<< " isn't a member of the chat";
|
||||||
|
set_dialog_reply_markup(d, MessageId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MessagesManager::on_dialog_photo_updated(DialogId dialog_id) {
|
void MessagesManager::on_dialog_photo_updated(DialogId dialog_id) {
|
||||||
auto d = get_dialog(dialog_id); // called from update_user, must not create the dialog
|
auto d = get_dialog(dialog_id); // called from update_user, must not create the dialog
|
||||||
if (d != nullptr && d->is_update_new_chat_sent) {
|
if (d != nullptr && d->is_update_new_chat_sent) {
|
||||||
@ -21265,9 +21284,11 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
|
|||||||
|
|
||||||
if (!td_->auth_manager_->is_bot() && from_update && d->reply_markup_message_id != MessageId()) {
|
if (!td_->auth_manager_->is_bot() && from_update && d->reply_markup_message_id != MessageId()) {
|
||||||
auto deleted_user_id = get_message_content_deleted_user_id(m->content.get());
|
auto deleted_user_id = get_message_content_deleted_user_id(m->content.get());
|
||||||
if (deleted_user_id.is_valid() && td_->contacts_manager_->is_user_bot(deleted_user_id)) {
|
if (deleted_user_id.is_valid()) { // do not check for is_user_bot to allow deleted bots
|
||||||
const Message *old_message = get_message_force(d, d->reply_markup_message_id);
|
const Message *old_message = get_message_force(d, d->reply_markup_message_id);
|
||||||
if (old_message == nullptr || old_message->sender_user_id == deleted_user_id) {
|
if (old_message == nullptr || old_message->sender_user_id == deleted_user_id) {
|
||||||
|
LOG(INFO) << "Remove reply markup in " << dialog_id << ", because bot " << deleted_user_id
|
||||||
|
<< " isn't a member of the chat";
|
||||||
set_dialog_reply_markup(d, MessageId());
|
set_dialog_reply_markup(d, MessageId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -581,6 +581,8 @@ class MessagesManager : public Actor {
|
|||||||
|
|
||||||
bool is_update_about_username_change_received(DialogId dialog_id) const;
|
bool is_update_about_username_change_received(DialogId dialog_id) const;
|
||||||
|
|
||||||
|
void on_dialog_bots_updated(DialogId dialog_id, vector<UserId> bot_user_ids);
|
||||||
|
|
||||||
void on_dialog_photo_updated(DialogId dialog_id);
|
void on_dialog_photo_updated(DialogId dialog_id);
|
||||||
void on_dialog_title_updated(DialogId dialog_id);
|
void on_dialog_title_updated(DialogId dialog_id);
|
||||||
void on_dialog_username_updated(DialogId dialog_id, const string &old_username, const string &new_username);
|
void on_dialog_username_updated(DialogId dialog_id, const string &old_username, const string &new_username);
|
||||||
|
Loading…
Reference in New Issue
Block a user