Support file reference repair for quick reply messages.
This commit is contained in:
parent
ee25355ba6
commit
3f85140627
@ -16,6 +16,7 @@
|
||||
#include "td/telegram/Global.h"
|
||||
#include "td/telegram/MessagesManager.h"
|
||||
#include "td/telegram/NotificationSettingsManager.h"
|
||||
#include "td/telegram/QuickReplyManager.h"
|
||||
#include "td/telegram/StickerSetId.h"
|
||||
#include "td/telegram/StickersManager.h"
|
||||
#include "td/telegram/StoryManager.h"
|
||||
@ -80,6 +81,7 @@ fileSourceUserFull = FileSource; // repa
|
||||
fileSourceAttachmentMenuBot user_id:int53 = FileSource; // repaired with messages.getAttachMenuBot
|
||||
fileSourceWebApp user_id:int53 short_name:string = FileSource; // repaired with messages.getAttachMenuBot
|
||||
fileSourceStory chat_id:int53 story_id:int32 = FileSource; // repaired with stories.getStoriesByID
|
||||
fileSourceQuickReplyMessage shortcut_id:int32 message_id:int53 = FileSource; // repaired with messages.getQuickReplyMessages
|
||||
*/
|
||||
|
||||
FileSourceId FileReferenceManager::get_current_file_source_id() const {
|
||||
@ -169,6 +171,11 @@ FileSourceId FileReferenceManager::create_story_file_source(StoryFullId story_fu
|
||||
return add_file_source_id(source, PSLICE() << story_full_id);
|
||||
}
|
||||
|
||||
FileSourceId FileReferenceManager::create_quick_reply_message_file_source(QuickReplyMessageFullId message_full_id) {
|
||||
FileSourceQuickReplyMessage source{message_full_id};
|
||||
return add_file_source_id(source, PSLICE() << "quick reply " << message_full_id);
|
||||
}
|
||||
|
||||
FileReferenceManager::Node &FileReferenceManager::add_node(NodeId node_id) {
|
||||
CHECK(node_id.is_valid());
|
||||
auto &node = nodes_[node_id];
|
||||
@ -383,6 +390,11 @@ void FileReferenceManager::send_query(Destination dest, FileSourceId file_source
|
||||
[&](const FileSourceStory &source) {
|
||||
send_closure_later(G()->story_manager(), &StoryManager::reload_story, source.story_full_id, std::move(promise),
|
||||
"FileSourceStory");
|
||||
},
|
||||
[&](const FileSourceQuickReplyMessage &source) {
|
||||
send_closure_later(G()->quick_reply_manager(), &QuickReplyManager::reload_quick_reply_message,
|
||||
source.message_full_id.get_quick_reply_shortcut_id(),
|
||||
source.message_full_id.get_message_id(), std::move(promise));
|
||||
}));
|
||||
}
|
||||
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "td/telegram/files/FileSourceId.h"
|
||||
#include "td/telegram/MessageFullId.h"
|
||||
#include "td/telegram/PhotoSizeSource.h"
|
||||
#include "td/telegram/QuickReplyMessageFullId.h"
|
||||
#include "td/telegram/SetWithPosition.h"
|
||||
#include "td/telegram/StoryFullId.h"
|
||||
#include "td/telegram/td_api.h"
|
||||
@ -66,6 +67,7 @@ class FileReferenceManager final : public Actor {
|
||||
FileSourceId create_attach_menu_bot_file_source(UserId user_id);
|
||||
FileSourceId create_web_app_file_source(UserId user_id, const string &short_name);
|
||||
FileSourceId create_story_file_source(StoryFullId story_full_id);
|
||||
FileSourceId create_quick_reply_message_file_source(QuickReplyMessageFullId message_full_id);
|
||||
|
||||
using NodeId = FileId;
|
||||
void repair_file_reference(NodeId node_id, Promise<> promise);
|
||||
@ -174,13 +176,17 @@ class FileReferenceManager final : public Actor {
|
||||
struct FileSourceStory {
|
||||
StoryFullId story_full_id;
|
||||
};
|
||||
struct FileSourceQuickReplyMessage {
|
||||
QuickReplyMessageFullId message_full_id;
|
||||
};
|
||||
|
||||
// append only
|
||||
using FileSource =
|
||||
Variant<FileSourceMessage, FileSourceUserPhoto, FileSourceChatPhoto, FileSourceChannelPhoto, FileSourceWallpapers,
|
||||
FileSourceWebPage, FileSourceSavedAnimations, FileSourceRecentStickers, FileSourceFavoriteStickers,
|
||||
FileSourceBackground, FileSourceChatFull, FileSourceChannelFull, FileSourceAppConfig,
|
||||
FileSourceSavedRingtones, FileSourceUserFull, FileSourceAttachMenuBot, FileSourceWebApp, FileSourceStory>;
|
||||
FileSourceSavedRingtones, FileSourceUserFull, FileSourceAttachMenuBot, FileSourceWebApp, FileSourceStory,
|
||||
FileSourceQuickReplyMessage>;
|
||||
WaitFreeVector<FileSource> file_sources_;
|
||||
|
||||
int64 query_generation_{0};
|
||||
|
@ -17,6 +17,8 @@
|
||||
#include "td/telegram/MessageFullId.h"
|
||||
#include "td/telegram/MessagesManager.h"
|
||||
#include "td/telegram/NotificationSettingsManager.h"
|
||||
#include "td/telegram/QuickReplyManager.h"
|
||||
#include "td/telegram/QuickReplyMessageFullId.h"
|
||||
#include "td/telegram/StickersManager.h"
|
||||
#include "td/telegram/StoryFullId.h"
|
||||
#include "td/telegram/StoryManager.h"
|
||||
@ -36,32 +38,34 @@ void FileReferenceManager::store_file_source(FileSourceId file_source_id, Storer
|
||||
CHECK(index < file_sources_.size());
|
||||
auto &source = file_sources_[index];
|
||||
td::store(source.get_offset(), storer);
|
||||
source.visit(overloaded([&](const FileSourceMessage &source) { td::store(source.message_full_id, storer); },
|
||||
[&](const FileSourceUserPhoto &source) {
|
||||
td::store(source.user_id, storer);
|
||||
td::store(source.photo_id, storer);
|
||||
},
|
||||
[&](const FileSourceChatPhoto &source) { td::store(source.chat_id, storer); },
|
||||
[&](const FileSourceChannelPhoto &source) { td::store(source.channel_id, storer); },
|
||||
[&](const FileSourceWallpapers &source) {},
|
||||
[&](const FileSourceWebPage &source) { td::store(source.url, storer); },
|
||||
[&](const FileSourceSavedAnimations &source) {},
|
||||
[&](const FileSourceRecentStickers &source) { td::store(source.is_attached, storer); },
|
||||
[&](const FileSourceFavoriteStickers &source) {},
|
||||
[&](const FileSourceBackground &source) {
|
||||
td::store(source.background_id, storer);
|
||||
td::store(source.access_hash, storer);
|
||||
},
|
||||
[&](const FileSourceChatFull &source) { td::store(source.chat_id, storer); },
|
||||
[&](const FileSourceChannelFull &source) { td::store(source.channel_id, storer); },
|
||||
[&](const FileSourceAppConfig &source) {}, [&](const FileSourceSavedRingtones &source) {},
|
||||
[&](const FileSourceUserFull &source) { td::store(source.user_id, storer); },
|
||||
[&](const FileSourceAttachMenuBot &source) { td::store(source.user_id, storer); },
|
||||
[&](const FileSourceWebApp &source) {
|
||||
td::store(source.user_id, storer);
|
||||
td::store(source.short_name, storer);
|
||||
},
|
||||
[&](const FileSourceStory &source) { td::store(source.story_full_id, storer); }));
|
||||
source.visit(
|
||||
overloaded([&](const FileSourceMessage &source) { td::store(source.message_full_id, storer); },
|
||||
[&](const FileSourceUserPhoto &source) {
|
||||
td::store(source.user_id, storer);
|
||||
td::store(source.photo_id, storer);
|
||||
},
|
||||
[&](const FileSourceChatPhoto &source) { td::store(source.chat_id, storer); },
|
||||
[&](const FileSourceChannelPhoto &source) { td::store(source.channel_id, storer); },
|
||||
[&](const FileSourceWallpapers &source) {},
|
||||
[&](const FileSourceWebPage &source) { td::store(source.url, storer); },
|
||||
[&](const FileSourceSavedAnimations &source) {},
|
||||
[&](const FileSourceRecentStickers &source) { td::store(source.is_attached, storer); },
|
||||
[&](const FileSourceFavoriteStickers &source) {},
|
||||
[&](const FileSourceBackground &source) {
|
||||
td::store(source.background_id, storer);
|
||||
td::store(source.access_hash, storer);
|
||||
},
|
||||
[&](const FileSourceChatFull &source) { td::store(source.chat_id, storer); },
|
||||
[&](const FileSourceChannelFull &source) { td::store(source.channel_id, storer); },
|
||||
[&](const FileSourceAppConfig &source) {}, [&](const FileSourceSavedRingtones &source) {},
|
||||
[&](const FileSourceUserFull &source) { td::store(source.user_id, storer); },
|
||||
[&](const FileSourceAttachMenuBot &source) { td::store(source.user_id, storer); },
|
||||
[&](const FileSourceWebApp &source) {
|
||||
td::store(source.user_id, storer);
|
||||
td::store(source.short_name, storer);
|
||||
},
|
||||
[&](const FileSourceStory &source) { td::store(source.story_full_id, storer); },
|
||||
[&](const FileSourceQuickReplyMessage &source) { td::store(source.message_full_id, storer); }));
|
||||
}
|
||||
|
||||
template <class ParserT>
|
||||
@ -149,6 +153,11 @@ FileSourceId FileReferenceManager::parse_file_source(Td *td, ParserT &parser) {
|
||||
td::parse(story_full_id, parser);
|
||||
return td->story_manager_->get_story_file_source_id(story_full_id);
|
||||
}
|
||||
case 18: {
|
||||
QuickReplyMessageFullId message_full_id;
|
||||
td::parse(message_full_id, parser);
|
||||
return td->quick_reply_manager_->get_quick_reply_message_file_source_id(message_full_id);
|
||||
}
|
||||
default:
|
||||
parser.set_error("Invalid type in FileSource");
|
||||
return FileSourceId();
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include "td/telegram/ContactsManager.h"
|
||||
#include "td/telegram/Dependencies.h"
|
||||
#include "td/telegram/DialogManager.h"
|
||||
#include "td/telegram/FileReferenceManager.h"
|
||||
#include "td/telegram/Global.h"
|
||||
#include "td/telegram/logevent/LogEvent.h"
|
||||
#include "td/telegram/logevent/LogEventHelper.h"
|
||||
@ -1290,6 +1291,21 @@ void QuickReplyManager::send_update_quick_reply_shortcut_messages(const Shortcut
|
||||
}
|
||||
}
|
||||
|
||||
FileSourceId QuickReplyManager::get_quick_reply_message_file_source_id(QuickReplyMessageFullId message_full_id) {
|
||||
if (td_->auth_manager_->is_bot()) {
|
||||
return FileSourceId();
|
||||
}
|
||||
if (!message_full_id.is_server()) {
|
||||
return FileSourceId();
|
||||
}
|
||||
|
||||
auto &file_source_id = message_full_id_to_file_source_id_[message_full_id];
|
||||
if (!file_source_id.is_valid()) {
|
||||
file_source_id = td_->file_reference_manager_->create_quick_reply_message_file_source(message_full_id);
|
||||
}
|
||||
return file_source_id;
|
||||
}
|
||||
|
||||
void QuickReplyManager::get_current_state(vector<td_api::object_ptr<td_api::Update>> &updates) const {
|
||||
if (td_->auth_manager_->is_bot()) {
|
||||
return;
|
||||
|
@ -7,6 +7,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "td/telegram/DialogId.h"
|
||||
#include "td/telegram/files/FileSourceId.h"
|
||||
#include "td/telegram/MessageId.h"
|
||||
#include "td/telegram/QuickReplyMessageFullId.h"
|
||||
#include "td/telegram/QuickReplyShortcutId.h"
|
||||
@ -48,6 +49,8 @@ class QuickReplyManager final : public Actor {
|
||||
|
||||
void reload_quick_reply_message(QuickReplyShortcutId shortcut_id, MessageId message_id, Promise<Unit> &&promise);
|
||||
|
||||
FileSourceId get_quick_reply_message_file_source_id(QuickReplyMessageFullId message_full_id);
|
||||
|
||||
void get_current_state(vector<td_api::object_ptr<td_api::Update>> &updates) const;
|
||||
|
||||
private:
|
||||
@ -252,6 +255,8 @@ class QuickReplyManager final : public Actor {
|
||||
|
||||
FlatHashSet<QuickReplyMessageFullId, QuickReplyMessageFullIdHash> deleted_message_full_ids_;
|
||||
|
||||
FlatHashMap<QuickReplyMessageFullId, FileSourceId, QuickReplyMessageFullIdHash> message_full_id_to_file_source_id_;
|
||||
|
||||
Td *td_;
|
||||
ActorShared<> parent_;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user