Update API scheme to layer 168. Giveaways.
This commit is contained in:
		
							parent
							
								
									f5b59c9456
								
							
						
					
					
						commit
						e135f8954f
					
				
					 10 changed files with 258 additions and 58 deletions
				
			
		|  | @ -2170,6 +2170,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | |||
| "lng_giveaway_maximum_users_error#other" = "You can select maximum {count} users."; | ||||
| "lng_giveaway_channels_confirm_title" = "Channel is Private"; | ||||
| "lng_giveaway_channels_confirm_about" = "Are you sure you want to add a private channel? Users won't be able to join it without an invite link."; | ||||
| "lng_giveaway_additional_prizes" = "Additional prizes"; | ||||
| "lng_giveaway_additional_about" = "Turn this on if you want to give the winners your own prizes in addition to Premium subscriptions."; | ||||
| "lng_giveaway_additional_prizes_ph" = "Enter your prize"; | ||||
| "lng_giveaway_prizes_just_premium#one" = "All prizes: **{count}** Telegram Premium subscription {duration}."; | ||||
| "lng_giveaway_prizes_just_premium#other" = "All prizes: **{count}** Telegram Premium subscriptions {duration}."; | ||||
| "lng_giveaway_prizes_additional#one" = "All prizes: **{count}** {prize} with Telegram Premium subscription {duration}."; | ||||
| "lng_giveaway_prizes_additional#other" = "All prizes: **{count}** {prize} with Telegram Premium subscriptions {duration}."; | ||||
| "lng_giveaway_show_winners" = "Show winners"; | ||||
| "lng_giveaway_show_winners_about" = "Choose whether to make the list of winners public when the giveaway ends."; | ||||
| 
 | ||||
| "lng_giveaway_created_title" = "Giveaway created"; | ||||
| "lng_giveaway_created_body" = "Check your channels' {link} to see how this giveaway boosted your channel."; | ||||
|  |  | |||
|  | @ -420,6 +420,8 @@ const std::vector<int> &PremiumGiftCodeOptions::availablePresets() const { | |||
| } | ||||
| 
 | ||||
