From caf9cd17af514901b3d395bb00a8bc16e3f0bc27 Mon Sep 17 00:00:00 2001 From: fluttershy <a@a.a> Date: Sat, 18 Jan 2025 05:42:08 +0500 Subject: [PATCH 1/3] tests amd cmake update --- CMakeLists.txt | 32 +++++++++++++++++++++++++++++++- sources/main.cpp | 44 +++++++++++++++++++++++++++++++++++--------- tests/tests.cpp | 12 ++++++++++++ 3 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 tests/tests.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b83775..31c1a5e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,23 +2,40 @@ cmake_minimum_required(VERSION 3.10) project(sparkle) +include(GoogleTest) + set(SOURCE sources/main.cpp) set(LIBS ${CMAKE_SOURCE_DIR}/libs/) set(INCLUDE ${CMAKE_SOURCE_DIR}/include/) +set(TESTS ${CMAKE_SOURCE_DIR}/tests) find_package(CURL REQUIRED) find_path(IXWEBSOCKET_INCLUDE_DIR ixwebsocket) find_library(IXWEBSOCKET_LIBRARIES ixwebsocket) +message(STATUS "IXWEBSOCKET_LIBRARIES: ${IXWEBSOCKET_LIBRARIES}") +message(STATUS "CURL_LIBRARIES: ${CURL_LIBRARIES}") + + if(NOT IXWEBSOCKET_INCLUDE_DIR OR NOT IXWEBSOCKET_LIBRARIES) message(FATAL_ERROR "ixwebsocket not found") endif() if(NOT CURL_INCLUDE_DIRS OR NOT CURL_LIBRARIES) - message(FATAL_ERROR "nghttp2 not found") + message(FATAL_ERROR "curl not found") endif() add_executable(${PROJECT_NAME} ${SOURCE}) +#add_library(sparkles STATIC ${SOURCE}) +add_executable(tests ${TESTS}/tests.cpp) + +#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}) target_include_directories(${PROJECT_NAME} PRIVATE ${LIBS} @@ -32,6 +49,19 @@ target_link_libraries(${PROJECT_NAME} PRIVATE ${CURL_LIBRARIES} ) +target_include_directories(tests PRIVATE + ${LIBS} + ${INCLUDE} + ${IXWEBSOCKET_INCLUDE_DIR} + ${CURL_INCLUDE_DIRS} +) + +target_link_libraries(tests gtest + ${IXWEBSOCKET_LIBRARIES} + ${CURL_LIBRARIES} + gtest_main +) + set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED True) set(CMAKE_CXX_FLAGS "-march=native -O2 -pipe") diff --git a/sources/main.cpp b/sources/main.cpp index 15bb1e3..5ef0e39 100644 --- a/sources/main.cpp +++ b/sources/main.cpp @@ -2,17 +2,43 @@ #include <includes.h> int main(int argc, char* argv[]) { if (argc != 3) return -1; - WebSocket* bot = &WebSocket::getInstance(argv[2], GatewayIntents::AllIntents); + WebSocket* bot = &WebSocket::getInstance(argv[2], GatewayIntents::AllIntents, false); bot->on(GatewayEvents::READY, [](const Bot<Message, User, Author>& msg) { - if (!g(2, msg.net)->isBot()) { - cout << g(0, msg.net)->send("939957962972229634", j("content", "asd")) << endl; - } - }); - bot->on(GatewayEvents::MESSAGE_CREATE, [](const Bot<Message, User, Author>& msg) { - if (!g(2, msg.net)->isBot()) { - cout << g(0, msg.net)->send("939957962972229634", j("content", g(2, msg.net)->content())) << endl; + std::string lastID = "1292591828888977589"; + while (true) { + std::vector<std::string> ids; + std::cout << "Last ID: " << lastID << std::endl; + json js = json::parse(g(0, msg.net)->getMessages("956854968260890654", "100", lastID)); + if (js.is_array() && !js.empty()) { + for (const auto& message : js) { + if (message["author"]["id"] == "956790566463614986") { + std::cout << "My message ID: " << message["id"].get<std::string>() << std::endl; + ids.push_back(message["id"].get<std::string>()); + } + lastID = message["id"].get<std::string>(); + } + if (ids.size() > 1) { + for (size_t x = 0; x < ids.size(); x++) { + try { + json jss = json::parse(g(0, msg.net)->deleteMessage("956854968260890654", ids[x])); + if (jss["code"].get<string>() == "20028") { + std::this_thread::sleep_for(10s); + } + std::cout << "Delete response: " << jss["message"] << ":" << jss["code"] << std::endl; + } + catch (...) { + std::cout << "DELETED" << std::endl; + } + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + } + } + } + else { + std::cout << "No messages found or error in response." << std::endl; + } + //std::this_thread::sleep_for(std::chrono::milliseconds(10)); } }); bot->start(); return 0; -} \ No newline at end of file +} diff --git a/tests/tests.cpp b/tests/tests.cpp new file mode 100644 index 0000000..b863039 --- /dev/null +++ b/tests/tests.cpp @@ -0,0 +1,12 @@ +#include <gtest/gtest.h> +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); +} \ No newline at end of file From a6c535e78414fb89ccc48c047fcaefefb47a75ef Mon Sep 17 00:00:00 2001 From: fluttershy <a@a.a> Date: Sat, 18 Jan 2025 23:31:16 +0500 Subject: [PATCH 2/3] cmake update and logs --- CMakeLists.txt | 18 ++++++++++++++++-- libs/utils/logs.hpp | 21 +++++++++++++-------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 31c1a5e..a58e3e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,14 +8,28 @@ set(SOURCE sources/main.cpp) set(LIBS ${CMAKE_SOURCE_DIR}/libs/) set(INCLUDE ${CMAKE_SOURCE_DIR}/include/) set(TESTS ${CMAKE_SOURCE_DIR}/tests) +set(CMAKE_C_COMPILER "clang") +set(CMAKE_CXX_COMPILER "clang++") find_package(CURL REQUIRED) find_path(IXWEBSOCKET_INCLUDE_DIR ixwebsocket) find_library(IXWEBSOCKET_LIBRARIES ixwebsocket) +find_program(CMAKE_C_COMPILER clang) +find_program(CLANG_CXX_COMPILER clang++) -message(STATUS "IXWEBSOCKET_LIBRARIES: ${IXWEBSOCKET_LIBRARIES}") -message(STATUS "CURL_LIBRARIES: ${CURL_LIBRARIES}") +message(STATUS "ixwebsocket: ${IXWEBSOCKET_LIBRARIES}") +message(STATUS "curl: ${CURL_LIBRARIES}") +if(NOT CMAKE_C_COMPILER OR NOT CLANG_CXX_COMPILER) + message(STATUS "clang not found") + set(CMAKE_C_COMPILER "gcc") + set(CMAKE_CXX_COMPILER "g++") + find_program(CMAKE_C_COMPILER clang) + find_program(CLANG_CXX_COMPILER clang++) + if(NOT CMAKE_C_COMPILER OR NOT CLANG_CXX_COMPILER) + message(FATAL_ERROR "gcc not found") + endif() +endif() if(NOT IXWEBSOCKET_INCLUDE_DIR OR NOT IXWEBSOCKET_LIBRARIES) message(FATAL_ERROR "ixwebsocket not found") diff --git a/libs/utils/logs.hpp b/libs/utils/logs.hpp index d7b4671..51f5682 100644 --- a/libs/utils/logs.hpp +++ b/libs/utils/logs.hpp @@ -6,8 +6,8 @@ #include <iomanip> #include <ctime> using std::setfill, std::setw; -enum level { INFO, WARNING, ERROR }; -enum type { WEBSOCKET, NETWORK }; +enum level { INFO, WARNING, ERROR, CRITICAL }; +enum type { WEBSOCKET, NETWORK, API }; class Logs { public: static void create(level lvl, type t, const std::string& message) { @@ -15,19 +15,22 @@ public: std::string color; switch (lvl) { case INFO: - color = "\033[34m"; + color = "\033[34;1m"; break; case WARNING: - color = "\033[33m"; + color = "\033[33;1m"; break; case ERROR: - color = "\033[31m"; + color = "\033[31;1m"; + break; + case CRITICAL: + color = "\033[31;1;2m"; break; default: color = "\033[0m"; break; } - std::cout << color << "[" << getCurrentTime() << "][" << str(t) << "][" << str(lvl) << "] \033[37m" << message << "\033[0m" << std::endl; + std::cout << color << "[" << getCurrentTime() << "][" << str(t) << "][" << str(lvl) << "] \033[0m" << message << "\033[0m" << std::endl; #endif } private: @@ -38,18 +41,20 @@ private: oss << setfill('0') << setw(2) << timer->tm_hour << ":" << setfill('0') << setw(2) << timer->tm_min << ":" << setfill('0') << setw(2) << timer->tm_sec; return oss.str(); } - static std::string str(level lvl) { + static std::string str(const level& lvl) { switch (lvl) { case INFO: return "INFO"; case WARNING: return "WARNING"; case ERROR: return "ERROR"; + case CRITICAL: return "CRITICAL"; default: return "UNKNOWN"; } } - static std::string str(type t) { + static std::string str(const type& t) { switch (t) { case WEBSOCKET: return "WEBSOCKET"; case NETWORK: return "NETWORK"; + case API: return "API"; default: return "UNKNOWN"; } } From 3f97369f039cd0995d58ebfdce368866cef40e9e Mon Sep 17 00:00:00 2001 From: fluttershy <a@a.a> Date: Sun, 19 Jan 2025 04:35:20 +0500 Subject: [PATCH 3/3] code cleanup --- CMakeLists.txt | 2 +- include/includes.h | 2 +- libs/api/Author.hpp | 2 +- libs/api/Bot.hpp | 8 +- libs/api/Channel.hpp | 2 +- libs/api/Message.hpp | 10 +- libs/api/User.hpp | 2 +- libs/gateway/Websocket.hpp | 95 ++-------------- libs/tls/Network.hpp | 14 +-- libs/utils/enums.hpp | 179 ++++++++++++++++++------------- libs/utils/{logs.hpp => log.hpp} | 18 ++-- libs/utils/types.hpp | 3 +- 12 files changed, 145 insertions(+), 192 deletions(-) rename libs/utils/{logs.hpp => log.hpp} (88%) diff --git a/CMakeLists.txt b/CMakeLists.txt index a58e3e8..fe0f4c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,4 +79,4 @@ target_link_libraries(tests gtest set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED True) set(CMAKE_CXX_FLAGS "-march=native -O2 -pipe") -#set(CMAKE_CXX_FLAGS "-O0 -pipe") +#set(CMAKE_CXX_FLAGS "-O0 -pipe") \ No newline at end of file diff --git a/include/includes.h b/include/includes.h index fb60bf7..2823bd0 100644 --- a/include/includes.h +++ b/include/includes.h @@ -2,7 +2,7 @@ #define INCLUDE_INCLUDES_H_ #include <utils/types.hpp> #include <utils/json.hpp> -#include <utils/logs.hpp> +#include <utils/log.hpp> #include <utils/enums.hpp> #include <iostream> #include <string> diff --git a/libs/api/Author.hpp b/libs/api/Author.hpp index cc6ab41..074e40e 100644 --- a/libs/api/Author.hpp +++ b/libs/api/Author.hpp @@ -51,7 +51,7 @@ public: return data["d"]["author"]["avatar"]; } string send(const json& msg) { - return req.request("POST", dapi + "/channels/" + data["d"]["channel_id"].get<string>() + "/messages", msg.dump()); + return req.request(HttpMethods::POST, DiscordEndpoints::details::latest + "/channels/" + data["d"]["channel_id"].get<string>() + "/messages", msg.dump()); } }; #endif \ No newline at end of file diff --git a/libs/api/Bot.hpp b/libs/api/Bot.hpp index dbac131..b79a2d6 100644 --- a/libs/api/Bot.hpp +++ b/libs/api/Bot.hpp @@ -3,7 +3,7 @@ #include <includes.h> using std::string, std::cout, std::endl, nlohmann::json; template<typename...Args> -class Bot { +class Discord { private: void initializeNets(const json& data) { initializeNetsImpl(data, std::index_sequence_for<Args...>{}); @@ -15,15 +15,15 @@ private: json data; public: std::tuple<std::unique_ptr<Args>...> net; - Bot(const json& data) : data(data) { + Discord(const json& data) : data(data) { initializeNets(data); } }; -class BotHandler : Bot<> { +class Bot { private: json data; public: - BotHandler(const json& data) : data(data), Bot(data) {}; + Bot(const json& data) : data(data) {}; string id() { return data["d"]["id"]; } diff --git a/libs/api/Channel.hpp b/libs/api/Channel.hpp index 343ca55..f4f81e0 100644 --- a/libs/api/Channel.hpp +++ b/libs/api/Channel.hpp @@ -11,7 +11,7 @@ private: public: Channel(const json& data = "") : data(data), web(WebSocket::getInstance()), req(NetworkManager::getInstance()) {} string send(const json& msg) { - return req.request("POST", dapi + "/channels/" + data["d"]["channel_id"].get<string>() + "/messages", msg.dump()); + return req.request(HttpMethods::POST, DiscordEndpoints::details::latest + "/channels/" + data["d"]["channel_id"].get<string>() + "/messages", msg.dump()); } }; #endif \ No newline at end of file diff --git a/libs/api/Message.hpp b/libs/api/Message.hpp index 08b3701..98a1ed9 100644 --- a/libs/api/Message.hpp +++ b/libs/api/Message.hpp @@ -11,19 +11,19 @@ private: public: Message(const json& data) : data(data), web(WebSocket::getInstance()), req(NetworkManager::getInstance()) {}; string send(const string& id, const json& msg) { - return req.request("POST", dapi + "/channels/" + id + "/messages", msg.dump()); + return req.request(HttpMethods::POST, DiscordEndpoints::details::latest + "/channels/" + id + "/messages", msg.dump()); } string getMessages(const string& id, const string& count, const string& before = "") { if (before.empty()) { - return req.request("GET", dapi + "/channels/" + id + "/messages?limit=" + count); + return req.request(HttpMethods::GET, DiscordEndpoints::details::latest + "/channels/" + id + "/messages?limit=" + count); } else { - return req.request("GET", dapi + "/channels/" + id + "/messages?before=" + before + "&limit=" + count); + return req.request(HttpMethods::GET, DiscordEndpoints::details::latest + "/channels/" + id + "/messages?before=" + before + "&limit=" + count); } - return "pizda"; + return ""; } string deleteMessage(const string& channel_id, const string& message_id) { - return req.request("DELETE", dapi + "/channels/" + channel_id + "/messages/" + message_id); + return req.request(HttpMethods::DELETE, DiscordEndpoints::details::latest + "/channels/" + channel_id + "/messages/" + message_id); } }; #endif \ No newline at end of file diff --git a/libs/api/User.hpp b/libs/api/User.hpp index fa18587..02bfe38 100644 --- a/libs/api/User.hpp +++ b/libs/api/User.hpp @@ -26,7 +26,7 @@ public: return current; } virtual string me() { - return req.request("GET", dapi + "/users/@me"); + return req.request(HttpMethods::GET, DiscordEndpoints::details::latest + "/users/@me"); } bool isBot() { try { diff --git a/libs/gateway/Websocket.hpp b/libs/gateway/Websocket.hpp index 61ff9a8..e9baa28 100644 --- a/libs/gateway/Websocket.hpp +++ b/libs/gateway/Websocket.hpp @@ -10,87 +10,12 @@ using namespace std::chrono; using namespace std::chrono_literals; class WebSocket { private: - const std::array<std::pair<const int, std::string_view>, 73> events = { { - {APPLICATION_COMMAND_PERMISSIONS_UPDATE, "APPLICATION_COMMAND_PERMISSIONS_UPDATE"}, - {AUTO_MODERATION_ACTION_EXECUTION, "AUTO_MODERATION_ACTION_EXECUTION"}, - {AUTO_MODERATION_RULE_CREATE, "AUTO_MODERATION_RULE_CREATE"}, - {AUTO_MODERATION_RULE_DELETE, "AUTO_MODERATION_RULE_DELETE"}, - {AUTO_MODERATION_RULE_UPDATE, "AUTO_MODERATION_RULE_UPDATE"}, - {CHANNEL_CREATE, "CHANNEL_CREATE"}, - {CHANNEL_DELETE, "CHANNEL_DELETE"}, - {CHANNEL_PINS_UPDATE, "CHANNEL_PINS_UPDATE"}, - {CHANNEL_UPDATE, "CHANNEL_UPDATE"}, - {ENTITLEMENT_CREATE, "ENTITLEMENT_CREATE"}, - {ENTITLEMENT_DELETE, "ENTITLEMENT_DELETE"}, - {ENTITLEMENT_UPDATE, "ENTITLEMENT_UPDATE"}, - {GUILD_AUDIT_LOG_ENTRY_CREATE, "GUILD_AUDIT_LOG_ENTRY_CREATE"}, - {GUILD_BAN_ADD, "GUILD_BAN_ADD"}, - {GUILD_BAN_REMOVE, "GUILD_BAN_REMOVE"}, - {GUILD_CREATE, "GUILD_CREATE"}, - {GUILD_DELETE, "GUILD_DELETE"}, - {GUILD_EMOJIS_UPDATE, "GUILD_EMOJIS_UPDATE"}, - {GUILD_INTEGRATIONS_UPDATE, "GUILD_INTEGRATIONS_UPDATE"}, - {GUILD_MEMBER_ADD, "GUILD_MEMBER_ADD"}, - {GUILD_MEMBER_REMOVE, "GUILD_MEMBER_REMOVE"}, - {GUILD_MEMBERS_CHUNK, "GUILD_MEMBERS_CHUNK"}, - {GUILD_MEMBER_UPDATE, "GUILD_MEMBER_UPDATE"}, - {GUILD_ROLE_CREATE, "GUILD_ROLE_CREATE"}, - {GUILD_ROLE_DELETE, "GUILD_ROLE_DELETE"}, - {GUILD_ROLE_UPDATE, "GUILD_ROLE_UPDATE"}, - {GUILD_SCHEDULED_EVENT_CREATE, "GUILD_SCHEDULED_EVENT_CREATE"}, - {GUILD_SCHEDULED_EVENT_DELETE, "GUILD_SCHEDULED_EVENT_DELETE"}, - {GUILD_SCHEDULED_EVENT_UPDATE, "GUILD_SCHEDULED_EVENT_UPDATE"}, - {GUILD_SCHEDULED_EVENT_USER_REMOVE, "GUILD_SCHEDULED_EVENT_USER_REMOVE"}, - {GUILD_SOUNDBOARD_SOUND_CREATE, "GUILD_SOUNDBOARD_SOUND_CREATE"}, - {GUILD_SOUNDBOARD_SOUND_DELETE, "GUILD_SOUNDBOARD_SOUND_DELETE"}, - {GUILD_SOUNDBOARD_SOUNDS_UPDATE, "GUILD_SOUNDBOARD_SOUNDS_UPDATE"}, - {GUILD_SOUNDBOARD_SOUND_UPDATE, "GUILD_SOUNDBOARD_SOUND_UPDATE"}, - {SOUNDBOARD_SOUNDS, "SOUNDBOARD_SOUNDS"}, - {GUILD_STICKERS_UPDATE, "GUILD_STICKERS_UPDATE"}, - {GUILD_UPDATE, "GUILD_UPDATE"}, - {INTEGRATION_CREATE, "INTEGRATION_CREATE"}, - {INTEGRATION_DELETE, "INTEGRATION_DELETE"}, - {INTEGRATION_UPDATE, "INTEGRATION_UPDATE"}, - {INVITE_CREATE, "INVITE_CREATE"}, - {INVITE_DELETE, "INVITE_DELETE"}, - {MESSAGE_CREATE, "MESSAGE_CREATE"}, - {MESSAGE_DELETE, "MESSAGE_DELETE"}, - {MESSAGE_DELETE_BULK, "MESSAGE_DELETE_BULK"}, - {MESSAGE_POLL_VOTE_ADD, "MESSAGE_POLL_VOTE_ADD"}, - {MESSAGE_POLL_VOTE_REMOVE, "MESSAGE_POLL_VOTE_REMOVE"}, - {MESSAGE_REACTION_ADD, "MESSAGE_REACTION_ADD"}, - {MESSAGE_REACTION_REMOVE, "MESSAGE_REACTION_REMOVE"}, - {MESSAGE_REACTION_REMOVE_ALL, "MESSAGE_REACTION_REMOVE_ALL"}, - {MESSAGE_REACTION_REMOVE_EMOJI, "MESSAGE_REACTION_REMOVE_EMOJI"}, - {MESSAGE_UPDATE, "MESSAGE_UPDATE"}, - {PRESENCE_UPDATE, "PRESENCE_UPDATE"}, - {READY, "READY"}, - {RESUMED, "RESUMED"}, - {STAGE_INSTANCE_CREATE, "STAGE_INSTANCE_CREATE"}, - {STAGE_INSTANCE_DELETE, "STAGE_INSTANCE_DELETE"}, - {SUBSCRIPTION_CREATE, "SUBSCRIPTION_CREATE"}, - {STAGE_INSTANCE_UPDATE, "STAGE_INSTANCE_UPDATE"}, - {SUBSCRIPTION_DELETE, "SUBSCRIPTION_DELETE"}, - {SUBSCRIPTION_UPDATE, "SUBSCRIPTION_UPDATE"}, - {THREAD_CREATE, "THREAD_CREATE"}, - {THREAD_DELETE, "THREAD_DELETE"}, - {THREAD_LIST_SYNC, "THREAD_LIST_SYNC"}, - {THREAD_MEMBERS_UPDATE, "THREAD_MEMBERS_UPDATE"}, - {THREAD_MEMBER_UPDATE, "THREAD_MEMBER_UPDATE"}, - {THREAD_UPDATE, "THREAD_UPDATE"}, - {TYPING_START, "TYPING_START"}, - {USER_UPDATE, "USER_UPDATE"}, - {VOICE_CHANNEL_EFFECT_SEND, "VOICE_CHANNEL_EFFECT_SEND"}, - {VOICE_SERVER_UPDATE, "VOICE_SERVER_UPDATE"}, - {VOICE_STATE_UPDATE, "VOICE_STATE_UPDATE"}, - {WEBHOOKS_UPDATE, "WEBHOOKS_UPDATE"} - }}; bool isBot; int intents; std::string token; ix::WebSocket webSocket; json payload = { {"op", 1},{"d", nullptr} }, id; - std::unordered_map<std::string_view, std::function<void(const json&)>> eventHandlers; + std::unordered_map<std::string, std::function<void(const json&)>> eventHandlers; WebSocket& operator=(const WebSocket&) = delete; WebSocket(const WebSocket&) = delete; WebSocket(const std::string& token, const int& intents, bool& isBot) { @@ -124,20 +49,18 @@ private: ix::initNetSystem(); webSocket.setUrl("wss://gateway.discord.gg/?v=10&encoding=json"); webSocket.setHandshakeTimeout(5); - Logs::create(INFO, WEBSOCKET, "ixwebsocket init"); + Log::create(INFO, WEBSOCKET, "ixwebsocket init"); webSocket.setOnMessageCallback([this, res = json(), heartbeat_interval = 0, connected = false](const ix::WebSocketMessagePtr& msg) mutable { if (msg->type == ix::WebSocketMessageType::Message) { res = json::parse(msg->str); - //#ifdef DEBUG - Logs::create(INFO, WEBSOCKET, res["op"].dump() + " " + res["t"].dump()); - //#endif + Log::create(INFO, WEBSOCKET, res["op"].dump() + " " + res["t"].dump()); switch (res["op"].get<int>()) { case 10: heartbeat_interval = res["d"]["heartbeat_interval"].get<int>(); !connected ? connected = true, webSocket.send(id.dump()) : 0; std::thread([this, &heartbeat_interval, &connected]() { while (connected && heartbeat_interval != -1) { - Logs::create(INFO, WEBSOCKET, "Heartbeat " + std::to_string(heartbeat_interval)); + Log::create(INFO, WEBSOCKET, "Heartbeat " + std::to_string(heartbeat_interval)); std::this_thread::sleep_for(milliseconds(heartbeat_interval)); webSocket.send(payload.dump()); } @@ -169,7 +92,7 @@ public: } */ static WebSocket& getInstance(const std::string& token = "", const int intents = 0, bool bot = true) { - Logs::create(WARNING, WEBSOCKET, "Instance event"); + Log::create(WARNING, WEBSOCKET, "Instance event"); static WebSocket instance(token, intents, bot); return instance; } @@ -183,13 +106,13 @@ public: int getIntents() const { return WebSocket::intents; } - void on(const int event, std::function<void(const json&&)> handler) { - eventHandlers[events[event].second] = [handler](const json& message) { + void on(const string& event, std::function<void(const json&)> handler) { + eventHandlers[event] = [handler](const json& message) { handler(message.get<json>()); }; } - void once(const int event, std::function<void(const json&&)> handler) { - eventHandlers[events[event].second] = [event, handler, isCalled = false](const json& message) mutable { + void once(const string& event, std::function<void(const json&)> handler) { + eventHandlers[event] = [event, handler, isCalled = false](const json& message) mutable { isCalled == false ? isCalled = true : 0, handler(message.get<json>()); }; } diff --git a/libs/tls/Network.hpp b/libs/tls/Network.hpp index 950fecd..f278ce3 100644 --- a/libs/tls/Network.hpp +++ b/libs/tls/Network.hpp @@ -12,11 +12,11 @@ private: NetworkManager& operator=(const NetworkManager&) = delete; NetworkManager(const NetworkManager&) = delete; NetworkManager() : web(WebSocket::getInstance()) { - Logs::create(INFO, NETWORK, "Network init"); + Log::create(INFO, NETWORK, "Network init"); curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if (!curl) { - Logs::create(ERROR, NETWORK, "Failed to initialize CURL"); + Log::create(ERROR, NETWORK, "Failed to initialize CURL"); abort(); } } @@ -32,25 +32,25 @@ private: } public: static NetworkManager& getInstance() { - Logs::create(WARNING, NETWORK, "Instance event"); + 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, string("https://discord.com" + path).c_str()); + 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_2_0); - res = curl_easy_perform(curl); - if (res != 0) Logs::create(ERROR, NETWORK, "curl_easy_perform() failed: " + std::string(curl_easy_strerror(res))); + 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); } return response; diff --git a/libs/utils/enums.hpp b/libs/utils/enums.hpp index 54cb51a..13ecf92 100644 --- a/libs/utils/enums.hpp +++ b/libs/utils/enums.hpp @@ -1,79 +1,107 @@ #ifndef UTILS_EVENTS_HPP_ #define UTILS_EVENTS_HPP_ -enum GatewayEvents { - APPLICATION_COMMAND_PERMISSIONS_UPDATE, - AUTO_MODERATION_ACTION_EXECUTION, - AUTO_MODERATION_RULE_CREATE, - AUTO_MODERATION_RULE_DELETE, - AUTO_MODERATION_RULE_UPDATE, - CHANNEL_CREATE, - CHANNEL_DELETE, - CHANNEL_PINS_UPDATE, - CHANNEL_UPDATE, - ENTITLEMENT_CREATE, - ENTITLEMENT_DELETE, - ENTITLEMENT_UPDATE, - GUILD_AUDIT_LOG_ENTRY_CREATE, - GUILD_BAN_ADD, - GUILD_BAN_REMOVE, - GUILD_CREATE, - GUILD_DELETE, - GUILD_EMOJIS_UPDATE, - GUILD_INTEGRATIONS_UPDATE, - GUILD_MEMBER_ADD, - GUILD_MEMBER_REMOVE, - GUILD_MEMBERS_CHUNK, - GUILD_MEMBER_UPDATE, - GUILD_ROLE_CREATE, - GUILD_ROLE_DELETE, - GUILD_ROLE_UPDATE, - GUILD_SCHEDULED_EVENT_CREATE, - GUILD_SCHEDULED_EVENT_DELETE, - GUILD_SCHEDULED_EVENT_UPDATE, - GUILD_SCHEDULED_EVENT_USER_REMOVE, - GUILD_SOUNDBOARD_SOUND_CREATE, - GUILD_SOUNDBOARD_SOUND_DELETE, - GUILD_SOUNDBOARD_SOUNDS_UPDATE, - GUILD_SOUNDBOARD_SOUND_UPDATE, - SOUNDBOARD_SOUNDS, - GUILD_STICKERS_UPDATE, - GUILD_UPDATE, - INTEGRATION_CREATE, - INTEGRATION_DELETE, - INTEGRATION_UPDATE, - INVITE_CREATE, - INVITE_DELETE, - MESSAGE_CREATE, - MESSAGE_DELETE, - MESSAGE_DELETE_BULK, - MESSAGE_POLL_VOTE_ADD, - MESSAGE_POLL_VOTE_REMOVE, - MESSAGE_REACTION_ADD, - MESSAGE_REACTION_REMOVE, - MESSAGE_REACTION_REMOVE_ALL, - MESSAGE_REACTION_REMOVE_EMOJI, - MESSAGE_UPDATE, - PRESENCE_UPDATE, - READY, - RESUMED, - STAGE_INSTANCE_CREATE, - STAGE_INSTANCE_DELETE, - STAGE_INSTANCE_UPDATE, - SUBSCRIPTION_CREATE, - SUBSCRIPTION_DELETE, - SUBSCRIPTION_UPDATE, - THREAD_CREATE, - THREAD_DELETE, - THREAD_LIST_SYNC, - THREAD_MEMBERS_UPDATE, - THREAD_MEMBER_UPDATE, - THREAD_UPDATE, - TYPING_START, - USER_UPDATE, - VOICE_CHANNEL_EFFECT_SEND, - VOICE_SERVER_UPDATE, - VOICE_STATE_UPDATE, - WEBHOOKS_UPDATE +struct GatewayEvents { + static constexpr const char* APPLICATION_COMMAND_PERMISSIONS_UPDATE = "APPLICATION_COMMAND_PERMISSIONS_UPDATE"; + static constexpr const char* AUTO_MODERATION_ACTION_EXECUTION = "AUTO_MODERATION_ACTION_EXECUTION"; + static constexpr const char* AUTO_MODERATION_RULE_CREATE = "AUTO_MODERATION_RULE_CREATE"; + static constexpr const char* AUTO_MODERATION_RULE_DELETE = "AUTO_MODERATION_RULE_DELETE"; + static constexpr const char* AUTO_MODERATION_RULE_UPDATE = "AUTO_MODERATION_RULE_UPDATE"; + static constexpr const char* CHANNEL_CREATE = "CHANNEL_CREATE"; + static constexpr const char* CHANNEL_DELETE = "CHANNEL_DELETE"; + static constexpr const char* CHANNEL_PINS_UPDATE = "CHANNEL_PINS_UPDATE"; + static constexpr const char* CHANNEL_UPDATE = "CHANNEL_UPDATE"; + static constexpr const char* ENTITLEMENT_CREATE = "ENTITLEMENT_CREATE"; + static constexpr const char* ENTITLEMENT_DELETE = "ENTITLEMENT_DELETE"; + static constexpr const char* ENTITLEMENT_UPDATE = "ENTITLEMENT_UPDATE"; + static constexpr const char* GUILD_AUDIT_LOG_ENTRY_CREATE = "GUILD_AUDIT_LOG_ENTRY_CREATE"; + static constexpr const char* GUILD_BAN_ADD = "GUILD_BAN_ADD"; + static constexpr const char* GUILD_BAN_REMOVE = "GUILD_BAN_REMOVE"; + static constexpr const char* GUILD_CREATE = "GUILD_CREATE"; + static constexpr const char* GUILD_DELETE = "GUILD_DELETE"; + static constexpr const char* GUILD_EMOJIS_UPDATE = "GUILD_EMOJIS_UPDATE"; + static constexpr const char* GUILD_INTEGRATIONS_UPDATE = "GUILD_INTEGRATIONS_UPDATE"; + static constexpr const char* GUILD_MEMBER_ADD = "GUILD_MEMBER_ADD"; + static constexpr const char* GUILD_MEMBER_REMOVE = "GUILD_MEMBER_REMOVE"; + static constexpr const char* GUILD_MEMBERS_CHUNK = "GUILD_MEMBERS_CHUNK"; + static constexpr const char* GUILD_MEMBER_UPDATE = "GUILD_MEMBER_UPDATE"; + static constexpr const char* GUILD_ROLE_CREATE = "GUILD_ROLE_CREATE"; + static constexpr const char* GUILD_ROLE_DELETE = "GUILD_ROLE_DELETE"; + static constexpr const char* GUILD_ROLE_UPDATE = "GUILD_ROLE_UPDATE"; + static constexpr const char* GUILD_SCHEDULED_EVENT_CREATE = "GUILD_SCHEDULED_EVENT_CREATE"; + static constexpr const char* GUILD_SCHEDULED_EVENT_DELETE = "GUILD_SCHEDULED_EVENT_DELETE"; + static constexpr const char* GUILD_SCHEDULED_EVENT_UPDATE = "GUILD_SCHEDULED_EVENT_UPDATE"; + static constexpr const char* GUILD_SCHEDULED_EVENT_USER_REMOVE = "GUILD_SCHEDULED_EVENT_USER_REMOVE"; + static constexpr const char* GUILD_SOUNDBOARD_SOUND_CREATE = "GUILD_SOUNDBOARD_SOUND_CREATE"; + static constexpr const char* GUILD_SOUNDBOARD_SOUND_DELETE = "GUILD_SOUNDBOARD_SOUND_DELETE"; + static constexpr const char* GUILD_SOUNDBOARD_SOUNDS_UPDATE = "GUILD_SOUNDBOARD_SOUNDS_UPDATE"; + static constexpr const char* GUILD_SOUNDBOARD_SOUND_UPDATE = "GUILD_SOUNDBOARD_SOUND_UPDATE"; + static constexpr const char* SOUNDBOARD_SOUNDS = "SOUNDBOARD_SOUNDS"; + static constexpr const char* GUILD_STICKERS_UPDATE = "GUILD_STICKERS_UPDATE"; + static constexpr const char* GUILD_UPDATE = "GUILD_UPDATE"; + static constexpr const char* INTEGRATION_CREATE = "INTEGRATION_CREATE"; + static constexpr const char* INTEGRATION_DELETE = "INTEGRATION_DELETE"; + static constexpr const char* INTEGRATION_UPDATE = "INTEGRATION_UPDATE"; + static constexpr const char* INVITE_CREATE = "INVITE_CREATE"; + static constexpr const char* INVITE_DELETE = "INVITE_DELETE"; + static constexpr const char* MESSAGE_CREATE = "MESSAGE_CREATE"; + static constexpr const char* MESSAGE_DELETE = "MESSAGE_DELETE"; + static constexpr const char* MESSAGE_DELETE_BULK = "MESSAGE_DELETE_BULK"; + static constexpr const char* MESSAGE_POLL_VOTE_ADD = "MESSAGE_POLL_VOTE_ADD"; + static constexpr const char* MESSAGE_POLL_VOTE_REMOVE = "MESSAGE_POLL_VOTE_REMOVE"; + static constexpr const char* MESSAGE_REACTION_ADD = "MESSAGE_REACTION_ADD"; + static constexpr const char* MESSAGE_REACTION_REMOVE = "MESSAGE_REACTION_REMOVE"; + static constexpr const char* MESSAGE_REACTION_REMOVE_ALL = "MESSAGE_REACTION_REMOVE_ALL"; + static constexpr const char* MESSAGE_REACTION_REMOVE_EMOJI = "MESSAGE_REACTION_REMOVE_EMOJI"; + static constexpr const char* MESSAGE_UPDATE = "MESSAGE_UPDATE"; + static constexpr const char* PRESENCE_UPDATE = "PRESENCE_UPDATE"; + static constexpr const char* READY = "READY"; + static constexpr const char* RESUMED = "RESUMED"; + static constexpr const char* STAGE_INSTANCE_CREATE = "STAGE_INSTANCE_CREATE"; + static constexpr const char* STAGE_INSTANCE_DELETE = "STAGE_INSTANCE_DELETE"; + static constexpr const char* STAGE_INSTANCE_UPDATE = "STAGE_INSTANCE_UPDATE"; + static constexpr const char* SUBSCRIPTION_CREATE = "SUBSCRIPTION_CREATE"; + static constexpr const char* SUBSCRIPTION_DELETE = "SUBSCRIPTION_DELETE"; + static constexpr const char* SUBSCRIPTION_UPDATE = "SUBSCRIPTION_UPDATE"; + static constexpr const char* THREAD_CREATE = "THREAD_CREATE"; + static constexpr const char* THREAD_DELETE = "THREAD_DELETE"; + static constexpr const char* THREAD_LIST_SYNC = "THREAD_LIST_SYNC"; + static constexpr const char* THREAD_MEMBERS_UPDATE = "THREAD_MEMBERS_UPDATE"; + static constexpr const char* THREAD_MEMBER_UPDATE = "THREAD_MEMBER_UPDATE"; + static constexpr const char* THREAD_UPDATE = "THREAD_UPDATE"; + static constexpr const char* TYPING_START = "TYPING_START"; + static constexpr const char* USER_UPDATE = "USER_UPDATE"; + static constexpr const char* VOICE_CHANNEL_EFFECT_SEND = "VOICE_CHANNEL_EFFECT_SEND"; + static constexpr const char* VOICE_SERVER_UPDATE = "VOICE_SERVER_UPDATE"; + static constexpr const char* VOICE_STATE_UPDATE = "VOICE_STATE_UPDATE"; + static constexpr const char* WEBHOOKS_UPDATE = "WEBHOOKS_UPDATE"; +}; +struct HttpMethods { + static constexpr const char* POST = "POST"; + static constexpr const char* GET = "GET"; + static constexpr const char* PATCH = "PATCH"; + static constexpr const char* DELETE = "DELETE"; + static constexpr const char* PUT = "PUT"; + static constexpr const char* OPTIONS = "OPTIONS"; +}; +struct ApiVersion { + static inline std::string api = "/api/"; + static inline std::string v10 = "v10"; + static inline std::string v9 = "v9"; + static inline std::string v8 = "v8"; + static inline std::string v7 = "v7"; + static inline std::string v6 = "v6"; + static inline std::string current = api + v6; + static inline std::string latest = api + v10; +}; +struct DiscordEndpoints { + static inline std::string main_scheme = "https://"; + static inline std::string discord = main_scheme + "discord.com"; + static inline std::string images = main_scheme + "cdn.discord.com"; + static inline std::string media = main_scheme + "media.discord.com"; + struct details { + static inline std::string current = DiscordEndpoints::discord + ApiVersion::current; + static inline std::string latest = DiscordEndpoints::discord + ApiVersion::latest; + }; }; enum GatewayIntents { AutoModerationConfiguration = 1048576, @@ -109,4 +137,7 @@ enum UserStatus { DoNotDisturb, Invisible }; +enum DiscordTime { + Epoch = 1420070400000, +}; #endif \ No newline at end of file diff --git a/libs/utils/logs.hpp b/libs/utils/log.hpp similarity index 88% rename from libs/utils/logs.hpp rename to libs/utils/log.hpp index 51f5682..5d7fb5b 100644 --- a/libs/utils/logs.hpp +++ b/libs/utils/log.hpp @@ -1,5 +1,5 @@ -#ifndef UTILS_LOGS_HPP -#define UTILS_LOGS_HPP +#ifndef UTILS_LOG_HPP +#define UTILS_LOG_HPP #include <string> #include <chrono> #include <iostream> @@ -8,30 +8,30 @@ using std::setfill, std::setw; enum level { INFO, WARNING, ERROR, CRITICAL }; enum type { WEBSOCKET, NETWORK, API }; -class Logs { +class Log { public: static void create(level lvl, type t, const std::string& message) { - #ifdef DEBUG + #ifdef DEBUG std::string color; switch (lvl) { case INFO: - color = "\033[34;1m"; + color = "\033[34;1m"; break; case WARNING: - color = "\033[33;1m"; + color = "\033[33;1m"; break; case ERROR: color = "\033[31;1m"; - break; + break; case CRITICAL: color = "\033[31;1;2m"; break; default: - color = "\033[0m"; + color = "\033[0m"; break; } std::cout << color << "[" << getCurrentTime() << "][" << str(t) << "][" << str(lvl) << "] \033[0m" << message << "\033[0m" << std::endl; - #endif + #endif } private: static std::string getCurrentTime() { diff --git a/libs/utils/types.hpp b/libs/utils/types.hpp index 594a4eb..b285e18 100644 --- a/libs/utils/types.hpp +++ b/libs/utils/types.hpp @@ -1,9 +1,8 @@ #ifndef UTILS_TYPES_HPP_ #define UTILS_TYPES_HPP_ -#define dapi string("/api/v10") #define j(...) {{__VA_ARGS__}} #define je(...) {__VA_ARGS__} #define g(x, y) (std::get<x>(y)) #define ALL_INTENTS 131071 -#define RELEASE +#define DEBUG #endif \ No newline at end of file