Skip to content

Commit 9be8c73

Browse files
committed
Add FileSourceRichMessage.
1 parent 251eb65 commit 9be8c73

6 files changed

Lines changed: 68 additions & 4 deletions

File tree

td/telegram/FileReferenceManager.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "td/telegram/DraftMessageManager.h"
1717
#include "td/telegram/files/FileManager.h"
1818
#include "td/telegram/Global.h"
19+
#include "td/telegram/MessageQueryManager.h"
1920
#include "td/telegram/MessagesManager.h"
2021
#include "td/telegram/NotificationSettingsManager.h"
2122
#include "td/telegram/QuickReplyManager.h"
@@ -126,6 +127,7 @@ fileSourceBotMediaPreviewInfo bot_user_id:int53 language_code:string = FileSourc
126127
fileSourceStoryAlbum chat_id:int53 story_album_id:int32 = FileSource; // stories.getAlbums, not reliable
127128
fileSourceSavedMusic user_id:int53 file_id:int32 = FileSource; // users.getSavedMusicByID
128129
fileSourceDraftMessage chat_id:int53 topic:MessageTopic = FileSource; // messages.getPeerDialogs/messages.getForumTopicsByID/messages.getSavedDialogsByID
130+
fileSourceRichMessage chat_id:int53 message_id:int53 = FileSource; // messages.getRichMessage
129131
*/
130132

131133
FileSourceId FileReferenceManager::get_current_file_source_id() const {
@@ -253,6 +255,11 @@ FileSourceId FileReferenceManager::create_draft_message_file_source(DialogId dia
253255
return add_file_source_id(source, PSLICE() << "draft message in " << topic << " of " << dialog_id);
254256
}
255257

258+
FileSourceId FileReferenceManager::create_rich_message_file_source(MessageFullId message_full_id) {
259+
FileSourceRichMessage source{message_full_id};
260+
return add_file_source_id(source, PSLICE() << "rich " << message_full_id);
261+
}
262+
256263
FileReferenceManager::Node &FileReferenceManager::add_node(NodeId node_id) {
257264
CHECK(node_id.is_valid());
258265
auto &node = nodes_[node_id];
@@ -498,6 +505,10 @@ void FileReferenceManager::send_query(Destination dest, FileSourceId file_source
498505
[&](const FileSourceDraftMessage &source) {
499506
send_closure_later(G()->draft_message_manager(), &DraftMessageManager::reload_draft_message, source.dialog_id,
500507
source.topic, std::move(promise));
508+
},
509+
[&](const FileSourceRichMessage &source) {
510+
send_closure_later(G()->message_query_manager(), &MessageQueryManager::reload_full_rich_message,
511+
source.message_full_id, std::move(promise));
501512
}));
502513
}
503514

