From 0f05501ea340ed874ce1e1c16c7ab48ba8c14b33 Mon Sep 17 00:00:00 2001 From: fluttershy Date: Sat, 25 Jan 2025 11:22:04 +0500 Subject: [PATCH] cmake flags, some fixes in api --- CMakeLists.txt | 36 ++++++++++++++++-------------------- libs/api/Author.hpp | 28 ++++++++-------------------- libs/api/Embed.hpp | 10 +++++----- libs/api/Message.hpp | 13 ++++++++++++- libs/gateway/Websocket.hpp | 5 ++--- libs/tls/Network.hpp | 9 ++++++++- sources/main.cpp | 5 +++-- tests/tests.cpp | 15 +++++---------- 8 files changed, 59 insertions(+), 62 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1981e30..25cdd12 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,11 +31,11 @@ endif() if(CMAKE_BUILD_TYPE) if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CMAKE_CXX_FLAGS "-march=native -O0 -pipe") + set(CMAKE_CXX_FLAGS "-march=native -O0 -pipe -Wall -Werror") add_definitions(-DDEBUG) elseif(CMAKE_BUILD_TYPE STREQUAL "Release") add_definitions(-DRELEASE) - set(CMAKE_CXX_FLAGS "-march=native -O2 -pipe") + set(CMAKE_CXX_FLAGS "-march=native -O2 -pipe -Wall -Werror") endif() endif() @@ -43,15 +43,11 @@ message(STATUS "${CMAKE_BUILD_TYPE}") add_executable(${PROJECT_NAME} ${SOURCE}) #add_library(sparkles STATIC ${SOURCE}) -#add_executable(tests ${TESTS}/tests.cpp) +add_executable(tests ${TESTS}/tests.cpp) -#enable_testing() +enable_testing() -add_test(NAME network COMMAND tests) - -#target_include_directories(sparkles PRIVATE ${LIBS} ${INCLUDE} ${IXWEBSOCKET_INCLUDE_DIR} ${CURL_INCLUDE_DIRS}) - -#target_link_libraries(sparkles PRIVATE ${IXWEBSOCKET_LIBRARIES} ${CURL_LIBRARIES}) +add_test(NAME NetworkManagerTest COMMAND tests) target_include_directories(${PROJECT_NAME} PRIVATE ${LIBS} @@ -65,15 +61,15 @@ target_link_libraries(${PROJECT_NAME} PRIVATE ${CURL_LIBRARIES} ) -#target_include_directories(tests PRIVATE -# ${LIBS} -# ${INCLUDE} -# ${IXWEBSOCKET_INCLUDE_DIR} -# ${CURL_INCLUDE_DIRS} -#) +target_include_directories(tests PRIVATE + ${LIBS} + ${INCLUDE} + ${IXWEBSOCKET_INCLUDE_DIR} + ${CURL_INCLUDE_DIRS} +) -#target_link_libraries(tests gtest -# ${IXWEBSOCKET_LIBRARIES} -# ${CURL_LIBRARIES} -# gtest_main -#) \ No newline at end of file +target_link_libraries(tests gtest + ${IXWEBSOCKET_LIBRARIES} + ${CURL_LIBRARIES} + gtest_main +) \ No newline at end of file diff --git a/libs/api/Author.hpp b/libs/api/Author.hpp index d48fd8f..80100d1 100644 --- a/libs/api/Author.hpp +++ b/libs/api/Author.hpp @@ -9,6 +9,8 @@ private: WebSocket& web; NetworkManager& req; public: + const std::string channel_id, global_name, id, content, avatar, guild_id, discriminator, message_id; + bool isPinned, isBot; Author(const nlohmann::json& data) : data(data), d(data["d"]), @@ -18,26 +20,12 @@ public: global_name(functions::isNull(d["author"]["global_name"])), id(d["author"]["id"]), content(d["content"]), - isBot(d["author"].contains("bot") ? d["author"]["bot"].get() : false) - { - }; - const std::string channel_id, global_name, id, content; - bool isBot; - std::string discriminator() const { - return data["d"]["author"]["discriminator"]; - } - std::string guild_id() { - return data["d"]["guild_id"]; - } - std::string msg_id() { - return data["d"]["id"]; - } - bool isPinned() { - return data["d"]["pinned"]; - } - std::string avatar() { - return data["d"]["author"]["avatar"]; - } + avatar(data["d"]["author"]["avatar"]), + guild_id(data["d"]["guild_id"]), + discriminator(data["d"]["author"]["discriminator"]), + message_id(data["d"]["id"]), + isPinned(data["d"]["pinned"]), + isBot(d["author"].contains("bot") ? d["author"]["bot"].get() : false) {}; std::string send(const nlohmann::json& msg) { return req.request(HttpMethods::POST, DiscordEndpoints::details::latest + "/channels/" + data["d"]["channel_id"].get() + "/messages", msg.dump()); } diff --git a/libs/api/Embed.hpp b/libs/api/Embed.hpp index 24a2c1f..d689e17 100644 --- a/libs/api/Embed.hpp +++ b/libs/api/Embed.hpp @@ -18,35 +18,35 @@ public: } EmbedBuilder& addTitle(const std::string& title) { if (embed["embeds"].size() == 0) { - embed["embeds"].push_back(nlohmann::json::object()); + embed["embeds"].emplace_back(nlohmann::json::object()); } embed["embeds"].back()["title"] = title; return *this; } EmbedBuilder& addDescription(const std::string& desc) { if (embed["embeds"].size() == 0) { - embed["embeds"].push_back(nlohmann::json::object()); + embed["embeds"].emplace_back(nlohmann::json::object()); } embed["embeds"].back()["description"] = desc; return *this; } EmbedBuilder& addColor(const std::string& color) { if (embed["embeds"].size() == 0) { - embed["embeds"].push_back(nlohmann::json::object()); + embed["embeds"].emplace_back(nlohmann::json::object()); } embed["embeds"].back()["color"] = color; return *this; } EmbedBuilder& addUrl(const std::string& url) { if (embed["embeds"].size() == 0) { - embed["embeds"].push_back(nlohmann::json::object()); + embed["embeds"].emplace_back(nlohmann::json::object()); } embed["embeds"].back()["url"] = url; return *this; } EmbedBuilder& addImage(const std::string& imageurl) { if (embed["embeds"].size() == 0) { - embed["embeds"].push_back(nlohmann::json::object()); + embed["embeds"].emplace_back(nlohmann::json::object()); } embed["embeds"].back()["image"] = { {"url", imageurl} }; return *this; diff --git a/libs/api/Message.hpp b/libs/api/Message.hpp index 456b566..8c3611c 100644 --- a/libs/api/Message.hpp +++ b/libs/api/Message.hpp @@ -8,7 +8,7 @@ private: WebSocket& web; NetworkManager& req; public: - Message(const nlohmann::json& data) : data(data), web(WebSocket::getInstance()), req(NetworkManager::getInstance()) {}; + Message(const nlohmann::json& data = "") : data(data), web(WebSocket::getInstance()), req(NetworkManager::getInstance()) {}; std::string send(const std::string& id, const nlohmann::json& msg) { std::cout << id << msg << std::endl; return req.request(HttpMethods::POST, DiscordEndpoints::details::latest + "/channels/" + id + "/messages", msg.dump()); @@ -28,5 +28,16 @@ public: nlohmann::json pack(const nlohmann::json& key, const std::string& value) const { return {{ key, value }}; } + struct Api { + nlohmann::json data; + NetworkManager& req; + Api(const nlohmann::json& json = "") : data(json), req(NetworkManager::getInstance()) {}; + unsigned latency() const { + return req.getLatency(); + } + }; + std::string str() const { + return std::string(data); + } }; #endif \ No newline at end of file diff --git a/libs/gateway/Websocket.hpp b/libs/gateway/Websocket.hpp index 4f0d037..ffb574c 100644 --- a/libs/gateway/Websocket.hpp +++ b/libs/gateway/Websocket.hpp @@ -2,7 +2,6 @@ #define GATEWAY_WEBSOCKET_HPP_ #include #include -#include #include #include using namespace std::chrono; @@ -105,12 +104,12 @@ public: int getIntents() const { return WebSocket::intents; } - void on(const std::string& event, std::function handler) { + void on(const std::string&& event, std::function handler) { eventHandlers[event] = [handler](const nlohmann::json& message) { handler(message.get()); }; } - void once(const std::string& event, std::function handler) { + void once(const std::string&& event, std::function handler) { eventHandlers[event] = [event, handler, isCalled = false](const nlohmann::json& message) mutable { isCalled == false ? isCalled = true : 0, handler(message.get()); }; diff --git a/libs/tls/Network.hpp b/libs/tls/Network.hpp index c2ef6a3..ae909f5 100644 --- a/libs/tls/Network.hpp +++ b/libs/tls/Network.hpp @@ -8,6 +8,7 @@ private: CURL* curl; CURLcode res; WebSocket& web; + std::chrono::duration duration; NetworkManager& operator=(const NetworkManager&) = delete; NetworkManager(const NetworkManager&) = delete; NetworkManager() : web(WebSocket::getInstance()) { @@ -35,13 +36,17 @@ public: static NetworkManager instance; return instance; } + unsigned long getLatency() const { + return duration.count(); + } 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"); + 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"); @@ -49,8 +54,10 @@ public: 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); + auto start = std::chrono::steady_clock::now(); 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); + duration = std::chrono::steady_clock::now() - start; } #ifdef DEBUG Log::create(INFO, NETWORK, response); diff --git a/sources/main.cpp b/sources/main.cpp index ffdd3ea..91870d3 100644 --- a/sources/main.cpp +++ b/sources/main.cpp @@ -6,9 +6,10 @@ int main(int argc, char* argv[]) { bot->on(GatewayEvents::READY, [](const Discord& a) { std::cout << DiscordEndpoints::details::latest << std::endl; }); - bot->on(GatewayEvents::MESSAGE_CREATE, [bot](const Discord& msg) { + bot->on(GatewayEvents::MESSAGE_CREATE, [](const Discord& msg) { if (msg.get<2>().isBot == false) { - msg.get<0>().send("939957962972229634", msg.get<0>().pack("content", msg.get<2>().global_name)); + msg.get<0>().send("939957962972229634", msg.get<0>().pack("content", std::to_string(msg.get<3>().latency()) + "ms")); + msg.get<0>().send("939957962972229634", msg.get<0>().pack("content", msg.get<2>().avatar)); } }); bot->start(); diff --git a/tests/tests.cpp b/tests/tests.cpp index b863039..5a07259 100644 --- a/tests/tests.cpp +++ b/tests/tests.cpp @@ -1,12 +1,7 @@ #include -int add(int a, int b) { - return a + b; -} -TEST(AddTest, PositiveNumbers) { - EXPECT_EQ(add(1, 2), 3); - EXPECT_EQ(add(2, 3), 5); -} -TEST(AddTest, NegativeNumbers) { - EXPECT_EQ(add(-1, -1), -2); - EXPECT_EQ(add(-1, 1), 0); +#include +#include +TEST(NetworkManagerTest, RequestReturnsExpectedValue) { + NetworkManager& networkManager = NetworkManager::getInstance(); + EXPECT_FALSE(networkManager.request(HttpMethods::POST, DiscordEndpoints::details::latest + "/channels/939957962972229634/messages", { "content", "test" }).empty()); } \ No newline at end of file