diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 09b1909..d030c79 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,11 +2,15 @@ cmake_minimum_required(VERSION 3.9 FATAL_ERROR) add_executable(totato ./main.cpp + ./tox_client.hpp ./tox_client.cpp ./tox_private_impl.hpp ./auto_dirty.hpp ./auto_dirty.cpp + + ./message_cleanser.hpp + ./message_cleanser.cpp ) target_compile_features(totato PUBLIC cxx_std_17) diff --git a/src/main.cpp b/src/main.cpp index ea43ca4..e5aca10 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,6 +12,7 @@ #include "./tox_client.hpp" #include "./auto_dirty.hpp" +#include "./message_cleanser.hpp" #include @@ -156,6 +157,7 @@ int main(int argc, char** argv) { Contact3Registry cr; RegistryMessageModel rmm{cr}; MessageTimeSort mts{rmm}; + MessageCleanser mc{cr, rmm}; PluginManager pm; @@ -173,6 +175,8 @@ int main(int argc, char** argv) { tc.setSelfName(name); // TODO: this is ugly } + std::cout << "TOTATO: own address: " << tc.toxSelfGetAddressStr() << "\n"; + ToxPrivateImpl tpi{tc.getTox()}; AutoDirty ad{tc}; ToxContactModel2 tcm{cr, tc, tc}; @@ -229,6 +233,8 @@ int main(int argc, char** argv) { pm.tick(/*time_delta*/0.02f); + mc.iterate(0.02f); + //std::this_thread::sleep_for( // time left to get to 60fps //std::chrono::duration(0.0166f) // 60fps frame duration //- std::chrono::duration(std::chrono::steady_clock::now() - new_time) // time used for rendering diff --git a/src/message_cleanser.cpp b/src/message_cleanser.cpp new file mode 100644 index 0000000..aa03a3e --- /dev/null +++ b/src/message_cleanser.cpp @@ -0,0 +1,48 @@ +#include "./message_cleanser.hpp" + +#include +#include + +#include +#include + +MessageCleanser::MessageCleanser(Contact3Registry& cr, RegistryMessageModel& rmm) : _cr(cr), _rmm(rmm) { +} + +MessageCleanser::~MessageCleanser(void) { +} + +void MessageCleanser::iterate(float time_delta) { + _timer += time_delta; + if (_timer >= _interval) { + _timer = 0.f; + + //std::cout << "MC: cleaning up old messages...\n"; + + 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) { + 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)) { + to_remove.push_back(ent); + } + }); + + reg->destroy(to_remove.cbegin(), to_remove.cend()); + deleted_count += to_remove.size(); + } + } + + if (deleted_count > 0) { + std::cout << "MC: cleaned up " << deleted_count << "\n"; + } + } +} diff --git a/src/message_cleanser.hpp b/src/message_cleanser.hpp new file mode 100644 index 0000000..7691235 --- /dev/null +++ b/src/message_cleanser.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include + +class MessageCleanser { + Contact3Registry& _cr; + RegistryMessageModel& _rmm; + + 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(void); + + void iterate(float time_delta); +};