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