Support file reference repair for Web App files.
This commit is contained in:
parent
b427a7b9f6
commit
3a598036e6
@ -694,7 +694,7 @@ void AttachMenuManager::schedule_ping_web_view() {
|
|||||||
ping_web_view_timeout_.set_timeout_in(PING_WEB_VIEW_TIMEOUT);
|
ping_web_view_timeout_.set_timeout_in(PING_WEB_VIEW_TIMEOUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AttachMenuManager::get_web_app(UserId bot_user_id, string &&web_app_short_name,
|
void AttachMenuManager::get_web_app(UserId bot_user_id, const string &web_app_short_name,
|
||||||
Promise<td_api::object_ptr<td_api::foundWebApp>> &&promise) {
|
Promise<td_api::object_ptr<td_api::foundWebApp>> &&promise) {
|
||||||
TRY_RESULT_PROMISE(promise, input_user, td_->contacts_manager_->get_input_user(bot_user_id));
|
TRY_RESULT_PROMISE(promise, input_user, td_->contacts_manager_->get_input_user(bot_user_id));
|
||||||
TRY_RESULT_PROMISE(promise, bot_data, td_->contacts_manager_->get_bot_data(bot_user_id));
|
TRY_RESULT_PROMISE(promise, bot_data, td_->contacts_manager_->get_bot_data(bot_user_id));
|
||||||
@ -722,10 +722,29 @@ void AttachMenuManager::on_get_web_app(UserId bot_user_id, string web_app_short_
|
|||||||
}
|
}
|
||||||
|
|
||||||
WebApp web_app(td_, telegram_api::move_object_as<telegram_api::botApp>(bot_app->app_), DialogId(bot_user_id));
|
WebApp web_app(td_, telegram_api::move_object_as<telegram_api::botApp>(bot_app->app_), DialogId(bot_user_id));
|
||||||
|
auto file_ids = web_app.get_file_ids(td_);
|
||||||
|
if (!file_ids.empty()) {
|
||||||
|
auto file_source_id = get_web_app_file_source_id(bot_user_id, web_app_short_name);
|
||||||
|
for (auto file_id : file_ids) {
|
||||||
|
td_->file_manager_->add_file_source(file_id, file_source_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
promise.set_value(td_api::make_object<td_api::foundWebApp>(web_app.get_web_app_object(td_),
|
promise.set_value(td_api::make_object<td_api::foundWebApp>(web_app.get_web_app_object(td_),
|
||||||
bot_app->request_write_access_, !bot_app->inactive_));
|
bot_app->request_write_access_, !bot_app->inactive_));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AttachMenuManager::reload_web_app(UserId bot_user_id, const string &web_app_short_name, Promise<Unit> &&promise) {
|
||||||
|
get_web_app(bot_user_id, web_app_short_name,
|
||||||
|
PromiseCreator::lambda(
|
||||||
|
[promise = std::move(promise)](Result<td_api::object_ptr<td_api::foundWebApp>> result) mutable {
|
||||||
|
if (result.is_error()) {
|
||||||
|
promise.set_error(result.move_as_error());
|
||||||
|
} else {
|
||||||
|
promise.set_value(Unit());
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
void AttachMenuManager::request_app_web_view(DialogId dialog_id, UserId bot_user_id, string &&web_app_short_name,
|
void AttachMenuManager::request_app_web_view(DialogId dialog_id, UserId bot_user_id, string &&web_app_short_name,
|
||||||
string &&start_parameter,
|
string &&start_parameter,
|
||||||
const td_api::object_ptr<td_api::themeParameters> &theme,
|
const td_api::object_ptr<td_api::themeParameters> &theme,
|
||||||
@ -1133,6 +1152,19 @@ FileSourceId AttachMenuManager::get_attach_menu_bot_file_source_id(UserId user_i
|
|||||||
return source_id;
|
return source_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FileSourceId AttachMenuManager::get_web_app_file_source_id(UserId user_id, const string &short_name) {
|
||||||
|
if (!user_id.is_valid() || !is_active()) {
|
||||||
|
return FileSourceId();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto &source_id = web_app_file_source_ids_[user_id][short_name];
|
||||||
|
if (!source_id.is_valid()) {
|
||||||
|
source_id = td_->file_reference_manager_->create_web_app_file_source(user_id, short_name);
|
||||||
|
}
|
||||||
|
VLOG(file_references) << "Return " << source_id << " for web app " << user_id << '/' << short_name;
|
||||||
|
return source_id;
|
||||||
|
}
|
||||||
|
|
||||||
void AttachMenuManager::toggle_bot_is_added_to_attach_menu(UserId user_id, bool is_added, bool allow_write_access,
|
void AttachMenuManager::toggle_bot_is_added_to_attach_menu(UserId user_id, bool is_added, bool allow_write_access,
|
||||||
Promise<Unit> &&promise) {
|
Promise<Unit> &&promise) {
|
||||||
CHECK(is_active());
|
CHECK(is_active());
|
||||||
|
@ -32,9 +32,11 @@ class AttachMenuManager final : public Actor {
|
|||||||
|
|
||||||
void init();
|
void init();
|
||||||
|
|
||||||
void get_web_app(UserId bot_user_id, string &&web_app_short_name,
|
void get_web_app(UserId bot_user_id, const string &web_app_short_name,
|
||||||
Promise<td_api::object_ptr<td_api::foundWebApp>> &&promise);
|
Promise<td_api::object_ptr<td_api::foundWebApp>> &&promise);
|
||||||
|
|
||||||
|
void reload_web_app(UserId bot_user_id, const string &web_app_short_name, Promise<Unit> &&promise);
|
||||||
|
|
||||||
void request_app_web_view(DialogId dialog_id, UserId bot_user_id, string &&web_app_short_name,
|
void request_app_web_view(DialogId dialog_id, UserId bot_user_id, string &&web_app_short_name,
|
||||||
string &&start_parameter, const td_api::object_ptr<td_api::themeParameters> &theme,
|
string &&start_parameter, const td_api::object_ptr<td_api::themeParameters> &theme,
|
||||||
string &&platform, bool allow_write_access, Promise<string> &&promise);
|
string &&platform, bool allow_write_access, Promise<string> &&promise);
|
||||||
@ -57,6 +59,8 @@ class AttachMenuManager final : public Actor {
|
|||||||
|
|
||||||
FileSourceId get_attach_menu_bot_file_source_id(UserId user_id);
|
FileSourceId get_attach_menu_bot_file_source_id(UserId user_id);
|
||||||
|
|
||||||
|
FileSourceId get_web_app_file_source_id(UserId user_id, const string &short_name);
|
||||||
|
|
||||||
void toggle_bot_is_added_to_attach_menu(UserId user_id, bool is_added, bool allow_write_access,
|
void toggle_bot_is_added_to_attach_menu(UserId user_id, bool is_added, bool allow_write_access,
|
||||||
Promise<Unit> &&promise);
|
Promise<Unit> &&promise);
|
||||||
|
|
||||||
@ -165,6 +169,8 @@ class AttachMenuManager final : public Actor {
|
|||||||
FlatHashMap<UserId, FileSourceId, UserIdHash> attach_menu_bot_file_source_ids_;
|
FlatHashMap<UserId, FileSourceId, UserIdHash> attach_menu_bot_file_source_ids_;
|
||||||
vector<Promise<Unit>> reload_attach_menu_bots_queries_;
|
vector<Promise<Unit>> reload_attach_menu_bots_queries_;
|
||||||
|
|
||||||
|
FlatHashMap<UserId, FlatHashMap<string, FileSourceId>, UserIdHash> web_app_file_source_ids_;
|
||||||
|
|
||||||
struct OpenedWebView {
|
struct OpenedWebView {
|
||||||
DialogId dialog_id_;
|
DialogId dialog_id_;
|
||||||
UserId bot_user_id_;
|
UserId bot_user_id_;
|
||||||
|
@ -61,21 +61,22 @@ size_t FileReferenceManager::get_file_reference_error_pos(const Status &error) {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
fileSourceMessage chat_id:int53 message_id:int53 = FileSource; // repaired with get_message_from_server
|
fileSourceMessage chat_id:int53 message_id:int53 = FileSource; // repaired with get_message_from_server
|
||||||
fileSourceUserProfilePhoto user_id:int32 photo_id:int64 = FileSource; // repaired with photos.getUserPhotos
|
fileSourceUserProfilePhoto user_id:int53 photo_id:int64 = FileSource; // repaired with photos.getUserPhotos
|
||||||
fileSourceBasicGroupPhoto basic_group_id:int32 = FileSource; // no need to repair
|
fileSourceBasicGroupPhoto basic_group_id:int53 = FileSource; // no need to repair
|
||||||
fileSourceSupergroupPhoto supergroup_id:int32 = FileSource; // no need to repair
|
fileSourceSupergroupPhoto supergroup_id:int53 = FileSource; // no need to repair
|
||||||
fileSourceWebPage url:string = FileSource; // repaired with messages.getWebPage
|
fileSourceWebPage url:string = FileSource; // repaired with messages.getWebPage
|
||||||
fileSourceWallpapers = FileSource; // can't be repaired
|
fileSourceWallpapers = FileSource; // can't be repaired
|
||||||
fileSourceSavedAnimations = FileSource; // repaired with messages.getSavedGifs
|
fileSourceSavedAnimations = FileSource; // repaired with messages.getSavedGifs
|
||||||
fileSourceRecentStickers is_attached:Bool = FileSource; // repaired with messages.getRecentStickers, not reliable
|
fileSourceRecentStickers is_attached:Bool = FileSource; // repaired with messages.getRecentStickers, not reliable
|
||||||
fileSourceFavoriteStickers = FileSource; // repaired with messages.getFavedStickers, not reliable
|
fileSourceFavoriteStickers = FileSource; // repaired with messages.getFavedStickers, not reliable
|
||||||
fileSourceBackground background_id:int64 access_hash:int64 = FileSource; // repaired with account.getWallPaper
|
fileSourceBackground background_id:int64 access_hash:int64 = FileSource; // repaired with account.getWallPaper
|
||||||
fileSourceBasicGroupFull basic_group_id:int32 = FileSource; // repaired with messages.getFullChat
|
fileSourceBasicGroupFull basic_group_id:int53 = FileSource; // repaired with messages.getFullChat
|
||||||
fileSourceSupergroupFull supergroup_id:int32 = FileSource; // repaired with messages.getFullChannel
|
fileSourceSupergroupFull supergroup_id:int53 = FileSource; // repaired with messages.getFullChannel
|
||||||
fileSourceAppConfig = FileSource; // repaired with help.getAppConfig, not reliable
|
fileSourceAppConfig = FileSource; // repaired with help.getAppConfig, not reliable
|
||||||
fileSourceSavedRingtones = FileSource; // repaired with account.getSavedRingtones
|
fileSourceSavedRingtones = FileSource; // repaired with account.getSavedRingtones
|
||||||
fileSourceUserFull = FileSource; // repaired with users.getFullUser
|
fileSourceUserFull = FileSource; // repaired with users.getFullUser
|
||||||
fileSourceAttachmentMenuBot = FileSource; // repaired with messages.getAttachMenuBot
|
fileSourceAttachmentMenuBot user_id:int53 = FileSource; // repaired with messages.getAttachMenuBot
|
||||||
|
fileSourceWebApp user_id:int53 short_name:string = FileSource; // repaired with messages.getAttachMenuBot
|
||||||
*/
|
*/
|
||||||
|
|
||||||
FileSourceId FileReferenceManager::get_current_file_source_id() const {
|
FileSourceId FileReferenceManager::get_current_file_source_id() const {
|
||||||
@ -155,6 +156,11 @@ FileSourceId FileReferenceManager::create_attach_menu_bot_file_source(UserId use
|
|||||||
return add_file_source_id(source, PSLICE() << "attachment menu bot " << user_id);
|
return add_file_source_id(source, PSLICE() << "attachment menu bot " << user_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FileSourceId FileReferenceManager::create_web_app_file_source(UserId user_id, const string &short_name) {
|
||||||
|
FileSourceWebApp source{user_id, short_name};
|
||||||
|
return add_file_source_id(source, PSLICE() << "web app " << user_id << '/' << short_name);
|
||||||
|
}
|
||||||
|
|
||||||
FileReferenceManager::Node &FileReferenceManager::add_node(NodeId node_id) {
|
FileReferenceManager::Node &FileReferenceManager::add_node(NodeId node_id) {
|
||||||
CHECK(node_id.is_valid());
|
CHECK(node_id.is_valid());
|
||||||
auto &node = nodes_[node_id];
|
auto &node = nodes_[node_id];
|
||||||
@ -360,6 +366,10 @@ void FileReferenceManager::send_query(Destination dest, FileSourceId file_source
|
|||||||
[&](const FileSourceAttachMenuBot &source) {
|
[&](const FileSourceAttachMenuBot &source) {
|
||||||
send_closure_later(G()->attach_menu_manager(), &AttachMenuManager::reload_attach_menu_bot, source.user_id,
|
send_closure_later(G()->attach_menu_manager(), &AttachMenuManager::reload_attach_menu_bot, source.user_id,
|
||||||
std::move(promise));
|
std::move(promise));
|
||||||
|
},
|
||||||
|
[&](const FileSourceWebApp &source) {
|
||||||
|
send_closure_later(G()->attach_menu_manager(), &AttachMenuManager::reload_web_app, source.user_id,
|
||||||
|
source.short_name, std::move(promise));
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,6 +63,7 @@ class FileReferenceManager final : public Actor {
|
|||||||
FileSourceId create_saved_ringtones_file_source();
|
FileSourceId create_saved_ringtones_file_source();
|
||||||
FileSourceId create_user_full_file_source(UserId user_id);
|
FileSourceId create_user_full_file_source(UserId user_id);
|
||||||
FileSourceId create_attach_menu_bot_file_source(UserId user_id);
|
FileSourceId create_attach_menu_bot_file_source(UserId user_id);
|
||||||
|
FileSourceId create_web_app_file_source(UserId user_id, const string &short_name);
|
||||||
|
|
||||||
using NodeId = FileId;
|
using NodeId = FileId;
|
||||||
void repair_file_reference(NodeId node_id, Promise<> promise);
|
void repair_file_reference(NodeId node_id, Promise<> promise);
|
||||||
@ -164,13 +165,17 @@ class FileReferenceManager final : public Actor {
|
|||||||
struct FileSourceAttachMenuBot {
|
struct FileSourceAttachMenuBot {
|
||||||
UserId user_id;
|
UserId user_id;
|
||||||
};
|
};
|
||||||
|
struct FileSourceWebApp {
|
||||||
|
UserId user_id;
|
||||||
|
string short_name;
|
||||||
|
};
|
||||||
|
|
||||||
// append only
|
// append only
|
||||||
using FileSource =
|
using FileSource =
|
||||||
Variant<FileSourceMessage, FileSourceUserPhoto, FileSourceChatPhoto, FileSourceChannelPhoto, FileSourceWallpapers,
|
Variant<FileSourceMessage, FileSourceUserPhoto, FileSourceChatPhoto, FileSourceChannelPhoto, FileSourceWallpapers,
|
||||||
FileSourceWebPage, FileSourceSavedAnimations, FileSourceRecentStickers, FileSourceFavoriteStickers,
|
FileSourceWebPage, FileSourceSavedAnimations, FileSourceRecentStickers, FileSourceFavoriteStickers,
|
||||||
FileSourceBackground, FileSourceChatFull, FileSourceChannelFull, FileSourceAppConfig,
|
FileSourceBackground, FileSourceChatFull, FileSourceChannelFull, FileSourceAppConfig,
|
||||||
FileSourceSavedRingtones, FileSourceUserFull, FileSourceAttachMenuBot>;
|
FileSourceSavedRingtones, FileSourceUserFull, FileSourceAttachMenuBot, FileSourceWebApp>;
|
||||||
WaitFreeVector<FileSource> file_sources_;
|
WaitFreeVector<FileSource> file_sources_;
|
||||||
|
|
||||||
int64 query_generation_{0};
|
int64 query_generation_{0};
|
||||||
|
@ -54,7 +54,11 @@ void FileReferenceManager::store_file_source(FileSourceId file_source_id, Storer
|
|||||||
[&](const FileSourceChannelFull &source) { td::store(source.channel_id, storer); },
|
[&](const FileSourceChannelFull &source) { td::store(source.channel_id, storer); },
|
||||||
[&](const FileSourceAppConfig &source) {}, [&](const FileSourceSavedRingtones &source) {},
|
[&](const FileSourceAppConfig &source) {}, [&](const FileSourceSavedRingtones &source) {},
|
||||||
[&](const FileSourceUserFull &source) { td::store(source.user_id, storer); },
|
[&](const FileSourceUserFull &source) { td::store(source.user_id, storer); },
|
||||||
[&](const FileSourceAttachMenuBot &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);
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class ParserT>
|
template <class ParserT>
|
||||||
@ -130,6 +134,13 @@ FileSourceId FileReferenceManager::parse_file_source(Td *td, ParserT &parser) {
|
|||||||
td::parse(user_id, parser);
|
td::parse(user_id, parser);
|
||||||
return td->attach_menu_manager_->get_attach_menu_bot_file_source_id(user_id);
|
return td->attach_menu_manager_->get_attach_menu_bot_file_source_id(user_id);
|
||||||
}
|
}
|
||||||
|
case 16: {
|
||||||
|
UserId user_id;
|
||||||
|
string short_name;
|
||||||
|
td::parse(user_id, parser);
|
||||||
|
td::parse(short_name, parser);
|
||||||
|
return td->attach_menu_manager_->get_web_app_file_source_id(user_id, short_name);
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
parser.set_error("Invalid type in FileSource");
|
parser.set_error("Invalid type in FileSource");
|
||||||
return FileSourceId();
|
return FileSourceId();
|
||||||
|
@ -7814,8 +7814,7 @@ void Td::on_request(uint64 id, td_api::searchWebApp &request) {
|
|||||||
CHECK_IS_USER();
|
CHECK_IS_USER();
|
||||||
CLEAN_INPUT_STRING(request.web_app_short_name_);
|
CLEAN_INPUT_STRING(request.web_app_short_name_);
|
||||||
CREATE_REQUEST_PROMISE();
|
CREATE_REQUEST_PROMISE();
|
||||||
attach_menu_manager_->get_web_app(UserId(request.bot_user_id_), std::move(request.web_app_short_name_),
|
attach_menu_manager_->get_web_app(UserId(request.bot_user_id_), request.web_app_short_name_, std::move(promise));
|
||||||
std::move(promise));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Td::on_request(uint64 id, td_api::getWebAppLinkUrl &request) {
|
void Td::on_request(uint64 id, td_api::getWebAppLinkUrl &request) {
|
||||||
|
Loading…
Reference in New Issue
Block a user