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

@ -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)

@ -1,6 +1,7 @@
#ifndef API_AUTHOR_HPP_
#define API_AUTHOR_HPP_
#include <utils/types.hpp>
#include <api/Channel.hpp>
#include <string>
#include <exception>
#include <iostream>
@ -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<string>() + "/messages", msg.dump());
}
};
#endif

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

@ -4,6 +4,7 @@
#include <exception>
#include <iostream>
#include <tls/Network.hpp>
#include <api/Author.hpp>
#include <gateway/Websocket.hpp>
#include <utils/types.hpp>
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<string>() + "/messages", msg.dump());
}
};

@ -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<std::string_view, 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) : 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<int>()) {
case 10:
heartbeat_interval = res["d"]["heartbeat_interval"].get<int>();
!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<void(const json&)> handler) {
eventHandlers[events[event].second] = [handler](const json& message) {
const json& eventData = message.get<json>();
handler(eventData);
handler(message.get<json>());
};
}
void once(const int event, std::function<void(const json&)> handler) {
eventHandlers[events[event].second] = [event, this, handler, isCalled = false](const json& message) mutable {
if (isCalled == false) {
isCalled = true;
const json& eventData = message.get<json>();
handler(eventData);
}
eventHandlers[events[event].second] = [event, handler, isCalled = false](const json& message) mutable {
isCalled == false ? isCalled = true : 0, handler(message.get<json>());
};
}
void start() {
void start(void) {
while (1) std::this_thread::sleep_for(1ms);
}
};

@ -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<Message, User, Author>& b) {
g(0, b.net)->send("939957962972229634", j("content", "started"));
});
bot->on(GatewayEvents::MESSAGE_CREATE, [](const Bot<Message, User, Author>& b) {
if (!g(2, b.net)->isBot()) {
g(0, b.net)->send("939957962972229634", j("content", g(2, b.net)->content()));