Update layer 109. Add keyboardButtonTypeRequestPoll.

GitOrigin-RevId: eae6bb600cef6eb4d9386c4dc2a762d065b1fa09
This commit is contained in:
levlam 2020-01-14 20:18:35 +03:00
parent f3130ea7fb
commit fa31f168b5
7 changed files with 73 additions and 6 deletions

View File

@ -735,6 +735,9 @@ keyboardButtonTypeRequestPhoneNumber = KeyboardButtonType;
//@description A button that sends the user's location when pressed; available only in private chats
keyboardButtonTypeRequestLocation = KeyboardButtonType;
//@description A button that allows the user to create and send a poll when pressed; available only in private chats @force_regular If true, only regular polls should be allowed to create @force_quiz If true, only quiz mode polls should be allowed to create
keyboardButtonTypeRequestPoll force_regular:Bool force_quiz:Bool = KeyboardButtonType;
//@description Represents a single button in a bot keyboard @text Text of the button @type Type of the button
keyboardButton text:string type:KeyboardButtonType = KeyboardButton;
@ -1562,7 +1565,7 @@ inputMessageGame bot_user_id:int32 game_short_name:string = InputMessageContent;
//@payload The invoice payload @provider_token Payment provider token @provider_data JSON-encoded data about the invoice, which will be shared with the payment provider @start_parameter Unique invoice bot start_parameter for the generation of this invoice
inputMessageInvoice invoice:invoice title:string description:string photo_url:string photo_size:int32 photo_width:int32 photo_height:int32 payload:bytes provider_token:string provider_data:string start_parameter:string = InputMessageContent;
//@description A message with a poll. Polls can't be sent to secret chats. Polls can be sent to private chats only by bots @question Poll question, 1-255 characters @options List of poll answer options, 2-10 strings 1-100 characters each
//@description A message with a poll. Polls can't be sent to secret chats. Polls can be sent to private chats if this is a private chat with self or with a bot only @question Poll question, 1-255 characters @options List of poll answer options, 2-10 strings 1-100 characters each
//@is_anonymous True, if the poll voters are anonymous. Non-anonymous polls can't be sent or forwarded to channels @type Type of the poll
inputMessagePoll question:string options:vector<string> is_anonymous:Bool type:PollType = InputMessageContent;

Binary file not shown.

View File

@ -534,6 +534,7 @@ keyboardButtonGame#50f41ccf text:string = KeyboardButton;
keyboardButtonBuy#afd93fbb text:string = KeyboardButton;
keyboardButtonUrlAuth#10b78d29 flags:# text:string fwd_text:flags.0?string url:string button_id:int = KeyboardButton;
inputKeyboardButtonUrlAuth#d02e7fd4 flags:# request_write_access:flags.0?true text:string fwd_text:flags.1?string url:string bot:InputUser = KeyboardButton;
keyboardButtonRequestPoll#bbc7515d flags:# quiz:flags.0?Bool text:string = KeyboardButton;
keyboardButtonRow#77608b83 buttons:Vector<KeyboardButton> = KeyboardButtonRow;

Binary file not shown.

View File

