optimization

This commit is contained in:
fluttershy 2025-01-13 22:30:24 +05:00
parent 52696a58c6
commit d5bb8377ed
6 changed files with 26 additions and 28 deletions

View File

@ -1,6 +1,7 @@
cmake_minimum_required(VERSION 3.10) cmake_minimum_required(VERSION 3.10)
project(sparkle) project(sparkle)
find_package(OpenSSL REQUIRED) find_package(OpenSSL REQUIRED)
find_package(RapidJSON)
find_path(IXWEBSOCKET_INCLUDE_DIR ixwebsocket) find_path(IXWEBSOCKET_INCLUDE_DIR ixwebsocket)
find_library(IXWEBSOCKET_LIBRARY ixwebsocket) find_library(IXWEBSOCKET_LIBRARY ixwebsocket)
if(NOT IXWEBSOCKET_INCLUDE_DIR OR NOT IXWEBSOCKET_LIBRARY) if(NOT IXWEBSOCKET_INCLUDE_DIR OR NOT IXWEBSOCKET_LIBRARY)

View File

@ -1,6 +1,7 @@
#ifndef API_AUTHOR_HPP_ #ifndef API_AUTHOR_HPP_
#define API_AUTHOR_HPP_ #define API_AUTHOR_HPP_
#include <utils/types.hpp> #include <utils/types.hpp>
#include <api/Channel.hpp>
#include <string> #include <string>
#include <exception> #include <exception>
#include <iostream> #include <iostream>
@ -10,8 +11,10 @@ using std::endl;
class Author { class Author {
private: private:
json data; json data;
WebSocket& web;
NetworkManager& req;
public: public:
Author(const json& data) : data(data) {} Author(const json& data) : data(data), web(WebSocket::getInstance()), req(NetworkManager::getInstance()) {}
string content() { string content() {
try { try {
return data["d"]["content"]; return data["d"]["content"];
@ -36,8 +39,8 @@ public:
try { try {
return data["d"]["author"]["bot"]; return data["d"]["author"]["bot"];
} }
catch (std::exception& e) { catch (...) {
return false; return 0;
} }
} }
string guild_id() { string guild_id() {
@ -46,11 +49,14 @@ public:
string msg_id() { string msg_id() {
return data["d"]["id"]; return data["d"]["id"];
} }
bool isPinned() { inline bool isPinned() {
return data["d"]["pinned"]; return data["d"]["pinned"];
} }
string avatar() { string avatar() {
return data["d"]["author"]["avatar"]; 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());
}
}; };
#endif #endif

View File

@ -37,7 +37,7 @@ public:
try { try {
return data["d"]["bot"]; return data["d"]["bot"];
} }
catch (std::exception& e) { catch (...) {
return false; return false;
} }
} }

View File

@ -4,6 +4,7 @@
#include <exception> #include <exception>
#include <iostream> #include <iostream>
#include <tls/Network.hpp> #include <tls/Network.hpp>
#include <api/Author.hpp>
#include <gateway/Websocket.hpp> #include <gateway/Websocket.hpp>
#include <utils/types.hpp> #include <utils/types.hpp>
using std::string; using std::string;
@ -15,8 +16,8 @@ private:
WebSocket& web; WebSocket& web;
NetworkManager& req; NetworkManager& req;
public: public:
Channel(const json& data) : data(data), web(WebSocket::getInstance()), req(NetworkManager::getInstance()) {} Channel(const json& data = "") : data(data), web(WebSocket::getInstance()), req(NetworkManager::getInstance()) {}
string send(const json& msg) const { string send(const json& msg) {
return req.request("POST", dapi + "/channels/" + data["d"]["channel_id"].get<string>() + "/messages", msg.dump()); return req.request("POST", dapi + "/channels/" + data["d"]["channel_id"].get<string>() + "/messages", msg.dump());
} }
}; };

View File