td/telegram/FileReferenceManager.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class FileReferenceManager final : public Actor {
8282
FileSourceId create_story_album_file_source(StoryAlbumFullId story_album_full_id);
8383
FileSourceId create_user_saved_music_file_source(UserId user_id, int64 document_id, int64 access_hash);
8484
FileSourceId create_draft_message_file_source(DialogId dialog_id, MessageTopic topic);
85+
FileSourceId create_rich_message_file_source(MessageFullId message_full_id);
8586

8687
using NodeId = FileId;
8788
void repair_file_reference(NodeId node_id, Promise<> promise);
@@ -217,6 +218,9 @@ class FileReferenceManager final : public Actor {
217218
DialogId dialog_id;
218219
MessageTopic topic;
219220
};
221+
struct FileSourceRichMessage {
222+
MessageFullId message_full_id;
223+
};
220224

221225
// append only
222226
using FileSource =
@@ -225,7 +229,8 @@ class FileReferenceManager final : public Actor {
225229
FileSourceBackground, FileSourceChatFull, FileSourceChannelFull, FileSourceAppConfig,
226230
FileSourceSavedRingtones, FileSourceUserFull, FileSourceAttachMenuBot, FileSourceWebApp, FileSourceStory,
227231
FileSourceQuickReplyMessage, FileSourceStarTransaction, FileSourceBotMediaPreview,
228-
FileSourceBotMediaPreviewInfo, FileSourceStoryAlbum, FileSourceUserSavedMusic, FileSourceDraftMessage>;
232+
FileSourceBotMediaPreviewInfo, FileSourceStoryAlbum, FileSourceUserSavedMusic, FileSourceDraftMessage,
233+
FileSourceRichMessage>;
229234
WaitFreeVector<FileSource> file_sources_;
230235

231236
int64 query_generation_{0};

td/telegram/FileReferenceManager.hpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "td/telegram/FileReferenceManager.h"
1818
#include "td/telegram/files/FileSourceId.h"
1919
#include "td/telegram/MessageFullId.h"
20+
#include "td/telegram/MessageQueryManager.h"
2021
#include "td/telegram/MessagesManager.h"
2122
#include "td/telegram/MessageTopic.hpp"
2223
#include "td/telegram/NotificationSettingsManager.h"
@@ -90,7 +91,8 @@ void FileReferenceManager::store_file_source(FileSourceId file_source_id, Storer
9091
[&](const FileSourceDraftMessage &source) {
9192
td::store(source.dialog_id, storer);
9293
td::store(source.topic, storer);
93-
}));
94+
},
95+
[&](const FileSourceRichMessage &source) { td::store(source.message_full_id, storer); }));
9496
}
9597

9698
template <class ParserT>
@@ -225,6 +227,11 @@ FileSourceId FileReferenceManager::parse_file_source(Td *td, ParserT &parser) {
225227
td::parse(topic, parser);
226228
return td->draft_message_manager_->get_draft_message_file_source_id(dialog_id, topic);
227229
}
230+
case 25: {
231+
MessageFullId message_full_id;
232+
td::parse(message_full_id, parser);
233+
return td->message_query_manager_->get_rich_message_file_source_id(message_full_id);
234+
}
228235
default:
229236
parser.set_error("Invalid type in FileSource");
230237
return FileSourceId();

