diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index f03f63858..99cbcb193 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -6973,7 +6973,7 @@ void MessagesManager::on_user_dialog_action(DialogId dialog_id, MessageId top_th progress <= prev_progress) { return; } - if (top_thread_message_id != prev_top_thread_message_id) { + if (top_thread_message_id != prev_top_thread_message_id && prev_top_thread_message_id.is_valid()) { send_update_user_chat_action(dialog_id, prev_top_thread_message_id, user_id, td_api::make_object()); } @@ -6983,6 +6983,9 @@ void MessagesManager::on_user_dialog_action(DialogId dialog_id, MessageId top_th } } + if (top_thread_message_id.is_valid()) { + send_update_user_chat_action(dialog_id, MessageId(), user_id, copy_chat_action_object(action)); + } send_update_user_chat_action(dialog_id, top_thread_message_id, user_id, std::move(action)); } @@ -28916,6 +28919,52 @@ bool MessagesManager::is_dialog_action_unneeded(DialogId dialog_id) const { return false; } +tl_object_ptr MessagesManager::copy_chat_action_object( + const tl_object_ptr &action) { + CHECK(action != nullptr); + switch (action->get_id()) { + case td_api::chatActionCancel::ID: + return make_tl_object(); + case td_api::chatActionTyping::ID: + return make_tl_object(); + case td_api::chatActionRecordingVideo::ID: + return make_tl_object(); + case td_api::chatActionUploadingVideo::ID: { + auto progress = static_cast(*action).progress_; + return make_tl_object(progress); + } + case td_api::chatActionRecordingVoiceNote::ID: + return make_tl_object(); + case td_api::chatActionUploadingVoiceNote::ID: { + auto progress = static_cast(*action).progress_; + return make_tl_object(progress); + } + case td_api::chatActionUploadingPhoto::ID: { + auto progress = static_cast(*action).progress_; + return make_tl_object(progress); + } + case td_api::chatActionUploadingDocument::ID: { + auto progress = static_cast(*action).progress_; + return make_tl_object(progress); + } + case td_api::chatActionChoosingLocation::ID: + return make_tl_object(); + case td_api::chatActionChoosingContact::ID: + return make_tl_object(); + case td_api::chatActionStartPlayingGame::ID: + return make_tl_object(); + case td_api::chatActionRecordingVideoNote::ID: + return make_tl_object(); + case td_api::chatActionUploadingVideoNote::ID: { + auto progress = static_cast(*action).progress_; + return make_tl_object(progress); + } + default: + UNREACHABLE(); + return nullptr; + } +} + void MessagesManager::send_dialog_action(DialogId dialog_id, MessageId top_thread_message_id, const tl_object_ptr &action, Promise &&promise) { if (action == nullptr) { diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 7f5d7c85c..306a570e1 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -2353,6 +2353,8 @@ class MessagesManager : public Actor { bool update_dialog_silent_send_message(Dialog *d, bool silent_send_message); + static tl_object_ptr copy_chat_action_object(const tl_object_ptr &action); + bool is_dialog_action_unneeded(DialogId dialog_id) const; void on_send_dialog_action_timeout(DialogId dialog_id);