diff --git a/src/main.cpp b/src/main.cpp index d1b225d..235bb43 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -182,7 +182,7 @@ int main(int argc, char** argv) { Contact3Registry cr; RegistryMessageModel rmm{cr}; MessageTimeSort mts{rmm}; - MessageCleanser mc{cr, rmm}; + MessageCleanser mc{cr, rmm, conf}; MessageCommandDispatcher mcd{cr, rmm, conf}; { // setup basic commands for bot diff --git a/src/message_cleanser.cpp b/src/message_cleanser.cpp index 18444de..a9e2d1c 100644 --- a/src/message_cleanser.cpp +++ b/src/message_cleanser.cpp @@ -2,13 +2,20 @@ #include #include +#include #include #include +#include -MessageCleanser::MessageCleanser(Contact3Registry& cr, RegistryMessageModel& rmm) : _cr(cr), _rmm(rmm) { - // config - // has MessageCleanser::old_age +MessageCleanser::MessageCleanser( + Contact3Registry& cr, + RegistryMessageModel& rmm, + ConfigModelI& conf +) : _cr(cr), _rmm(rmm), _conf(conf) { + if (!_conf.has_int("MessageCleanser", "old_age_minutes")) { + _conf.set("MessageCleanser", "old_age_minutes", int64_t(_old_age_default)); + } } MessageCleanser::~MessageCleanser(void) { @@ -23,17 +30,27 @@ float MessageCleanser::iterate(float time_delta) { uint64_t now_ts = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); - uint64_t deleted_count{0}; - // TODO: iterate rmm directly //_rmm.get(); // workaround by iterating contacts for (const auto& c : _cr.view()) { if (auto* reg = _rmm.get(c); reg != nullptr) { + float old_age {0.f}; + { // old age from conf + // TODO: find some way to extract this (maybe map into contact reg?) + if (const auto* id_comp = _cr.try_get(c); id_comp != nullptr) { + const auto id_hex = bin2hex(id_comp->data); + old_age = _conf.get_int("MessageCleanser", "old_age_minutes", id_hex).value_or(_old_age_default); + } else { + old_age = _conf.get_int("MessageCleanser", "old_age_minutes").value_or(_old_age_default); + } + old_age *= 60.f; // to sec + } + std::vector to_remove; // assuming all messages have Timestamp comp - reg->view().each([this, now_ts, &to_remove](const Message3 ent, const Message::Components::Timestamp& ts) { - if (now_ts >= ts.ts + static_cast(_old_age*1000.f)) { + reg->view().each([this, now_ts, old_age, &to_remove](const Message3 ent, const Message::Components::Timestamp& ts) { + if (now_ts >= ts.ts + static_cast(old_age*1000.f)) { to_remove.push_back(ent); } }); @@ -44,12 +61,11 @@ float MessageCleanser::iterate(float time_delta) { _rmm.throwEventDestroy(*reg, c); reg->destroy(c); } - deleted_count += to_remove.size(); - } - } - if (deleted_count > 0) { - std::cout << "MC: cleaned up " << deleted_count << "\n"; + if (!to_remove.empty()) { + std::cout << "MC: cleaned up " << to_remove.size() << ", age >= " << old_age << "sec\n"; + } + } } } diff --git a/src/message_cleanser.hpp b/src/message_cleanser.hpp index fcaa245..b038691 100644 --- a/src/message_cleanser.hpp +++ b/src/message_cleanser.hpp @@ -1,17 +1,24 @@ #pragma once #include +#include class MessageCleanser { Contact3Registry& _cr; RegistryMessageModel& _rmm; + ConfigModelI& _conf; + + static constexpr int64_t _old_age_default{150}; // minutes - float _old_age{150.f*60.f}; // max 150min float _interval{3.f*60.f}; // every 3min float _timer{0.f}; public: - MessageCleanser(Contact3Registry& cr, RegistryMessageModel& rmm); + MessageCleanser( + Contact3Registry& cr, + RegistryMessageModel& rmm, + ConfigModelI& conf + ); ~MessageCleanser(void); float iterate(float time_delta);