td/telegram/MessageQueryManager.cpp

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "td/telegram/DialogParticipant.h"
1717
#include "td/telegram/DialogParticipantManager.h"
1818
#include "td/telegram/FactCheck.h"
19+
#include "td/telegram/FileReferenceManager.h"
1920
#include "td/telegram/files/FileManager.h"
2021
#include "td/telegram/FolderId.h"
2122
#include "td/telegram/ForumTopicManager.h"
@@ -86,7 +87,6 @@ class GetRichMessageQuery final : public Td::ResultHandler {
8687
return on_error(Status::Error(400, "Chat not found"));
8788
}
8889
message_id_ = message_full_id.get_message_id();
89-
CHECK(message_id_.is_server());
9090
send_query(G()->net_query_creator().create(
9191
telegram_api::messages_getRichMessage(std::move(input_peer), message_id_.get_server_message_id().get())));
9292
}
@@ -2145,9 +2145,42 @@ void MessageQueryManager::on_get_affected_history(DialogId dialog_id, AffectedHi
21452145

21462146
void MessageQueryManager::get_full_rich_message(MessageFullId message_full_id,
21472147
Promise<td_api::object_ptr<td_api::richMessage>> &&promise) {
2148+
if (!message_full_id.get_message_id().is_server()) {
2149+
return promise.set_error(400, "Invalid message specified");
2150+
}
21482151
td_->create_handler<GetRichMessageQuery>(std::move(promise))->send(message_full_id);
21492152
}
21502153

2154+
void MessageQueryManager::reload_full_rich_message(MessageFullId message_full_id, Promise<Unit> &&promise) {
2155+
return get_full_rich_message(
2156+
message_full_id, PromiseCreator::lambda([promise = std::move(promise)](
2157+
Result<td_api::object_ptr<td_api::richMessage>> result) mutable {
2158+
if (result.is_error()) {
2159+
promise.set_error(result.move_as_error());
2160+
} else {
2161+
promise.set_value(Unit());
2162+
}
2163+
}));
2164+
}
2165+
2166+
FileSourceId MessageQueryManager::get_rich_message_file_source_id(MessageFullId message_full_id) {
2167+
if (td_->auth_manager_->is_bot()) {
2168+
return FileSourceId();
2169+
}
2170+
2171+
auto dialog_id = message_full_id.get_dialog_id();
2172+
auto message_id = message_full_id.get_message_id();
2173+
if (!dialog_id.is_valid() || dialog_id.get_type() == DialogType::SecretChat || !message_id.is_server()) {
2174+
return FileSourceId();
2175+
}
2176+
2177+
auto &file_source_id = rich_message_full_id_to_file_source_id_[message_full_id];
2178+
if (!file_source_id.is_valid()) {
2179+
file_source_id = td_->file_reference_manager_->create_rich_message_file_source(message_full_id);
2180+
}
2181+
return file_source_id;
2182+
}
2183+
21512184
void MessageQueryManager::upload_message_covers(BusinessConnectionId business_connection_id, DialogId dialog_id,
21522185
vector<MessageCover> covers, Promise<Unit> &&promise) {
21532186
TRY_STATUS_PROMISE(promise, G()->close_status());

td/telegram/MessageQueryManager.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "td/telegram/DialogListId.h"
1414
#include "td/telegram/EmojiGameInfo.h"
1515
#include "td/telegram/files/FileId.h"
16+
#include "td/telegram/files/FileSourceId.h"
1617
#include "td/telegram/files/FileUploadId.h"
1718
#include "td/telegram/ForumTopicId.h"
1819
#include "td/telegram/MessageCover.h"
@@ -35,6 +36,7 @@
3536
#include "td/utils/FlatHashSet.h"
3637
#include "td/utils/Promise.h"
3738
#include "td/utils/Status.h"
39+
#include "td/utils/WaitFreeHashMap.h"
3840

3941
#include <functional>
4042
#include <memory>
@@ -57,6 +59,10 @@ class MessageQueryManager final : public Actor {
5759

5860
void get_full_rich_message(MessageFullId message_full_id, Promise<td_api::object_ptr<td_api::richMessage>> &&promise);
5961

62+
void reload_full_rich_message(MessageFullId message_full_id, Promise<Unit> &&promise);
63+
64+
FileSourceId get_rich_message_file_source_id(MessageFullId message_full_id);
65+
6066
void upload_message_covers(BusinessConnectionId business_connection_id, DialogId dialog_id,
6167
vector<MessageCover> covers, Promise<Unit> &&promise);
6268

@@ -390,6 +396,8 @@ class MessageQueryManager final : public Actor {
390396
double emoji_game_info_receive_time_ = 0.0;
391397
EmojiGameInfo emoji_game_info_;
392398

399+
WaitFreeHashMap<MessageFullId, FileSourceId, MessageFullIdHash> rich_message_full_id_to_file_source_id_;
400+
393401
MultiTimeout send_message_view_metrics_timeout_{"SendMessageViewMetricsTimeout"};
394402

395403
Td *td_;

td/telegram/MessagesManager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14994,7 +14994,7 @@ void MessagesManager::get_full_rich_message(MessageFullId message_full_id,
1499414994
if (m == nullptr) {
1499514995
return promise.set_error(400, "Message not found");
1499614996
}
14997-
if (!m->message_id.is_server() || m->content->get_type() != MessageContentType::RichText) {
14997+
if (m->content->get_type() != MessageContentType::RichText) {
1499814998
return promise.set_error(400, "Invalid message specified");
1499914999
}
1500015000
td_->message_query_manager_->get_full_rich_message(message_full_id, std::move(promise));

0 commit comments

Comments
 (0)