@ -91,16 +91,15 @@ private:
{VOICE_STATE_UPDATE, "VOICE_STATE_UPDATE"}, {VOICE_STATE_UPDATE, "VOICE_STATE_UPDATE"},
{WEBHOOKS_UPDATE, "WEBHOOKS_UPDATE"} {WEBHOOKS_UPDATE, "WEBHOOKS_UPDATE"}
}}; }};
bool connected = false, isBot; bool isBot;
int intents; int intents;
std::string token; std::string token;
ix::WebSocket webSocket; ix::WebSocket webSocket;
int heartbeat_interval, lastS; json payload = { {"op", 1},{"d", nullptr} }, id;
json payload = { {"op", 1},{"d", nullptr} }, id, res;
std::unordered_map<std::string_view, std::function<void(const json&)>> eventHandlers; std::unordered_map<std::string_view, std::function<void(const json&)>> eventHandlers;
WebSocket& operator=(const WebSocket&) = delete; WebSocket& operator=(const WebSocket&) = delete;
WebSocket(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::token = token;
WebSocket::intents = intents; WebSocket::intents = intents;
WebSocket::isBot = isBot; WebSocket::isBot = isBot;
@ -130,16 +129,15 @@ private:
}; };
ix::initNetSystem(); ix::initNetSystem();
webSocket.setUrl("wss://gateway.discord.gg/?v=10&encoding=json"); 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) { if (msg->type == ix::WebSocketMessageType::Message) {
res = json::parse(msg->str); res = json::parse(msg->str);
res["s"].is_number() ? lastS = res["s"] : false; chngcol(std::string("WEBSOCKET: " + res["op"].dump() + " " + res["t"].dump()), 0, 0, 120);
chngcol(std::string("WEBSOCKET: " + std::to_string(lastS) + " " + res["op"].dump() + " " + res["t"].dump()), 0, 0, 120);
switch (res["op"].get<int>()) { switch (res["op"].get<int>()) {
case 10: case 10:
heartbeat_interval = res["d"]["heartbeat_interval"].get<int>(); heartbeat_interval = res["d"]["heartbeat_interval"].get<int>();
!connected ? connected = true, webSocket.send(id.dump()) : false; !connected ? connected = true, webSocket.send(id.dump()) : 0;
std::thread([this]() { std::thread([this, &heartbeat_interval, &connected]() {
while (connected && heartbeat_interval != -1) { while (connected && heartbeat_interval != -1) {
std::this_thread::sleep_for(milliseconds(heartbeat_interval)); std::this_thread::sleep_for(milliseconds(heartbeat_interval));
webSocket.send(payload.dump()); webSocket.send(payload.dump());
@ -187,20 +185,15 @@ public:
} }
void on(const int event, std::function<void(const json&)> handler) { void on(const int event, std::function<void(const json&)> handler) {
eventHandlers[events[event].second] = [handler](const json& message) { eventHandlers[events[event].second] = [handler](const json& message) {
const json& eventData = message.get<json>(); handler(message.get<json>());
handler(eventData);
}; };
} }
void once(const int event, std::function<void(const json&)> handler) { void once(const int event, std::function<void(const json&)> handler) {
eventHandlers[events[event].second] = [event, this, handler, isCalled = false](const json& message) mutable { eventHandlers[events[event].second] = [event, handler, isCalled = false](const json& message) mutable {
if (isCalled == false) { isCalled == false ? isCalled = true : 0, handler(message.get<json>());
isCalled = true;
const json& eventData = message.get<json>();
handler(eventData);
}
}; };
} }
void start() { void start(void) {
while (1) std::this_thread::sleep_for(1ms); while (1) std::this_thread::sleep_for(1ms);
} }
}; };

View File

@ -14,9 +14,6 @@
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
if (argc != 3) return -1; if (argc != 3) return -1;
WebSocket* bot = &WebSocket::getInstance(argv[2], 131071); WebSocket* bot = &WebSocket::getInstance(argv[2], 131071);
bot->on(GatewayEvents::READY, [](const Bot<Message, User, Author>& b) {
g(0, b.net)->send("939957962972229634", j("content", "started"));
});
bot->on(GatewayEvents::MESSAGE_CREATE, [](const Bot<Message, User, Author>& b) { bot->on(GatewayEvents::MESSAGE_CREATE, [](const Bot<Message, User, Author>& b) {
if (!g(2, b.net)->isBot()) { if (!g(2, b.net)->isBot()) {
g(0, b.net)->send("939957962972229634", j("content", g(2, b.net)->content())); g(0, b.net)->send("939957962972229634", j("content", g(2, b.net)->content()));