Add SavedMessagesTopicId class.
This commit is contained in:
parent
0aeb11dee8
commit
85c4cd4642
@ -468,6 +468,7 @@ set(TDLIB_SOURCE
|
||||
td/telegram/ReportReason.cpp
|
||||
td/telegram/RequestedDialogType.cpp
|
||||
td/telegram/RestrictionReason.cpp
|
||||
td/telegram/SavedMessagesTopicId.cpp
|
||||
td/telegram/ScopeNotificationSettings.cpp
|
||||
td/telegram/SecretChatActor.cpp
|
||||
td/telegram/SecretChatDb.cpp
|
||||
@ -790,6 +791,7 @@ set(TDLIB_SOURCE
|
||||
td/telegram/RequestActor.h
|
||||
td/telegram/RequestedDialogType.h
|
||||
td/telegram/RestrictionReason.h
|
||||
td/telegram/SavedMessagesTopicId.h
|
||||
td/telegram/ScheduledServerMessageId.h
|
||||
td/telegram/ScopeNotificationSettings.h
|
||||
td/telegram/SecretChatActor.h
|
||||
|
@ -3903,7 +3903,7 @@ void MessagesManager::Message::store(StorerT &storer) const {
|
||||
bool has_input_reply_to = !message_id.is_any_server() && input_reply_to.is_valid();
|
||||
bool has_replied_message_info = !replied_message_info.is_empty();
|
||||
bool has_forward_info = forward_info != nullptr;
|
||||
bool has_saved_messages_dialog_id = saved_messages_dialog_id.is_valid();
|
||||
bool has_saved_messages_topic_id = saved_messages_topic_id.is_valid();
|
||||
BEGIN_STORE_FLAGS();
|
||||
STORE_FLAG(is_channel_post);
|
||||
STORE_FLAG(is_outgoing);
|
||||
@ -3985,7 +3985,7 @@ void MessagesManager::Message::store(StorerT &storer) const {
|
||||
STORE_FLAG(has_input_reply_to);
|
||||
STORE_FLAG(has_replied_message_info);
|
||||
STORE_FLAG(has_forward_info);
|
||||
STORE_FLAG(has_saved_messages_dialog_id);
|
||||
STORE_FLAG(has_saved_messages_topic_id);
|
||||
END_STORE_FLAGS();
|
||||
}
|
||||
|
||||
@ -4100,8 +4100,8 @@ void MessagesManager::Message::store(StorerT &storer) const {
|
||||
if (has_replied_message_info) {
|
||||
store(replied_message_info, storer);
|
||||
}
|
||||
if (has_saved_messages_dialog_id) {
|
||||
store(saved_messages_dialog_id, storer);
|
||||
if (has_saved_messages_topic_id) {
|
||||
store(saved_messages_topic_id, storer);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4156,7 +4156,7 @@ void MessagesManager::Message::parse(ParserT &parser) {
|
||||
bool has_input_reply_to = false;
|
||||
bool has_replied_message_info = false;
|
||||
bool has_forward_info = false;
|
||||
bool has_saved_messages_dialog_id = false;
|
||||
bool has_saved_messages_topic_id = false;
|
||||
BEGIN_PARSE_FLAGS();
|
||||
PARSE_FLAG(is_channel_post);
|
||||
PARSE_FLAG(is_outgoing);
|
||||
@ -4238,7 +4238,7 @@ void MessagesManager::Message::parse(ParserT &parser) {
|
||||
PARSE_FLAG(has_input_reply_to);
|
||||
PARSE_FLAG(has_replied_message_info);
|
||||
PARSE_FLAG(has_forward_info);
|
||||
PARSE_FLAG(has_saved_messages_dialog_id);
|
||||
PARSE_FLAG(has_saved_messages_topic_id);
|
||||
END_PARSE_FLAGS();
|
||||
}
|
||||
|
||||
@ -4417,8 +4417,8 @@ void MessagesManager::Message::parse(ParserT &parser) {
|
||||
} else {
|
||||
replied_message_info = RepliedMessageInfo::legacy(legacy_reply_to_message_id, legacy_reply_in_dialog_id);
|
||||
}
|
||||
if (has_saved_messages_dialog_id) {
|
||||
parse(saved_messages_dialog_id, parser);
|
||||
if (has_saved_messages_topic_id) {
|
||||
parse(saved_messages_topic_id, parser);
|
||||
}
|
||||
|
||||
CHECK(content != nullptr);
|
||||
@ -12745,23 +12745,6 @@ void MessagesManager::finish_add_secret_message(unique_ptr<PendingSecretMessage>
|
||||
pending_secret_message->success_promise.set_value(Unit()); // TODO: set after message is saved
|
||||
}
|
||||
|
||||
DialogId MessagesManager::get_saved_messages_dialog_id(DialogId my_dialog_id, const Message *m) {
|
||||
if (m->forward_info != nullptr) {
|
||||
auto last_dialog_id = m->forward_info->get_last_dialog_id();
|
||||
if (last_dialog_id.is_valid()) {
|
||||
return last_dialog_id;
|
||||
}
|
||||
auto from_dialog_id = m->forward_info->get_origin().get_sender();
|
||||
if (from_dialog_id.is_valid()) {
|
||||
return my_dialog_id;
|
||||
}
|
||||
if (m->forward_info->get_origin().is_sender_hidden()) {
|
||||
return DialogId(static_cast<int64>(2666000));
|
||||
}
|
||||
}
|
||||
return my_dialog_id;
|
||||
}
|
||||
|
||||
MessagesManager::MessageInfo MessagesManager::parse_telegram_api_message(
|
||||
tl_object_ptr<telegram_api::Message> message_ptr, bool is_scheduled, const char *source) const {
|
||||
LOG(DEBUG) << "Receive from " << source << " " << to_string(message_ptr);
|
||||
@ -12838,7 +12821,7 @@ MessagesManager::MessageInfo MessagesManager::parse_telegram_api_message(
|
||||
message_info.restriction_reasons = get_restriction_reasons(std::move(message->restriction_reason_));
|
||||
message_info.author_signature = std::move(message->post_author_);
|
||||
if (message->saved_peer_id_ != nullptr) {
|
||||
message_info.saved_messages_dialog_id = DialogId(message->saved_peer_id_);
|
||||
message_info.saved_messages_topic_id = SavedMessagesTopicId(DialogId(message->saved_peer_id_));
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -12869,7 +12852,7 @@ MessagesManager::MessageInfo MessagesManager::parse_telegram_api_message(
|
||||
message_info.reply_header.replied_message_info_ = RepliedMessageInfo();
|
||||
message_info.reply_header.story_full_id_ = StoryFullId();
|
||||
if (message_info.dialog_id == td_->dialog_manager_->get_my_dialog_id()) {
|
||||
message_info.saved_messages_dialog_id = message_info.dialog_id;
|
||||
message_info.saved_messages_topic_id = SavedMessagesTopicId(message_info.dialog_id);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -13123,7 +13106,7 @@ std::pair<DialogId, unique_ptr<MessagesManager::Message>> MessagesManager::creat
|
||||
message->reply_to_story_full_id = reply_to_story_full_id;
|
||||
message->restriction_reasons = std::move(message_info.restriction_reasons);
|
||||
message->author_signature = std::move(message_info.author_signature);
|
||||
message->saved_messages_dialog_id = message_info.saved_messages_dialog_id;
|
||||
message->saved_messages_topic_id = message_info.saved_messages_topic_id;
|
||||
message->is_outgoing = is_outgoing;
|
||||
message->is_channel_post = is_channel_post;
|
||||
message->contains_mention =
|
||||
@ -13174,15 +13157,15 @@ std::pair<DialogId, unique_ptr<MessagesManager::Message>> MessagesManager::creat
|
||||
}
|
||||
|
||||
if (dialog_id == my_dialog_id) {
|
||||
if (!message->saved_messages_dialog_id.is_valid()) {
|
||||
if (!message->saved_messages_topic_id.is_valid()) {
|
||||
LOG(ERROR) << "Receive no saved messages topic for " << message_id << " in " << dialog_id;
|
||||
message->saved_messages_dialog_id = get_saved_messages_dialog_id(dialog_id, message.get());
|
||||
message->saved_messages_topic_id = SavedMessagesTopicId(my_dialog_id, message->forward_info.get());
|
||||
}
|
||||
} else {
|
||||
if (message->saved_messages_dialog_id.is_valid()) {
|
||||
LOG(ERROR) << "Receive saved messages topic " << message_info.saved_messages_dialog_id << " for " << message_id
|
||||
if (message->saved_messages_topic_id.is_valid()) {
|
||||
LOG(ERROR) << "Receive saved messages topic " << message_info.saved_messages_topic_id << " for " << message_id
|
||||
<< " in " << dialog_id;
|
||||
message->saved_messages_dialog_id = DialogId();
|
||||
message->saved_messages_topic_id = SavedMessagesTopicId();
|
||||
}
|
||||
}
|
||||
|
||||
@ -21399,8 +21382,8 @@ unique_ptr<MessagesManager::Message> MessagesManager::parse_message(Dialog *d, M
|
||||
if (m->is_pinned && is_scheduled) {
|
||||
m->is_pinned = false;
|
||||
}
|
||||
if (dialog_id == td_->dialog_manager_->get_my_dialog_id() && !m->saved_messages_dialog_id.is_valid()) {
|
||||
m->saved_messages_dialog_id = get_saved_messages_dialog_id(dialog_id, m);
|
||||
if (dialog_id == td_->dialog_manager_->get_my_dialog_id() && !m->saved_messages_topic_id.is_valid()) {
|
||||
m->saved_messages_topic_id = SavedMessagesTopicId(dialog_id, m->forward_info.get());
|
||||
}
|
||||
|
||||
LOG(INFO) << "Loaded " << m->message_id << " in " << dialog_id << " of size " << value.size() << " from database";
|
||||
@ -22220,21 +22203,6 @@ tl_object_ptr<td_api::MessageSchedulingState> MessagesManager::get_message_sched
|
||||
return td_api::make_object<td_api::messageSchedulingStateSendAtDate>(send_date);
|
||||
}
|
||||
|
||||
td_api::object_ptr<td_api::SavedMessagesTopic> MessagesManager::get_saved_messages_topic_object(
|
||||
DialogId saved_messages_dialog_id) const {
|
||||
if (saved_messages_dialog_id == DialogId()) {
|
||||
return nullptr;
|
||||
}
|
||||
if (saved_messages_dialog_id == td_->dialog_manager_->get_my_dialog_id()) {
|
||||
return td_api::make_object<td_api::savedMessagesTopicMyNotes>();
|
||||
}
|
||||
if (saved_messages_dialog_id == DialogId(static_cast<int64>(2666000))) {
|
||||
return td_api::make_object<td_api::savedMessagesTopicAuthorHidden>();
|
||||
}
|
||||
return td_api::make_object<td_api::savedMessagesTopicSavedFromChat>(
|
||||
get_chat_id_object(saved_messages_dialog_id, "savedMessagesTopicSavedFromChat"));
|
||||
}
|
||||
|
||||
td_api::object_ptr<td_api::MessageContent> MessagesManager::get_message_message_content_object(DialogId dialog_id,
|
||||
const Message *m) const {
|
||||
auto live_location_date = m->is_failed_to_send ? 0 : m->date;
|
||||
@ -22387,7 +22355,7 @@ tl_object_ptr<td_api::message> MessagesManager::get_message_object(DialogId dial
|
||||
can_get_media_timestamp_links, can_report_reactions, has_timestamped_media, m->is_channel_post,
|
||||
m->is_topic_message, m->contains_unread_mention, date, edit_date, std::move(forward_info), std::move(import_info),
|
||||
std::move(interaction_info), std::move(unread_reactions), std::move(reply_to), top_thread_message_id,
|
||||
get_saved_messages_topic_object(m->saved_messages_dialog_id), std::move(self_destruct_type), ttl_expires_in,
|
||||
m->saved_messages_topic_id.get_saved_messages_topic_object(td_), std::move(self_destruct_type), ttl_expires_in,
|
||||
auto_delete_in, via_bot_user_id, m->author_signature, m->media_album_id,
|
||||
get_restriction_reason_description(m->restriction_reasons), std::move(content), std::move(reply_markup));
|
||||
}
|
||||
@ -22601,7 +22569,7 @@ unique_ptr<MessagesManager::Message> MessagesManager::create_message_to_send(
|
||||
m->is_content_secret = is_secret_message_content(m->ttl, m->content->get_type());
|
||||
}
|
||||
if (dialog_id == DialogId(my_id)) {
|
||||
m->saved_messages_dialog_id = get_saved_messages_dialog_id(dialog_id, m);
|
||||
m->saved_messages_topic_id = SavedMessagesTopicId(dialog_id, m->forward_info.get());
|
||||
}
|
||||
|
||||
return message;
|
||||
@ -22947,7 +22915,7 @@ void MessagesManager::add_message_dependencies(Dependencies &dependencies, const
|
||||
auto is_bot = td_->auth_manager_->is_bot();
|
||||
dependencies.add(m->sender_user_id);
|
||||
dependencies.add_dialog_and_dependencies(m->sender_dialog_id);
|
||||
dependencies.add_dialog_and_dependencies(m->saved_messages_dialog_id);
|
||||
m->saved_messages_topic_id.add_dependencies(dependencies);
|
||||
m->replied_message_info.add_dependencies(dependencies, is_bot);
|
||||
dependencies.add_dialog_and_dependencies(m->reply_to_story_full_id.get_dialog_id());
|
||||
dependencies.add_dialog_and_dependencies(m->real_forward_from_dialog_id);
|
||||
@ -26690,7 +26658,7 @@ Result<MessageId> MessagesManager::add_local_message(
|
||||
m->is_content_secret = is_secret_message_content(m->ttl, m->content->get_type());
|
||||
m->send_emoji = std::move(message_content.emoji);
|
||||
if (dialog_id == DialogId(my_id)) {
|
||||
m->saved_messages_dialog_id = get_saved_messages_dialog_id(dialog_id, m);
|
||||
m->saved_messages_topic_id = SavedMessagesTopicId(dialog_id, m->forward_info.get());
|
||||
}
|
||||
|
||||
bool need_update = true;
|
||||
@ -33143,10 +33111,10 @@ bool MessagesManager::update_message(Dialog *d, Message *old_message, unique_ptr
|
||||
<< new_message->had_forward_info;
|
||||
old_message->had_forward_info = new_message->had_forward_info;
|
||||
}
|
||||
if (old_message->saved_messages_dialog_id != new_message->saved_messages_dialog_id) {
|
||||
if (old_message->saved_messages_topic_id != new_message->saved_messages_topic_id) {
|
||||
LOG(ERROR) << "Saved messages topic for " << message_id << " in " << dialog_id << " changed from "
|
||||
<< old_message->saved_messages_dialog_id << " to " << new_message->saved_messages_dialog_id;
|
||||
old_message->saved_messages_dialog_id = new_message->saved_messages_dialog_id;
|
||||
<< old_message->saved_messages_topic_id << " to " << new_message->saved_messages_topic_id;
|
||||
old_message->saved_messages_topic_id = new_message->saved_messages_topic_id;
|
||||
need_send_update = true;
|
||||
}
|
||||
if (old_message->notification_id != new_message->notification_id) {
|
||||
|
@ -56,6 +56,7 @@
|
||||
#include "td/telegram/RepliedMessageInfo.h"
|
||||
#include "td/telegram/ReplyMarkup.h"
|
||||
#include "td/telegram/RestrictionReason.h"
|
||||
#include "td/telegram/SavedMessagesTopicId.h"
|
||||
#include "td/telegram/ScheduledServerMessageId.h"
|
||||
#include "td/telegram/secret_api.h"
|
||||
#include "td/telegram/SecretChatId.h"
|
||||
@ -948,7 +949,7 @@ class MessagesManager final : public Actor {
|
||||
MessageId message_id;
|
||||
UserId sender_user_id;
|
||||
DialogId sender_dialog_id;
|
||||
DialogId saved_messages_dialog_id;
|
||||
SavedMessagesTopicId saved_messages_topic_id;
|
||||
int32 date = 0;
|
||||
int32 ttl_period = 0;
|
||||
int32 ttl = 0;
|
||||
@ -986,7 +987,7 @@ class MessagesManager final : public Actor {
|
||||
MessageId message_id;
|
||||
UserId sender_user_id;
|
||||
DialogId sender_dialog_id;
|
||||
DialogId saved_messages_dialog_id;
|
||||
SavedMessagesTopicId saved_messages_topic_id;
|
||||
int32 date = 0;
|
||||
int32 edit_date = 0;
|
||||
int32 send_date = 0;
|
||||
@ -1611,8 +1612,6 @@ class MessagesManager final : public Actor {
|
||||
void finish_delete_secret_chat_history(DialogId dialog_id, bool remove_from_dialog_list, MessageId last_message_id,
|
||||
Promise<Unit> promise);
|
||||
|
||||
static DialogId get_saved_messages_dialog_id(DialogId my_dialog_id, const Message *m);
|
||||
|
||||
MessageInfo parse_telegram_api_message(tl_object_ptr<telegram_api::Message> message_ptr, bool is_scheduled,
|
||||
const char *source) const;
|
||||
|
||||
@ -2341,9 +2340,6 @@ class MessagesManager final : public Actor {
|
||||
|
||||
static tl_object_ptr<td_api::MessageSchedulingState> get_message_scheduling_state_object(int32 send_date);
|
||||
|
||||
td_api::object_ptr<td_api::SavedMessagesTopic> get_saved_messages_topic_object(
|
||||
DialogId saved_messages_dialog_id) const;
|
||||
|
||||
td_api::object_ptr<td_api::MessageContent> get_message_message_content_object(DialogId dialog_id,
|
||||
const Message *m) const;
|
||||
|
||||
|
70
td/telegram/SavedMessagesTopicId.cpp
Normal file
70
td/telegram/SavedMessagesTopicId.cpp
Normal file
@ -0,0 +1,70 @@
|
||||
//
|
||||
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2024
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
#include "td/telegram/SavedMessagesTopicId.h"
|
||||
|
||||
#include "td/telegram/Dependencies.h"
|
||||
#include "td/telegram/DialogManager.h"
|
||||
#include "td/telegram/MessageForwardInfo.h"
|
||||
#include "td/telegram/MessagesManager.h"
|
||||
#include "td/telegram/Td.h"
|
||||
|
||||
namespace td {
|
||||
|
||||
static constexpr DialogId HIDDEN_AUTHOR_DIALOG_ID = DialogId(static_cast<int64>(2666000));
|
||||
|
||||
SavedMessagesTopicId::SavedMessagesTopicId(DialogId my_dialog_id, const MessageForwardInfo *message_forward_info) {
|
||||
if (message_forward_info != nullptr) {
|
||||
auto last_dialog_id = message_forward_info->get_last_dialog_id();
|
||||
if (last_dialog_id.is_valid()) {
|
||||
dialog_id_ = last_dialog_id;
|
||||
return;
|
||||
}
|
||||
auto from_dialog_id = message_forward_info->get_origin().get_sender();
|
||||
if (from_dialog_id.is_valid()) {
|
||||
dialog_id_ = my_dialog_id;
|
||||
return;
|
||||
}
|
||||
if (message_forward_info->get_origin().is_sender_hidden()) {
|
||||
dialog_id_ = HIDDEN_AUTHOR_DIALOG_ID;
|
||||
}
|
||||
}
|
||||
dialog_id_ = my_dialog_id;
|
||||
}
|
||||
|
||||
td_api::object_ptr<td_api::SavedMessagesTopic> SavedMessagesTopicId::get_saved_messages_topic_object(Td *td) const {
|
||||
if (dialog_id_ == DialogId()) {
|
||||
return nullptr;
|
||||
}
|
||||
if (dialog_id_ == td->dialog_manager_->get_my_dialog_id()) {
|
||||
return td_api::make_object<td_api::savedMessagesTopicMyNotes>();
|
||||
}
|
||||
if (dialog_id_ == HIDDEN_AUTHOR_DIALOG_ID) {
|
||||
return td_api::make_object<td_api::savedMessagesTopicAuthorHidden>();
|
||||
}
|
||||
return td_api::make_object<td_api::savedMessagesTopicSavedFromChat>(
|
||||
td->messages_manager_->get_chat_id_object(dialog_id_, "savedMessagesTopicSavedFromChat"));
|
||||
}
|
||||
|
||||
void SavedMessagesTopicId::add_dependencies(Dependencies &dependencies) const {
|
||||
if (dialog_id_ == HIDDEN_AUTHOR_DIALOG_ID) {
|
||||
dependencies.add_dialog_dependencies(dialog_id_);
|
||||
} else {
|
||||
dependencies.add_dialog_and_dependencies(dialog_id_);
|
||||
}
|
||||
}
|
||||
|
||||
StringBuilder &operator<<(StringBuilder &string_builder, SavedMessagesTopicId saved_messages_topic_id) {
|
||||
if (!saved_messages_topic_id.dialog_id_.is_valid()) {
|
||||
return string_builder << "[no Saved Messages topic]";
|
||||
}
|
||||
if (saved_messages_topic_id.dialog_id_ == HIDDEN_AUTHOR_DIALOG_ID) {
|
||||
return string_builder << "[Author Hidden topic]";
|
||||
}
|
||||
return string_builder << "[topic of" << saved_messages_topic_id.dialog_id_ << ']';
|
||||
}
|
||||
|
||||
} // namespace td
|
72
td/telegram/SavedMessagesTopicId.h
Normal file
72
td/telegram/SavedMessagesTopicId.h
Normal file
@ -0,0 +1,72 @@
|
||||
//
|
||||
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2024
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
#pragma once
|
||||
|
||||
#include "td/telegram/DialogId.h"
|
||||
#include "td/telegram/td_api.h"
|
||||
|
||||
#include "td/utils/common.h"
|
||||
#include "td/utils/HashTableUtils.h"
|
||||
#include "td/utils/StringBuilder.h"
|
||||
|
||||
namespace td {
|
||||
|
||||
class Dependencies;
|
||||
class MessageForwardInfo;
|
||||
class Td;
|
||||
|
||||
class SavedMessagesTopicId {
|
||||
DialogId dialog_id_;
|
||||
|
||||
friend struct SavedMessagesTopicIdHash;
|
||||
|
||||
friend StringBuilder &operator<<(StringBuilder &string_builder, SavedMessagesTopicId saved_messages_topic_id);
|
||||
|
||||
public:
|
||||
SavedMessagesTopicId() = default;
|
||||
|
||||
explicit SavedMessagesTopicId(DialogId dialog_id) : dialog_id_(dialog_id) {
|
||||
}
|
||||
|
||||
SavedMessagesTopicId(DialogId my_dialog_id, const MessageForwardInfo *message_forward_info);
|
||||
|
||||
bool is_valid() const {
|
||||
return dialog_id_.is_valid();
|
||||
}
|
||||
|
||||
td_api::object_ptr<td_api::SavedMessagesTopic> get_saved_messages_topic_object(Td *td) const;
|
||||
|
||||
void add_dependencies(Dependencies &dependencies) const;
|
||||
|
||||
bool operator==(const SavedMessagesTopicId &other) const {
|
||||
return dialog_id_ == other.dialog_id_;
|
||||
}
|
||||
|
||||
bool operator!=(const SavedMessagesTopicId &other) const {
|
||||
return dialog_id_ != other.dialog_id_;
|
||||
}
|
||||
|
||||
template <class StorerT>
|
||||
void store(StorerT &storer) const {
|
||||
dialog_id_.store(storer);
|
||||
}
|
||||
|
||||
template <class ParserT>
|
||||
void parse(ParserT &parser) {
|
||||
dialog_id_.parse(parser);
|
||||
}
|
||||
};
|
||||
|
||||
struct SavedMessagesTopicIdHash {
|
||||
uint32 operator()(SavedMessagesTopicId saved_messages_topic_id) const {
|
||||
return Hash<DialogId>()(saved_messages_topic_id.dialog_id_);
|
||||
}
|
||||
};
|
||||
|
||||
StringBuilder &operator<<(StringBuilder &string_builder, SavedMessagesTopicId saved_messages_topic_id);
|
||||
|
||||
} // namespace td
|
Loading…
Reference in New Issue
Block a user