diff options
| author | ilotterytea <iltsu@alright.party> | 2024-12-15 00:08:06 +0500 |
|---|---|---|
| committer | ilotterytea <iltsu@alright.party> | 2024-12-15 00:08:37 +0500 |
| commit | 2b2611d5a2bb9f2bec1ef71285e3a4e2d848392c (patch) | |
| tree | 108888327a71a238baf999733ace19dee1b2a0b8 /bot/src | |
| parent | 1134c8316e5ee445567f9bf225e9fb9c2631b4dc (diff) | |
feat: userid command
Diffstat (limited to 'bot/src')
| -rw-r--r-- | bot/src/commands/command.cpp | 2 | ||||
| -rw-r--r-- | bot/src/modules/user.hpp | 95 |
2 files changed, 97 insertions, 0 deletions
diff --git a/bot/src/commands/command.cpp b/bot/src/commands/command.cpp index 7dd4e47..169ca71 100644 --- a/bot/src/commands/command.cpp +++ b/bot/src/commands/command.cpp @@ -20,6 +20,7 @@ #include "../modules/settings.hpp" #include "../modules/spam.hpp" #include "../modules/timer.hpp" +#include "../modules/user.hpp" #include "../utils/chrono.hpp" #include "request.hpp" #include "response.hpp" @@ -38,6 +39,7 @@ namespace bot { this->add_command(std::make_unique<mod::Chatters>()); this->add_command(std::make_unique<mod::Spam>()); this->add_command(std::make_unique<mod::Settings>()); + this->add_command(std::make_unique<mod::User>()); } void CommandLoader::add_command(std::unique_ptr<Command> command) { diff --git a/bot/src/modules/user.hpp b/bot/src/modules/user.hpp new file mode 100644 index 0000000..71f2747 --- /dev/null +++ b/bot/src/modules/user.hpp @@ -0,0 +1,95 @@ +#pragma once + +#include <exception> +#include <string> +#include <vector> + +#include "../bundle.hpp" +#include "../commands/command.hpp" +#include "../commands/response_error.hpp" +#include "cpr/api.h" +#include "cpr/cprtypes.h" +#include "cpr/response.h" +#include "nlohmann/json.hpp" + +namespace bot { + namespace mod { + class User : public command::Command { + std::string get_name() const override { return "userid"; } + + int get_delay_seconds() const override { return 10; } + + command::Response run(const InstanceBundle &bundle, + const command::Request &request) const override { + if (!request.message.has_value()) { + throw ResponseException<ResponseError::NOT_ENOUGH_ARGUMENTS>( + request, bundle.localization, command::CommandArgument::VALUE); + } + + std::vector<std::string> parts = + utils::string::split_text(request.message.value(), ','); + + std::vector<std::string> ids; + std::vector<std::string> logins; + + for (const std::string &part : parts) { + if (ids.size() + logins.size() >= 3) break; + try { + int id = std::stoi(part); + ids.push_back(part); + } catch (std::exception e) { + logins.push_back(part); + } + } + + std::string query; + + if (!ids.empty()) { + query += "id="; + query += utils::string::join_vector(ids, ','); + + if (!logins.empty()) query += "&"; + } + + if (!logins.empty()) { + query += "login="; + query += utils::string::join_vector(logins, ','); + } + + if (query.empty()) { + throw ResponseException<ResponseError::INCORRECT_ARGUMENT>( + request, bundle.localization, request.message.value()); + } + + cpr::Response response = + cpr::Get(cpr::Url{"https://api.ivr.fi/v2/twitch/user?" + query}); + + if (response.status_code != 200) { + throw ResponseException<ResponseError::EXTERNAL_API_ERROR>( + request, bundle.localization, response.status_code, + response.status_line); + } + + nlohmann::json j = nlohmann::json::parse(response.text); + + std::vector<std::string> msgs; + + for (const auto &x : j) { + std::string name = x["login"]; + std::string id = x["id"]; + + std::string is_banned = x["banned"] ? "⛔" : "✅"; + std::string ban_reason; + if (x.contains("banReason")) ban_reason = x["banReason"]; + + std::string msg = is_banned + " " + name + " (" + id + ")" + + (ban_reason.empty() ? "" : ": ") + ban_reason; + + msgs.push_back(request.user.get_alias_name() + ": " + msg); + } + + return command::Response(msgs); + } + }; + } +} |
