| 424 | } |
| 425 | |
| 426 | void Premium::requestPremiumRequiredSlice() { |
| 427 | _messageMoneyRequestScheduled = false; |
| 428 | if (!_resolveMessageMoneyRequestedUsers.empty() |
| 429 | || _resolveMessageMoneyRequiredUsers.empty()) { |
| 430 | return; |
| 431 | } |
| 432 | constexpr auto kPerRequest = 100; |
| 433 | auto users = MTP_vector_from_range(_resolveMessageMoneyRequiredUsers |
| 434 | | ranges::views::transform(&UserData::inputUser)); |
| 435 | if (users.v.size() > kPerRequest) { |
| 436 | auto shortened = users.v; |
| 437 | shortened.resize(kPerRequest); |
| 438 | users = MTP_vector<MTPInputUser>(std::move(shortened)); |
| 439 | const auto from = begin(_resolveMessageMoneyRequiredUsers); |
| 440 | _resolveMessageMoneyRequestedUsers = { from, from + kPerRequest }; |
| 441 | _resolveMessageMoneyRequiredUsers.erase(from, from + kPerRequest); |
| 442 | } else { |
| 443 | _resolveMessageMoneyRequestedUsers |
| 444 | = base::take(_resolveMessageMoneyRequiredUsers); |
| 445 | } |
| 446 | const auto finish = [=](const QVector<MTPRequirementToContact> &list) { |
| 447 | |
| 448 | auto index = 0; |
| 449 | for (const auto &user : base::take(_resolveMessageMoneyRequestedUsers)) { |
| 450 | const auto set = [&](bool requirePremium, int stars) { |
| 451 | using Flag = UserDataFlag; |
| 452 | constexpr auto me = Flag::RequiresPremiumToWrite; |
| 453 | constexpr auto known = Flag::MessageMoneyRestrictionsKnown; |
| 454 | constexpr auto hasPrem = Flag::HasRequirePremiumToWrite; |
| 455 | constexpr auto hasStars = Flag::HasStarsPerMessage; |
| 456 | user->setStarsPerMessage(stars); |
| 457 | user->setFlags((user->flags() & ~me) |
| 458 | | known |
| 459 | | (requirePremium ? (me | hasPrem) : Flag()) |
| 460 | | (stars ? hasStars : Flag())); |
| 461 | }; |
| 462 | if (index >= list.size()) { |
| 463 | set(false, 0); |
| 464 | continue; |
| 465 | } |
| 466 | list[index++].match([&](const MTPDrequirementToContactEmpty &) { |
| 467 | set(false, 0); |
| 468 | }, [&](const MTPDrequirementToContactPremium &) { |
| 469 | set(true, 0); |
| 470 | }, [&](const MTPDrequirementToContactPaidMessages &data) { |
| 471 | set(false, data.vstars_amount().v); |
| 472 | }); |
| 473 | } |
| 474 | if (!_messageMoneyRequestScheduled |
| 475 | && !_resolveMessageMoneyRequiredUsers.empty()) { |
| 476 | _messageMoneyRequestScheduled = true; |
| 477 | crl::on_main(_session, [=] { |
| 478 | requestPremiumRequiredSlice(); |
| 479 | }); |
| 480 | } |
| 481 | _someMessageMoneyRestrictionsResolved.fire({}); |
| 482 | }; |
| 483 | _session->api().request( |
nothing calls this directly
no test coverage detected