add commands to add/drop access

This commit is contained in:
Eric Mertens 2025-02-02 19:20:15 -08:00
parent 5cfb47ce92
commit 39a4d84a54
2 changed files with 55 additions and 23 deletions

View File

@ -86,7 +86,11 @@ static auto start_irc(
bot->sig_command.connect([webhook, connection](const Bot::Command &cmd) {
auto cursor = webhook_commands.find(std::string{cmd.command});
if (cursor != webhook_commands.end()) {
try {
cursor->second(webhook, cmd);
} catch (const std::exception &e) {
BOOST_LOG_TRIVIAL(error) << "Command handler failed: " << e.what();
}
}
});

View File

@ -484,49 +484,77 @@ std::map<std::string, void (*)(std::shared_ptr<Webhooks>, const myirc::Bot::Comm
std::string name;
if (iss >> name)
{
auto cursor = webhooks->settings_.projects.find(name);
if (cursor == webhooks->settings_.projects.end())
{
return;
}
auto &project = cursor->second;
auto &project = webhooks->settings_.projects.at(name);
if (not authorized_for_project(cmd, project, cmd.account))
{
return;
}
project.enabled = true;
webhooks->save_settings();
reply_to(webhooks, cmd, "Enabled project " + name);
}
}},
{"disable-project", [](std::shared_ptr<Webhooks> webhooks, const myirc::Bot::Command &cmd) {
//if (cmd.oper.empty())
//{
// return;
//}
std::istringstream iss{std::string{cmd.arguments}};
std::string name;
if (iss >> name)
{
auto cursor = webhooks->settings_.projects.find(name);
if (cursor == webhooks->settings_.projects.end())
{
return;
}
auto &project = cursor->second;
auto &project = webhooks->settings_.projects.at(name);
if (not authorized_for_project(cmd, project, cmd.account))
{
return;
}
project.enabled = false;
webhooks->save_settings();
reply_to(webhooks, cmd, "Disabled project " + name);
}
}},
{"add-access", [](std::shared_ptr<Webhooks> webhooks, const myirc::Bot::Command &cmd) {
if (cmd.oper.empty())
{
return;
}
std::istringstream iss{std::string{cmd.arguments}};
std::string name, account;
if (iss >> name >> account)
{
auto &project = webhooks->settings_.projects.at(name);
if (not authorized_for_project(cmd, project, cmd.account))
{
return;
}
auto [_, inserted] = project.authorized_accounts.insert(account);
if (inserted) {
webhooks->save_settings();
reply_to(webhooks, cmd, "Access added");
}
else
{
reply_to(webhooks, cmd, "Access already set");
}
}
}},
{"drop-access", [](std::shared_ptr<Webhooks> webhooks, const myirc::Bot::Command &cmd) {
if (cmd.oper.empty())
{
return;
}
std::istringstream iss{std::string{cmd.arguments}};
std::string name, account;
if (iss >> name >> account)
{
auto &project = webhooks->settings_.projects.at(name);
if (not authorized_for_project(cmd, project, cmd.account))
{
return;
}
auto removed = project.authorized_accounts.erase(account);
if (removed) {
webhooks->save_settings();
reply_to(webhooks, cmd, "Access dropped");
} else {
reply_to(webhooks, cmd, "Access not found");
}
}
}},
};