Add internalLinkTypeWebApp.is_compact.

This commit is contained in:
levlam 2024-06-29 22:35:45 +03:00
parent 9297ae4098
commit aa26c117ee
3 changed files with 37 additions and 24 deletions

View File

@ -6414,7 +6414,8 @@ internalLinkTypeVideoChat chat_username:string invite_hash:string is_live_stream
//@bot_username Username of the bot that owns the Web App
//@web_app_short_name Short name of the Web App
//@start_parameter Start parameter to be passed to getWebAppLinkUrl
internalLinkTypeWebApp bot_username:string web_app_short_name:string start_parameter:string = InternalLinkType;
//@is_compact True, if the Web App must be tried to open in a compact mode with getWebAppLinkUrl
internalLinkTypeWebApp bot_username:string web_app_short_name:string start_parameter:string is_compact:Bool = InternalLinkType;
//@description Contains an HTTPS link to a message in a supergroup or channel, or a forum topic @link The link @is_public True, if the link will work for non-members of the chat

View File

@ -811,16 +811,19 @@ class LinkManager::InternalLinkWebApp final : public InternalLink {
string bot_username_;
string web_app_short_name_;
string start_parameter_;
string mode_;
td_api::object_ptr<td_api::InternalLinkType> get_internal_link_type_object() const final {
return td_api::make_object<td_api::internalLinkTypeWebApp>(bot_username_, web_app_short_name_, start_parameter_);
return td_api::make_object<td_api::internalLinkTypeWebApp>(bot_username_, web_app_short_name_, start_parameter_,
mode_ == "compact");
}
public:
InternalLinkWebApp(string bot_username, string web_app_short_name, string start_parameter)
InternalLinkWebApp(string bot_username, string web_app_short_name, string start_parameter, string mode)
: bot_username_(std::move(bot_username))
, web_app_short_name_(std::move(web_app_short_name))
, start_parameter_(std::move(start_parameter)) {
, start_parameter_(std::move(start_parameter))
, mode_(std::move(mode)) {
}
};
@ -1312,9 +1315,9 @@ unique_ptr<LinkManager::InternalLink> LinkManager::parse_tg_link_query(Slice que
}
if (arg.first == "appname" && is_valid_web_app_name(arg.second)) {
// resolve?domain=<bot_username>&appname=<app_name>
// resolve?domain=<bot_username>&appname=<app_name>&startapp=<start_parameter>
return td::make_unique<InternalLinkWebApp>(std::move(username), arg.second,
url_query.get_arg("startapp").str());
// resolve?domain=<bot_username>&appname=<app_name>&startapp=<start_parameter>&mode=compact
return td::make_unique<InternalLinkWebApp>(
std::move(username), arg.second, url_query.get_arg("startapp").str(), url_query.get_arg("mode").str());
}
if (arg.first == "story" && is_valid_story_id(arg.second)) {
// resolve?domain=<username>&story=<story_id>
@ -1738,8 +1741,9 @@ unique_ptr<LinkManager::InternalLink> LinkManager::parse_t_me_link_query(Slice q
}
if (path.size() == 2 && is_valid_web_app_name(path[1])) {
// /<username>/<web_app_name>
// /<username>/<web_app_name>?startapp=<start_parameter>
return td::make_unique<InternalLinkWebApp>(std::move(username), path[1], url_query.get_arg("startapp").str());
// /<username>/<web_app_name>?startapp=<start_parameter>&mode=compact
return td::make_unique<InternalLinkWebApp>(std::move(username), path[1], url_query.get_arg("startapp").str(),
url_query.get_arg("mode").str());
}
for (auto &arg : url_query.args_) {
if (arg.first == "voicechat" || arg.first == "videochat" || arg.first == "livestream") {
@ -2441,16 +2445,18 @@ Result<string> LinkManager::get_internal_link_impl(const td_api::InternalLinkTyp
if (!is_valid_start_parameter(link->start_parameter_)) {
return Status::Error(400, "Invalid start parameter specified");
}
string start_parameter;
string parameters;
if (!link->start_parameter_.empty()) {
start_parameter = PSTRING() << (is_internal ? '&' : '?') << "startapp=" << link->start_parameter_;
parameters = PSTRING() << (is_internal ? '&' : '?') << "startapp=" << link->start_parameter_
<< (link->is_compact_ ? "&mode=compact" : "");
} else if (link->is_compact_) {
parameters = PSTRING() << (is_internal ? '&' : '?') << "mode=compact";
}
if (is_internal) {
return PSTRING() << "tg://resolve?domain=" << link->bot_username_ << "&appname=" << link->web_app_short_name_
<< start_parameter;
<< parameters;
} else {
return PSTRING() << get_t_me_url() << link->bot_username_ << '/' << link->web_app_short_name_
<< start_parameter;
return PSTRING() << get_t_me_url() << link->bot_username_ << '/' << link->web_app_short_name_ << parameters;
}
}
default:

View File

@ -376,8 +376,9 @@ static auto video_chat(const td::string &chat_username, const td::string &invite
}
static auto web_app(const td::string &bot_username, const td::string &web_app_short_name,
const td::string &start_parameter) {
return td::td_api::make_object<td::td_api::internalLinkTypeWebApp>(bot_username, web_app_short_name, start_parameter);
const td::string &start_parameter, bool is_compact) {
return td::td_api::make_object<td::td_api::internalLinkTypeWebApp>(bot_username, web_app_short_name, start_parameter,
is_compact);
}
TEST(Link, parse_internal_link_part1) {
@ -616,7 +617,7 @@ TEST(Link, parse_internal_link_part1) {
parse_internal_link("t.me/bg/111111-222222%20?rotation=180%20", background("111111-222222%20?rotation=180%20"));
parse_internal_link("t.me/bg/111111~222222", background("111111~222222"));
parse_internal_link("t.me/bg/abacaba", background("abacaba"));
parse_internal_link("t.me/Bg/abacaba", web_app("Bg", "abacaba", ""));
parse_internal_link("t.me/Bg/abacaba", web_app("Bg", "abacaba", "", false));
parse_internal_link("t.me/bg/111111~222222#asdasd", background("111111~222222"));
parse_internal_link("t.me/bg/111111~222222?mode=blur", background("111111~222222"));
parse_internal_link("t.me/bg/111111~222222?mode=blur&text=1", background("111111~222222"));
@ -1182,7 +1183,7 @@ TEST(Link, parse_internal_link_part4) {
parse_internal_link("https://telegram.dog/tele%63ram/s/%31%39", story("telecram", 19));
parse_internal_link("tg:resolve?domain=username&appname=aasdasd&startapp=123asd",
web_app("username", "aasdasd", "123asd"));
web_app("username", "aasdasd", "123asd", false));
parse_internal_link("TG://resolve?domain=username&appname=&startapp=123asd", public_chat("username"));
parse_internal_link("TG://test@resolve?domain=username&appname=asd", nullptr);
parse_internal_link("tg:resolve:80?domain=username&appname=asd", nullptr);
@ -1191,7 +1192,10 @@ TEST(Link, parse_internal_link_part4) {
parse_internal_link("tg:resolve?domain=&appname=asd", unknown_deep_link("tg://resolve?domain=&appname=asd"));
parse_internal_link("tg:resolve?domain=telegram&&&&&&&appname=%41&startapp=", public_chat("telegram"));
parse_internal_link("tg:resolve?domain=telegram&&&&&&&appname=%41b&startapp=", public_chat("telegram"));
parse_internal_link("tg:resolve?domain=telegram&&&&&&&appname=%41bc&startapp=", web_app("telegram", "Abc", ""));
parse_internal_link("tg:resolve?domain=telegram&&&&&&&appname=%41bc&startapp=",
web_app("telegram", "Abc", "", false));
parse_internal_link("tg:resolve?domain=telegram&&&&&&&appname=%41bc&startapp=&mode=compact",
web_app("telegram", "Abc", "", true));
parse_internal_link("t.me/username/0/a//s/as?appname=asd", public_chat("username"));
parse_internal_link("t.me/username/aasdas/2?test=1&appname=asd#12312", public_chat("username"));
@ -1203,12 +1207,14 @@ TEST(Link, parse_internal_link_part4) {
parse_internal_link("t.me//username?appname=asd", nullptr);
parse_internal_link("https://telegram.dog/tele%63ram?appname=t%63st", public_chat("telecram"));
parse_internal_link("t.me/username/def/asd", public_chat("username"));
parse_internal_link("t.me/username/asd#12312&startapp=qwe", web_app("username", "asd", ""));
parse_internal_link("t.me/username/asd?12312&startapp=qwe", web_app("username", "asd", "qwe"));
parse_internal_link("t.me/username/asdasd?startapp=0", web_app("username", "asdasd", "0"));
parse_internal_link("t.me/username/asd", web_app("username", "asd", ""));
parse_internal_link("t.me/username/asd#12312&startapp=qwe", web_app("username", "asd", "", false));
parse_internal_link("t.me/username/asd?12312&startapp=qwe&mode=compac", web_app("username", "asd", "qwe", false));
parse_internal_link("t.me/username/asd?12312&startapp=qwe&mode=compact", web_app("username", "asd", "qwe", true));
parse_internal_link("t.me/username/asdasd?startapp=0", web_app("username", "asdasd", "0", false));
parse_internal_link("t.me/username/asd", web_app("username", "asd", "", false));
parse_internal_link("t.me/username/", public_chat("username"));
parse_internal_link("https://telegram.dog/tele%63ram/t%63st", web_app("telecram", "tcst", ""));
parse_internal_link("https://telegram.dog/tele%63ram/t%63st", web_app("telecram", "tcst", "", false));
parse_internal_link("https://telegram.dog/tele%63ram/t%63st?mode=compact", web_app("telecram", "tcst", "", true));
parse_internal_link("tg:resolve?domain=username&startapp=aasdasd", side_menu_bot("username", "aasdasd"));
parse_internal_link("TG://resolve?domain=username&startapp=&startapp=123asd", side_menu_bot("username", ""));