From 84844cee6c364ad38bc0c80681146ea4e3200ff1 Mon Sep 17 00:00:00 2001 From: fluttershy Date: Wed, 19 Feb 2025 18:04:49 +0500 Subject: [PATCH] network fixes --- libs/interface/Bot.hpp | 2 +- libs/network/network.cpp | 21 +++++++++------------ libs/network/network.hpp | 2 +- libs/network/websocket.cpp | 5 ++--- 4 files changed, 13 insertions(+), 17 deletions(-) diff --git a/libs/interface/Bot.hpp b/libs/interface/Bot.hpp index 5355453..3fe09a1 100644 --- a/libs/interface/Bot.hpp +++ b/libs/interface/Bot.hpp @@ -10,7 +10,7 @@ public: Discord(const nlohmann::json& data) : data(data), net(std::make_tuple(std::make_unique(data)...)) {} template _deprecated_t("Use ctx() instead") - auto& get() const { + auto& get() const { return *std::get>(net); } const auto& ctx() const { diff --git a/libs/network/network.cpp b/libs/network/network.cpp index 87e5a59..4b466a1 100644 --- a/libs/network/network.cpp +++ b/libs/network/network.cpp @@ -1,5 +1,5 @@ #include "network.hpp" -NetworkManager::NetworkManager() : curl(curl_easy_init()), res(CURLE_OK), web(WebSocket::getInstance()) { +NetworkManager::NetworkManager() : curl(curl_easy_init(), curl_easy_cleanup), res(CURLE_OK), web(WebSocket::getInstance()) { Log::create(INFO, NETWORK, "Network init"); curl_global_init(CURL_GLOBAL_DEFAULT); if (!curl) { @@ -8,9 +8,6 @@ NetworkManager::NetworkManager() : curl(curl_easy_init()), res(CURLE_OK), web(We } } NetworkManager::~NetworkManager() { - if (curl) { - curl_easy_cleanup(curl); - } curl_global_cleanup(); } auto NetworkManager::WriteCallback(void* contents, unsigned long size, unsigned long nmemb, void* userp) -> unsigned long { @@ -28,19 +25,19 @@ auto NetworkManager::getLatency() const -> unsigned long { auto NetworkManager::request(const std::string& method, const std::string& path, const std::string& data) -> std::string { std::string response; if (curl) { - curl_easy_setopt(curl, CURLOPT_URL, path.c_str()); - curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, method.c_str()); - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str()); + curl_easy_setopt(curl.get(), CURLOPT_URL, path.c_str()); + curl_easy_setopt(curl.get(), CURLOPT_CUSTOMREQUEST, method.c_str()); + curl_easy_setopt(curl.get(), CURLOPT_POSTFIELDS, data.c_str()); curl_slist* headers = nullptr; headers = curl_slist_append(headers, "Accept: application/json"); headers = curl_slist_append(headers, "Content-Type: application/json"); headers = curl_slist_append(headers, ("Authorization: " + web.getToken()).c_str()); headers = curl_slist_append(headers, "User-Agent: DiscordBot"); - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); - curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_3ONLY); - res = curl_easy_perform(curl); + curl_easy_setopt(curl.get(), CURLOPT_HTTPHEADER, headers); + curl_easy_setopt(curl.get(), CURLOPT_WRITEFUNCTION, WriteCallback); + curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &response); + curl_easy_setopt(curl.get(), CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_3ONLY); + res = curl_easy_perform(curl.get()); if (res != 0) { Log::create(ERROR, NETWORK, "curl_easy_perform() failed: " + std::string(curl_easy_strerror(res))); } diff --git a/libs/network/network.hpp b/libs/network/network.hpp index 8dff095..b44c134 100644 --- a/libs/network/network.hpp +++ b/libs/network/network.hpp @@ -5,7 +5,7 @@ #include class NetworkManager { private: - CURL* curl; + std::unique_ptr curl; CURLcode res; WebSocket& web; NetworkManager(); diff --git a/libs/network/websocket.cpp b/libs/network/websocket.cpp index 9d0fed4..62ee9bc 100644 --- a/libs/network/websocket.cpp +++ b/libs/network/websocket.cpp @@ -28,10 +28,9 @@ void EventEmitter::once(const std::string& event, const eventHandlers& handler) } void EventEmitter::off(const std::string& event, eventHandlers handler) { if (auto it = handlers.find(event); it != handlers.cend()) { - auto& vec = it->second; - vec.erase(std::ranges::remove_if(vec, [&handler](const eventHandlers& h) { + it->second.erase(std::ranges::remove_if(it->second, [&handler](const eventHandlers& h) { return h.target() == handler.target(); - }).begin(), vec.cend()); + }).begin(), it->second.cend()); } } WebSocket::WebSocket(const std::string& token, int intents, bool isBot) : token(token), intents(intents), isBot(isBot) {