From d968fd0bedd7b94244bd02e06ef0dd5281d90776 Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 26 Oct 2020 15:25:34 +0300 Subject: [PATCH] Implement new chat action rules. GitOrigin-RevId: 12214755c86adfee0a7b3ec5f6e39024364cdb99 --- td/telegram/ContactsManager.cpp | 4 +-- td/telegram/ContactsManager.h | 2 +- td/telegram/MessagesManager.cpp | 34 ++++++++++++++---- td/telegram/UpdatesManager.cpp | 61 +++++---------------------------- 4 files changed, 40 insertions(+), 61 deletions(-) diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index c2def7dad..0e86d692e 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -12272,9 +12272,9 @@ Result ContactsManager::get_bot_data(UserId user_id) const { return bot_data; } -bool ContactsManager::is_user_online(UserId user_id) const { +bool ContactsManager::is_user_online(UserId user_id, int32 tolerance) const { int32 was_online = get_user_was_online(get_user(user_id), user_id); - return was_online > G()->unix_time(); + return was_online > G()->unix_time() - tolerance; } bool ContactsManager::is_user_status_exact(UserId user_id) const { diff --git a/td/telegram/ContactsManager.h b/td/telegram/ContactsManager.h index 197fed8c8..787c88ae4 100644 --- a/td/telegram/ContactsManager.h +++ b/td/telegram/ContactsManager.h @@ -429,7 +429,7 @@ class ContactsManager : public Actor { bool is_user_bot(UserId user_id) const; Result get_bot_data(UserId user_id) const TD_WARN_UNUSED_RESULT; - bool is_user_online(UserId user_id) const; + bool is_user_online(UserId user_id, int32 tolerance = 0) const; bool is_user_status_exact(UserId user_id) const; diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 0a3b7cc88..2384a05c0 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -6834,12 +6834,32 @@ void MessagesManager::on_user_dialog_action(DialogId dialog_id, MessageId top_th if (td_->auth_manager_->is_bot() || !user_id.is_valid() || is_broadcast_channel(dialog_id)) { return; } + if (!td_->messages_manager_->have_dialog(dialog_id)) { + LOG(DEBUG) << "Ignore typing in unknown " << dialog_id; + return; + } + if (!td_->contacts_manager_->have_min_user(user_id)) { + LOG(DEBUG) << "Ignore typing of unknown " << user_id; + return; + } + if (top_thread_message_id != MessageId() && !top_thread_message_id.is_valid()) { + LOG(ERROR) << "Ignore typing in the message thread of " << top_thread_message_id; + return; + } bool is_canceled = action == DialogAction(); if (!is_canceled || message_content_type != MessageContentType::None) { td_->contacts_manager_->on_update_user_local_was_online(user_id, date); } + auto dialog_type = dialog_id.get_type(); + if (dialog_type == DialogType::User || dialog_type == DialogType::SecretChat) { + if (!td_->contacts_manager_->is_user_bot(user_id) && !td_->contacts_manager_->is_user_status_exact(user_id) && + !get_dialog(dialog_id)->is_opened) { + return; + } + } + if (is_canceled) { auto actions_it = active_dialog_actions_.find(dialog_id); if (actions_it == active_dialog_actions_.end()) { @@ -28864,12 +28884,14 @@ bool MessagesManager::is_dialog_action_unneeded(DialogId dialog_id) const { return true; } - if (!td_->auth_manager_->is_bot() && !td_->contacts_manager_->is_user_online(user_id)) { - return true; - } - - if (!td_->auth_manager_->is_bot() && !td_->contacts_manager_->is_user_status_exact(user_id)) { - // return true; + if (!td_->auth_manager_->is_bot()) { + if (td_->contacts_manager_->is_user_status_exact(user_id)) { + if (!td_->contacts_manager_->is_user_online(user_id, 30)) { + return true; + } + } else { + // return true; + } } } return false; diff --git a/td/telegram/UpdatesManager.cpp b/td/telegram/UpdatesManager.cpp index 57fb0ae7f..80a27546d 100644 --- a/td/telegram/UpdatesManager.cpp +++ b/td/telegram/UpdatesManager.cpp @@ -1836,74 +1836,31 @@ int32 UpdatesManager::get_short_update_date() const { void UpdatesManager::on_update(tl_object_ptr update, bool /*force_apply*/) { UserId user_id(update->user_id_); - if (!td_->contacts_manager_->have_min_user(user_id)) { - LOG(DEBUG) << "Ignore user typing of unknown " << user_id; - return; - } - DialogId dialog_id(user_id); - if (!td_->messages_manager_->have_dialog(dialog_id)) { - LOG(DEBUG) << "Ignore user typing in unknown " << dialog_id; - return; - } - td_->messages_manager_->on_user_dialog_action(dialog_id, MessageId(), user_id, + td_->messages_manager_->on_user_dialog_action(DialogId(user_id), MessageId(), user_id, DialogAction(std::move(update->action_)), get_short_update_date()); } void UpdatesManager::on_update(tl_object_ptr update, bool /*force_apply*/) { - UserId user_id(update->user_id_); - if (!td_->contacts_manager_->have_min_user(user_id)) { - LOG(DEBUG) << "Ignore user chat typing of unknown " << user_id; - return; - } - DialogId dialog_id(ChatId(update->chat_id_)); - if (!td_->messages_manager_->have_dialog(dialog_id)) { - LOG(DEBUG) << "Ignore user chat typing in unknown " << dialog_id; - return; - } - td_->messages_manager_->on_user_dialog_action(dialog_id, MessageId(), user_id, - DialogAction(std::move(update->action_)), get_short_update_date()); + td_->messages_manager_->on_user_dialog_action(DialogId(ChatId(update->chat_id_)), MessageId(), + UserId(update->user_id_), DialogAction(std::move(update->action_)), + get_short_update_date()); } void UpdatesManager::on_update(tl_object_ptr update, bool /*force_apply*/) { - UserId user_id(update->user_id_); - if (!td_->contacts_manager_->have_min_user(user_id)) { - LOG(DEBUG) << "Ignore user channel typing of unknown " << user_id; - return; - } - DialogId dialog_id(ChannelId(update->channel_id_)); - if (!td_->messages_manager_->have_dialog(dialog_id)) { - LOG(DEBUG) << "Ignore user channel typing in unknown " << dialog_id; - return; - } MessageId top_thread_message_id; if ((update->flags_ & telegram_api::updateChannelUserTyping::TOP_MSG_ID_MASK) != 0) { top_thread_message_id = MessageId(ServerMessageId(update->top_msg_id_)); - if (!top_thread_message_id.is_valid() && top_thread_message_id != MessageId()) { - LOG(ERROR) << "Ignore user channel typing in the message thread of " << top_thread_message_id; - return; - } } - td_->messages_manager_->on_user_dialog_action(dialog_id, top_thread_message_id, user_id, - DialogAction(std::move(update->action_)), get_short_update_date()); + td_->messages_manager_->on_user_dialog_action(DialogId(ChannelId(update->channel_id_)), top_thread_message_id, + UserId(update->user_id_), DialogAction(std::move(update->action_)), + get_short_update_date()); } void UpdatesManager::on_update(tl_object_ptr update, bool /*force_apply*/) { SecretChatId secret_chat_id(update->chat_id_); - DialogId dialog_id(secret_chat_id); - - if (!td_->messages_manager_->have_dialog(dialog_id)) { - LOG(DEBUG) << "Ignore secret chat typing in unknown " << dialog_id; - return; - } - UserId user_id = td_->contacts_manager_->get_secret_chat_user_id(secret_chat_id); - if (!td_->contacts_manager_->have_user_force(user_id)) { - LOG(DEBUG) << "Ignore secret chat typing of unknown " << user_id; - return; - } - - td_->messages_manager_->on_user_dialog_action(dialog_id, MessageId(), user_id, DialogAction::get_typing_action(), - get_short_update_date()); + td_->messages_manager_->on_user_dialog_action(DialogId(secret_chat_id), MessageId(), user_id, + DialogAction::get_typing_action(), get_short_update_date()); } void UpdatesManager::on_update(tl_object_ptr update, bool /*force_apply*/) {