diff --git a/src/unlocker/spoofing.cpp b/src/unlocker/spoofing.cpp index ea5bf7d..23c5047 100644 --- a/src/unlocker/spoofing.cpp +++ b/src/unlocker/spoofing.cpp @@ -33,6 +33,11 @@ void Spoofer::registerListeners(Proxy* proxy) proxy->OnServerResponse.addListener([this](const std::string& url, std::string& body, std::string& respHeaders) { this->serverResponseHandler(url, body, respHeaders); }); + + proxy->OnClientRequest.addListener( + [this](const std::string& url, const std::string& body, std::string& reqHeaders) { + this->clientRequestHandler(url, body, reqHeaders); + }); } void Spoofer::loadData() @@ -259,7 +264,7 @@ void Spoofer::modifyCharacterData(json& js) } } -void Spoofer::serverResponseHandler(const std::string& url, std::string& body, std::string& /*respHeaders*/) +void Spoofer::serverResponseHandler(const std::string& url, std::string& body, std::string& respHeaders) { if (url.find("bhvrdbd.com") != std::string::npos) Log::verbose("BHVR api res @ {}", url); @@ -400,8 +405,36 @@ void Spoofer::serverResponseHandler(const std::string& url, std::string& body, s try { json doc = json::parse(body); - modifyCharacterData(doc); - body = doc.dump(); + + if (body.find("NotAllowedException") != std::string::npos && body.find("not owned") != std::string::npos) + { + Log::info("Spoofing bloodweb error error for unowned character"); + json mock; + mock["bloodWebLevelChanged"] = false; + mock["updatedWallets"] = json::array(); + mock["bloodWebLevel"] = 15; + mock["prestigeLevel"] = 0; + mock["bloodWebData"] = {{"ringData", json::array()}, {"paths", json::array()}}; + mock["characterItems"] = json::array(); + mock["characterName"] = this->_lastBloodWebChar; + + modifyCharacterData(mock); + + size_t firstSpace = respHeaders.find(' '); + if (firstSpace != std::string::npos) + { + respHeaders.replace(firstSpace + 1, 3, "200"); + } + + body = mock.dump(); + return; + } + else + { + modifyCharacterData(doc); + body = doc.dump(); + } + return; } catch (const json::parse_error& e) { @@ -409,4 +442,24 @@ void Spoofer::serverResponseHandler(const std::string& url, std::string& body, s } return; } -} \ No newline at end of file +} + +void Spoofer::clientRequestHandler(const std::string& url, const std::string& body, std::string& /*reqHeaders*/) +{ + if (url.find("api/v1/dbd-character-data/bloodweb") != std::string::npos || + url.find("api/v1/dbd-character-data/bulk-spending-bloodweb") != std::string::npos) + { + try + { + json req = json::parse(body); + if (req.contains("characterName")) + { + this->_lastBloodWebChar = req["characterName"]; + Log::info("Detected bloodweb request for character: {}", this->_lastBloodWebChar); + } + } + catch (...) + { + } + } +} diff --git a/src/unlocker/spoofing.h b/src/unlocker/spoofing.h index b2117e9..4fd10d5 100644 --- a/src/unlocker/spoofing.h +++ b/src/unlocker/spoofing.h @@ -22,6 +22,7 @@ class Spoofer void modifyCharacterData(nlohmann::json& js); void serverResponseHandler(const std::string& url, std::string& body, std::string& respHeaders); + void clientRequestHandler(const std::string& url, const std::string& body, std::string& reqHeaders); std::unordered_set _camperItemIds; std::unordered_set _slasherPowerIds; @@ -37,4 +38,6 @@ class Spoofer std::unordered_set _catalogOutfitIds; std::unordered_set _catalogItemIds; + + std::string _lastBloodWebChar = "Ace"; };