aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--td/generate/scheme/td_api.tl4
-rw-r--r--td/telegram/LinkManager.cpp41
-rw-r--r--td/telegram/LinkManager.h1
-rw-r--r--test/link.cpp11
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 &section) {
+ 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"));