From d5bb8377ed2dfc04ba599df70091ce8a1c184595 Mon Sep 17 00:00:00 2001 From: fluttershy Date: Mon, 13 Jan 2025 22:30:24 +0500 Subject: [PATCH] optimization --- CMakeLists.txt | 1 + libs/api/Author.hpp | 14 ++++++++++---- libs/api/Bot.hpp | 2 +- libs/api/Channel.hpp | 5 +++-- libs/gateway/Websocket.hpp | 29 +++++++++++------------------ sources/main.cpp | 3 --- 6 files changed, 26 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a77d023..ffdb99d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,7 @@ cmake_minimum_required(VERSION 3.10) project(sparkle) find_package(OpenSSL REQUIRED) +find_package(RapidJSON) find_path(IXWEBSOCKET_INCLUDE_DIR ixwebsocket) find_library(IXWEBSOCKET_LIBRARY ixwebsocket) if(NOT IXWEBSOCKET_INCLUDE_DIR OR NOT IXWEBSOCKET_LIBRARY) diff --git a/libs/api/Author.hpp b/libs/api/Author.hpp index d6ee818..34b6a04 100644 --- a/libs/api/Author.hpp +++ b/libs/api/Author.hpp @@ -1,6 +1,7 @@ #ifndef API_AUTHOR_HPP_ #define API_AUTHOR_HPP_ #include +#include #include #include #include @@ -10,8 +11,10 @@ using std::endl; class Author { private: json data; + WebSocket& web; + NetworkManager& req; public: - Author(const json& data) : data(data) {} + Author(const json& data) : data(data), web(WebSocket::getInstance()), req(NetworkManager::getInstance()) {} string content() { try { return data["d"]["content"]; @@ -36,8 +39,8 @@ public: try { return data["d"]["author"]["bot"]; } - catch (std::exception& e) { - return false; + catch (...) { + return 0; } } string guild_id() { @@ -46,11 +49,14 @@ public: string msg_id() { return data["d"]["id"]; } - bool isPinned() { + inline bool isPinned() { return data["d"]["pinned"]; } string avatar() { return data["d"]["author"]["avatar"]; } + string send(const json& msg) { + return req.request("POST", dapi + "/channels/" + data["d"]["channel_id"].get() + "/messages", msg.dump()); + } }; #endif \ No newline at end of file diff --git a/libs/api/Bot.hpp b/libs/api/Bot.hpp index 41c1c65..a2c21c4 100644 --- a/libs/api/Bot.hpp +++ b/libs/api/Bot.hpp @@ -37,7 +37,7 @@ public: try { return data["d"]["bot"]; } - catch (std::exception& e) { + catch (...) { return false; } } diff --git a/libs/api/Channel.hpp b/libs/api/Channel.hpp index c98258c..4e6f999 100644 --- a/libs/api/Channel.hpp +++ b/libs/api/Channel.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include using std::string; @@ -15,8 +16,8 @@ private: WebSocket& web; NetworkManager& req; public: - Channel(const json& data) : data(data), web(WebSocket::getInstance()), req(NetworkManager::getInstance()) {} - string send(const json& msg) const { + 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() + "/messages", msg.dump()); } }; diff --git a/libs/gateway/Websocket.hpp b/libs/gateway/Websocket.hpp index ae1eb2f..6a5a0ea 100644 --- a/libs/gateway/Websocket.hpp +++ b/libs/gateway/Websocket.hpp @@ -91,16 +91,15 @@ private: {VOICE_STATE_UPDATE, "VOICE_STATE_UPDATE"}, {WEBHOOKS_UPDATE, "WEBHOOKS_UPDATE"} }}; - bool connected = false, isBot; + bool isBot; int intents; std::string token; ix::WebSocket webSocket; - int heartbeat_interval, lastS; - json payload = { {"op", 1},{"d", nullptr} }, id, res; + json payload = { {"op", 1},{"d", nullptr} }, id; std::unordered_map> eventHandlers; WebSocket& operator=(const WebSocket&) = delete; WebSocket(const WebSocket&) = delete; - WebSocket(const std::string& token, const int& intents, bool& isBot) : lastS(0), heartbeat_interval(-1) { + WebSocket(const std::string& token, const int& intents, bool& isBot) { WebSocket::token = token; WebSocket::intents = intents; WebSocket::isBot = isBot; @@ -130,16 +129,15 @@ private: }; ix::initNetSystem(); webSocket.setUrl("wss://gateway.discord.gg/?v=10&encoding=json"); - webSocket.setOnMessageCallback([this](const ix::WebSocketMessagePtr& msg) { + 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); - res["s"].is_number() ? lastS = res["s"] : false; - chngcol(std::string("WEBSOCKET: " + std::to_string(lastS) + " " + res["op"].dump() + " " + res["t"].dump()), 0, 0, 120); + chngcol(std::string("WEBSOCKET: " + res["op"].dump() + " " + res["t"].dump()), 0, 0, 120); switch (res["op"].get()) { case 10: heartbeat_interval = res["d"]["heartbeat_interval"].get(); - !connected ? connected = true, webSocket.send(id.dump()) : false; - std::thread([this]() { + !connected ? connected = true, webSocket.send(id.dump()) : 0; + std::thread([this, &heartbeat_interval, &connected]() { while (connected && heartbeat_interval != -1) { std::this_thread::sleep_for(milliseconds(heartbeat_interval)); webSocket.send(payload.dump()); @@ -187,20 +185,15 @@ public: } void on(const int event, std::function handler) { eventHandlers[events[event].second] = [handler](const json& message) { - const json& eventData = message.get(); - handler(eventData); + handler(message.get()); }; } void once(const int event, std::function handler) { - eventHandlers[events[event].second] = [event, this, handler, isCalled = false](const json& message) mutable { - if (isCalled == false) { - isCalled = true; - const json& eventData = message.get(); - handler(eventData); - } + eventHandlers[events[event].second] = [event, handler, isCalled = false](const json& message) mutable { + isCalled == false ? isCalled = true : 0, handler(message.get()); }; } - void start() { + void start(void) { while (1) std::this_thread::sleep_for(1ms); } }; diff --git a/sources/main.cpp b/sources/main.cpp index f6c1e70..2dfcb11 100644 --- a/sources/main.cpp +++ b/sources/main.cpp @@ -14,9 +14,6 @@ int main(int argc, char* argv[]) { if (argc != 3) return -1; WebSocket* bot = &WebSocket::getInstance(argv[2], 131071); - bot->on(GatewayEvents::READY, [](const Bot& b) { - g(0, b.net)->send("939957962972229634", j("content", "started")); - }); bot->on(GatewayEvents::MESSAGE_CREATE, [](const Bot& b) { if (!g(2, b.net)->isBot()) { g(0, b.net)->send("939957962972229634", j("content", g(2, b.net)->content()));