diff --git a/libs/api/Author.hpp b/libs/api/Author.hpp index a7f22d8..d48fd8f 100644 --- a/libs/api/Author.hpp +++ b/libs/api/Author.hpp @@ -2,56 +2,44 @@ #define API_AUTHOR_HPP_ #include #include -using std::string, std::cout, std::endl, nlohmann::json; class Author { private: - json data; + nlohmann::json data; + const nlohmann::json &d; WebSocket& web; NetworkManager& req; public: - Author(const json& data) : + Author(const nlohmann::json& data) : data(data), + d(data["d"]), web(WebSocket::getInstance()), req(NetworkManager::getInstance()), - channel_id(functions::isNull(data["d"]["channel_id"])), - global_name(functions::isNull(data["d"]["author"]["global_name"])), - id(data["d"]["author"]["id"]) + channel_id(functions::isNull(d["channel_id"])), + global_name(functions::isNull(d["author"]["global_name"])), + id(d["author"]["id"]), + content(d["content"]), + isBot(d["author"].contains("bot") ? d["author"]["bot"].get() : false) { }; - string content() const { - try { - return data["d"]["content"]; - } - catch (...) { - return ""; - } - } - const string channel_id, global_name, id; - string discriminator() const { + const std::string channel_id, global_name, id, content; + bool isBot; + std::string discriminator() const { return data["d"]["author"]["discriminator"]; } - bool isBot() const { - try { - return data["d"]["author"]["bot"]; - } - catch (...) { - return 0; - } - } - string guild_id() { + std::string guild_id() { return data["d"]["guild_id"]; } - string msg_id() { + std::string msg_id() { return data["d"]["id"]; } bool isPinned() { return data["d"]["pinned"]; } - string avatar() { + std::string avatar() { return data["d"]["author"]["avatar"]; } - string send(const json& msg) { - return req.request(HttpMethods::POST, DiscordEndpoints::details::latest + "/channels/" + data["d"]["channel_id"].get() + "/messages", msg.dump()); + std::string send(const nlohmann::json& msg) { + return req.request(HttpMethods::POST, DiscordEndpoints::details::latest + "/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 bc31ed0..5e7b56f 100644 --- a/libs/api/Bot.hpp +++ b/libs/api/Bot.hpp @@ -1,20 +1,20 @@ #ifndef API_BOT_HPP_ #define API_BOT_HPP_ #include -using std::string, std::cout, std::endl, nlohmann::json; template class Discord { private: std::tuple...> net; - json data; - void initializeNets(const json& data) { + nlohmann::json data; + void initializeNets(const nlohmann::json& data) { initializeNetsImpl(data, std::index_sequence_for{}); } - templatevoid initializeNetsImpl(const json& data, std::index_sequence) { + template + void initializeNetsImpl(const nlohmann::json& data, std::index_sequence) { net = std::make_tuple(std::make_unique(data)...); } public: - Discord(const json& data) : data(data) { + Discord(const nlohmann::json& data) : data(data) { initializeNets(data); } template @@ -24,10 +24,10 @@ public: }; class Bot { private: - json data; + nlohmann::json data; public: - Bot(const json& data) : data(data) {}; - string id() const { + Bot(const nlohmann::json& data) : data(data) {}; + std::string id() const { return data["d"]["id"]; } bool isBot() const { diff --git a/libs/api/Channel.hpp b/libs/api/Channel.hpp index f4f81e0..548f2b3 100644 --- a/libs/api/Channel.hpp +++ b/libs/api/Channel.hpp @@ -2,16 +2,15 @@ #define API_CHANNEL_HPP_ #include #include -using std::string, std::cout, std::endl, nlohmann::json; class Channel { private: - json data; + nlohmann::json data; WebSocket& web; NetworkManager& req; public: - Channel(const json& data = "") : data(data), web(WebSocket::getInstance()), req(NetworkManager::getInstance()) {} - string send(const json& msg) { - return req.request(HttpMethods::POST, DiscordEndpoints::details::latest + "/channels/" + data["d"]["channel_id"].get() + "/messages", msg.dump()); + Channel(const nlohmann::json& data = "") : data(data), web(WebSocket::getInstance()), req(NetworkManager::getInstance()) {} + std::string send(const nlohmann::json& msg) { + return req.request(HttpMethods::POST, DiscordEndpoints::details::latest + "/channels/" + data["d"]["channel_id"].get() + "/messages", msg.dump()); } }; #endif \ No newline at end of file diff --git a/libs/api/Embed.hpp b/libs/api/Embed.hpp index 9f3efd8..24a2c1f 100644 --- a/libs/api/Embed.hpp +++ b/libs/api/Embed.hpp @@ -1,58 +1,57 @@ #ifndef API_EMBED_HPP_ #define API_EMBED_HPP_ #include -using std::string, std::cout, std::endl, nlohmann::json; class EmbedBuilder { private: - json embed = { + nlohmann::json embed = { {"content", ""}, {"tts", false}, - {"embeds", json::array()} + {"embeds", nlohmann::json::array()} }, data; public: - EmbedBuilder(const json& data) : data(data) { + EmbedBuilder(const nlohmann::json& data) : data(data) { embed = { {"content", ""}, {"tts", false}, - {"embeds", json::array()} + {"embeds", nlohmann::json::array()} }; } - EmbedBuilder& addTitle(const string& title) { + EmbedBuilder& addTitle(const std::string& title) { if (embed["embeds"].size() == 0) { - embed["embeds"].push_back(json::object()); + embed["embeds"].push_back(nlohmann::json::object()); } embed["embeds"].back()["title"] = title; return *this; } - EmbedBuilder& addDescription(const string& desc) { + EmbedBuilder& addDescription(const std::string& desc) { if (embed["embeds"].size() == 0) { - embed["embeds"].push_back(json::object()); + embed["embeds"].push_back(nlohmann::json::object()); } embed["embeds"].back()["description"] = desc; return *this; } - EmbedBuilder& addColor(const string& color) { + EmbedBuilder& addColor(const std::string& color) { if (embed["embeds"].size() == 0) { - embed["embeds"].push_back(json::object()); + embed["embeds"].push_back(nlohmann::json::object()); } embed["embeds"].back()["color"] = color; return *this; } - EmbedBuilder& addUrl(const string& url) { + EmbedBuilder& addUrl(const std::string& url) { if (embed["embeds"].size() == 0) { - embed["embeds"].push_back(json::object()); + embed["embeds"].push_back(nlohmann::json::object()); } embed["embeds"].back()["url"] = url; return *this; } - EmbedBuilder& addImage(const string& imageurl) { + EmbedBuilder& addImage(const std::string& imageurl) { if (embed["embeds"].size() == 0) { - embed["embeds"].push_back(json::object()); + embed["embeds"].push_back(nlohmann::json::object()); } embed["embeds"].back()["image"] = { {"url", imageurl} }; return *this; } - json getEmbed() const { + nlohmann::json getEmbed() const { return embed; } }; diff --git a/libs/api/Guild.hpp b/libs/api/Guild.hpp index d88eaae..0b684dd 100644 --- a/libs/api/Guild.hpp +++ b/libs/api/Guild.hpp @@ -1,14 +1,13 @@ #ifndef API_GUILD_HPP_ #define API_GUILD_HPP_ #include -//#include -using std::string, std::cout, std::endl, nlohmann::json; +#include class Guild { private: - json data; + nlohmann::json data; public: - Guild(const json& data) : data(data) {} - string id() const { + Guild(const nlohmann::json& data) : data(data) {} + std::string id() const { return data["d"]["user"]["id"]; } }; diff --git a/libs/api/Message.hpp b/libs/api/Message.hpp index bf9c6f5..456b566 100644 --- a/libs/api/Message.hpp +++ b/libs/api/Message.hpp @@ -2,18 +2,18 @@ #define API_MESSAGE_HPP_ #include #include -using std::string, std::cout, std::endl, nlohmann::json; class Message { private: - json data; + nlohmann::json data; WebSocket& web; NetworkManager& req; public: - Message(const json& data) : data(data), web(WebSocket::getInstance()), req(NetworkManager::getInstance()) {}; - string send(const string& id, const json& msg) { + Message(const nlohmann::json& data) : data(data), web(WebSocket::getInstance()), req(NetworkManager::getInstance()) {}; + std::string send(const std::string& id, const nlohmann::json& msg) { + std::cout << id << msg << std::endl; return req.request(HttpMethods::POST, DiscordEndpoints::details::latest + "/channels/" + id + "/messages", msg.dump()); } - string getMessages(const string& id, const string& count, const string& before = "") { + std::string getMessages(const std::string& id, const std::string& count, const std::string& before = "") { if (before.empty()) { return req.request(HttpMethods::GET, DiscordEndpoints::details::latest + "/channels/" + id + "/messages?limit=" + count); } @@ -22,11 +22,11 @@ public: } return ""; } - string deleteMessage(const string& channel_id, const string& message_id) { + std::string deleteMessage(const std::string& channel_id, const std::string& message_id) { return req.request(HttpMethods::DELETE, DiscordEndpoints::details::latest + "/channels/" + channel_id + "/messages/" + message_id); } - json pack(const json& pack) const { - return { pack }; + nlohmann::json pack(const nlohmann::json& key, const std::string& value) const { + return {{ key, value }}; } }; #endif \ No newline at end of file diff --git a/libs/api/User.hpp b/libs/api/User.hpp index f065679..c5feff3 100644 --- a/libs/api/User.hpp +++ b/libs/api/User.hpp @@ -3,18 +3,18 @@ #include #include #include -using std::string, std::cout, std::endl, nlohmann::json; class User { private: - json data; + nlohmann::json data; WebSocket& web; NetworkManager& req; public: - User(const json& data = "") : data(data), web(WebSocket::getInstance()), req(NetworkManager::getInstance()) {} - json extract(const std::vector& keys) { - std::vector d = { "d" }; + User(const nlohmann::json& data = "") : data(data), web(WebSocket::getInstance()), req(NetworkManager::getInstance()) {} + #ifdef DEBUG + nlohmann::json extract(const std::vector& keys) { + std::vector d = { "d" }; d.insert(d.end(), keys.begin(), keys.end()); - json current = data; + nlohmann::json current = data; for (const auto& key : d) { if (current.contains(key)) { current = current[key]; @@ -25,7 +25,8 @@ public: } return current; } - virtual string me() { + #endif + std::string me() { return req.request(HttpMethods::GET, DiscordEndpoints::details::latest + "/users/@me"); } bool isBot() const { diff --git a/libs/gateway/Websocket.hpp b/libs/gateway/Websocket.hpp index e9baa28..4f0d037 100644 --- a/libs/gateway/Websocket.hpp +++ b/libs/gateway/Websocket.hpp @@ -5,7 +5,6 @@ #include #include #include -using std::string, std::cout, std::endl, nlohmann::json; using namespace std::chrono; using namespace std::chrono_literals; class WebSocket { @@ -14,11 +13,11 @@ private: int intents; std::string token; ix::WebSocket webSocket; - json payload = { {"op", 1},{"d", nullptr} }, id; - std::unordered_map> eventHandlers; + nlohmann::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) { + WebSocket(const std::string& token, const int& intents, const bool& isBot) { WebSocket::token = token; WebSocket::intents = intents; WebSocket::isBot = isBot; @@ -34,7 +33,7 @@ private: }}, //{"compress", 1}, {"presence", { - {"activities", json::array({ + {"activities", nlohmann::json::array({ { //{"name", "asdsadsadsadsa"}, //{"type", 2} @@ -50,9 +49,9 @@ private: webSocket.setUrl("wss://gateway.discord.gg/?v=10&encoding=json"); webSocket.setHandshakeTimeout(5); Log::create(INFO, WEBSOCKET, "ixwebsocket init"); - webSocket.setOnMessageCallback([this, res = json(), heartbeat_interval = 0, connected = false](const ix::WebSocketMessagePtr& msg) mutable { + webSocket.setOnMessageCallback([this, res = nlohmann::json(), heartbeat_interval = 0, connected = false](const ix::WebSocketMessagePtr& msg) mutable { if (msg->type == ix::WebSocketMessageType::Message) { - res = json::parse(msg->str); + res = nlohmann::json::parse(msg->str); Log::create(INFO, WEBSOCKET, res["op"].dump() + " " + res["t"].dump()); switch (res["op"].get()) { case 10: @@ -106,14 +105,14 @@ public: int getIntents() const { return WebSocket::intents; } - void on(const string& event, std::function handler) { - eventHandlers[event] = [handler](const json& message) { - handler(message.get()); + void on(const std::string& event, std::function handler) { + eventHandlers[event] = [handler](const nlohmann::json& message) { + handler(message.get()); }; } - void once(const string& event, std::function handler) { - eventHandlers[event] = [event, handler, isCalled = false](const json& message) mutable { - isCalled == false ? isCalled = true : 0, handler(message.get()); + void once(const std::string& event, std::function handler) { + eventHandlers[event] = [event, handler, isCalled = false](const nlohmann::json& message) mutable { + isCalled == false ? isCalled = true : 0, handler(message.get()); }; } void start() { diff --git a/libs/tls/Network.hpp b/libs/tls/Network.hpp index 71443e6..c2ef6a3 100644 --- a/libs/tls/Network.hpp +++ b/libs/tls/Network.hpp @@ -3,7 +3,6 @@ #include #include #include -using std::string, std::cout, std::endl, nlohmann::json; class NetworkManager { private: CURL* curl; @@ -53,6 +52,9 @@ public: 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); } + #ifdef DEBUG + Log::create(INFO, NETWORK, response); + #endif return response; } }; diff --git a/libs/utils/log.hpp b/libs/utils/log.hpp index b99799d..373ab0a 100644 --- a/libs/utils/log.hpp +++ b/libs/utils/log.hpp @@ -5,7 +5,6 @@ #include #include #include -using std::setfill, std::setw; enum level { INFO, WARNING, ERROR, CRITICAL }; enum type { WEBSOCKET, NETWORK, API }; class Log { @@ -28,7 +27,10 @@ private: std::time_t now_c = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); std::tm* timer = std::localtime(&now_c); std::ostringstream oss; - oss << setfill('0') << setw(2) << timer->tm_hour << ":" << setfill('0') << setw(2) << timer->tm_min << ":" << setfill('0') << setw(2) << timer->tm_sec; + oss << std::setfill('0') << std::setw(2) + << timer->tm_hour << ":" << std::setfill('0') << std::setw(2) + << timer->tm_min << ":" << std::setfill('0') << std::setw(2) + << timer->tm_sec; return oss.str(); } static std::string str(const level& lvl) { diff --git a/libs/utils/types.hpp b/libs/utils/types.hpp index 13526ef..4ab7438 100644 --- a/libs/utils/types.hpp +++ b/libs/utils/types.hpp @@ -1,4 +1,4 @@ #ifndef UTILS_TYPES_HPP_ #define UTILS_TYPES_HPP_ -#define RELEASE +#define DEBUG #endif \ No newline at end of file diff --git a/sources/main.cpp b/sources/main.cpp index 25f547e..ffdd3ea 100644 --- a/sources/main.cpp +++ b/sources/main.cpp @@ -3,11 +3,13 @@ int main(int argc, char* argv[]) { if (argc != 3) return -1; WebSocket* bot = &WebSocket::getInstance(argv[2], GatewayIntents::AllIntents); - bot->on(GatewayEvents::READY, [](const Discord&a) { - cout << DiscordEndpoints::details::latest << endl; + bot->on(GatewayEvents::READY, [](const Discord& a) { + std::cout << DiscordEndpoints::details::latest << std::endl; }); bot->on(GatewayEvents::MESSAGE_CREATE, [bot](const Discord& msg) { - msg.get<0>().send("939957962972229634", msg.get<0>().pack({ "content", msg.get<2>().id })); + if (msg.get<2>().isBot == false) { + msg.get<0>().send("939957962972229634", msg.get<0>().pack("content", msg.get<2>().global_name)); + } }); bot->start(); return 0;