Save voice chat channel_id.

This commit is contained in:
levlam 2020-12-04 12:40:51 +03:00
parent 49f7a56f11
commit eb9abbb9ab
7 changed files with 41 additions and 28 deletions

View File

@ -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<td_api::updateSupergroupFullInfo>(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<td_api::supergroup> ContactsManager::get_supergroup_object(Channel
}
tl_object_ptr<td_api::supergroupFullInfo> 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<td_api::supergroupFullInfo> 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<td_api::supergroupFullInfo> 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<td_api::object_ptr<td_api::Update
}
for (auto &it : channels_full_) {
updates.push_back(td_api::make_object<td_api::updateSupergroupFullInfo>(
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<td_api::updateBasicGroupFullInfo>(

View File

@ -1411,7 +1411,8 @@ class ContactsManager : public Actor {
tl_object_ptr<td_api::supergroup> get_supergroup_object(ChannelId channel_id, const Channel *c) const;
tl_object_ptr<td_api::supergroupFullInfo> get_supergroup_full_info_object(const ChannelFull *channel_full) const;
tl_object_ptr<td_api::supergroupFullInfo> get_supergroup_full_info_object(const ChannelFull *channel_full,
ChannelId channel_id) const;
static tl_object_ptr<td_api::SecretChatState> get_secret_chat_state_object(SecretChatState state);

View File

@ -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<td_api::groupCallId>(id);
}
bool operator==(const GroupCallId &other) const {
return id == other.id;
}

View File

@ -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<InputGroupCallId> 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<GroupCall>();
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, Promise<Uni
td_->create_handler<DiscardGroupCallQuery>(std::move(promise))->send(input_group_call_id);
}
void GroupCallManager::on_update_group_call(tl_object_ptr<telegram_api::GroupCall> group_call_ptr) {
auto call_id = update_group_call(group_call_ptr);
void GroupCallManager::on_update_group_call(tl_object_ptr<telegram_api::GroupCall> 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<telegram_api::GroupCal
}
}
InputGroupCallId GroupCallManager::update_group_call(const tl_object_ptr<telegram_api::GroupCall> &group_call_ptr) {
InputGroupCallId GroupCallManager::update_group_call(const tl_object_ptr<telegram_api::GroupCall> &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_ptr<telegra
}
bool need_update = false;
auto *group_call = add_group_call(call_id);
auto *group_call = add_group_call(call_id, channel_id);
call.channel_id = channel_id.is_valid() ? channel_id : group_call->channel_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_ptr<telegra
}
}
if (!group_call->channel_id.is_valid()) {
group_call->channel_id = channel_id;
}
if (!join_params.empty()) {
on_join_group_call_response(call_id, std::move(join_params));
}

View File

@ -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<InputGroupCallId> &&promise);
@ -55,7 +55,7 @@ class GroupCallManager : public Actor {
void discard_group_call(GroupCallId group_call_id, Promise<Unit> &&promise);
void on_update_group_call(tl_object_ptr<telegram_api::GroupCall> group_call_ptr);
void on_update_group_call(tl_object_ptr<telegram_api::GroupCall> group_call_ptr, ChannelId channel_id);
void process_join_group_call_response(InputGroupCallId input_group_call_id, uint64 generation,
tl_object_ptr<telegram_api::Updates> &&updates, Promise<Unit> &&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<telegram_api::GroupCall> &group_call_ptr);
InputGroupCallId update_group_call(const tl_object_ptr<telegram_api::GroupCall> &group_call_ptr,
ChannelId channel_id);
static Result<td_api::object_ptr<td_api::groupCallJoinResponse>> get_group_call_join_response_object(
string json_response);

View File

@ -4787,13 +4787,13 @@ tl_object_ptr<td_api::MessageContent> get_message_content_object(const MessageCo
case MessageContentType::GroupCall: {
auto *m = static_cast<const MessageGroupCall *>(content);
return make_tl_object<td_api::messageGroupCall>(
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<const MessageInviteToGroupCall *>(content);
return make_tl_object<td_api::messageInviteGroupCallMembers>(
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:

View File

@ -2148,7 +2148,8 @@ void UpdatesManager::on_update(tl_object_ptr<telegram_api::updatePhoneCallSignal
}
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateGroupCall> 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<telegram_api::updateContactsReset> update, bool /*force_apply*/) {