#include "network.hpp" 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) { Log::create(CRITICAL, NETWORK, "Failed to initialize CURL"); abort(); } } NetworkManager::~NetworkManager() { curl_global_cleanup(); } auto NetworkManager::WriteCallback(void* contents, unsigned long size, unsigned long nmemb, void* userp) -> unsigned long { (static_cast(userp))->append(static_cast(contents), size * nmemb); return size * nmemb; } auto NetworkManager::getInstance() -> NetworkManager& { Log::create(INFO, NETWORK, "Instance event"); static NetworkManager instance; return instance; } auto NetworkManager::getLatency() const -> unsigned long { return 0; } 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.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.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))); } curl_slist_free_all(headers); } #ifdef DEBUG Log::create(INFO, NETWORK, response); #endif return response; }