Skip to content

Commit da4282a

Browse files
committed
Add optional administrator_rights to internalLinkTypeBotStartInGroup.
1 parent eef401c commit da4282a

File tree

3 files changed

+73
-19
lines changed

3 files changed

+73
-19
lines changed

td/generate/scheme/td_api.tl

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3371,9 +3371,13 @@ internalLinkTypeBackground background_name:string = InternalLinkType;
33713371
internalLinkTypeBotStart bot_username:string start_parameter:string = InternalLinkType;
33723372

33733373
//@description The link is a link to a Telegram bot, which is supposed to be added to a group chat. Call searchPublicChat with the given bot username, check that the user is a bot and can be added to groups,
3374-
//-ask the current user to select a basic group or a supergroup chat to add the bot to, and then call sendBotStartMessage with the given start parameter and the chosen chat. Bots can be added to a public supergroup only by administrators of the supergroup
3375-
//@bot_username Username of the bot @start_parameter The parameter to be passed to sendBotStartMessage
3376-
internalLinkTypeBotStartInGroup bot_username:string start_parameter:string = InternalLinkType;
3374+
//-ask the current user to select a basic group or a supergroup chat to add the bot to, taking into account that bots can be added to a public supergroup only by administrators of the supergroup.
3375+
//-If administrator rights are provided by the link, call getChatMember to receive the current bot rights in the chat and if the bot already is an administrator,
3376+
//-check that the current user can edit its administrator rights, combine received rights with the requested administrator rights, show confirmation box to the user,
3377+
//-and call setChatMemberStatus with the chosen chat and confirmed administrator rights. Before call to setChatMemberStatus it may be required to upgrade the chosen basic group chat to a supergroup chat.
3378+
//-Then if start_parameter isn't empty, call sendBotStartMessage with the given start parameter and the chosen chat, otherwise just send /start message with bot's username added to the chat.
3379+
//@bot_username Username of the bot @start_parameter The parameter to be passed to sendBotStartMessage @administrator_rights Expected administrator rights for the bot; may be null
3380+
internalLinkTypeBotStartInGroup bot_username:string start_parameter:string administrator_rights:chatAdministratorRights = InternalLinkType;
33773381

33783382
//@description The link is a link to a Telegram bot, which is supposed to be added to a channel chat as an administrator. Call searchPublicChat with the given bot username and check that the user is a bot,
33793383
//-ask the current user to select a channel chat to add the bot to as an administrator. Then call getChatMember to receive the current bot rights in the chat and if the bot already is an administrator,

