diff --git a/Telegram/SourceFiles/main/main_app_config.cpp b/Telegram/SourceFiles/main/main_app_config.cpp index d3f9b86d73..f9cc2baaff 100644 --- a/Telegram/SourceFiles/main/main_app_config.cpp +++ b/Telegram/SourceFiles/main/main_app_config.cpp @@ -263,26 +263,6 @@ TimeId AppConfig::groupCallMessageTTL() const { return get(u"group_call_message_ttl"_q, 10); } -auto AppConfig::groupCallColorings() const -> std::vector { - if (!_groupCallColorings.empty()) { - return _groupCallColorings; - } - - if (_groupCallColorings.empty()) { - _groupCallColorings = std::vector{ - { 0x955CDB, 0x49079B, 0, 30, 30, 0 }, // purple - { 0x955CDB, 0x49079B, 10, 60, 60, 1 }, // still purple - { 0x46A3EB, 0x00508E, 50, 120, 80, 2 }, // blue - { 0x40A920, 0x176200, 100, 300, 110, 3 }, // green - { 0xE29A09, 0x9A3E00, 250, 600, 150, 4 }, // yellow - { 0xED771E, 0x9B3100, 500, 900, 200, 7 }, // orange - { 0xE14542, 0x8B0503, 2'000, 1800, 280, 10 }, // red - { 0x596473, 0x252C36, 10'000, 3600, 400, 20 }, // silver - }; - } - return _groupCallColorings; -} - void AppConfig::refresh(bool force) { if (_requestId || !_api) { if (force) { @@ -473,4 +453,136 @@ bool AppConfig::newRequirePremiumFree() const { false); } +auto AppConfig::groupCallColorings() const -> std::vector { + if (!_groupCallColorings.empty()) { + return _groupCallColorings; + } + const auto key = u"stars_groupcall_message_limits"_q; + getValue(key, [&](const MTPJSONValue &value) { + value.match([&](const MTPDjsonArray &data) { + const auto &list = data.vvalue().v; + _groupCallColorings.reserve(list.size()); + for (const auto &entry : list) { + entry.match([&](const MTPDjsonObject &data) { + auto &entry = _groupCallColorings.emplace_back(); + const auto &fields = data.vvalue().v; + for (const auto &field : fields) { + const auto &key = field.data().vkey().v; + const auto &value = field.data().vvalue(); + const auto error = [&] { + LOG(("API Error: Incorrect value for %1." + ).arg(qs(key))); + return std::nullopt; + }; + const auto number = [&]() -> std::optional { + if (value.type() != mtpc_jsonNumber) { + return error(); + } + const auto &data = value.c_jsonNumber(); + const auto v = base::SafeRound(data.vvalue().v); + if (v < 0) { + return error(); + } + return int(v); + }; + const auto color = [&]() -> std::optional { + if (value.type() != mtpc_jsonString) { + return error(); + } + const auto &data = value.c_jsonString(); + const auto text = data.vvalue().v; + if (text.size() != 6) { + return error(); + } + const auto digit = [&](int i) { + Expects(i >= 0 && i < 6); + + const auto ch = text[i]; + return (ch >= '0' && ch <= '9') + ? int(ch - '0') + : (ch >= 'A' && ch <= 'F') + ? (int(ch - 'A') + 10) + : (ch >= 'a' && ch <= 'f') + ? (int(ch - 'a') + 10) + : std::optional(); + }; + const auto component = [&](int i) { + const auto a = digit(i), b = digit(i + 1); + return (a && b) + ? ((*a) * 16 + (*b)) + : std::optional(); + }; + const auto r = component(0); + const auto g = component(2); + const auto b = component(4); + if (!r || !g || !b) { + return error(); + } + return ((*r) << 16) | ((*g) << 8) | (*b); + }; + if (key == "stars"_q) { + if (const auto n = number()) { + entry.fromStars = *n; + } else { + return _groupCallColorings.pop_back(); + } + } else if (key == "pin_period"_q) { + if (const auto n = number()) { + entry.secondsPin = *n; + } else { + return _groupCallColorings.pop_back(); + } + } else if (key == "text_length_max"_q) { + if (const auto n = number()) { + entry.charactersMax = *n; + } else { + return _groupCallColorings.pop_back(); + } + } else if (key == "emoji_max"_q) { + if (const auto n = number()) { + entry.emojiLimit = *n; + } else { + return _groupCallColorings.pop_back(); + } + } else if (key == "color1"_q) { + if (const auto c = color()) { + entry.bgLight = *c; + } else { + return _groupCallColorings.pop_back(); + } + } else if (key == "color_bg"_q) { + if (const auto c = color()) { + entry.bgDark = *c; + } else { + return _groupCallColorings.pop_back(); + } + } + } + }, [](const auto &) {}); + } + }, [](const auto &) {}); + }); + if (_groupCallColorings.empty()) { + _groupCallColorings = std::vector{ + { 0x955CDB, 0x49079B, 0, 30, 30, 0 }, // purple + { 0x955CDB, 0x49079B, 10, 60, 60, 1 }, // still purple + { 0x46A3EB, 0x00508E, 50, 120, 80, 2 }, // blue + { 0x40A920, 0x176200, 100, 300, 110, 3 }, // green + { 0xE29A09, 0x9A3E00, 250, 600, 150, 4 }, // yellow + { 0xED771E, 0x9B3100, 500, 900, 200, 7 }, // orange + { 0xE14542, 0x8B0503, 2'000, 1800, 280, 10 }, // red + { 0x596473, 0x252C36, 10'000, 3600, 400, 20 }, // silver + }; + } else { + const auto proj = &StarsColoring::fromStars; + if (!ranges::contains(_groupCallColorings, 0, proj)) { + _groupCallColorings.insert( + begin(_groupCallColorings), + { 0x955CDB, 0x49079B, 0, 30, 30, 0 }); + } + ranges::sort(_groupCallColorings, ranges::less(), proj); + } + return _groupCallColorings; +} + } // namespace Main