summaryrefslogtreecommitdiff
path: root/bot/src/modules/user.hpp
diff options
context:
space:
mode:
authorilotterytea <iltsu@alright.party>2024-12-15 00:08:06 +0500
committerilotterytea <iltsu@alright.party>2024-12-15 00:08:37 +0500
commit2b2611d5a2bb9f2bec1ef71285e3a4e2d848392c (patch)
tree108888327a71a238baf999733ace19dee1b2a0b8 /bot/src/modules/user.hpp
parent1134c8316e5ee445567f9bf225e9fb9c2631b4dc (diff)
feat: userid command
Diffstat (limited to 'bot/src/modules/user.hpp')
-rw-r--r--bot/src/modules/user.hpp95
1 files changed, 95 insertions, 0 deletions
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);
+ }
+ };
+ }
+}