@ -17785,8 +17785,9 @@ Status MessagesManager::can_send_message_content(DialogId dialog_id, const Messa
auto content_type = content->get_type();
switch (dialog_type) {
case DialogType::User:
if (content_type == MessageContentType::Poll && !is_forward && !td_->auth_manager_->is_bot() && !is_via_bot) {
return Status::Error(400, "Polls can't be sent to private chats");
if (content_type == MessageContentType::Poll && !is_forward && !td_->auth_manager_->is_bot() && !is_via_bot &&
!td_->contacts_manager_->is_user_bot(dialog_id.get_user_id()) && dialog_id != get_my_dialog_id()) {
return Status::Error(400, "Polls can't be sent to the private chat");
}
break;
case DialogType::Chat:

View File

@ -41,6 +41,15 @@ static StringBuilder &operator<<(StringBuilder &string_builder, const KeyboardBu
case KeyboardButton::Type::RequestLocation:
string_builder << "RequestLocation";
break;
case KeyboardButton::Type::RequestPoll:
string_builder << "RequestPoll";
break;
case KeyboardButton::Type::RequestPollQuiz:
string_builder << "RequestPollQuiz";
break;
case KeyboardButton::Type::RequestPollRegular:
string_builder << "RequestPollRegular";
break;
default:
UNREACHABLE();
}
@ -175,6 +184,20 @@ static KeyboardButton get_keyboard_button(tl_object_ptr<telegram_api::KeyboardBu
button.text = std::move(keyboard_button->text_);
break;
}
case telegram_api::keyboardButtonRequestPoll::ID: {
auto keyboard_button = move_tl_object_as<telegram_api::keyboardButtonRequestPoll>(keyboard_button_ptr);
if (keyboard_button->flags_ & telegram_api::keyboardButtonRequestPoll::QUIZ_MASK) {
if (keyboard_button->quiz_) {
button.type = KeyboardButton::Type::RequestPollQuiz;
} else {
button.type = KeyboardButton::Type::RequestPollRegular;
}
} else {
button.type = KeyboardButton::Type::RequestPoll;
}
button.text = std::move(keyboard_button->text_);
break;
}
default:
LOG(ERROR) << "Unsupported keyboard button: " << to_string(keyboard_button_ptr);
}
@ -346,16 +369,33 @@ static Result<KeyboardButton> get_keyboard_button(tl_object_ptr<td_api::keyboard
break;
case td_api::keyboardButtonTypeRequestPhoneNumber::ID:
if (!request_buttons_allowed) {
return Status::Error(400, "Phone number can be requested in a private chats only");
return Status::Error(400, "Phone number can be requested in private chats only");
}
current_button.type = KeyboardButton::Type::RequestPhoneNumber;
break;
case td_api::keyboardButtonTypeRequestLocation::ID:
if (!request_buttons_allowed) {
return Status::Error(400, "Location can be requested in a private chats only");
return Status::Error(400, "Location can be requested in private chats only");
}
current_button.type = KeyboardButton::Type::RequestLocation;
break;
case td_api::keyboardButtonTypeRequestPoll::ID: {
if (!request_buttons_allowed) {
return Status::Error(400, "Poll can be requested in private chats only");
}
auto *request_poll = static_cast<const td_api::keyboardButtonTypeRequestPoll *>(button->type_.get());
if (request_poll->force_quiz_ && request_poll->force_regular_) {
return Status::Error(400, "Can't force quiz mode and regular poll simultaneously");
}
if (request_poll->force_quiz_) {
current_button.type = KeyboardButton::Type::RequestPollQuiz;
} else if (request_poll->force_regular_) {
current_button.type = KeyboardButton::Type::RequestPollRegular;
} else {
current_button.type = KeyboardButton::Type::RequestPoll;
}
break;
}
default:
UNREACHABLE();
}
@ -560,6 +600,12 @@ static tl_object_ptr<telegram_api::KeyboardButton> get_keyboard_button(const Key
return make_tl_object<telegram_api::keyboardButtonRequestPhone>(keyboard_button.text);
case KeyboardButton::Type::RequestLocation:
return make_tl_object<telegram_api::keyboardButtonRequestGeoLocation>(keyboard_button.text);
case KeyboardButton::Type::RequestPoll:
return make_tl_object<telegram_api::keyboardButtonRequestPoll>(0, false, keyboard_button.text);
case KeyboardButton::Type::RequestPollQuiz:
return make_tl_object<telegram_api::keyboardButtonRequestPoll>(1, true, keyboard_button.text);
case KeyboardButton::Type::RequestPollRegular:
return make_tl_object<telegram_api::keyboardButtonRequestPoll>(1, false, keyboard_button.text);
default:
UNREACHABLE();
return nullptr;
@ -674,6 +720,15 @@ static tl_object_ptr<td_api::keyboardButton> get_keyboard_button_object(const Ke
case KeyboardButton::Type::RequestLocation:
type = make_tl_object<td_api::keyboardButtonTypeRequestLocation>();
break;
case KeyboardButton::Type::RequestPoll:
type = make_tl_object<td_api::keyboardButtonTypeRequestPoll>(false, false);
break;
case KeyboardButton::Type::RequestPollQuiz:
type = make_tl_object<td_api::keyboardButtonTypeRequestPoll>(false, true);
break;
case KeyboardButton::Type::RequestPollRegular:
type = make_tl_object<td_api::keyboardButtonTypeRequestPoll>(true, false);
break;
default:
UNREACHABLE();
return nullptr;

View File

@ -17,7 +17,14 @@ namespace td {
struct KeyboardButton {
// append only
enum class Type : int32 { Text, RequestPhoneNumber, RequestLocation };
enum class Type : int32 {
Text,
RequestPhoneNumber,
RequestLocation,
RequestPoll,
RequestPollQuiz,
RequestPollRegular
};
Type type;
string text;
};