#ifndef API_BOT_HPP_
#define API_BOT_HPP_
#include <includes.h>
template<typename...Args>
class Discord {
private:
    std::tuple<std::unique_ptr<Args>...> net;
    nlohmann::json data;
    void initializeNets(const nlohmann::json& data) {
        initializeNetsImpl(data, std::index_sequence_for<Args...>{});
    }
    template<unsigned long... Is>
    void initializeNetsImpl(const nlohmann::json& data, std::index_sequence<Is...>) {
        net = std::make_tuple(std::make_unique<Args>(data)...);
    }
public:
    Discord(const nlohmann::json& data) : data(data) {
        initializeNets(data);
    }
    template<unsigned long Index>
    auto& get() const {
        return *std::get<Index>(net);
    }
};
class Bot {
private:
    nlohmann::json data;
public:
    Bot(const nlohmann::json& data) : data(data) {};
    std::string id() const {
        return data["d"]["id"];
    }
    bool isBot() const {
        try {
            return data["d"]["bot"];
        }
        catch (...) {
            return false;
        }
    }
};
#endif