optimization
This commit is contained in:
parent
52696a58c6
commit
d5bb8377ed
@ -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)
|
||||||
|
@ -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
|
@ -37,7 +37,7 @@ public:
|
|||||||
try {
|
try {
|
||||||
return data["d"]["bot"];
|
return data["d"]["bot"];
|
||||||
}
|
}
|
||||||
catch (std::exception& e) {
|
catch (...) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -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()));
|
||||||
|
Reference in New Issue
Block a user