#ifndef TLS_NETWORK_HPP_ #define TLS_NETWORK_HPP_ #include #include #include class NetworkManager { private: CURL* curl; CURLcode res; WebSocket& web; NetworkManager& operator=(const NetworkManager&) = delete; NetworkManager(const NetworkManager&) = delete; NetworkManager() : web(WebSocket::getInstance()) { Log::create(INFO, NETWORK, "Network init"); curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if (!curl) { Log::create(CRITICAL, NETWORK, "Failed to initialize CURL"); abort(); } } ~NetworkManager() { if (curl) { curl_easy_cleanup(curl); } curl_global_cleanup(); } static unsigned long WriteCallback(void* contents, unsigned long size, unsigned long nmemb, void* userp) { ((std::string*)userp)->append((char*)contents, size * nmemb); return size * nmemb; } public: static NetworkManager& getInstance() { Log::create(WARNING, NETWORK, "Instance event"); static NetworkManager instance; return instance; } std::string request(const std::string& method, const std::string& path, const std::string& data = "") { 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_slist* 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); if ((res = curl_easy_perform(curl)) != 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; } }; #endif