diff --git a/Telegram/SourceFiles/boxes/star_gift_craft_box.cpp b/Telegram/SourceFiles/boxes/star_gift_craft_box.cpp index 26e78ea426..f606fc3b13 100644 --- a/Telegram/SourceFiles/boxes/star_gift_craft_box.cpp +++ b/Telegram/SourceFiles/boxes/star_gift_craft_box.cpp @@ -760,10 +760,14 @@ void ShowSelectGiftBox( const auto state = raw->lifetime().make_state(); const auto permilles = session->appConfig().craftAttributePermilles(); - const auto permille = [=](int count) { + const auto permille = [=](int total, int count) { + Expects(total > 0); Expects(count > 0); - return (count <= permilles.size()) ? permilles[count - 1] : 1000; + const auto &list = (total <= permilles.size()) + ? permilles[total - 1] + : std::vector(); + return (count <= list.size()) ? list[count - 1] : 1000; }; std::move( @@ -800,8 +804,9 @@ void ShowSelectGiftBox( ranges::sort(backdrops, ranges::greater(), &Backdrop::count); ranges::sort(patterns, ranges::greater(), &Pattern::count); + const auto total = int(list.size()); const auto &backdrop = backdrops.front(); - state->backdropPermille = permille(backdrop.count); + state->backdropPermille = permille(total, backdrop.count); if (state->nowBackdrop != backdrop.fields) { if (!state->nowFrame.isNull()) { state->wasBackdrop = state->nowBackdrop; @@ -815,7 +820,7 @@ void ShowSelectGiftBox( } const auto &pattern = patterns.front(); - state->patternPermille = permille(pattern.count); + state->patternPermille = permille(total, pattern.count); if (state->nowPattern != pattern.document) { if (state->nowEmoji) { state->wasPattern = state->nowPattern; diff --git a/Telegram/SourceFiles/main/main_app_config.cpp b/Telegram/SourceFiles/main/main_app_config.cpp index 35683515a8..5828b19437 100644 --- a/Telegram/SourceFiles/main/main_app_config.cpp +++ b/Telegram/SourceFiles/main/main_app_config.cpp @@ -485,6 +485,35 @@ std::vector AppConfig::getIntArray( }); } +std::vector> AppConfig::getIntIntArray( + const QString &key, + std::vector> &&fallback) const { + return getValue(key, [&](const MTPJSONValue &value) { + return value.match([&](const MTPDjsonArray &data) { + auto result = std::vector>(); + result.reserve(data.vvalue().v.size()); + for (const auto &entry : data.vvalue().v) { + if (entry.type() != mtpc_jsonArray) { + return std::move(fallback); + } + const auto &list = entry.c_jsonArray().vvalue().v; + auto &last = result.emplace_back(); + last.reserve(list.size()); + for (const auto &inner : list) { + if (inner.type() != mtpc_jsonNumber) { + return std::move(fallback); + } + last.push_back( + int(base::SafeRound(inner.c_jsonNumber().vvalue().v))); + } + } + return result; + }, [&](const auto &data) { + return std::move(fallback); + }); + }); +} + std::vector AppConfig::getInt64Array( const QString &key, std::vector &&fallback) const { @@ -644,10 +673,15 @@ auto AppConfig::groupCallColorings() const -> std::vector { return _groupCallColorings; } -std::vector AppConfig::craftAttributePermilles() const { - return getIntArray( - u"stargift_craft_attribute_permillages"_q, - std::vector{ 60, 180, 450, 1000 }); +std::vector> AppConfig::craftAttributePermilles() const { + return get>>( + u"stargifts_craft_attribute_permilles"_q, + { + { 90 }, + { 80, 200 }, + { 70, 190, 460 }, + { 60, 180, 450, 1000 }, + }); } } // namespace Main diff --git a/Telegram/SourceFiles/main/main_app_config.h b/Telegram/SourceFiles/main/main_app_config.h index 50eeda5549..e1cc2f22be 100644 --- a/Telegram/SourceFiles/main/main_app_config.h +++ b/Telegram/SourceFiles/main/main_app_config.h @@ -47,6 +47,8 @@ public: return getStringMap(key, std::move(fallback)); } else if constexpr (std::is_same_v>) { return getIntArray(key, std::move(fallback)); + } else if constexpr (std::is_same_v>>) { + return getIntIntArray(key, std::move(fallback)); } else if constexpr (std::is_same_v>) { return getInt64Array(key, std::move(fallback)); } else if constexpr (std::is_same_v) { @@ -137,7 +139,7 @@ public: using StarsColoring = Calls::Group::Ui::StarsColoring; [[nodiscard]] std::vector groupCallColorings() const; - [[nodiscard]] std::vector craftAttributePermilles() const; + [[nodiscard]] std::vector> craftAttributePermilles() const; void refresh(bool force = false); @@ -167,6 +169,9 @@ private: [[nodiscard]] std::vector getIntArray( const QString &key, std::vector &&fallback) const; + [[nodiscard]] std::vector> getIntIntArray( + const QString &key, + std::vector> &&fallback) const; [[nodiscard]] std::vector getInt64Array( const QString &key, std::vector &&fallback) const;