Use colorings from appconfig.

This commit is contained in:
John Preston
2025-11-04 19:17:50 +04:00
parent 834986410c
commit e8f10f2b45
+132 -20
View File
@@ -263,26 +263,6 @@ TimeId AppConfig::groupCallMessageTTL() const {
return get<int>(u"group_call_message_ttl"_q, 10);
}
auto AppConfig::groupCallColorings() const -> std::vector<StarsColoring> {
if (!_groupCallColorings.empty()) {
return _groupCallColorings;
}
if (_groupCallColorings.empty()) {
_groupCallColorings = std::vector<StarsColoring>{
{ 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<StarsColoring> {
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<int> {
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<int> {
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<int>();
};
const auto component = [&](int i) {
const auto a = digit(i), b = digit(i + 1);
return (a && b)
? ((*a) * 16 + (*b))
: std::optional<int>();
};
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<StarsColoring>{
{ 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