Add inlineKeyboardButtonTypeSwitchInline.target_chat.
This commit is contained in:
parent
6fde8184af
commit
2a70fec0b0
@ -1545,8 +1545,8 @@ inlineKeyboardButtonTypeCallbackWithPassword data:bytes = InlineKeyboardButtonTy
|
|||||||
//@description A button with a game that sends a callback query to a bot. This button must be in the first column and row of the keyboard and can be attached only to a message with content of the type messageGame
|
//@description A button with a game that sends a callback query to a bot. This button must be in the first column and row of the keyboard and can be attached only to a message with content of the type messageGame
|
||||||
inlineKeyboardButtonTypeCallbackGame = InlineKeyboardButtonType;
|
inlineKeyboardButtonTypeCallbackGame = InlineKeyboardButtonType;
|
||||||
|
|
||||||
//@description A button that forces an inline query to the bot to be inserted in the input field @query Inline query to be sent to the bot @in_current_chat True, if the inline query must be sent from the current chat
|
//@description A button that forces an inline query to the bot to be inserted in the input field @query Inline query to be sent to the bot @target_chat Target chat from which to send the inline query
|
||||||
inlineKeyboardButtonTypeSwitchInline query:string in_current_chat:Bool = InlineKeyboardButtonType;
|
inlineKeyboardButtonTypeSwitchInline query:string target_chat:TargetChat = InlineKeyboardButtonType;
|
||||||
|
|
||||||
//@description A button to buy something. This button must be in the first column and row of the keyboard and can be attached only to a message with content of the type messageInvoice
|
//@description A button to buy something. This button must be in the first column and row of the keyboard and can be attached only to a message with content of the type messageInvoice
|
||||||
inlineKeyboardButtonTypeBuy = InlineKeyboardButtonType;
|
inlineKeyboardButtonTypeBuy = InlineKeyboardButtonType;
|
||||||
|
@ -84,7 +84,7 @@ static StringBuilder &operator<<(StringBuilder &string_builder, const InlineKeyb
|
|||||||
string_builder << "CallbackGame";
|
string_builder << "CallbackGame";
|
||||||
break;
|
break;
|
||||||
case InlineKeyboardButton::Type::SwitchInline:
|
case InlineKeyboardButton::Type::SwitchInline:
|
||||||
string_builder << "SwitchInline";
|
string_builder << "SwitchInline, target chat mask = " << keyboard_button.id;
|
||||||
break;
|
break;
|
||||||
case InlineKeyboardButton::Type::SwitchInlineCurrentDialog:
|
case InlineKeyboardButton::Type::SwitchInlineCurrentDialog:
|
||||||
string_builder << "SwitchInlineCurrentChat";
|
string_builder << "SwitchInlineCurrentChat";
|
||||||
@ -292,6 +292,30 @@ static InlineKeyboardButton get_inline_keyboard_button(
|
|||||||
: InlineKeyboardButton::Type::SwitchInline;
|
: InlineKeyboardButton::Type::SwitchInline;
|
||||||
button.text = std::move(keyboard_button->text_);
|
button.text = std::move(keyboard_button->text_);
|
||||||
button.data = std::move(keyboard_button->query_);
|
button.data = std::move(keyboard_button->query_);
|
||||||
|
if (!keyboard_button->same_peer_) {
|
||||||
|
for (auto &peer_type : keyboard_button->peer_types_) {
|
||||||
|
switch (peer_type->get_id()) {
|
||||||
|
case telegram_api::inlineQueryPeerTypePM::ID:
|
||||||
|
button.id |= InlineKeyboardButton::USERS_MASK;
|
||||||
|
break;
|
||||||
|
case telegram_api::inlineQueryPeerTypeBotPM::ID:
|
||||||
|
button.id |= InlineKeyboardButton::BOTS_MASK;
|
||||||
|
break;
|
||||||
|
case telegram_api::inlineQueryPeerTypeChat::ID:
|
||||||
|
case telegram_api::inlineQueryPeerTypeMegagroup::ID:
|
||||||
|
button.id |= InlineKeyboardButton::CHATS_MASK;
|
||||||
|
break;
|
||||||
|
case telegram_api::inlineQueryPeerTypeBroadcast::ID:
|
||||||
|
button.id |= InlineKeyboardButton::BROADCASTS_MASK;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOG(ERROR) << "Receive " << to_string(peer_type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (button.id == InlineKeyboardButton::FULL_MASK) {
|
||||||
|
button.id = 0;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case telegram_api::keyboardButtonBuy::ID: {
|
case telegram_api::keyboardButtonBuy::ID: {
|
||||||
@ -576,16 +600,47 @@ static Result<InlineKeyboardButton> get_inline_keyboard_button(tl_object_ptr<td_
|
|||||||
return Status::Error(400, "Can't use CallbackWithPassword inline button");
|
return Status::Error(400, "Can't use CallbackWithPassword inline button");
|
||||||
case td_api::inlineKeyboardButtonTypeSwitchInline::ID: {
|
case td_api::inlineKeyboardButtonTypeSwitchInline::ID: {
|
||||||
auto button_type = move_tl_object_as<td_api::inlineKeyboardButtonTypeSwitchInline>(button->type_);
|
auto button_type = move_tl_object_as<td_api::inlineKeyboardButtonTypeSwitchInline>(button->type_);
|
||||||
|
if (button_type->target_chat_ == nullptr) {
|
||||||
|
return Status::Error(400, "Target chat must be non-empty");
|
||||||
|
}
|
||||||
|
switch (button_type->target_chat_->get_id()) {
|
||||||
|
case td_api::targetChatChosen::ID: {
|
||||||
|
auto target = static_cast<const td_api::targetChatChosen *>(button_type->target_chat_.get());
|
||||||
|
if (target->allow_user_chats_) {
|
||||||
|
current_button.id |= InlineKeyboardButton::USERS_MASK;
|
||||||
|
}
|
||||||
|
if (target->allow_bot_chats_) {
|
||||||
|
current_button.id |= InlineKeyboardButton::BOTS_MASK;
|
||||||
|
}
|
||||||
|
if (target->allow_group_chats_) {
|
||||||
|
current_button.id |= InlineKeyboardButton::CHATS_MASK;
|
||||||
|
}
|
||||||
|
if (target->allow_channel_chats_) {
|
||||||
|
current_button.id |= InlineKeyboardButton::BROADCASTS_MASK;
|
||||||
|
}
|
||||||
|
if (current_button.id == InlineKeyboardButton::FULL_MASK) {
|
||||||
|
current_button.id = 0;
|
||||||
|
}
|
||||||
|
current_button.type = InlineKeyboardButton::Type::SwitchInline;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case td_api::targetChatCurrent::ID:
|
||||||
|
current_button.type = InlineKeyboardButton::Type::SwitchInlineCurrentDialog;
|
||||||
|
break;
|
||||||
|
case td_api::targetChatInternalLink::ID:
|
||||||
|
return Status::Error(400, "Unsupported target chat specified");
|
||||||
|
default:
|
||||||
|
UNREACHABLE();
|
||||||
|
}
|
||||||
if (!switch_inline_buttons_allowed) {
|
if (!switch_inline_buttons_allowed) {
|
||||||
const char *button_name =
|
const char *button_name = current_button.type == InlineKeyboardButton::Type::SwitchInline
|
||||||
button_type->in_current_chat_ ? "switch_inline_query_current_chat" : "switch_inline_query";
|
? "switch_inline_query"
|
||||||
|
: "switch_inline_query_current_chat";
|
||||||
return Status::Error(400, PSLICE() << "Can't use " << button_name
|
return Status::Error(400, PSLICE() << "Can't use " << button_name
|
||||||
<< " in a channel chat, because a user will not be able to use the button "
|
<< " button in a channel chat, because users will not be able to use the "
|
||||||
"without knowing bot's username");
|
"button without knowing bot's username");
|
||||||
}
|
}
|
||||||
|
|
||||||
current_button.type = button_type->in_current_chat_ ? InlineKeyboardButton::Type::SwitchInlineCurrentDialog
|
|
||||||
: InlineKeyboardButton::Type::SwitchInline;
|
|
||||||
current_button.data = std::move(button_type->query_);
|
current_button.data = std::move(button_type->query_);
|
||||||
if (!clean_input_string(current_button.data)) {
|
if (!clean_input_string(current_button.data)) {
|
||||||
return Status::Error(400, "Inline keyboard button switch inline query must be encoded in UTF-8");
|
return Status::Error(400, "Inline keyboard button switch inline query must be encoded in UTF-8");
|
||||||
@ -828,16 +883,33 @@ static tl_object_ptr<telegram_api::KeyboardButton> get_input_keyboard_button(
|
|||||||
BufferSlice(keyboard_button.data));
|
BufferSlice(keyboard_button.data));
|
||||||
case InlineKeyboardButton::Type::CallbackGame:
|
case InlineKeyboardButton::Type::CallbackGame:
|
||||||
return make_tl_object<telegram_api::keyboardButtonGame>(keyboard_button.text);
|
return make_tl_object<telegram_api::keyboardButtonGame>(keyboard_button.text);
|
||||||
case InlineKeyboardButton::Type::SwitchInline:
|
case InlineKeyboardButton::Type::SwitchInline: {
|
||||||
case InlineKeyboardButton::Type::SwitchInlineCurrentDialog: {
|
|
||||||
int32 flags = 0;
|
int32 flags = 0;
|
||||||
if (keyboard_button.type == InlineKeyboardButton::Type::SwitchInlineCurrentDialog) {
|
|
||||||
flags |= telegram_api::keyboardButtonSwitchInline::SAME_PEER_MASK;
|
|
||||||
}
|
|
||||||
vector<telegram_api::object_ptr<telegram_api::InlineQueryPeerType>> peer_types;
|
vector<telegram_api::object_ptr<telegram_api::InlineQueryPeerType>> peer_types;
|
||||||
|
if (keyboard_button.id != 0) {
|
||||||
|
CHECK(keyboard_button.type == InlineKeyboardButton::Type::SwitchInline);
|
||||||
|
flags |= telegram_api::keyboardButtonSwitchInline::PEER_TYPES_MASK;
|
||||||
|
if ((keyboard_button.id & InlineKeyboardButton::USERS_MASK) != 0) {
|
||||||
|
peer_types.push_back(telegram_api::make_object<telegram_api::inlineQueryPeerTypePM>());
|
||||||
|
}
|
||||||
|
if ((keyboard_button.id & InlineKeyboardButton::BOTS_MASK) != 0) {
|
||||||
|
peer_types.push_back(telegram_api::make_object<telegram_api::inlineQueryPeerTypeBotPM>());
|
||||||
|
}
|
||||||
|
if ((keyboard_button.id & InlineKeyboardButton::CHATS_MASK) != 0) {
|
||||||
|
peer_types.push_back(telegram_api::make_object<telegram_api::inlineQueryPeerTypeChat>());
|
||||||
|
peer_types.push_back(telegram_api::make_object<telegram_api::inlineQueryPeerTypeMegagroup>());
|
||||||
|
}
|
||||||
|
if ((keyboard_button.id & InlineKeyboardButton::BROADCASTS_MASK) != 0) {
|
||||||
|
peer_types.push_back(telegram_api::make_object<telegram_api::inlineQueryPeerTypeBroadcast>());
|
||||||
|
}
|
||||||
|
}
|
||||||
return make_tl_object<telegram_api::keyboardButtonSwitchInline>(flags, false /*ignored*/, keyboard_button.text,
|
return make_tl_object<telegram_api::keyboardButtonSwitchInline>(flags, false /*ignored*/, keyboard_button.text,
|
||||||
keyboard_button.data, std::move(peer_types));
|
keyboard_button.data, std::move(peer_types));
|
||||||
}
|
}
|
||||||
|
case InlineKeyboardButton::Type::SwitchInlineCurrentDialog:
|
||||||
|
return make_tl_object<telegram_api::keyboardButtonSwitchInline>(
|
||||||
|
telegram_api::keyboardButtonSwitchInline::SAME_PEER_MASK, false /*ignored*/, keyboard_button.text,
|
||||||
|
keyboard_button.data, vector<telegram_api::object_ptr<telegram_api::InlineQueryPeerType>>());
|
||||||
case InlineKeyboardButton::Type::Buy:
|
case InlineKeyboardButton::Type::Buy:
|
||||||
return make_tl_object<telegram_api::keyboardButtonBuy>(keyboard_button.text);
|
return make_tl_object<telegram_api::keyboardButtonBuy>(keyboard_button.text);
|
||||||
case InlineKeyboardButton::Type::UrlAuth: {
|
case InlineKeyboardButton::Type::UrlAuth: {
|
||||||
@ -978,11 +1050,21 @@ static tl_object_ptr<td_api::inlineKeyboardButton> get_inline_keyboard_button_ob
|
|||||||
case InlineKeyboardButton::Type::CallbackGame:
|
case InlineKeyboardButton::Type::CallbackGame:
|
||||||
type = make_tl_object<td_api::inlineKeyboardButtonTypeCallbackGame>();
|
type = make_tl_object<td_api::inlineKeyboardButtonTypeCallbackGame>();
|
||||||
break;
|
break;
|
||||||
case InlineKeyboardButton::Type::SwitchInline:
|
case InlineKeyboardButton::Type::SwitchInline: {
|
||||||
type = make_tl_object<td_api::inlineKeyboardButtonTypeSwitchInline>(keyboard_button.data, false);
|
auto mask = keyboard_button.id;
|
||||||
|
if (mask == 0) {
|
||||||
|
mask = InlineKeyboardButton::FULL_MASK;
|
||||||
|
}
|
||||||
|
type = make_tl_object<td_api::inlineKeyboardButtonTypeSwitchInline>(
|
||||||
|
keyboard_button.data,
|
||||||
|
td_api::make_object<td_api::targetChatChosen>(
|
||||||
|
(mask & InlineKeyboardButton::USERS_MASK) != 0, (mask & InlineKeyboardButton::BOTS_MASK) != 0,
|
||||||
|
(mask & InlineKeyboardButton::CHATS_MASK) != 0, (mask & InlineKeyboardButton::BROADCASTS_MASK) != 0));
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case InlineKeyboardButton::Type::SwitchInlineCurrentDialog:
|
case InlineKeyboardButton::Type::SwitchInlineCurrentDialog:
|
||||||
type = make_tl_object<td_api::inlineKeyboardButtonTypeSwitchInline>(keyboard_button.data, true);
|
type = make_tl_object<td_api::inlineKeyboardButtonTypeSwitchInline>(
|
||||||
|
keyboard_button.data, td_api::make_object<td_api::targetChatCurrent>());
|
||||||
break;
|
break;
|
||||||
case InlineKeyboardButton::Type::Buy:
|
case InlineKeyboardButton::Type::Buy:
|
||||||
type = make_tl_object<td_api::inlineKeyboardButtonTypeBuy>();
|
type = make_tl_object<td_api::inlineKeyboardButtonTypeBuy>();
|
||||||
|
@ -53,8 +53,16 @@ struct InlineKeyboardButton {
|
|||||||
User,
|
User,
|
||||||
WebView
|
WebView
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static constexpr int64 USERS_MASK = 1;
|
||||||
|
static constexpr int64 BOTS_MASK = 2;
|
||||||
|
static constexpr int64 CHATS_MASK = 4;
|
||||||
|
static constexpr int64 BROADCASTS_MASK = 8;
|
||||||
|
static constexpr int64 FULL_MASK = USERS_MASK | BOTS_MASK | CHATS_MASK | BROADCASTS_MASK;
|
||||||
|
|
||||||
Type type;
|
Type type;
|
||||||
int64 id = 0; // UrlAuth only, button_id or (2 * request_write_access - 1) * bot_user_id
|
int64 id = 0; // UrlAuth: button_id or (2 * request_write_access - 1) * bot_user_id
|
||||||
|
// SwitchInline: mask of allowed target chats; 0 if any
|
||||||
UserId user_id; // User only
|
UserId user_id; // User only
|
||||||
string text;
|
string text;
|
||||||
string forward_text; // UrlAuth only
|
string forward_text; // UrlAuth only
|
||||||
|
Loading…
Reference in New Issue
Block a user