kinda works
This commit is contained in:
parent
381ff27659
commit
0b073303d3
@ -40,7 +40,7 @@ CatCommand api_key("bptf_key", "Set API Key", [](const CCommand& args) {
|
||||
});
|
||||
|
||||
|
||||
void store_data(unsigned id, unsigned value, bool no_value, bool outdated_value);
|
||||
void store_data(unsigned id, float value, bool no_value, bool outdated_value);
|
||||
|
||||
void processing_thread() {
|
||||
logging::Info("[bp.tf] Starting the thread");
|
||||
@ -56,27 +56,19 @@ void processing_thread() {
|
||||
pending_queue.pop();
|
||||
}
|
||||
}
|
||||
logging::Info("[bp.tf] Requesting data for %d users", count);
|
||||
if (count) {
|
||||
logging::Info("[bp.tf] Requesting data for %d users", count);
|
||||
std::string id_list = "";
|
||||
logging::Info("Constructing list");
|
||||
for (const auto& x : batch) {
|
||||
x->pending = false;
|
||||
logging::Info("Adding %u to the list", x->id);
|
||||
id_list += format("[U:1:", x->id, "],");
|
||||
}
|
||||
logging::Info("List constructed");
|
||||
// Remove trailing ','
|
||||
id_list = id_list.substr(0, id_list.length() - 1);
|
||||
std::string query = format("steamids=", id_list, "&key=", api_key_s);
|
||||
logging::Info("Query constructed");
|
||||
try {
|
||||
auto sock = https::RAII_HTTPS_Socket("backpack.tf");
|
||||
logging::Info("Socket created");
|
||||
sock.ssl_connect();
|
||||
logging::Info("Socket connected (%d)", sock.sock_);
|
||||
std::string response = sock.get("/api/users/info/v1?" + query);
|
||||
logging::Info("Request sent");
|
||||
if (response.find("HTTP/1.1 200 OK\r\n") != 0) {
|
||||
size_t status = response.find("\r\n");
|
||||
throw std::runtime_error("Response isn't 200 OK! It's " + response.substr(0, status));
|
||||
@ -84,13 +76,12 @@ void processing_thread() {
|
||||
|
||||
std::string body = response.substr(response.find("\r\n\r\n") + 4);
|
||||
|
||||
logging::Info("[bp.tf] Response: %s", body.c_str());
|
||||
|
||||
try {
|
||||
nlohmann::json data(body);
|
||||
nlohmann::json data = nlohmann::json::parse(body);
|
||||
nlohmann::json users = data["users"];
|
||||
std::lock_guard<std::mutex> lock(cache_mutex);
|
||||
for (auto it = users.begin(); it != users.end(); ++it) {
|
||||
unsigned userid = strtoul(it.key().substr(5).c_str(), nullptr, 10);
|
||||
try {
|
||||
unsigned userid = strtoul(it.key().substr(5).c_str(), nullptr, 10);
|
||||
const auto& v = it.value();
|
||||
@ -98,10 +89,13 @@ void processing_thread() {
|
||||
logging::Info("Data for %u (%s) is not an object!", userid, it.key());
|
||||
continue;
|
||||
}
|
||||
logging::Info("Parsing data for user %u (%s)", userid, v["name"]);
|
||||
const auto& inv = v["inventory"]["440"];
|
||||
std::string name = v.at("name");
|
||||
logging::Info("Parsing data for user %u (%s)", userid, name.c_str());
|
||||
if (v.find("inventory") == v.end()) {
|
||||
store_data(userid, 0, true, false);
|
||||
}
|
||||
const auto& inv = v.at("inventory").at("440");
|
||||
if (inv.find("value") == inv.end()) {
|
||||
logging::Info("Private backpack");
|
||||
store_data(userid, 0, true, false);
|
||||
} else {
|
||||
float value = float(inv["value"]);
|
||||
@ -109,7 +103,7 @@ void processing_thread() {
|
||||
store_data(userid, value * REFINED_METAL_PRICE, false, (unsigned(time(0)) - updated > OUTDATED_AGE));
|
||||
}
|
||||
} catch (std::exception& ex) {
|
||||
logging::Info("Error while parsing user %s", it.key().c_str());
|
||||
logging::Info("Error while parsing user %s: %s", it.key().c_str(), ex.what());
|
||||
}
|
||||
}
|
||||
} catch (std::exception& e) {
|
||||
@ -151,7 +145,7 @@ backpack_data_s& access_data(unsigned id) {
|
||||
}
|
||||
}
|
||||
|
||||
void store_data(unsigned id, unsigned value, bool none, bool outdated) {
|
||||
void store_data(unsigned id, float value, bool none, bool outdated) {
|
||||
auto& d = access_data(id);
|
||||
d.last_request = unsigned(time(0));
|
||||
d.bad = false;
|
||||
|
@ -24,7 +24,7 @@ struct backpack_data_s {
|
||||
bool no_value { false }; // No recorded value
|
||||
bool outdated_value { false }; // Outdated value. Private inventory?
|
||||
unsigned last_request { 0 };
|
||||
unsigned value { 0 };
|
||||
float value { 0 };
|
||||
unsigned id { 0 };
|
||||
};
|
||||
|
||||
|
@ -85,27 +85,30 @@ void RenderPlayer(int eid) {
|
||||
}
|
||||
if (backpacktf::enabled()) {
|
||||
ImGui::SameLine();
|
||||
if (!info.friendsID) {
|
||||
if (info.fakeplayer) {
|
||||
ImGui::Text("[BOT]");
|
||||
}
|
||||
const auto& d = backpacktf::get_data(info.friendsID);
|
||||
if (d.bad && not d.pending) {
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 0.0f, 0.0f, 1.0f));
|
||||
ImGui::Text("Error");
|
||||
} else if (d.pending) {
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.6f, 0.6f, 0.6f, 1.0f));
|
||||
ImGui::Text("Fetching");
|
||||
} else if (d.no_value) {
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 1.0f, 0.0f, 1.0f));
|
||||
ImGui::Text("No value");
|
||||
} else if (d.outdated_value) {
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.6f, 0.6f, 0.6f, 1.0f));
|
||||
ImGui::Text("$%u", d.value);
|
||||
} else if (!info.friendsID) {
|
||||
ImGui::Text("Unknown");
|
||||
} else {
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.0f, 0.8f, 0.0f, 1.0f));
|
||||
ImGui::Text("$%u", d.value);
|
||||
const auto& d = backpacktf::get_data(info.friendsID);
|
||||
if (d.bad && not d.pending) {
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 0.0f, 0.0f, 1.0f));
|
||||
ImGui::Text("Error");
|
||||
} else if (d.pending) {
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.6f, 0.6f, 0.6f, 1.0f));
|
||||
ImGui::Text("Fetching");
|
||||
} else if (d.no_value) {
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 1.0f, 0.0f, 1.0f));
|
||||
ImGui::Text("Private?");
|
||||
} else if (d.outdated_value) {
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.6f, 0.6f, 0.6f, 1.0f));
|
||||
ImGui::Text("$%.2f", d.value);
|
||||
} else {
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.0f, 0.8f, 0.0f, 1.0f));
|
||||
ImGui::Text("$%.2f", d.value);
|
||||
}
|
||||
ImGui::PopStyleColor();
|
||||
}
|
||||
ImGui::PopStyleColor();
|
||||
}
|
||||
ImGui::SameLine(610);
|
||||
ImGui::PushItemWidth(200.0f);
|
||||
|
@ -51,7 +51,6 @@ RAII_HTTPS_Socket::RAII_HTTPS_Socket(const std::string& host) : hostname_(host)
|
||||
}
|
||||
|
||||
RAII_HTTPS_Socket::~RAII_HTTPS_Socket() {
|
||||
logging::Info("Cleaning up HTTPS socket");
|
||||
ssl_die();
|
||||
if (sock_ >= 0)
|
||||
close(sock_);
|
||||
@ -60,8 +59,9 @@ RAII_HTTPS_Socket::~RAII_HTTPS_Socket() {
|
||||
bool RAII_HTTPS_Socket::ssl_connect() {
|
||||
connection_ = SSL_new(ssl_context);
|
||||
SSL_set_fd(connection_, sock_);
|
||||
if (SSL_connect(connection_) != 1) {
|
||||
printf("SSL connection error\n");
|
||||
int ret = SSL_connect(connection_);
|
||||
if (ret != 1) {
|
||||
logging::Info("SSL connection error: %d, %d, %x\n", ret, SSL_get_error(connection_, ret), ERR_get_error());
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@ -86,10 +86,8 @@ std::string RAII_HTTPS_Socket::get(const std::string& path) {
|
||||
int rq_length = snprintf(buffer_rq.get(), rq_size, "GET %s HTTP/1.0\r\nHost: %s\r\n\r\n", path.c_str(), hostname_.c_str());
|
||||
int sent = 0;
|
||||
int chunk = 0;
|
||||
logging::Info("Writing %d bytes to socket %d", rq_length, sock_);
|
||||
do {
|
||||
chunk = SSL_write(connection_, buffer_rq.get() + sent, rq_length - sent);
|
||||
logging::Info("Written %d bytes", chunk);
|
||||
if (chunk < 0) {
|
||||
throw std::runtime_error("Error writing to Secure Socket: " + std::to_string(ERR_get_error()));
|
||||
} else if (chunk == 0) {
|
||||
|
Reference in New Issue
Block a user