|
|
|
@@ -6,6 +6,7 @@
|
|
|
|
|
#include <random>
|
|
|
|
|
#include <vector>
|
|
|
|
|
#include <regex>
|
|
|
|
|
#include <thread>
|
|
|
|
|
|
|
|
|
|
#include <time.h>
|
|
|
|
|
|
|
|
|
@@ -353,6 +354,26 @@ void Spoofer::modifyCharacterData(json& js)
|
|
|
|
|
/*
|
|
|
|
|
endpoint handlers
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
void Spoofer::onGetCatalogItems(std::string& body)
|
|
|
|
|
{
|
|
|
|
|
std::thread t([body]() {
|
|
|
|
|
std::string outPath = utils::getExePath() + "catalog.json";
|
|
|
|
|
std::ofstream file(outPath);
|
|
|
|
|
if (file.is_open())
|
|
|
|
|
{
|
|
|
|
|
file << body;
|
|
|
|
|
file.close();
|
|
|
|
|
Log::verbose("Raw catalog saved to {}", outPath);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
Log::error("Unable to write to catalog.json");
|
|
|
|
|
});
|
|
|
|
|
t.detach();
|
|
|
|
|
|
|
|
|
|
parseCatalog(body);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Spoofer::onGetAll(std::string& body)
|
|
|
|
|
{
|
|
|
|
|
json doc = json::parse(body, nullptr, false);
|
|
|
|
@@ -426,6 +447,60 @@ void Spoofer::onInventoryAll(std::string& body)
|
|
|
|
|
Log::verbose("Inventory spoofed");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Spoofer::onMessageList(std::string& body)
|
|
|
|
|
{
|
|
|
|
|
json doc = json::parse(body, nullptr, false);
|
|
|
|
|
if (doc.is_discarded()) return Log::error("JSON parse error for dbd-messages/listV2");
|
|
|
|
|
|
|
|
|
|
auto now = std::chrono::system_clock::now();
|
|
|
|
|
auto now_seconds = std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch()).count();
|
|
|
|
|
auto now_milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count();
|
|
|
|
|
|
|
|
|
|
json msg;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
msg base
|
|
|
|
|
*/
|
|
|
|
|
msg["allowedPlatforms"] = json::array({"egs", "grdk", "ps4", "ps5", "steam", "xbox", "xsx"});
|
|
|
|
|
msg["flag"] = "READ";
|
|
|
|
|
msg["gameSpecificData"] = {};
|
|
|
|
|
msg["read"] = false;
|
|
|
|
|
msg["tag"] = json::array({"inbox"});
|
|
|
|
|
msg["expireAt"] = now_seconds + (1337 * 24 * 60 * 60);
|
|
|
|
|
msg["received"] = now_milliseconds;
|
|
|
|
|
msg["recipientId"] = "system";
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
msg content
|
|
|
|
|
*/
|
|
|
|
|
json bodyContent;
|
|
|
|
|
bodyContent["sections"] = json::array();
|
|
|
|
|
bodyContent["sections"].push_back(
|
|
|
|
|
{{"type", "text"},
|
|
|
|
|
{"text", "Japan is turning footsteps into electricity!<br><br>Using piezoelectric tiles, every step "
|
|
|
|
|
"you take generates a small amount of energy. Millions of steps together can power LED "
|
|
|
|
|
"lights and displays in busy places like Shibuya Station.<br><br>A brilliant way to create a "
|
|
|
|
|
"sustainable and smart city — turning movement into clean, renewable energy."}});
|
|
|
|
|
|
|
|
|
|
bodyContent["image"] = {
|
|
|
|
|
{"packagedPath", "/Game/UI/UMGAssets/Icons/ItemAddons/iconAddon_powerBulb.iconAddon_powerBulb"},
|
|
|
|
|
{"contentVersion", "ccc3f02b0a671fe19a0017d6a69293876a465fd9"},
|
|
|
|
|
{"uri", ""}};
|
|
|
|
|
|
|
|
|
|
bodyContent["sections"].push_back(
|
|
|
|
|
{{"type", "itemshowcase"},
|
|
|
|
|
{"rewards", json::array({{{"type", "inventory"}, {"id", "ADDON_flashlight_oddbulb"}, {"amount", 1}}})}});
|
|
|
|
|
|
|
|
|
|
msg["message"] = {};
|
|
|
|
|
msg["message"]["title"] = "Japan is turning footsteps into electricity";
|
|
|
|
|
msg["message"]["body"] = bodyContent.dump();
|
|
|
|
|
|
|
|
|
|
doc["messages"].push_back(msg);
|
|
|
|
|
|
|
|
|
|
body = doc.dump();
|
|
|
|
|
Log::verbose("Spoofed message list");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Spoofer::onBloodweb(std::string& body, std::string& respHeaders)
|
|
|
|
|
{
|
|
|
|
|
json doc = json::parse(body, nullptr, false);
|
|
|
|
@@ -457,13 +532,17 @@ void Spoofer::onBloodweb(std::string& body, std::string& respHeaders)
|
|
|
|
|
respHeaders = std::regex_replace(respHeaders, statusRegex, "HTTP/1.1 200");
|
|
|
|
|
|
|
|
|
|
body = mock.dump();
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
Log::verbose("Spoofed bloodweb request for unowned character.");
|
|
|
|
|
#endif
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
modifyCharacterData(doc);
|
|
|
|
|
body = doc.dump();
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
Log::verbose("Spoofed bloodweb items for owned character");
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@@ -478,8 +557,11 @@ void Spoofer::serverResponseHandler(const std::string& url, std::string& body, s
|
|
|
|
|
Log::verbose("BHVR api res @ {}", url);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if (url.find("api/v1/extensions/store/getCatalogItems") != std::string::npos) return onGetCatalogItems(body);
|
|
|
|
|
if (url.find("api/v1/dbd-character-data/get-all") != std::string::npos) return onGetAll(body);
|
|
|
|
|
if (url.find("api/v1/dbd-character-data/get-all") != std::string::npos) return onGetAll(body);
|
|
|
|
|
if (url.find("api/v1/dbd-inventories/all") != std::string::npos) return onInventoryAll(body);
|
|
|
|
|
if (url.find("/api/v1/messages/listV2") != std::string::npos) return onMessageList(body);
|
|
|
|
|
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)
|
|
|
|
|
return onBloodweb(body, respHeaders);
|
|
|
|
|