diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 9b6d253..bb7d759 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -32,3 +32,17 @@ target_link_libraries(plugin_zox_ngc_hs PUBLIC solanaceae_plugin solanaceae_zox ) + +######################################## + +add_library(plugin_transfer_auto_accept SHARED + ./plugin_transfer_auto_accept.cpp + ./transfer_auto_accept.hpp + ./transfer_auto_accept.cpp +) + +target_link_libraries(plugin_transfer_auto_accept PUBLIC + solanaceae_plugin + solanaceae_util + solanaceae_message3 +) diff --git a/plugins/plugin_transfer_auto_accept.cpp b/plugins/plugin_transfer_auto_accept.cpp new file mode 100644 index 0000000..baa929c --- /dev/null +++ b/plugins/plugin_transfer_auto_accept.cpp @@ -0,0 +1,72 @@ +#include + +#include "./transfer_auto_accept.hpp" +#include + +#include +#include + +#define RESOLVE_INSTANCE(x) static_cast(solana_api->resolveInstance(#x)) +#define PROVIDE_INSTANCE(x, p, v) solana_api->provideInstance(#x, p, static_cast(v)) + +static std::unique_ptr g_taa = nullptr; + +extern "C" { + +SOLANA_PLUGIN_EXPORT const char* solana_plugin_get_name(void) { + return "TransferAutoAccept"; +} + +SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_get_version(void) { + return SOLANA_PLUGIN_VERSION; +} + +SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_start(struct SolanaAPI* solana_api) { + std::cout << "PLUGIN TAA START()\n"; + + if (solana_api == nullptr) { + return 1; + } + + RegistryMessageModel* rmm = nullptr; + ConfigModelI* conf = nullptr; + + { // make sure required types are loaded + rmm = RESOLVE_INSTANCE(RegistryMessageModel); + conf = RESOLVE_INSTANCE(ConfigModelI); + + if (rmm == nullptr) { + std::cerr << "PLUGIN TAA missing RegistryMessageModel\n"; + return 2; + } + + if (conf == nullptr) { + std::cerr << "PLUGIN TAA missing ConfigModelI\n"; + return 2; + } + } + + // static store, could be anywhere tho + // construct with fetched dependencies + g_taa = std::make_unique(*rmm, *conf); + + // register types + PROVIDE_INSTANCE(TransferAutoAccept, "TransferAutoAccept", g_taa.get()); + + return 0; +} + +SOLANA_PLUGIN_EXPORT void solana_plugin_stop(void) { + std::cout << "PLUGIN TAA STOP()\n"; + + g_taa.reset(); +} + +SOLANA_PLUGIN_EXPORT void solana_plugin_tick(float delta) { + (void)delta; + //std::cout << "PLUGIN TAA TICK()\n"; + g_taa->iterate(); +} + +} // extern C + diff --git a/plugins/transfer_auto_accept.cpp b/plugins/transfer_auto_accept.cpp new file mode 100644 index 0000000..f645c61 --- /dev/null +++ b/plugins/transfer_auto_accept.cpp @@ -0,0 +1,78 @@ +#include "./transfer_auto_accept.hpp" + +#include + +#include + +#include + +TransferAutoAccept::TransferAutoAccept(RegistryMessageModel& rmm, ConfigModelI& conf) : _rmm(rmm), _conf(conf) { + _rmm.subscribe(this, RegistryMessageModel_Event::message_construct); + _rmm.subscribe(this, RegistryMessageModel_Event::message_updated); + + if (!_conf.has_string("TransferAutoAccept", "save_path")) { + _conf.set("TransferAutoAccept", "save_path", std::string_view{"tmp_save_dir"}); + } + + // dont load module instead? + //if (!_conf.has_bool("TransferAutoAccept", "autoaccept")) { + //_conf.set("TransferAutoAccept", "autoaccept", false); // safe default + //} + + if (!_conf.has_int("TransferAutoAccept", "autoaccept_limit")) { + _conf.set("TransferAutoAccept", "autoaccept_limit", 50l*1024l*1024l); // sane default + } +} + +void TransferAutoAccept::iterate(void) { + for (auto& it : _accept_queue) { + if (it.all_of()) { + continue; // already accepted + } + + it.emplace( + // TODO: contact to entry + _conf.get_string("TransferAutoAccept", "save_path").value_or("tmp_save_dir") + ); + std::cout << "TAA: auto accpeted transfer\n"; + _rmm.throwEventUpdate(it); + } + _accept_queue.clear(); +} + +void TransferAutoAccept::checkMsg(Message3Handle h) { + if (h.all_of()) { + return; // already accepted + } + + if (!h.all_of()) { + return; + } + + const auto& file_info = h.get(); + // TODO: contact to entry + if (file_info.total_size > uint64_t(_conf.get_int("TransferAutoAccept", "autoaccept_limit").value_or(1024*1024))) { + return; // too large + } + + if (file_info.file_list.empty() || file_info.file_list.front().file_name.empty()) { + return; // bad file + } + + _accept_queue.push_back(h); +} + +bool TransferAutoAccept::onEvent(const Message::Events::MessageConstruct& e) { + std::cout << "TAA: msg c\n"; + checkMsg(e.e); + + return false; +} + +bool TransferAutoAccept::onEvent(const Message::Events::MessageUpdated& e) { + std::cout << "TAA: msg u\n"; + checkMsg(e.e); + + return false; +} + diff --git a/plugins/transfer_auto_accept.hpp b/plugins/transfer_auto_accept.hpp new file mode 100644 index 0000000..fcfe5ec --- /dev/null +++ b/plugins/transfer_auto_accept.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include + +#include + +// fwd +struct ConfigModelI; + +class TransferAutoAccept : public RegistryMessageModelEventI { + RegistryMessageModel& _rmm; + //ContactModelI& _cm; + ConfigModelI& _conf; + + std::vector _accept_queue; + + public: + TransferAutoAccept(RegistryMessageModel& rmm, ConfigModelI& conf); + + // TODO: iterate + void iterate(void); + + protected: + void checkMsg(Message3Handle h); + + protected: // mm + bool onEvent(const Message::Events::MessageConstruct& e) override; + bool onEvent(const Message::Events::MessageUpdated& e) override; + +}; +