[Updater] Only download updater when required

This commit is contained in:
/dev/root 2017-02-25 12:45:03 +01:00
parent 8b50bb567c
commit af8801c9c5
2 changed files with 67 additions and 13 deletions

View File

@ -7,6 +7,8 @@ namespace Components
bool News::Terminate; bool News::Terminate;
std::thread News::Thread; std::thread News::Thread;
std::string News::UpdaterArgs; std::string News::UpdaterArgs;
std::string News::UpdaterHash;
int News::UpdaterRefresh;
bool News::unitTest() bool News::unitTest()
{ {
@ -50,6 +52,56 @@ namespace Components
TerminateProcess(GetCurrentProcess(), exitCode); TerminateProcess(GetCurrentProcess(), exitCode);
} }
bool News::GetLatestUpdater()
{
if (Utils::IO::FileExists("updater.exe"))
{
// Generate hash of local updater.exe
std::string localUpdater = Utils::IO::ReadFile("updater.exe");
localUpdater = Utils::Cryptography::SHA1::Compute(localUpdater, true);
if (News::UpdaterHash.empty() || (News::UpdaterRefresh - Game::Sys_Milliseconds() > 900000)) // Check for updater Update every 15 mins max
{
News::UpdaterRefresh = Game::Sys_Milliseconds();
std::string data = Utils::Cache::GetFile("/json/updater"); // {"updater.exe":{"SHA1":"*HASH*"}}
std::string error;
json11::Json listData = json11::Json::parse(data, error);
if (error.empty() || listData.is_object())
{
News::UpdaterHash = listData["updater.exe"]["SHA1"].string_value();
}
}
if (!News::UpdaterHash.empty() && localUpdater != News::UpdaterHash)
{
remove("updater.exe");
}
}
if (!Utils::IO::FileExists("updater.exe"))
{
return News::DownloadUpdater();
}
return true;
}
bool News::DownloadUpdater()
{
std::string data = Utils::Cache::GetFile("/iw4/updater.exe");
if (!data.empty())
{
Utils::IO::WriteFile("updater.exe", data);
return true;
}
return false;
}
const char* News::GetNewsText() const char* News::GetNewsText()
{ {
return Localization::Get("MPUI_MOTD_TEXT"); return Localization::Get("MPUI_MOTD_TEXT");
@ -95,21 +147,18 @@ namespace Components
std::thread([]() std::thread([]()
{ {
std::string data = Utils::Cache::GetFile("/iw4/updater.exe"); if (News::GetLatestUpdater())
{
if (data.empty()) Console::SetSkipShutdown();
Command::Execute("wait 300; quit;", false);
}
else
{ {
Localization::ClearTemp(); Localization::ClearTemp();
News::UpdaterArgs.clear(); News::UpdaterArgs.clear();
Command::Execute("closemenu popup_reconnectingtoparty", false); Command::Execute("closemenu popup_reconnectingtoparty", false);
Game::ShowMessageBox("Failed to download the updater!", "Error"); Game::ShowMessageBox("Failed to download the updater!", "Error");
} }
else
{
Console::SetSkipShutdown();
Utils::IO::WriteFile("updater.exe", data);
Command::Execute("wait 300; quit;", false);
}
}).detach(); }).detach();
} }
@ -121,6 +170,8 @@ namespace Components
News::News() News::News()
{ {
News::UpdaterArgs.clear(); News::UpdaterArgs.clear();
News::UpdaterHash.clear();
News::UpdaterRefresh = 0;
if (ZoneBuilder::IsEnabled()) return; // Maybe also dedi? if (ZoneBuilder::IsEnabled()) return; // Maybe also dedi?
Dvar::Register<bool>("g_firstLaunch", true, Game::DVAR_FLAG_SAVED, ""); Dvar::Register<bool>("g_firstLaunch", true, Game::DVAR_FLAG_SAVED, "");
@ -151,10 +202,7 @@ namespace Components
Localization::Set("MPUI_CHANGELOG_TEXT", "Loading..."); Localization::Set("MPUI_CHANGELOG_TEXT", "Loading...");
Localization::Set("MPUI_MOTD_TEXT", NEWS_MOTD_DEFAULT); Localization::Set("MPUI_MOTD_TEXT", NEWS_MOTD_DEFAULT);
if (Utils::IO::FileExists("updater.exe")) //News::GetLatestUpdater();
{
remove("updater.exe");
}
// make newsfeed (ticker) menu items not cut off based on safe area // make newsfeed (ticker) menu items not cut off based on safe area
Utils::Hook::Nop(0x63892D, 5); Utils::Hook::Nop(0x63892D, 5);
@ -208,6 +256,7 @@ namespace Components
News::~News() News::~News()
{ {
News::UpdaterArgs.clear(); News::UpdaterArgs.clear();
News::UpdaterHash.clear();
} }
void News::preDestroy() void News::preDestroy()

View File

@ -20,8 +20,13 @@ namespace Components
private: private:
static std::string UpdaterArgs; static std::string UpdaterArgs;
static std::string UpdaterHash;
static int UpdaterRefresh;
static std::thread Thread; static std::thread Thread;
static bool Terminate; static bool Terminate;
static bool GetLatestUpdater();
static bool DownloadUpdater();
static void CheckForUpdate(); static void CheckForUpdate();
static void ExitProcessStub(unsigned int exitCode); static void ExitProcessStub(unsigned int exitCode);