diff --git a/Telegram/SourceFiles/countries/countries_instance.h b/Telegram/SourceFiles/countries/countries_instance.h index 6c571165ac..a282b7b12d 100644 --- a/Telegram/SourceFiles/countries/countries_instance.h +++ b/Telegram/SourceFiles/countries/countries_instance.h @@ -10,11 +10,19 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace Countries { +struct CallingCodeInfo { + QString callingCode; + std::vector prefixes; + std::vector patterns; +}; + struct Info { QString name; QString iso2; QString code; QString alternativeName; + std::vector codes; + bool isHidden = false; }; class CountriesInstance final { diff --git a/Telegram/SourceFiles/countries/countries_manager.cpp b/Telegram/SourceFiles/countries/countries_manager.cpp index 3fc0d4ec54..b5ecf1c4fa 100644 --- a/Telegram/SourceFiles/countries/countries_manager.cpp +++ b/Telegram/SourceFiles/countries/countries_manager.cpp @@ -90,6 +90,17 @@ void Manager::write() const { void Manager::request() { Expects(_api); + const auto convertMTP = [](const auto &vector, bool force = false) { + if (!vector) { + return std::vector(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( MTP_string(), MTP_int(_hash) @@ -102,16 +113,28 @@ void Manager::request() { for (const auto &country : data.vcountries().v) { const auto &countryData = country.c_help_country(); + if (countryData.is_hidden()) { + continue; + } const auto &first = countryData.vcountry_codes().v.front() .c_help_countryCode(); - const auto name = countryData.vdefault_name().v; - - infos.push_back(ProcessAlternativeName({ - .name = name, + auto info = Info(ProcessAlternativeName({ + .name = countryData.vdefault_name().v, .iso2 = countryData.viso2().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));