From 13cddba7af9f0fd2ee3250bdefa43c397b3b3c72 Mon Sep 17 00:00:00 2001 From: Michal Brzozowski Date: Mon, 14 Oct 2019 16:14:25 +1100 Subject: [PATCH] Separately fetch retired dungeons conquest stats from keeperrl.com. --- file_sharing.cpp | 54 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/file_sharing.cpp b/file_sharing.cpp index b5153c850..a46f8df37 100644 --- a/file_sharing.cpp +++ b/file_sharing.cpp @@ -315,7 +315,7 @@ optional FileSharing::downloadContent(const string& url) { } static optional parseSite(const vector& fields) { - if (fields.size() < 5) + if (fields.size() < 3) return none; INFO << "Parsed " << fields; FileSharing::SiteInfo elem {}; @@ -323,9 +323,7 @@ static optional parseSite(const vector& fields) { input.getArchive() >> elem.fileInfo.filename >> elem.gameInfo; try { elem.fileInfo.date = fromString(fields[1]); - elem.wonGames = fromString(fields[2]); - elem.totalGames = fromString(fields[3]); - elem.version = fromString(fields[4]); + elem.version = fromString(fields[2]); elem.fileInfo.download = true; } catch (cereal::Exception) { return none; @@ -335,15 +333,53 @@ static optional parseSite(const vector& fields) { return elem; } +namespace { +struct SiteConquestInfo { + string filename; + int totalGames; + int wonGames; +}; +} + +static optional parseSiteConquest(const vector& fields) { + if (fields.size() < 3) + return none; + INFO << "Parsed " << fields; + SiteConquestInfo elem {}; + try { + elem.filename = unescapeEverything(fields[0]); + elem.wonGames = fromString(fields[1]); + elem.totalGames = fromString(fields[2]); + } catch (cereal::Exception) { + return none; + } catch (ParsingException e) { + return none; + } + return elem; +} + expected, string> FileSharing::listSites() { if (!options.getBoolValue(OptionId::ONLINE)) return make_unexpected("Please enable online features in the settings in order to download retired dungeons!"_s); - if (auto sites = getSteamSites()) - return *sites; - if (auto content = downloadContent(uploadUrl + "/dungeons.txt")) - return parseLines(*content, parseSite); - else + vector conquestInfo; + thread downloadConquest([&conquestInfo, this] { + if (auto content = downloadContent(uploadUrl + "/get_sites.php")) + conquestInfo = parseLines(*content, parseSiteConquest); + }); + optional> ret = getSteamSites(); + if (!ret) + if (auto content = downloadContent(uploadUrl + "/dungeons.txt")) + ret = parseLines(*content, parseSite); + downloadConquest.join(); + if (!ret) return make_unexpected("Error fetching online dungeons."_s); + for (auto& conquestElem : conquestInfo) + for (auto& elem : *ret) + if (elem.fileInfo.filename == conquestElem.filename) { + elem.wonGames = conquestElem.wonGames; + elem.totalGames = conquestElem.totalGames; + } + return *ret; } static optional parseBoardMessage(const vector& fields) {