| [[nodiscard]] int PremiumGiftCodeOptions::monthsFromPreset(int monthsIndex) { | ||||
| 	Expects(monthsIndex >= 0 && monthsIndex < _availablePresets.size()); | ||||
| 
 | ||||
| 	return _optionsForOnePerson.months[monthsIndex]; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -221,11 +221,11 @@ void ApiWrap::setupSupportMode() { | |||
| void ApiWrap::requestChangelog( | ||||
| 		const QString &sinceVersion, | ||||
| 		Fn<void(const MTPUpdates &result)> callback) { | ||||
| 	request(MTPhelp_GetAppChangelog( | ||||
| 		MTP_string(sinceVersion) | ||||
| 	)).done( | ||||
| 		callback | ||||
| 	).send(); | ||||
| 	//request(MTPhelp_GetAppChangelog(
 | ||||
| 	//	MTP_string(sinceVersion)
 | ||||
| 	//)).done(
 | ||||
| 	//	callback
 | ||||
| 	//).send();
 | ||||
| } | ||||
| 
 | ||||
| void ApiWrap::refreshTopPromotion() { | ||||
|  |  | |||
|  | @ -37,6 +37,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | |||
| #include "ui/toast/toast.h" | ||||
| #include "ui/widgets/checkbox.h" | ||||
| #include "ui/widgets/continuous_sliders.h" | ||||
| #include "ui/widgets/fields/input_field.h" | ||||
| #include "ui/widgets/labels.h" | ||||
| #include "ui/wrap/slide_wrap.h" | ||||
| #include "styles/style_giveaway.h" | ||||
|  | @ -48,6 +49,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | |||
| namespace { | ||||
| 
 | ||||
| constexpr auto kDoneTooltipDuration = 5 * crl::time(1000); | ||||
| constexpr auto kAdditionalPrizeLengthMax = 128; | ||||
| 
 | ||||
| [[nodiscard]] QDateTime ThreeDaysAfterToday() { | ||||
| 	auto dateNow = QDateTime::currentDateTime(); | ||||
|  | @ -257,6 +259,10 @@ void CreateGiveawayBox( | |||
| 		rpl::variable<TimeId> dateValue; | ||||
| 		rpl::variable<std::vector<QString>> countriesValue; | ||||
| 
 | ||||
| 		rpl::variable<QString> additionalPrize; | ||||
| 		rpl::variable<int> chosenMonths; | ||||
| 		rpl::variable<bool> showWinners; | ||||
| 
 | ||||
| 		rpl::variable<bool> confirmButtonBusy = true; | ||||
| 	}; | ||||
| 	const auto state = box->lifetime().make_state<State>(peer); | ||||
|  | @ -669,6 +675,182 @@ void CreateGiveawayBox( | |||
| 		c->add(std::move(terms)); | ||||
| 	}; | ||||
| 
 | ||||
| 	const auto durationGroup = std::make_shared<Ui::RadiobuttonGroup>(0); | ||||
| 	durationGroup->setChangedCallback([=](int value) { | ||||
| 		state->chosenMonths = state->apiOptions.monthsFromPreset(value); | ||||
| 	}); | ||||
| 	const auto listOptionsRandom = randomWrap->entity()->add( | ||||
| 		object_ptr<Ui::VerticalLayout>(box)); | ||||
| 	const auto listOptionsSpecific = contentWrap->entity()->add( | ||||
| 		object_ptr<Ui::VerticalLayout>(box)); | ||||
| 	const auto rebuildListOptions = [=](GiveawayType type, int usersCount) { | ||||
| 		if (prepaid) { | ||||
| 			return; | ||||
| 		} | ||||
| 		while (listOptionsRandom->count()) { | ||||
| 			delete listOptionsRandom->widgetAt(0); | ||||
| 		} | ||||
| 		while (listOptionsSpecific->count()) { | ||||
| 			delete listOptionsSpecific->widgetAt(0); | ||||
| 		} | ||||
| 		const auto listOptions = (type == GiveawayType::SpecificUsers) | ||||
| 			? listOptionsSpecific | ||||
| 			: listOptionsRandom; | ||||
| 		Ui::AddSubsectionTitle( | ||||
| 			listOptions, | ||||
| 			tr::lng_giveaway_duration_title( | ||||
| 				lt_count, | ||||
| 				rpl::single(usersCount) | tr::to_count()), | ||||
| 			st::giveawayGiftCodeChannelsSubsectionPadding); | ||||
| 		Ui::Premium::AddGiftOptions( | ||||
| 			listOptions, | ||||
| 			durationGroup, | ||||
| 			state->apiOptions.options(usersCount), | ||||
| 			st::giveawayGiftCodeGiftOption, | ||||
| 			true); | ||||
| 
 | ||||
| 		Ui::AddSkip(listOptions); | ||||
| 
 | ||||
| 		auto termsContainer = object_ptr<Ui::VerticalLayout>(listOptions); | ||||
| 		addTerms(termsContainer.data()); | ||||
| 		listOptions->add(object_ptr<Ui::DividerLabel>( | ||||
| 			listOptions, | ||||
| 			std::move(termsContainer), | ||||
| 			st::defaultBoxDividerLabelPadding)); | ||||
| 
 | ||||
| 		Ui::AddSkip(listOptions); | ||||
| 
 | ||||
| 		box->verticalLayout()->resizeToWidth(box->width()); | ||||
| 	}; | ||||
| 	if (!prepaid) { | ||||
| 		rpl::combine( | ||||
| 			state->sliderValue.value(), | ||||
| 			state->typeValue.value() | ||||
| 		) | rpl::start_with_next([=](int users, GiveawayType type) { | ||||
| 			typeGroup->setValue(type); | ||||
| 			rebuildListOptions(type, (type == GiveawayType::SpecificUsers) | ||||
| 				? state->selectedToAward.size() | ||||
| 				: users); | ||||
| 		}, box->lifetime()); | ||||
| 	} else { | ||||
| 		typeGroup->setValue(GiveawayType::Random); | ||||
| 	} | ||||
| 
 | ||||
| 	{ | ||||
| 		const auto additionalWrap = randomWrap->entity()->add( | ||||
| 			object_ptr<Ui::VerticalLayout>(randomWrap)); | ||||
| 		const auto additionalToggle = additionalWrap->add( | ||||
| 			object_ptr<Ui::SettingsButton>( | ||||
| 				additionalWrap, | ||||
| 				tr::lng_giveaway_additional_prizes(), | ||||
| 				st::defaultSettingsButton)); | ||||
| 		const auto additionalInner = additionalWrap->add( | ||||
| 			object_ptr<Ui::SlideWrap<Ui::InputField>>( | ||||
| 				additionalWrap, | ||||
| 				object_ptr<Ui::InputField>( | ||||
| 					additionalWrap, | ||||
| 					st::giveawayGiftCodeAdditionalField, | ||||
| 					Ui::InputField::Mode::SingleLine, | ||||
| 					tr::lng_giveaway_additional_prizes_ph()), | ||||
| 				st::giveawayGiftCodeAdditionalPaddingMin)); | ||||
| 		const auto additionalPadded = additionalInner->wrapped(); | ||||
| 		const auto additional = additionalInner->entity(); | ||||
| 		additionalInner->hide(anim::type::instant); | ||||
| 		additional->setMaxLength(kAdditionalPrizeLengthMax); | ||||
| 		const auto fillAdditionalPrizeValue = [=] { | ||||
| 			state->additionalPrize = additional->getLastText().trimmed(); | ||||
| 		}; | ||||
| 		additionalToggle->toggleOn(rpl::single(false))->toggledChanges( | ||||
| 		) | rpl::start_with_next([=](bool toggled) { | ||||
| 			if (!toggled && Ui::InFocusChain(additional)) { | ||||
| 				additionalWrap->setFocus(); | ||||
| 				state->additionalPrize = QString(); | ||||
| 			} | ||||
| 			additionalInner->toggle(toggled, anim::type::normal); | ||||
| 			if (toggled) { | ||||
| 				additional->setFocusFast(); | ||||
| 				fillAdditionalPrizeValue(); | ||||
| 			} | ||||
| 		}, additionalInner->lifetime()); | ||||
| 		additionalInner->finishAnimating(); | ||||
| 
 | ||||
| 		additional->changes() | rpl::filter([=] { | ||||
| 			return additionalInner->toggled(); | ||||
| 		}) | rpl::start_with_next( | ||||
| 			fillAdditionalPrizeValue, | ||||
| 			additional->lifetime()); | ||||
| 
 | ||||
| 		Ui::AddSkip(additionalWrap); | ||||
| 
 | ||||
| 		auto monthsValue = prepaid | ||||
| 			? (rpl::single(prepaid->months) | rpl::type_erased()) | ||||
| 			: state->chosenMonths.value(); | ||||
| 		const auto usersCountByType = [=](GiveawayType type) { | ||||
| 			if (type != GiveawayType::SpecificUsers) { | ||||
| 				return state->sliderValue.value() | rpl::type_erased(); | ||||
| 			} | ||||
| 			return state->toAwardAmountChanged.events_starting_with_copy( | ||||
| 				rpl::empty | ||||
| 			) | rpl::map([=] { | ||||
| 				return int(state->selectedToAward.size()); | ||||
| 			}) | rpl::type_erased(); | ||||
| 		}; | ||||
| 		auto usersCountValue = prepaid | ||||
| 			? (rpl::single(prepaid->quantity) | rpl::type_erased()) | ||||
| 			: state->typeValue.value( | ||||
| 			) | rpl::map(usersCountByType) | rpl::flatten_latest(); | ||||
| 
 | ||||
| 		const auto additionalLabel = Ui::CreateChild<Ui::FlatLabel>( | ||||
| 			additionalInner, | ||||
| 			rpl::duplicate(usersCountValue) | rpl::map([](int count) { | ||||
| 				return QString::number(count); | ||||
| 			}), | ||||
| 			st::giveawayGiftCodeAdditionalLabel); | ||||
| 		additionalLabel->widthValue() | rpl::start_with_next([=](int width) { | ||||
| 			const auto min = st::giveawayGiftCodeAdditionalPaddingMin; | ||||
| 			const auto skip = st::giveawayGiftCodeAdditionalLabelSkip; | ||||
| 			const auto added = std::max(width + skip - min.left(), 0); | ||||
| 			const auto &field = st::giveawayGiftCodeAdditionalField; | ||||
| 			const auto top = field.textMargins.top(); | ||||
| 			additionalLabel->moveToLeft(min.right(), min.top() + top); | ||||
| 			additionalPadded->setPadding(min + QMargins(added, 0, 0, 0)); | ||||
| 		}, additionalLabel->lifetime()); | ||||
| 
 | ||||
| 		auto additionalAbout = rpl::combine( | ||||
| 			state->additionalPrize.value(), | ||||
| 			std::move(monthsValue), | ||||
| 			std::move(usersCountValue) | ||||
| 		) | rpl::map([=](QString prize, int months, int users) { | ||||
| 			const auto duration = ((months >= 12) | ||||
| 				? tr::lng_premium_gift_duration_years | ||||
| 				: tr::lng_premium_gift_duration_months)( | ||||
| 					tr::now, | ||||
| 					lt_count, | ||||
| 					(months >= 12) ? (months / 12) : months); | ||||
| 			if (prize.isEmpty()) { | ||||
| 				return tr::lng_giveaway_prizes_just_premium( | ||||
| 					tr::now, | ||||
| 					lt_count, | ||||
| 					users, | ||||
| 					lt_duration, | ||||
| 					TextWithEntities{ duration }, | ||||
| 					Ui::Text::RichLangValue); | ||||
| 			} | ||||
| 			return tr::lng_giveaway_prizes_additional( | ||||
| 				tr::now, | ||||
| 				lt_count, | ||||
| 				users, | ||||
| 				lt_prize, | ||||
| 				TextWithEntities{ prize }, | ||||
| 				lt_duration, | ||||
| 				TextWithEntities{ duration }, | ||||
| 				Ui::Text::RichLangValue); | ||||
| 		}); | ||||
| 
 | ||||
| 		Ui::AddDividerText(additionalWrap, std::move(additionalAbout)); | ||||
| 		Ui::AddSkip(additionalWrap); | ||||
| 	} | ||||
| 
 | ||||
| 	{ | ||||
| 		const auto dateContainer = randomWrap->entity()->add( | ||||
| 			object_ptr<Ui::VerticalLayout>(randomWrap)); | ||||
|  | @ -699,7 +881,7 @@ void CreateGiveawayBox( | |||
| 					.time = state->dateValue.current(), | ||||
| 					.max = [=] { | ||||
| 						return QDateTime::currentSecsSinceEpoch() | ||||
| 							+ state->apiOptions.giveawayPeriodMax();; | ||||
| 							+ state->apiOptions.giveawayPeriodMax(); | ||||
| 					}, | ||||
| 				}); | ||||
| 			})); | ||||
|  | @ -721,6 +903,7 @@ void CreateGiveawayBox( | |||
| 				dateContainer, | ||||
| 				std::move(terms), | ||||
| 				st::defaultBoxDividerLabelPadding)); | ||||
| 			Ui::AddSkip(dateContainer); | ||||
| 		} else { | ||||
| 			Ui::AddDividerText( | ||||
| 				dateContainer, | ||||
|  | @ -731,53 +914,24 @@ void CreateGiveawayBox( | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	const auto durationGroup = std::make_shared<Ui::RadiobuttonGroup>(0); | ||||
| 	const auto listOptions = contentWrap->entity()->add( | ||||
| 		object_ptr<Ui::VerticalLayout>(box)); | ||||
| 	const auto rebuildListOptions = [=](int amountUsers) { | ||||
| 		if (prepaid) { | ||||
| 			return; | ||||
| 		} | ||||
| 		while (listOptions->count()) { | ||||
| 			delete listOptions->widgetAt(0); | ||||
| 		} | ||||
| 		Ui::AddSubsectionTitle( | ||||
| 			listOptions, | ||||
| 			tr::lng_giveaway_duration_title( | ||||
| 				lt_count, | ||||
| 				rpl::single(amountUsers) | tr::to_count()), | ||||
| 			st::giveawayGiftCodeChannelsSubsectionPadding); | ||||
| 		Ui::Premium::AddGiftOptions( | ||||
| 			listOptions, | ||||
| 			durationGroup, | ||||
| 			state->apiOptions.options(amountUsers), | ||||
| 			st::giveawayGiftCodeGiftOption, | ||||
| 			true); | ||||
| 	{ | ||||
| 		const auto winnersWrap = randomWrap->entity()->add( | ||||
| 			object_ptr<Ui::VerticalLayout>(randomWrap)); | ||||
| 		const auto winnersToggle = winnersWrap->add( | ||||
| 			object_ptr<Ui::SettingsButton>( | ||||
| 				winnersWrap, | ||||
| 				tr::lng_giveaway_show_winners(), | ||||
| 				st::defaultSettingsButton)); | ||||
| 		state->showWinners = winnersToggle->toggleOn( | ||||
| 			rpl::single(false) | ||||
| 		)->toggledValue(); | ||||
| 		Ui::AddSkip(winnersWrap); | ||||
| 
 | ||||
| 		Ui::AddSkip(listOptions); | ||||
| 
 | ||||
| 		auto termsContainer = object_ptr<Ui::VerticalLayout>(listOptions); | ||||
| 		addTerms(termsContainer.data()); | ||||
| 		listOptions->add(object_ptr<Ui::DividerLabel>( | ||||
| 			listOptions, | ||||
| 			std::move(termsContainer), | ||||
| 			st::defaultBoxDividerLabelPadding)); | ||||
| 
 | ||||
| 		box->verticalLayout()->resizeToWidth(box->width()); | ||||
| 	}; | ||||
| 	if (!prepaid) { | ||||
| 		rpl::combine( | ||||
| 			state->sliderValue.value(), | ||||
| 			state->typeValue.value() | ||||
| 		) | rpl::start_with_next([=](int users, GiveawayType type) { | ||||
| 			typeGroup->setValue(type); | ||||
| 			rebuildListOptions((type == GiveawayType::SpecificUsers) | ||||
| 				? state->selectedToAward.size() | ||||
| 				: users); | ||||
| 		}, box->lifetime()); | ||||
| 	} else { | ||||
| 		typeGroup->setValue(GiveawayType::Random); | ||||
| 		Ui::AddDividerText( | ||||
| 			winnersWrap, | ||||
| 			tr::lng_giveaway_show_winners_about()); | ||||
| 	} | ||||
| 
 | ||||
| 	{ | ||||
| 		using namespace Info::Statistics; | ||||
| 		const auto &stButton = st::startGiveawayBox; | ||||
|  | @ -862,9 +1016,11 @@ void CreateGiveawayBox( | |||
| 						return not_null{ p->asChannel() }; | ||||
| 					}) | ranges::to_vector, | ||||
| 					.countries = state->countriesValue.current(), | ||||
| 					.additionalPrize = state->additionalPrize.current(), | ||||
| 					.untilDate = state->dateValue.current(), | ||||
| 					.onlyNewSubscribers = (membersGroup->value() | ||||
| 						== GiveawayType::OnlyNewMembers), | ||||
| 					.showWinners = state->showWinners.current(), | ||||
| 				}; | ||||
| 			} | ||||
| 			state->confirmButtonBusy = true; | ||||
|  | @ -960,7 +1116,10 @@ void CreateGiveawayBox( | |||
| 			loading->toggle(false, anim::type::instant); | ||||
| 			state->confirmButtonBusy = false; | ||||
| 			fillSliderContainer(); | ||||
| 			rebuildListOptions(1); | ||||
| 			if (!prepaid) { | ||||
| 				state->chosenMonths = state->apiOptions.monthsFromPreset(0); | ||||
| 			} | ||||
| 			rebuildListOptions(state->typeValue.current(), 1); | ||||
| 			contentWrap->toggle(true, anim::type::instant); | ||||
| 			contentWrap->resizeToWidth(box->width()); | ||||
| 		}; | ||||
|  |  | |||
|  | @ -121,6 +121,13 @@ giveawayGiftCodeTypeDividerPadding: margins(0px, 7px, 0px, 5px); | |||
| giveawayGiftCodeSliderPadding: margins(0px, 24px, 0px, 10px); | ||||
| giveawayGiftCodeSliderFloatSkip: 6px; | ||||
| giveawayGiftCodeChannelsSubsectionPadding: margins(0px, -1px, 0px, -4px); | ||||
| giveawayGiftCodeAdditionalPaddingMin: margins(50px, 4px, 22px, 0px); | ||||
| giveawayGiftCodeAdditionalField: InputField(defaultMultiSelectSearchField) { | ||||
| } | ||||
| giveawayGiftCodeAdditionalLabel: FlatLabel(defaultFlatLabel) { | ||||
| 	style: semiboldTextStyle; | ||||
| } | ||||
| giveawayGiftCodeAdditionalLabelSkip: 12px; | ||||
| 
 | ||||
| giveawayGiftCodeChannelsPeerList: PeerList(boostsListBox) { | ||||
| 	padding: margins(0px, 7px, 0px, 0px); | ||||
|  |  | |||
|  | @ -131,7 +131,7 @@ messageMediaGeoLive#b940c666 flags:# geo:GeoPoint heading:flags.0?int period:int | |||
| messageMediaPoll#4bd6e798 poll:Poll results:PollResults = MessageMedia; | ||||
| messageMediaDice#3f7ee58b value:int emoticon:string = MessageMedia; | ||||
| messageMediaStory#68cb6283 flags:# via_mention:flags.1?true peer:Peer id:int story:flags.0?StoryItem = MessageMedia; | ||||
| messageMediaGiveaway#58260664 flags:# only_new_subscribers:flags.0?true channels:Vector<long> countries_iso2:flags.1?Vector<string> quantity:int months:int until_date:int = MessageMedia; | ||||
| messageMediaGiveaway#daad85b0 flags:# only_new_subscribers:flags.0?true winners_are_visible:flags.2?true channels:Vector<long> countries_iso2:flags.1?Vector<string> prize_description:flags.3?string quantity:int months:int until_date:int = MessageMedia; | ||||
| 
 | ||||
| messageActionEmpty#b6aef7b0 = MessageAction; | ||||
| messageActionChatCreate#bd47cbad title:string users:Vector<long> = MessageAction; | ||||
|  | @ -1426,7 +1426,7 @@ help.premiumPromo#5334759c status_text:string status_entities:Vector<MessageEnti | |||
| inputStorePaymentPremiumSubscription#a6751e66 flags:# restore:flags.0?true upgrade:flags.1?true = InputStorePaymentPurpose; | ||||
| inputStorePaymentGiftPremium#616f7fe8 user_id:InputUser currency:string amount:long = InputStorePaymentPurpose; | ||||
| inputStorePaymentPremiumGiftCode#a3805f3f flags:# users:Vector<InputUser> boost_peer:flags.0?InputPeer currency:string amount:long = InputStorePaymentPurpose; | ||||
| inputStorePaymentPremiumGiveaway#7c9375e6 flags:# only_new_subscribers:flags.0?true boost_peer:InputPeer additional_peers:flags.1?Vector<InputPeer> countries_iso2:flags.2?Vector<string> random_id:long until_date:int currency:string amount:long = InputStorePaymentPurpose; | ||||
| inputStorePaymentPremiumGiveaway#160544ca flags:# only_new_subscribers:flags.0?true winners_are_visible:flags.3?true boost_peer:InputPeer additional_peers:flags.1?Vector<InputPeer> countries_iso2:flags.2?Vector<string> prize_description:flags.4?string random_id:long until_date:int currency:string amount:long = InputStorePaymentPurpose; | ||||
| 
 | ||||
| premiumGiftOption#74c34319 flags:# months:int currency:string amount:long bot_url:string store_product:flags.0?string = PremiumGiftOption; | ||||
| 
 | ||||
|  | @ -1583,7 +1583,7 @@ premiumGiftCodeOption#257e962b flags:# users:int months:int store_product:flags. | |||
| payments.checkedGiftCode#b722f158 flags:# via_giveaway:flags.2?true from_id:Peer giveaway_msg_id:flags.3?int to_id:flags.0?long date:int months:int used_date:flags.1?int chats:Vector<Chat> users:Vector<User> = payments.CheckedGiftCode; | ||||
| 
 | ||||
| payments.giveawayInfo#4367daa0 flags:# participating:flags.0?true preparing_results:flags.3?true start_date:int joined_too_early_date:flags.1?int admin_disallowed_chat_id:flags.2?long disallowed_country:flags.4?string = payments.GiveawayInfo; | ||||
| payments.giveawayInfoResults#cd5570 flags:# winner:flags.0?true refunded:flags.1?true start_date:int gift_code_slug:flags.0?string finish_date:int winners_count:int activated_count:int = payments.GiveawayInfo; | ||||
| payments.giveawayInfoResults#8ac7e167 flags:# winner:flags.0?true refunded:flags.1?true start_date:int gift_code_slug:flags.0?string finish_date:int winners_count:int activated_count:int winners:flags.2?Vector<User> = payments.GiveawayInfo; | ||||
| 
 | ||||
| prepaidGiveaway#b2539d54 id:long months:int quantity:int date:int = PrepaidGiveaway; | ||||
| 
 | ||||
|  | @ -1619,6 +1619,10 @@ help.peerColorOption#135bd42f flags:# hidden:flags.0?true color_id:int colors:fl | |||
| help.peerColorsNotModified#2ba1f5ce = help.PeerColors; | ||||
| help.peerColors#f8ed08 hash:int colors:Vector<help.PeerColorOption> = help.PeerColors; | ||||
| 
 | ||||
| storyPeerReaction#7decc433 peer_id:Peer date:int reaction:Reaction = StoryPeerReaction; | ||||
| 
 | ||||
| stories.storyReactionsList#d86c162a flags:# count:int reactions:Vector<StoryPeerReaction> chats:Vector<Chat> users:Vector<User> next_offset:flags.0?string = stories.StoryReactionsList; | ||||
| 
 | ||||
| ---functions--- | ||||
| 
 | ||||
| invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; | ||||
|  | @ -1986,7 +1990,6 @@ help.getNearestDc#1fb33026 = NearestDc; | |||
| help.getAppUpdate#522d5a7d source:string = help.AppUpdate; | ||||
| help.getInviteText#4d392343 = help.InviteText; | ||||
| help.getSupport#9cdf08cd = help.Support; | ||||
| help.getAppChangelog#9010ef6f prev_app_version:string = Updates; | ||||
| help.setBotUpdatesStatus#ec22cfcd pending_updates_count:int message:string = Bool; | ||||
| help.getCdnConfig#52029342 = CdnConfig; | ||||
| help.getRecentMeUrls#3dc0f114 referer:string = help.RecentMeUrls; | ||||
|  | @ -2195,6 +2198,7 @@ stories.getAllReadPeerStories#9b5ae7f9 = Updates; | |||
| stories.getPeerMaxIDs#535983c3 id:Vector<InputPeer> = Vector<int>; | ||||
| stories.getChatsToSend#a56a8b60 = messages.Chats; | ||||
| stories.togglePeerStoriesHidden#bd0415c4 peer:InputPeer hidden:Bool = Bool; | ||||
| stories.getStoryReactionsList#b9b2881f flags:# peer:InputPeer id:int reaction:flags.0?Reaction offset:flags.1?string limit:int = stories.StoryReactionsList; | ||||
| 
 | ||||
| premium.getBoostsList#60f67660 flags:# gifts:flags.0?true peer:InputPeer offset:string limit:int = premium.BoostsList; | ||||
| premium.getMyBoosts#be77b4a = premium.MyBoosts; | ||||
|  | @ -2202,4 +2206,4 @@ premium.applyBoost#6b7da746 flags:# slots:flags.0?Vector<int> peer:InputPeer = p | |||
| premium.getBoostsStatus#42f1f61 peer:InputPeer = premium.BoostsStatus; | ||||
| premium.getUserBoosts#39854d1f peer:InputPeer user_id:InputUser = premium.BoostsList; | ||||
| 
 | ||||
| // LAYER 167 | ||||
| // LAYER 168 | ||||
|  |  | |||
|  | @ -145,7 +145,13 @@ MTPinputStorePaymentPurpose InvoicePremiumGiftCodeGiveawayToTL( | |||
| 				: Flag::f_additional_peers) | ||||
| 			| (giveaway.countries.empty() | ||||
| 				? Flag() | ||||
| 				: Flag::f_countries_iso2)), | ||||
| 				: Flag::f_countries_iso2) | ||||
| 			| (giveaway.showWinners | ||||
| 				? Flag::f_winners_are_visible | ||||
| 				: Flag()) | ||||
| 			| (giveaway.additionalPrize.isEmpty() | ||||
| 				? Flag() | ||||
| 				: Flag::f_prize_description)), | ||||
| 		giveaway.boostPeer->input, | ||||
| 		MTP_vector_from_range(ranges::views::all( | ||||
| 			giveaway.additionalChannels | ||||
|  | @ -157,6 +163,7 @@ MTPinputStorePaymentPurpose InvoicePremiumGiftCodeGiveawayToTL( | |||
| 		) | ranges::views::transform([](QString value) { | ||||
| 			return MTP_string(value); | ||||
| 		})), | ||||
| 		MTP_string(giveaway.additionalPrize), | ||||
| 		MTP_long(invoice.randomId), | ||||
| 		MTP_int(giveaway.untilDate), | ||||
| 		MTP_string(invoice.currency), | ||||
|  |  | |||
|  | @ -190,8 +190,10 @@ struct InvoicePremiumGiftCodeGiveaway { | |||
| 	not_null<ChannelData*> boostPeer; | ||||
| 	std::vector<not_null<ChannelData*>> additionalChannels; | ||||
| 	std::vector<QString> countries; | ||||
| 	QString additionalPrize; | ||||
| 	TimeId untilDate = 0; | ||||
| 	bool onlyNewSubscribers = false; | ||||
| 	bool showWinners = false; | ||||
| }; | ||||
| 
 | ||||
| struct InvoicePremiumGiftCodeUsers { | ||||
|  |  | |||
|  | @ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | |||
| */ | ||||
| #include "ui/vertical_list.h" | ||||
| 
 | ||||
| #include "ui/text/text_utilities.h" | ||||
| #include "ui/widgets/box_content_divider.h" | ||||
| #include "ui/widgets/labels.h" | ||||
| #include "ui/wrap/padding_wrap.h" | ||||
|  | @ -30,6 +31,12 @@ void AddDivider(not_null<Ui::VerticalLayout*> container) { | |||
| void AddDividerText( | ||||
| 		not_null<Ui::VerticalLayout*> container, | ||||
| 		rpl::producer<QString> text) { | ||||
| 	AddDividerText(container, std::move(text) | Ui::Text::ToWithEntities()); | ||||
| } | ||||
| 
 | ||||
| void AddDividerText( | ||||
| 		not_null<Ui::VerticalLayout*> container, | ||||
| 		rpl::producer<TextWithEntities> text) { | ||||
| 	container->add(object_ptr<Ui::DividerLabel>( | ||||
| 		container, | ||||
| 		object_ptr<Ui::FlatLabel>( | ||||
|  |  | |||
|  | @ -22,6 +22,9 @@ void AddDivider(not_null<Ui::VerticalLayout*> container); | |||
| void AddDividerText( | ||||
| 	not_null<Ui::VerticalLayout*> container, | ||||
| 	rpl::producer<QString> text); | ||||
| void AddDividerText( | ||||
| 	not_null<Ui::VerticalLayout*> container, | ||||
| 	rpl::producer<TextWithEntities> text); | ||||
| not_null<Ui::FlatLabel*> AddSubsectionTitle( | ||||
| 	not_null<Ui::VerticalLayout*> container, | ||||
| 	rpl::producer<QString> text, | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 John Preston
						John Preston