Improved parsing of countries data from server.

This commit is contained in:
23rd 2021-08-27 12:02:47 +03:00
parent cf523953ad
commit 8310d7e47c
2 changed files with 35 additions and 4 deletions

View File

@ -10,11 +10,19 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
namespace Countries { namespace Countries {
struct CallingCodeInfo {
QString callingCode;
std::vector<QString> prefixes;
std::vector<QString> patterns;
};
struct Info { struct Info {
QString name; QString name;
QString iso2; QString iso2;
QString code; QString code;
QString alternativeName; QString alternativeName;
std::vector<CallingCodeInfo> codes;
bool isHidden = false;
}; };
class CountriesInstance final { class CountriesInstance final {

View File

@ -90,6 +90,17 @@ void Manager::write() const {
void Manager::request() { void Manager::request() {
Expects(_api); Expects(_api);
const auto convertMTP = [](const auto &vector, bool force = false) {
if (!vector) {
return std::vector<QString>(force ? 1 : 0);
}
return ranges::views::all(
vector->v
) | ranges::views::transform([](const MTPstring &s) -> QString {
return s.v;
}) | ranges::to_vector;
};
_api->request(MTPhelp_GetCountriesList( _api->request(MTPhelp_GetCountriesList(
MTP_string(), MTP_string(),
MTP_int(_hash) MTP_int(_hash)
@ -102,16 +113,28 @@ void Manager::request() {
for (const auto &country : data.vcountries().v) { for (const auto &country : data.vcountries().v) {
const auto &countryData = country.c_help_country(); const auto &countryData = country.c_help_country();
if (countryData.is_hidden()) {
continue;
}
const auto &first = countryData.vcountry_codes().v.front() const auto &first = countryData.vcountry_codes().v.front()
.c_help_countryCode(); .c_help_countryCode();
const auto name = countryData.vdefault_name().v; auto info = Info(ProcessAlternativeName({
.name = countryData.vdefault_name().v,
infos.push_back(ProcessAlternativeName({
.name = name,
.iso2 = countryData.viso2().v, .iso2 = countryData.viso2().v,
.code = first.vcountry_code().v, .code = first.vcountry_code().v,
.isHidden = countryData.is_hidden(),
})); }));
for (const auto &code : countryData.vcountry_codes().v) {
const auto &codeData = code.c_help_countryCode();
info.codes.push_back(CallingCodeInfo{
.callingCode = codeData.vcountry_code().v,
.prefixes = convertMTP(codeData.vprefixes(), true),
.patterns = convertMTP(codeData.vpatterns()),
});
}
infos.push_back(std::move(info));
} }
Instance().setList(std::move(infos)); Instance().setList(std::move(infos));