From a6feb1273cd06abddc347b4d40f837eb594f411b Mon Sep 17 00:00:00 2001 From: Syping Date: Sun, 18 Feb 2024 22:26:02 +0100 Subject: [PATCH] add edit command --- src/database_core.cpp | 2 + src/database_core.h | 2 + src/database_file.cpp | 2 + src/database_file.h | 2 + src/settings.cpp | 19 ++++-- src/settings.h | 11 ++-- src/slashcommands.cpp | 132 +++++++++++++++++++++++++++++++++++++++--- src/slashcommands.h | 1 + 8 files changed, 154 insertions(+), 17 deletions(-) diff --git a/src/database_core.cpp b/src/database_core.cpp index bc7e759..b540f36 100644 --- a/src/database_core.cpp +++ b/src/database_core.cpp @@ -58,6 +58,7 @@ void database::delete_guild(dpp::snowflake guild_id) #endif } +/* std::variant database::find_channel_target(dpp::snowflake guild_id, dpp::snowflake channel_id, const std::string &target) { #ifndef NDEBUG @@ -65,6 +66,7 @@ std::variant database::find_channel_target #endif return {}; } +*/ bot::settings::channel database::get_channel(dpp::snowflake guild_id, dpp::snowflake channel_id) { diff --git a/src/database_core.h b/src/database_core.h index b922479..6526eda 100644 --- a/src/database_core.h +++ b/src/database_core.h @@ -36,7 +36,9 @@ namespace bot { virtual void delete_channel(dpp::snowflake guild_id, dpp::snowflake channel_id); virtual void delete_channel_target(dpp::snowflake guild_id, dpp::snowflake channel_id, const std::string &target); virtual void delete_guild(dpp::snowflake guild_id); + /* unused atm. virtual std::variant find_channel_target(dpp::snowflake guild_id, dpp::snowflake channel_id, const std::string &target); + */ virtual bot::settings::channel get_channel(dpp::snowflake guild_id, dpp::snowflake channel_id); virtual std::vector get_channels(dpp::snowflake guild_id); /* unused atm. diff --git a/src/database_file.cpp b/src/database_file.cpp index 1e579de..db5774b 100644 --- a/src/database_file.cpp +++ b/src/database_file.cpp @@ -221,6 +221,7 @@ void file::delete_guild(dpp::snowflake guild_id) std::filesystem::remove(guild_file); } +/* std::variant file::find_channel_target(dpp::snowflake guild_id, dpp::snowflake channel_id, const std::string &target) { const std::lock_guard guard(m_mutex); @@ -248,6 +249,7 @@ std::variant file::find_channel_target(dpp } return {}; } +*/ bot::settings::channel file::get_channel(dpp::snowflake guild_id, dpp::snowflake channel_id) { diff --git a/src/database_file.h b/src/database_file.h index 167f252..5947b3f 100644 --- a/src/database_file.h +++ b/src/database_file.h @@ -38,7 +38,9 @@ namespace bot { void delete_channel(dpp::snowflake guild_id, dpp::snowflake channel_id) override; void delete_channel_target(dpp::snowflake guild_id, dpp::snowflake channel_id, const std::string &target) override; void delete_guild(dpp::snowflake guild_id) override; + /* unused atm. std::variant find_channel_target(dpp::snowflake guild_id, dpp::snowflake channel_id, const std::string &target) override; + */ bot::settings::channel get_channel(dpp::snowflake guild_id, dpp::snowflake channel_id) override; std::vector get_channels(dpp::snowflake guild_id) override; /* unused atm. diff --git a/src/settings.cpp b/src/settings.cpp index 486ff0d..067b137 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -260,7 +260,7 @@ uint16_t settings::avatar_size() return m_avatarSize; } -const channel* settings::get_channel(const guild *guild, dpp::snowflake channel_id) const +channel* settings::get_channel(guild *guild, dpp::snowflake channel_id) { for (auto channel = guild->channel.begin(); channel != guild->channel.end(); channel++) { if (channel->id == channel_id) @@ -269,7 +269,7 @@ const channel* settings::get_channel(const guild *guild, dpp::snowflake channel_ return nullptr; } -const channel* settings::get_channel(dpp::snowflake guild_id, dpp::snowflake channel_id) const +channel* settings::get_channel(dpp::snowflake guild_id, dpp::snowflake channel_id) { if (!m_externallyLockedCount) { #ifndef NDEBUG @@ -289,7 +289,7 @@ const channel* settings::get_channel(dpp::snowflake guild_id, dpp::snowflake cha return nullptr; } -const guild* settings::get_guild(dpp::snowflake guild_id) const +guild* settings::get_guild(dpp::snowflake guild_id) { if (!m_externallyLockedCount) { #ifndef NDEBUG @@ -304,7 +304,7 @@ const guild* settings::get_guild(dpp::snowflake guild_id) const return nullptr; } -const target* settings::get_target(dpp::snowflake guild_id, dpp::snowflake channel_id, const std::string &target) const +target* settings::get_target(dpp::snowflake guild_id, dpp::snowflake channel_id, const std::string &target) { if (!m_externallyLockedCount) { #ifndef NDEBUG @@ -329,7 +329,16 @@ const target* settings::get_target(dpp::snowflake guild_id, dpp::snowflake chann return nullptr; } -const target* settings::get_target(const channel *channel, const std::string &target) const +target* settings::get_target(channel *channel, const std::string &target) +{ + for (auto _target = channel->targets.begin(); _target != channel->targets.end(); _target++) { + if (_target->target == target) + return &*_target; + } + return nullptr; +} + +const target* settings::get_target(const channel *channel, const std::string &target) { for (auto _target = channel->targets.begin(); _target != channel->targets.end(); _target++) { if (_target->target == target) diff --git a/src/settings.h b/src/settings.h index b41b7ae..ed3b8b9 100644 --- a/src/settings.h +++ b/src/settings.h @@ -34,11 +34,12 @@ namespace bot { /* get functions */ uint16_t avatar_size(); - const channel* get_channel(const guild *guild, dpp::snowflake channel_id) const; - const channel* get_channel(dpp::snowflake guild_id, dpp::snowflake channel_id) const; - const guild* get_guild(dpp::snowflake guild_id) const; - const target* get_target(dpp::snowflake guild_id, dpp::snowflake channel_id, const std::string &target) const; - const target* get_target(const channel *channel, const std::string &target) const; + static channel* get_channel(guild *guild, dpp::snowflake channel_id); + channel* get_channel(dpp::snowflake guild_id, dpp::snowflake channel_id); + guild* get_guild(dpp::snowflake guild_id); + target* get_target(dpp::snowflake guild_id, dpp::snowflake channel_id, const std::string &target); + static target* get_target(channel *channel, const std::string &target); + static const target* get_target(const channel *channel, const std::string &target); const std::vector preferred_languages() const; std::shared_ptr get_database() const; std::unique_ptr get_translator() const; diff --git a/src/slashcommands.cpp b/src/slashcommands.cpp index 5a80086..d3a12f8 100644 --- a/src/slashcommands.cpp +++ b/src/slashcommands.cpp @@ -22,12 +22,127 @@ using namespace std::string_literals; void bot::slashcommands::process_command_event(dpp::cluster *bot, bot::settings::settings *settings, const dpp::slashcommand_t &event) { - if (event.command.get_command_name() == "list") + if (event.command.get_command_name() == "edit") + bot::slashcommands::process_edit_command(bot, settings, event); + else if (event.command.get_command_name() == "list") bot::slashcommands::process_list_command(bot, settings, event); else if (event.command.get_command_name() == "translate" || event.command.get_command_name() == "translate_pref") bot::slashcommands::process_translate_command(bot, settings, event); } +void bot::slashcommands::process_edit_command(dpp::cluster *bot, bot::settings::settings *settings, const dpp::slashcommand_t &event) +{ + try { + dpp::command_interaction interaction = event.command.get_command_interaction(); + if (interaction.options[0].name == "delete") { + const std::lock_guard guard(*settings); + if (bot::settings::channel *channel = settings->get_channel(event.command.guild_id, event.command.channel_id)) { + const std::string target = std::get(event.get_parameter("target")); + + std::shared_ptr database = settings->get_database(); + const bot::settings::channel db_channel = database->get_channel(event.command.guild_id, event.command.channel_id); + + if (db_channel.targets.empty()) { + event.reply(dpp::message("The current channel has no deleteable targets!").set_flags(dpp::m_ephemeral)); + } + else if (target == "**") { + std::vector targets; + for (auto db_target = db_channel.targets.begin(); db_target != db_channel.targets.end(); db_target++) { + targets.push_back(db_target->target); + } + for (auto target = channel->targets.begin(); target != channel->targets.end();) { + if (std::find(targets.begin(), targets.end(), target->target) != targets.end()) { + bot->delete_webhook(target->webhook.id); + target = channel->targets.erase(target); + } + else { + target++; + } + } + + database->delete_channel(event.command.guild_id, event.command.channel_id); + database->sync(); + + event.reply(dpp::message("Deleteable targets have being deleted!").set_flags(dpp::m_ephemeral)); + } + else { + bool target_found = false; + for (auto db_target = db_channel.targets.begin(); db_target != db_channel.targets.end(); db_target++) { + if (db_target->target == target) { + target_found = true; + break; + } + } + + if (target_found) { + for (auto _target = channel->targets.begin(); _target != channel->targets.end(); _target++) { + if (_target->target == target) { + bot->delete_webhook(_target->webhook.id); + channel->targets.erase(_target); + break; + } + } + + if (db_channel.targets.size() == 1) + database->delete_channel(event.command.guild_id, event.command.channel_id); + else + database->delete_channel_target(event.command.guild_id, event.command.channel_id, target); + database->sync(); + + event.reply(dpp::message("Target have being deleted!").set_flags(dpp::m_ephemeral)); + } + else { + event.reply(dpp::message("Target language is not being found or deleteable!").set_flags(dpp::m_ephemeral)); + } + } + } + else { + event.reply(dpp::message("The current channel is not being translated!").set_flags(dpp::m_ephemeral)); + } + } + else if (interaction.options[0].name == "source") { + const std::lock_guard guard(*settings); + if (bot::settings::channel *channel = settings->get_channel(event.command.guild_id, event.command.channel_id)) { + const std::string source = std::get(event.get_parameter("source")); + const std::vector languages = settings->get_translator()->get_languages(); + + std::ostringstream language_codes; + bool source_valid = false; + for (const bot::translator::language &language : languages) { + if (language.code == source) { + source_valid = true; + break; + } + language_codes << " " << language.code; + } + + if (source_valid) { + channel->source = source; + + std::shared_ptr database = settings->get_database(); + database->set_channel_source(event.command.guild_id, event.command.channel_id, source); + database->sync(); + + event.reply(dpp::message("Source language have being updated!").set_flags(dpp::m_ephemeral)); + } + else { + event.reply(dpp::message("Source language is not valid!\nAvailable languages are:" + language_codes.str()).set_flags(dpp::m_ephemeral)); + } + } + else { + event.reply(dpp::message("The current channel is not being translated!").set_flags(dpp::m_ephemeral)); + } + } + else { + throw std::invalid_argument("Option " + interaction.options[0].name + " is not known"); + } + } + catch (const std::exception& exception) { + std::cerr << "[Exception] " << exception.what() << std::endl; + event.reply(dpp::message("Exception while processing command:\n"s + exception.what()).set_flags(dpp::m_ephemeral)); + } +} + void bot::slashcommands::process_list_command(dpp::cluster *bot, bot::settings::settings *settings, const dpp::slashcommand_t &event) { try { @@ -254,13 +369,20 @@ void bot::slashcommands::register_commands(dpp::cluster *bot, bot::settings::set std::vector commands; - /* + dpp::command_option source_option(dpp::co_string, "source", "Source language (ISO 639-1)", true); + source_option.set_max_length(static_cast(2)).set_min_length(static_cast(2)); + dpp::command_option target_option(dpp::co_string, "target", "Target language (ISO 639-1)", true); + target_option.set_max_length(static_cast(2)).set_min_length(static_cast(2)); + dpp::slashcommand command_edit("edit", "Edit current channel settings", bot->me.id); command_edit.set_default_permissions(dpp::p_manage_webhooks); + dpp::command_option delete_edit_subcommand(dpp::co_sub_command, "delete", "Delete current channel target language"); dpp::command_option source_edit_subcommand(dpp::co_sub_command, "source", "Edit current channel source language"); + delete_edit_subcommand.add_option(target_option); + source_edit_subcommand.add_option(source_option); + command_edit.add_option(delete_edit_subcommand); command_edit.add_option(source_edit_subcommand); commands.push_back(command_edit); - */ dpp::slashcommand command_list("list", "List translation settings", bot->me.id); dpp::command_option channel_list_subcommand(dpp::co_sub_command, "channel", "List current channel translation settings"); @@ -273,10 +395,6 @@ void bot::slashcommands::register_commands(dpp::cluster *bot, bot::settings::set command_translate.set_default_permissions(dpp::p_manage_webhooks); dpp::command_option channel_translate_subcommand(dpp::co_sub_command, "channel", "Translate current channel to a channel"); dpp::command_option webhook_translate_subcommand(dpp::co_sub_command, "webhook", "Translate current channel to a webhook"); - dpp::command_option source_option(dpp::co_string, "source", "Source language (ISO 639-1)", true); - source_option.set_max_length(static_cast(2)).set_min_length(static_cast(2)); - dpp::command_option target_option(dpp::co_string, "target", "Target language (ISO 639-1)", true); - target_option.set_max_length(static_cast(2)).set_min_length(static_cast(2)); dpp::command_option channel_option(dpp::co_channel, "channel", "Target channel", true); channel_option.add_channel_type(dpp::CHANNEL_TEXT); dpp::command_option webhook_option(dpp::co_string, "webhook", "Target webhook", true); diff --git a/src/slashcommands.h b/src/slashcommands.h index d341fff..d981675 100644 --- a/src/slashcommands.h +++ b/src/slashcommands.h @@ -25,6 +25,7 @@ namespace bot { namespace slashcommands { extern void process_command_event(dpp::cluster *bot, bot::settings::settings *settings, const dpp::slashcommand_t &event); + extern void process_edit_command(dpp::cluster* bot, bot::settings::settings* settings, const dpp::slashcommand_t &event); extern void process_list_command(dpp::cluster *bot, bot::settings::settings *settings, const dpp::slashcommand_t &event); extern void process_translate_command(dpp::cluster *bot, bot::settings::settings *settings, const dpp::slashcommand_t &event); extern void process_translate_webhook_add_target(dpp::cluster *bot, bot::settings::settings *settings, const dpp::slashcommand_t &event, const std::string &target, const dpp::confirmation_callback_t &callback);