td/telegram/LinkManager.cpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -228,14 +228,20 @@ class LinkManager::InternalLinkBotStart final : public InternalLink {
228228
class LinkManager::InternalLinkBotStartInGroup final : public InternalLink {
229229
string bot_username_;
230230
string start_parameter_;
231+
AdministratorRights administrator_rights_;
231232

232233
td_api::object_ptr<td_api::InternalLinkType> get_internal_link_type_object() const final {
233-
return td_api::make_object<td_api::internalLinkTypeBotStartInGroup>(bot_username_, start_parameter_);
234+
return td_api::make_object<td_api::internalLinkTypeBotStartInGroup>(
235+
bot_username_, start_parameter_,
236+
administrator_rights_ == AdministratorRights() ? nullptr
237+
: administrator_rights_.get_chat_administrator_rights_object());
234238
}
235239

236240
public:
237-
InternalLinkBotStartInGroup(string bot_username, string start_parameter)
238-
: bot_username_(std::move(bot_username)), start_parameter_(std::move(start_parameter)) {
241+
InternalLinkBotStartInGroup(string bot_username, string start_parameter, AdministratorRights &&administrator_rights)
242+
: bot_username_(std::move(bot_username))
243+
, start_parameter_(std::move(start_parameter))
244+
, administrator_rights_(std::move(administrator_rights)) {
239245
}
240246
};
241247

@@ -914,7 +920,11 @@ unique_ptr<LinkManager::InternalLink> LinkManager::parse_tg_link_query(Slice que
914920
}
915921
if (arg.first == "startgroup" && is_valid_start_parameter(arg.second)) {
916922
// resolve?domain=<bot_username>&startgroup=<parameter>
917-
return td::make_unique<InternalLinkBotStartInGroup>(std::move(username), arg.second);
923+
// resolve?domain=<bot_username>&startgroup=>parameter>&admin=change_info+delete_messages+restrict_members
924+
// resolve?domain=<bot_username>&startgroup&admin=change_info+delete_messages+restrict_members
925+
auto administrator_rights = get_administrator_rights(url_query.get_arg("admin"), false);
926+
return td::make_unique<InternalLinkBotStartInGroup>(std::move(username), arg.second,
927+
std::move(administrator_rights));
918928
}
919929
if (arg.first == "startchannel") {
920930
// resolve?domain=<bot_username>&startchannel&admin=change_info+post_messages+promote_members
@@ -1219,7 +1229,11 @@ unique_ptr<LinkManager::InternalLink> LinkManager::parse_t_me_link_query(Slice q
12191229
}
12201230
if (arg.first == "startgroup" && is_valid_start_parameter(arg.second)) {
12211231
// /<bot_username>?startgroup=<parameter>
1222-
return td::make_unique<InternalLinkBotStartInGroup>(std::move(username), arg.second);
1232+
// /<bot_username>?startgroup=<parameter>&admin=change_info+delete_messages+restrict_members
1233+
// /<bot_username>?startgroup&admin=change_info+delete_messages+restrict_members
1234+
auto administrator_rights = get_administrator_rights(url_query.get_arg("admin"), false);
1235+
return td::make_unique<InternalLinkBotStartInGroup>(std::move(username), arg.second,
1236+
std::move(administrator_rights));
12231237
}
12241238
if (arg.first == "startchannel") {
12251239
// /<bot_username>?startchannel&admin=change_info+post_messages+promote_members

test/link.cpp

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,10 @@ TEST(Link, parse_internal_link) {
117117
auto bot_start = [](const td::string &bot_username, const td::string &start_parameter) {
118118
return td::td_api::make_object<td::td_api::internalLinkTypeBotStart>(bot_username, start_parameter);
119119
};
120-
auto bot_start_in_group = [](const td::string &bot_username, const td::string &start_parameter) {
121-
return td::td_api::make_object<td::td_api::internalLinkTypeBotStartInGroup>(bot_username, start_parameter);
120+
auto bot_start_in_group = [](const td::string &bot_username, const td::string &start_parameter,
121+
td::td_api::object_ptr<td::td_api::chatAdministratorRights> &&administrator_rights) {
122+
return td::td_api::make_object<td::td_api::internalLinkTypeBotStartInGroup>(bot_username, start_parameter,
123+
std::move(administrator_rights));
122124
};
123125
auto change_phone_number = [] {
124126
return td::td_api::make_object<td::td_api::internalLinkTypeChangePhoneNumber>();
@@ -640,14 +642,31 @@ TEST(Link, parse_internal_link) {
640642
parse_internal_link("t.me//username?start=", nullptr);
641643
parse_internal_link("https://telegram.dog/tele%63ram?start=t%63st", bot_start("telecram", "tcst"));
642644

643-
parse_internal_link("tg:resolve?domain=username&startgroup=aasdasd", bot_start_in_group("username", "aasdasd"));
644-
parse_internal_link("TG://resolve?domain=username&startgroup=", bot_start_in_group("username", ""));
645+
parse_internal_link("tg:resolve?domain=username&startgroup=aasdasd",
646+
bot_start_in_group("username", "aasdasd", nullptr));
647+
parse_internal_link("TG://resolve?domain=username&startgroup=", bot_start_in_group("username", "", nullptr));
645648
parse_internal_link("TG://test@resolve?domain=username&startgroup=", nullptr);
646649
parse_internal_link("tg:resolve:80?domain=username&startgroup=", nullptr);
647650
parse_internal_link("tg:http://resolve?domain=username&startgroup=", nullptr);
648651
parse_internal_link("tg:https://resolve?domain=username&startgroup=", nullptr);
649652
parse_internal_link("tg:resolve?domain=&startgroup=", unknown_deep_link("tg://resolve?domain=&startgroup="));
650-
parse_internal_link("tg:resolve?domain=telegram&&&&&&&startgroup=%30", bot_start_in_group("telegram", "0"));
653+
parse_internal_link("tg:resolve?domain=telegram&&&&&&&startgroup=%30", bot_start_in_group("telegram", "0", nullptr));
654+
655+
parse_internal_link("tg:resolve?domain=username&startgroup", bot_start_in_group("username", "", nullptr));
656+
parse_internal_link("tg:resolve?domain=username&startgroup&admin=asdas", bot_start_in_group("username", "", nullptr));
657+
parse_internal_link("tg:resolve?domain=username&startgroup&admin=post_messages",
658+
bot_start_in_group("username", "", nullptr));
659+
parse_internal_link(
660+
"tg:resolve?domain=username&startgroup=1&admin=delete_messages+anonymous",
661+
bot_start_in_group("username", "1",
662+
td::td_api::make_object<td::td_api::chatAdministratorRights>(
663+
true, false, false, false, true, false, false, false, false, false, true)));
664+
parse_internal_link(
665+
"tg:resolve?domain=username&startgroup&admin=manage_chat+change_info+post_messages+edit_messages+delete_messages+"
666+
"invite_users+restrict_members+pin_messages+promote_members+manage_video_chats+anonymous",
667+
bot_start_in_group("username", "",
668+
td::td_api::make_object<td::td_api::chatAdministratorRights>(
669+
true, true, false, false, true, true, true, true, true, true, true)));
651670

652671
parse_internal_link("tg:resolve?domain=username&startchannel", public_chat("username"));
653672
parse_internal_link("tg:resolve?domain=username&startchannel&admin=", public_chat("username"));
@@ -661,14 +680,31 @@ TEST(Link, parse_internal_link) {
661680
bot_add_to_channel("username", td::td_api::make_object<td::td_api::chatAdministratorRights>(
662681
true, true, true, true, true, true, true, false, true, true, false)));
663682

664-
parse_internal_link("t.me/username/0/a//s/as?startgroup=", bot_start_in_group("username", ""));
665-
parse_internal_link("t.me/username/aasdas?test=1&startgroup=#12312", bot_start_in_group("username", ""));
666-
parse_internal_link("t.me/username/0?startgroup=", bot_start_in_group("username", ""));
667-
parse_internal_link("t.me/username/-1?startgroup=asdasd", bot_start_in_group("username", "asdasd"));
668-
parse_internal_link("t.me/username?startgroup=", bot_start_in_group("username", ""));
683+
parse_internal_link("t.me/username/0/a//s/as?startgroup=", bot_start_in_group("username", "", nullptr));
684+
parse_internal_link("t.me/username/aasdas?test=1&startgroup=#12312", bot_start_in_group("username", "", nullptr));
685+
parse_internal_link("t.me/username/0?startgroup=", bot_start_in_group("username", "", nullptr));
686+
parse_internal_link("t.me/username/-1?startgroup=asdasd", bot_start_in_group("username", "asdasd", nullptr));
687+
parse_internal_link("t.me/username?startgroup=", bot_start_in_group("username", "", nullptr));
669688
parse_internal_link("t.me/username#startgroup=asdas", public_chat("username"));
670689
parse_internal_link("t.me//username?startgroup=", nullptr);
671-
parse_internal_link("https://telegram.dog/tele%63ram?startgroup=t%63st", bot_start_in_group("telecram", "tcst"));
690+
parse_internal_link("https://telegram.dog/tele%63ram?startgroup=t%63st",
691+
bot_start_in_group("telecram", "tcst", nullptr));
692+
693+
parse_internal_link("t.me/username?startgroup", bot_start_in_group("username", "", nullptr));
694+
parse_internal_link("t.me/username?startgroup&admin=asdas", bot_start_in_group("username", "", nullptr));
695+
parse_internal_link("t.me/username?startgroup&admin=post_messages", bot_start_in_group("username", "", nullptr));
696+
parse_internal_link(
697+
"t.me/username?startgroup=1&admin=delete_messages+anonymous",
698+
bot_start_in_group("username", "1",
699+
td::td_api::make_object<td::td_api::chatAdministratorRights>(
700+
true, false, false, false, true, false, false, false, false, false, true)));
701+
parse_internal_link(
702+
"t.me/"
703+
"username?startgroup&admin=manage_chat+change_info+post_messages+edit_messages+delete_messages+invite_users+"
704+
"restrict_members+pin_messages+promote_members+manage_video_chats+anonymous",
705+
bot_start_in_group("username", "",
706+
td::td_api::make_object<td::td_api::chatAdministratorRights>(
707+
true, true, false, false, true, true, true, true, true, true, true)));
672708

673709
parse_internal_link("t.me/username?startchannel", public_chat("username"));
674710
parse_internal_link("t.me/username?startchannel&admin=", public_chat("username"));

0 commit comments

Comments
 (0)