diff options
| author | levlam <levlam@telegram.org> | 2026-01-13 16:53:35 +0300 |
|---|---|---|
| committer | levlam <levlam@telegram.org> | 2026-01-13 16:53:35 +0300 |
| commit | ebf736e46e98cbcb88cca4f8b836203b90e1ec89 (patch) | |
| tree | 342902c6baf552da4bef8741e1646f8921ba6c7b | |
| parent | f241ef028633841d7db6656c20f62ac2fc20e35c (diff) | |
Add td_api::internalLinkTypeCalls.
| -rw-r--r-- | td/generate/scheme/td_api.tl | 4 | ||||
| -rw-r--r-- | td/telegram/LinkManager.cpp | 41 | ||||
| -rw-r--r-- | td/telegram/LinkManager.h | 1 | ||||
| -rw-r--r-- | test/link.cpp | 11 |
4 files changed, 57 insertions, 0 deletions
diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index d7e1af3d9..ba02ad3e7 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -8474,6 +8474,10 @@ internalLinkTypeBusinessChat link_name:string = InternalLinkType; //@purpose Purpose of Telegram Star purchase. Arbitrary string specified by the server, for example, "subs" if the Telegram Stars are required to extend channel subscriptions internalLinkTypeBuyStars star_count:int53 purpose:string = InternalLinkType; +//@description The link is a link to the Call tab @section Section of the page if any; may be one of +//-"all", "missed", "edit", "show-tab", "start-call" +internalLinkTypeCalls section:string = InternalLinkType; + //@description The link is an affiliate program link. Call searchChatAffiliateProgram with the given username and referrer to process the link //@username Username to be passed to searchChatAffiliateProgram //@referrer Referrer to be passed to searchChatAffiliateProgram diff --git a/td/telegram/LinkManager.cpp b/td/telegram/LinkManager.cpp index 57e4aecbc..48a70a3a0 100644 --- a/td/telegram/LinkManager.cpp +++ b/td/telegram/LinkManager.cpp @@ -324,6 +324,11 @@ static const vector<string> &get_send_gift_settings_subsections() { return subsections; } +static const vector<string> &get_calls_sections() { + static const vector<string> sections{"all", "missed", "edit", "show-tab", "start-call"}; + return sections; +} + static const vector<string> &get_my_profile_sections() { static const vector<string> sections{"posts", "posts/all-stories", "posts/add-album", "gifts", "archived-posts"}; return sections; @@ -681,6 +686,18 @@ class LinkManager::InternalLinkBuyStars final : public InternalLink { } }; +class LinkManager::InternalLinkCalls final : public InternalLink { + string section_; + + td_api::object_ptr<td_api::InternalLinkType> get_internal_link_type_object() const final { + return td_api::make_object<td_api::internalLinkTypeCalls>(section_); + } + + public: + explicit InternalLinkCalls(string section) : section_(std::move(section)) { + } +}; + class LinkManager::InternalLinkConfirmPhone final : public InternalLink { string hash_; string phone_number_; @@ -2075,6 +2092,20 @@ unique_ptr<LinkManager::InternalLink> LinkManager::parse_tg_link_query(Slice que } else if (path.size() >= 2 && path[0] == "settings" && path[1] == "saved-messages") { // settings/saved-messages return td::make_unique<InternalLinkSavedMessages>(); + } else if (path.size() >= 2 && path[0] == "settings" && path[1] == "calls") { + // settings/calls[/section] + string section; + if (path.size() >= 3u) { + section = path[2]; + for (size_t i = 3; i < path.size(); i++) { + section += '/'; + section += path[i]; + } + } + if (!td::contains(get_calls_sections(), section)) { + section = string(); + } + return td::make_unique<InternalLinkCalls>(std::move(section)); } else if (path.size() >= 2 && path[0] == "settings" && path[1] == "my-profile") { // settings/my-profile[/section] string section; @@ -2870,6 +2901,16 @@ Result<string> LinkManager::get_internal_link_impl(const td_api::InternalLinkTyp } return PSTRING() << "tg://stars_topup?balance=" << link->star_count_ << "&purpose=" << url_encode(link->purpose_); } + case td_api::internalLinkTypeCalls::ID: { + auto link = static_cast<const td_api::internalLinkTypeCalls *>(type_ptr); + if (!is_internal) { + return Status::Error("HTTP link is unavailable for the link type"); + } + if (td::contains(get_calls_sections(), link->section_)) { + return PSTRING() << "tg://settings/calls/" << link->section_; + } + return "tg://settings/calls"; + } case td_api::internalLinkTypeChatAffiliateProgram::ID: { auto link = static_cast<const td_api::internalLinkTypeChatAffiliateProgram *>(type_ptr); if (!is_valid_username(link->username_)) { diff --git a/td/telegram/LinkManager.h b/td/telegram/LinkManager.h index 316f801a3..4ec91dd0a 100644 --- a/td/telegram/LinkManager.h +++ b/td/telegram/LinkManager.h @@ -135,6 +135,7 @@ class LinkManager final : public Actor { class InternalLinkBotStartInGroup; class InternalLinkBusinessChat; class InternalLinkBuyStars; + class InternalLinkCalls; class InternalLinkConfirmPhone; class InternalLinkDialogBoost; class InternalLinkDialogFolderInvite; diff --git a/test/link.cpp b/test/link.cpp index 37af57d41..02cdf98d5 100644 --- a/test/link.cpp +++ b/test/link.cpp @@ -325,6 +325,10 @@ static auto buy_stars(td::int64 star_count, const td::string &purpose) { return td::td_api::make_object<td::td_api::internalLinkTypeBuyStars>(star_count, purpose); } +static auto calls(const td::string §ion) { + return td::td_api::make_object<td::td_api::internalLinkTypeCalls>(section); +} + static auto chat_affiliate_program(const td::string &username, const td::string &referral) { return td::td_api::make_object<td::td_api::internalLinkTypeChatAffiliateProgram>(username, referral); } @@ -955,6 +959,13 @@ TEST(Link, parse_internal_link_part2) { parse_internal_link("tg:settings/saved-messagess", settings()); parse_internal_link("tg:settings/saved-messages/test?#", saved_messages()); + parse_internal_link("tg://settings/calls", calls("")); + parse_internal_link("tg://settings/calls/asdasd", calls("")); + parse_internal_link("tg://settings/calls/all", calls("all")); + parse_internal_link("tg://settings/calls/edit", calls("edit")); + parse_internal_link("tg://settings/calls/all", calls("all")); + parse_internal_link("tg://settings/calls/start-call", calls("start-call")); + parse_internal_link("tg://settings/my-profile", my_profile("")); parse_internal_link("tg://settings/my-profile/asdasd", my_profile("")); parse_internal_link("tg://settings/my-profile/posts", my_profile("posts")); |
