Use service messages to synchronize active group call state.

This commit is contained in:
levlam 2021-04-11 05:37:53 +03:00
parent 4b212b0728
commit 47a7bc05e2
4 changed files with 33 additions and 2 deletions

View File

@ -2593,6 +2593,12 @@ FullMessageId get_message_content_replied_message_id(DialogId dialog_id, const M
}
}
std::pair<InputGroupCallId, bool> get_message_content_group_call_info(const MessageContent *content) {
CHECK(content->get_type() == MessageContentType::GroupCall);
auto message_group_call = static_cast<const MessageGroupCall *>(content);
return {message_group_call->input_group_call_id, message_group_call->duration >= 0};
}
vector<UserId> get_message_content_added_user_ids(const MessageContent *content) {
CHECK(content->get_type() == MessageContentType::ChatAddUsers);
return static_cast<const MessageChatAddUsers *>(content)->user_ids;

View File

@ -9,6 +9,7 @@
#include "td/telegram/DialogId.h"
#include "td/telegram/files/FileId.h"
#include "td/telegram/FullMessageId.h"
#include "td/telegram/InputGroupCallId.h"
#include "td/telegram/logevent/LogEvent.h"
#include "td/telegram/MessageContentType.h"
#include "td/telegram/MessageCopyOptions.h"
@ -132,6 +133,8 @@ MessageId get_message_content_pinned_message_id(const MessageContent *content);
FullMessageId get_message_content_replied_message_id(DialogId dialog_id, const MessageContent *content);
std::pair<InputGroupCallId, bool> get_message_content_group_call_info(const MessageContent *content);
vector<UserId> get_message_content_added_user_ids(const MessageContent *content);
UserId get_message_content_deleted_user_id(const MessageContent *content);

View File

@ -29861,11 +29861,10 @@ void MessagesManager::on_update_dialog_group_call_id(DialogId dialog_id, InputGr
}
if (d->active_group_call_id != input_group_call_id) {
LOG(INFO) << "Update active group call in " << dialog_id << " to " << input_group_call_id;
d->active_group_call_id = input_group_call_id;
bool has_active_group_call = input_group_call_id.is_valid();
if (has_active_group_call != d->has_active_group_call) {
LOG(ERROR) << "Receive invalid has_active_group_call flag " << d->has_active_group_call << ", but have "
<< input_group_call_id << " in " << dialog_id;
d->has_active_group_call = has_active_group_call;
if (!has_active_group_call) {
d->is_group_call_empty = false;
@ -32607,6 +32606,7 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
}
if (from_update) {
speculatively_update_active_group_call_id(d, m);
speculatively_update_channel_participants(dialog_id, m);
update_sent_message_contents(dialog_id, m);
update_used_hashtags(dialog_id, m);
@ -36055,6 +36055,26 @@ void MessagesManager::reget_message_from_server_if_needed(DialogId dialog_id, co
}
}
void MessagesManager::speculatively_update_active_group_call_id(Dialog *d, const Message *m) {
CHECK(m != nullptr);
if (!m->message_id.is_any_server() || m->content->get_type() != MessageContentType::GroupCall) {
return;
}
InputGroupCallId input_group_call_id;
bool is_ended;
std::tie(input_group_call_id, is_ended) = get_message_content_group_call_info(m->content.get());
if (is_ended) {
if (d->active_group_call_id == input_group_call_id) {
on_update_dialog_group_call_id(d->dialog_id, InputGroupCallId());
}
} else {
if (d->active_group_call_id != input_group_call_id) {
repair_dialog_active_group_call_id(d->dialog_id);
}
}
}
void MessagesManager::speculatively_update_channel_participants(DialogId dialog_id, const Message *m) {
CHECK(m != nullptr);
if (!m->message_id.is_any_server() || dialog_id.get_type() != DialogType::Channel || !m->sender_user_id.is_valid()) {

View File

@ -2881,6 +2881,8 @@ class MessagesManager : public Actor {
void reget_message_from_server_if_needed(DialogId dialog_id, const Message *m);
void speculatively_update_active_group_call_id(Dialog *d, const Message *m);
void speculatively_update_channel_participants(DialogId dialog_id, const Message *m);
void update_sent_message_contents(DialogId dialog_id, const Message *m);