diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index 2ac223d6c..69c48b245 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -5973,7 +5973,7 @@ void ContactsManager::on_create_channel_group_call(ChannelId channel_id, InputGr channel_full->is_changed = true; update_channel_full(channel_full, channel_id); } - promise.set_value(td_->group_call_manager_->get_group_call_id(input_group_call_id)); + promise.set_value(td_->group_call_manager_->get_group_call_id(input_group_call_id, channel_id)); } void ContactsManager::get_channel_statistics_dc_id(DialogId dialog_id, bool for_full_statistics, @@ -9218,7 +9218,7 @@ void ContactsManager::update_channel_full(ChannelFull *channel_full, ChannelId c send_closure( G()->td(), &Td::send_update, make_tl_object(get_supergroup_id_object(channel_id, "update_channel_full"), - get_supergroup_full_info_object(channel_full))); + get_supergroup_full_info_object(channel_full, channel_id))); channel_full->need_send_update = false; } if (channel_full->need_save_to_database) { @@ -14384,11 +14384,11 @@ tl_object_ptr ContactsManager::get_supergroup_object(Channel } tl_object_ptr ContactsManager::get_supergroup_full_info_object(ChannelId channel_id) const { - return get_supergroup_full_info_object(get_channel_full(channel_id)); + return get_supergroup_full_info_object(get_channel_full(channel_id), channel_id); } tl_object_ptr ContactsManager::get_supergroup_full_info_object( - const ChannelFull *channel_full) const { + const ChannelFull *channel_full, ChannelId channel_id) const { CHECK(channel_full != nullptr); double slow_mode_delay_expires_in = 0; if (channel_full->slow_mode_next_send_date != 0) { @@ -14398,7 +14398,7 @@ tl_object_ptr ContactsManager::get_supergroup_full_i get_chat_photo_object(td_->file_manager_.get(), channel_full->photo), channel_full->description, channel_full->participant_count, channel_full->administrator_count, channel_full->restricted_count, channel_full->banned_count, DialogId(channel_full->linked_channel_id).get(), - td_->group_call_manager_->get_group_call_id(channel_full->active_group_call_id).get(), + td_->group_call_manager_->get_group_call_id(channel_full->active_group_call_id, channel_id).get(), channel_full->slow_mode_delay, slow_mode_delay_expires_in, channel_full->can_get_participants, channel_full->can_set_username, channel_full->can_set_sticker_set, channel_full->can_set_location, channel_full->can_view_statistics, channel_full->is_all_history_available, channel_full->sticker_set_id.get(), @@ -14622,7 +14622,7 @@ void ContactsManager::get_current_state(vector( - it.first.get(), get_supergroup_full_info_object(it.second.get()))); + it.first.get(), get_supergroup_full_info_object(it.second.get(), it.first))); } for (auto &it : chats_full_) { updates.push_back(td_api::make_object( diff --git a/td/telegram/ContactsManager.h b/td/telegram/ContactsManager.h index 5daa380f3..a0b639475 100644 --- a/td/telegram/ContactsManager.h +++ b/td/telegram/ContactsManager.h @@ -1411,7 +1411,8 @@ class ContactsManager : public Actor { tl_object_ptr get_supergroup_object(ChannelId channel_id, const Channel *c) const; - tl_object_ptr get_supergroup_full_info_object(const ChannelFull *channel_full) const; + tl_object_ptr get_supergroup_full_info_object(const ChannelFull *channel_full, + ChannelId channel_id) const; static tl_object_ptr get_secret_chat_state_object(SecretChatState state); diff --git a/td/telegram/GroupCallId.h b/td/telegram/GroupCallId.h index 05e534cfa..a5778ca66 100644 --- a/td/telegram/GroupCallId.h +++ b/td/telegram/GroupCallId.h @@ -6,8 +6,6 @@ // #pragma once -#include "td/telegram/td_api.h" - #include "td/utils/common.h" #include "td/utils/StringBuilder.h" @@ -34,10 +32,6 @@ class GroupCallId { return id; } - auto get_group_call_id_object() const { - return td_api::make_object(id); - } - bool operator==(const GroupCallId &other) const { return id == other.id; } diff --git a/td/telegram/GroupCallManager.cpp b/td/telegram/GroupCallManager.cpp index e7a37fe8d..8771cdcf6 100644 --- a/td/telegram/GroupCallManager.cpp +++ b/td/telegram/GroupCallManager.cpp @@ -331,6 +331,7 @@ class DiscardGroupCallQuery : public Td::ResultHandler { struct GroupCallManager::GroupCall { GroupCallId group_call_id; + ChannelId channel_id; bool is_inited = false; bool is_active = false; bool is_joined = false; @@ -358,8 +359,8 @@ void GroupCallManager::tear_down() { parent_.reset(); } -GroupCallId GroupCallManager::get_group_call_id(InputGroupCallId input_group_call_id) { - return add_group_call(input_group_call_id)->group_call_id; +GroupCallId GroupCallManager::get_group_call_id(InputGroupCallId input_group_call_id, ChannelId channel_id) { + return add_group_call(input_group_call_id, channel_id)->group_call_id; } Result GroupCallManager::get_input_group_call_id(GroupCallId group_call_id) { @@ -379,12 +380,16 @@ GroupCallId GroupCallManager::get_next_group_call_id(InputGroupCallId input_grou return max_group_call_id_; } -GroupCallManager::GroupCall *GroupCallManager::add_group_call(InputGroupCallId input_group_call_id) { +GroupCallManager::GroupCall *GroupCallManager::add_group_call(InputGroupCallId input_group_call_id, + ChannelId channel_id) { auto &group_call = group_calls_[input_group_call_id]; if (group_call == nullptr) { group_call = make_unique(); group_call->group_call_id = get_next_group_call_id(input_group_call_id); } + if (!group_call->channel_id.is_valid()) { + group_call->channel_id = channel_id; + } return group_call.get(); } @@ -446,7 +451,7 @@ void GroupCallManager::finish_get_group_call(InputGroupCallId input_group_call_i if (result.is_ok()) { td_->contacts_manager_->on_get_users(std::move(result.ok_ref()->users_), "finish_get_group_call"); - auto call_id = update_group_call(result.ok()->call_); + auto call_id = update_group_call(result.ok()->call_, ChannelId()); if (call_id != input_group_call_id) { LOG(ERROR) << "Expected " << input_group_call_id << ", but received " << to_string(result.ok()); result = Status::Error(500, "Receive another group call"); @@ -745,8 +750,13 @@ void GroupCallManager::discard_group_call(GroupCallId group_call_id, Promisecreate_handler(std::move(promise))->send(input_group_call_id); } -void GroupCallManager::on_update_group_call(tl_object_ptr group_call_ptr) { - auto call_id = update_group_call(group_call_ptr); +void GroupCallManager::on_update_group_call(tl_object_ptr group_call_ptr, + ChannelId channel_id) { + if (!channel_id.is_valid()) { + LOG(ERROR) << "Receive " << to_string(group_call_ptr) << " in invalid " << channel_id; + channel_id = ChannelId(); + } + auto call_id = update_group_call(group_call_ptr, channel_id); if (call_id.is_valid()) { LOG(INFO) << "Update " << call_id; } else { @@ -754,12 +764,14 @@ void GroupCallManager::on_update_group_call(tl_object_ptr &group_call_ptr) { +InputGroupCallId GroupCallManager::update_group_call(const tl_object_ptr &group_call_ptr, + ChannelId channel_id) { CHECK(group_call_ptr != nullptr); InputGroupCallId call_id; GroupCall call; call.is_inited = true; + string join_params; switch (group_call_ptr->get_id()) { case telegram_api::groupCall::ID: { @@ -790,7 +802,8 @@ InputGroupCallId GroupCallManager::update_group_call(const tl_object_ptrchannel_id; if (!group_call->is_inited) { call.group_call_id = group_call->group_call_id; *group_call = std::move(call); @@ -818,6 +831,9 @@ InputGroupCallId GroupCallManager::update_group_call(const tl_object_ptrchannel_id.is_valid()) { + group_call->channel_id = channel_id; + } if (!join_params.empty()) { on_join_group_call_response(call_id, std::move(join_params)); } diff --git a/td/telegram/GroupCallManager.h b/td/telegram/GroupCallManager.h index 2a125ba05..84e301cee 100644 --- a/td/telegram/GroupCallManager.h +++ b/td/telegram/GroupCallManager.h @@ -33,7 +33,7 @@ class GroupCallManager : public Actor { GroupCallManager &operator=(GroupCallManager &&) = delete; ~GroupCallManager() override; - GroupCallId get_group_call_id(InputGroupCallId input_group_call_id); + GroupCallId get_group_call_id(InputGroupCallId input_group_call_id, ChannelId channel_id); void create_voice_chat(ChannelId channel_id, Promise &&promise); @@ -55,7 +55,7 @@ class GroupCallManager : public Actor { void discard_group_call(GroupCallId group_call_id, Promise &&promise); - void on_update_group_call(tl_object_ptr group_call_ptr); + void on_update_group_call(tl_object_ptr group_call_ptr, ChannelId channel_id); void process_join_group_call_response(InputGroupCallId input_group_call_id, uint64 generation, tl_object_ptr &&updates, Promise &&promise); @@ -70,7 +70,7 @@ class GroupCallManager : public Actor { GroupCallId get_next_group_call_id(InputGroupCallId input_group_call_id); - GroupCall *add_group_call(InputGroupCallId input_group_call_id); + GroupCall *add_group_call(InputGroupCallId input_group_call_id, ChannelId channel_id); const GroupCall *get_group_call(InputGroupCallId input_group_call_id) const; GroupCall *get_group_call(InputGroupCallId input_group_call_id); @@ -87,7 +87,8 @@ class GroupCallManager : public Actor { void on_group_call_left(InputGroupCallId input_group_call_id, int32 source); - InputGroupCallId update_group_call(const tl_object_ptr &group_call_ptr); + InputGroupCallId update_group_call(const tl_object_ptr &group_call_ptr, + ChannelId channel_id); static Result> get_group_call_join_response_object( string json_response); diff --git a/td/telegram/MessageContent.cpp b/td/telegram/MessageContent.cpp index e4f345ab4..92c3ca2a0 100644 --- a/td/telegram/MessageContent.cpp +++ b/td/telegram/MessageContent.cpp @@ -4787,13 +4787,13 @@ tl_object_ptr get_message_content_object(const MessageCo case MessageContentType::GroupCall: { auto *m = static_cast(content); return make_tl_object( - td->group_call_manager_->get_group_call_id(m->input_group_call_id).get(), + td->group_call_manager_->get_group_call_id(m->input_group_call_id, ChannelId()).get(), m->duration >= 0 ? max(m->duration, 1) : 0); } case MessageContentType::InviteToGroupCall: { auto *m = static_cast(content); return make_tl_object( - td->group_call_manager_->get_group_call_id(m->input_group_call_id).get(), + td->group_call_manager_->get_group_call_id(m->input_group_call_id, ChannelId()).get(), td->contacts_manager_->get_user_ids_object(m->user_ids, "MessageInviteToGroupCall")); } default: diff --git a/td/telegram/UpdatesManager.cpp b/td/telegram/UpdatesManager.cpp index 131a2b302..24523ecac 100644 --- a/td/telegram/UpdatesManager.cpp +++ b/td/telegram/UpdatesManager.cpp @@ -2148,7 +2148,8 @@ void UpdatesManager::on_update(tl_object_ptr update, bool /*force_apply*/) { - send_closure(G()->group_call_manager(), &GroupCallManager::on_update_group_call, std::move(update->call_)); + send_closure(G()->group_call_manager(), &GroupCallManager::on_update_group_call, std::move(update->call_), + ChannelId(update->channel_id_)); } void UpdatesManager::on_update(tl_object_ptr update, bool /*force_apply*/) {