/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "main/main_app_config.h" #include "main/main_account.h" #include "base/call_delayed.h" #include "apiwrap.h" namespace Main { namespace { constexpr auto kRefreshTimeout = 3600 * crl::time(1000); } // namespace AppConfig::AppConfig(not_null account) : _account(account) { account->mtpValue( ) | rpl::start_with_next([=](MTP::Instance *instance) { if (instance) { _api.emplace(instance); refresh(); } else { _api.reset(); _requestId = 0; } }, _lifetime); } void AppConfig::refresh() { if (_requestId || !_api) { return; } _requestId = _api->request(MTPhelp_GetAppConfig( )).done([=](const MTPJSONValue &result) { _requestId = 0; refreshDelayed(); if (result.type() == mtpc_jsonObject) { _data.clear(); for (const auto &element : result.c_jsonObject().vvalue().v) { element.match([&](const MTPDjsonObjectValue &data) { _data.emplace_or_assign(qs(data.vkey()), data.vvalue()); }); } DEBUG_LOG(("getAppConfig result handled.")); } _refreshed.fire({}); }).fail([=](const RPCError &error) { _requestId = 0; refreshDelayed(); }).send(); } void AppConfig::refreshDelayed() { base::call_delayed(kRefreshTimeout, _account, [=] { refresh(); }); } rpl::producer<> AppConfig::refreshed() const { return _refreshed.events(); } template auto AppConfig::getValue(const QString &key, Extractor &&extractor) const { const auto i = _data.find(key); return extractor((i != end(_data)) ? i->second : MTPJSONValue(MTP_jsonNull())); } bool AppConfig::getBool(const QString &key, bool fallback) const { return getValue(key, [&](const MTPJSONValue &value) { return value.match([&](const MTPDjsonBool &data) { return mtpIsTrue(data.vvalue()); }, [&](const auto &data) { return fallback; }); }); } double AppConfig::getDouble(const QString &key, double fallback) const { return getValue(key, [&](const MTPJSONValue &value) { return value.match([&](const MTPDjsonNumber &data) { return data.vvalue().v; }, [&](const auto &data) { return fallback; }); }); } QString AppConfig::getString( const QString &key, const QString &fallback) const { return getValue(key, [&](const MTPJSONValue &value) { return value.match([&](const MTPDjsonString &data) { return qs(data.vvalue()); }, [&](const auto &data) { return fallback; }); }); } std::vector AppConfig::getStringArray( const QString &key, std::vector &&fallback) const { return getValue(key, [&](const MTPJSONValue &value) { return value.match([&](const MTPDjsonArray &data) { auto result = std::vector(); for (const auto &entry : data.vvalue().v) { if (entry.type() != mtpc_jsonString) { return std::move(fallback); } result.push_back(qs(entry.c_jsonString().vvalue())); } return result; }, [&](const auto &data) { return std::move(fallback); }); }); } } // namespace Main