From 48dca58dfc16cdaca75e3e21ac672798315f3945 Mon Sep 17 00:00:00 2001 From: Slavasil Date: Fri, 22 Nov 2024 10:20:53 +0300 Subject: [PATCH] rename new_post_fetcher and make it a standalone struct --- manager.cpp | 246 ++++++++++++++++++++++++++-------------------------- manager.h | 23 +++++ 2 files changed, 144 insertions(+), 125 deletions(-) diff --git a/manager.cpp b/manager.cpp index 131e094..31f2fc9 100644 --- a/manager.cpp +++ b/manager.cpp @@ -25,6 +25,10 @@ RepostManager::RepostManager(uv_loop_t *eventLoop, tg::AuthCodeProvider tgCodePr m_repostTimer = new uv_timer_t; uv_timer_init(eventLoop, m_repostTimer); m_repostTimer->data = this; + + m_checkTimer = new uv_timer_t; + uv_timer_init(eventLoop, m_checkTimer); + m_checkTimer->data = this; } RepostManager::~RepostManager() { @@ -66,135 +70,123 @@ void RepostManager::start() { m_tg.start(); } +void NewPostFetcher::fetch() { + if (vkState.ready && tgState.ready) { + onDone(std::move(vkState.posts), std::move(tgState.posts)); + return; + } + + if (!vkState.ready && vkState.needRequest) { + if (mgr->m_appState->vkLastLoadedPostId != 0) { + spdlog::info("fetching {} VK posts at offset {}", vkState.count, vkState.offset); + vkState.needRequest = false; + mgr->collect_vk_posts_from(vkState.offset, vkState.count, [this](auto posts){ + vkState.offset += posts.size(); + vkState.count = vkState.count * 3 / 2; + check_vk_posts(posts); + }); + } else { + spdlog::info("fetching all VK posts"); + vkState.needRequest = false; + mgr->collect_all_vk_posts([this](auto posts){ + spdlog::info("fetched all {} VK posts", posts.size()); + if (posts.size() > 0) { + spdlog::info("last vk post id is now {}", posts[0].id); + mgr->m_appState->vkLastLoadedPostId = posts[0].id; + } + vkState.ready = true; + std::vector aposts = mgr->to_abstract_posts(posts); + vkState.posts.reserve(vkState.posts.size() + aposts.size()); + for (auto i = aposts.begin(), e = aposts.end(); i != e; ++i) { + vkState.posts.emplace_back(std::move(*i)); + } + fetch(); + }); + } + } + + if (!tgState.ready && tgState.needRequest) { + if (mgr->m_appState->tgLastLoadedPostId != 0) { + spdlog::info("fetching {} TG posts starting from #{}", tgState.count, tgState.offset); + tgState.needRequest = false; + mgr->collect_tg_posts_from(tgState.offset, tgState.count, [this](auto posts){ + if (posts.empty()) return; + tgState.offset += posts[posts.size() - 1]->id_; + check_tg_posts(std::move(posts)); + }); + tgState.count = tgState.count * 3 / 2; + } else { + tgState.needRequest = false; + mgr->collect_all_tg_posts([this](auto posts){ + spdlog::info("fetched all {} TG posts", posts.size()); + if (posts.size() > 0) { + spdlog::info("last telegram post id is now {}", posts[0]->id_); + mgr->m_appState->tgLastLoadedPostId = posts[0]->id_; + } + tgState.ready = true; + std::vector aposts = mgr->to_abstract_posts(posts); + tgState.posts.reserve(tgState.posts.size() + aposts.size()); + for (auto i = aposts.begin(), e = aposts.end(); i != e; ++i) { + tgState.posts.emplace_back(std::move(*i)); + } + fetch(); + }); + } + } +} + +void NewPostFetcher::check_vk_posts(std::vector posts) { + spdlog::info("fetched {} VK posts", posts.size()); + long oldLastPostId = mgr->m_appState->vkLastLoadedPostId; + if (posts.size() > 0) { + spdlog::info("last vk post id is now {}", posts[0].id); + } + std::vector aposts = mgr->to_abstract_posts(posts); + spdlog::info("looking for id {}, have {} - {}", oldLastPostId, aposts[0].id, aposts[aposts.size() - 1].id); + if (mgr->drop_posts_older_than(aposts, oldLastPostId)) { + spdlog::info("found last remembered VK post"); + vkState.ready = true; + } + vkState.posts.reserve(vkState.posts.size() + aposts.size()); + for (auto i = aposts.begin(), e = aposts.end(); i != e; ++i) { + vkState.posts.emplace_back(std::move(*i)); + } + vkState.needRequest = true; + if (vkState.ready) { + spdlog::debug("last loaded vk post id is now {}", vkState.posts[0].id); + mgr->m_appState->vkLastLoadedPostId = vkState.posts[0].id; + } + fetch(); +} + +void NewPostFetcher::check_tg_posts(std::vector> posts) { + spdlog::info("fetched {} TG posts", posts.size()); + long oldLastPostId = mgr->m_appState->tgLastLoadedPostId; + if (posts.size() > 0) { + spdlog::info("last telegram post id is now {}", posts[0]->id_); + } + std::vector aposts = mgr->to_abstract_posts(posts); + if (mgr->drop_posts_older_than(aposts, oldLastPostId)) { + spdlog::info("found last remembered TG post"); + tgState.ready = true; + } + tgState.posts.reserve(tgState.posts.size() + aposts.size()); + for (auto i = aposts.begin(), e = aposts.end(); i != e; ++i) { + tgState.posts.emplace_back(std::move(*i)); + } + tgState.needRequest = true; + if (tgState.ready) { + spdlog::debug("last loaded tg post id is now {}", tgState.posts[0].id); + mgr->m_appState->tgLastLoadedPostId = tgState.posts[0].id; + } + fetch(); +} + void RepostManager::on_clients_ready() { m_appState->vkLastLoadedPostId = m_appState->vkLastPostId; m_appState->tgLastLoadedPostId = m_appState->tgLastPostId; - struct new_post_fetcher { - struct fetcher_state { - bool ready = false; - bool needRequest = true; - long offset = 0, count = 3; - std::vector posts; - }; - RepostManager *mgr; - fetcher_state vkState, tgState; - new_post_fetcher(RepostManager *m) : mgr(m) {} - std::function &&vkPosts, std::vector &&tgPosts)> onDone; - std::function onError; - void fetch() { - if (vkState.ready && tgState.ready) { - onDone(std::move(vkState.posts), std::move(tgState.posts)); - return; - } - - if (!vkState.ready && vkState.needRequest) { - if (mgr->m_appState->vkLastLoadedPostId != 0) { - spdlog::info("fetching {} VK posts at offset {}", vkState.count, vkState.offset); - vkState.needRequest = false; - mgr->collect_vk_posts_from(vkState.offset, vkState.count, [this](auto posts){ - vkState.offset += posts.size(); - vkState.count = vkState.count * 3 / 2; - check_vk_posts(posts); - }); - } else { - spdlog::info("fetching all VK posts"); - vkState.needRequest = false; - mgr->collect_all_vk_posts([this](auto posts){ - spdlog::info("fetched all {} VK posts", posts.size()); - if (posts.size() > 0) { - spdlog::info("last vk post id is now {}", posts[0].id); - mgr->m_appState->vkLastLoadedPostId = posts[0].id; - } - vkState.ready = true; - std::vector aposts = mgr->to_abstract_posts(posts); - vkState.posts.reserve(vkState.posts.size() + aposts.size()); - for (auto i = aposts.begin(), e = aposts.end(); i != e; ++i) { - vkState.posts.emplace_back(std::move(*i)); - } - fetch(); - }); - } - } - - if (!tgState.ready && tgState.needRequest) { - if (mgr->m_appState->tgLastLoadedPostId != 0) { - spdlog::info("fetching {} TG posts starting from #{}", tgState.count, tgState.offset); - tgState.needRequest = false; - mgr->collect_tg_posts_from(tgState.offset, tgState.count, [this](auto posts){ - if (posts.empty()) return; - tgState.offset += posts[posts.size() - 1]->id_; - check_tg_posts(std::move(posts)); - }); - tgState.count = tgState.count * 3 / 2; - } else { - tgState.needRequest = false; - mgr->collect_all_tg_posts([this](auto posts){ - spdlog::info("fetched all {} TG posts", posts.size()); - if (posts.size() > 0) { - spdlog::info("last telegram post id is now {}", posts[0]->id_); - mgr->m_appState->tgLastLoadedPostId = posts[0]->id_; - } - tgState.ready = true; - std::vector aposts = mgr->to_abstract_posts(posts); - tgState.posts.reserve(tgState.posts.size() + aposts.size()); - for (auto i = aposts.begin(), e = aposts.end(); i != e; ++i) { - tgState.posts.emplace_back(std::move(*i)); - } - fetch(); - }); - } - } - } - void check_vk_posts(std::vector posts) { - spdlog::info("fetched {} VK posts", posts.size()); - long oldLastPostId = mgr->m_appState->vkLastLoadedPostId; - if (posts.size() > 0) { - spdlog::info("last vk post id is now {}", posts[0].id); - //mgr->m_appState->vkLastLoadedPostId = posts[0].id; - } - std::vector aposts = mgr->to_abstract_posts(posts); - spdlog::info("looking for id {}, have {} - {}", oldLastPostId, aposts[0].id, aposts[aposts.size() - 1].id); - if (mgr->drop_posts_older_than(aposts, oldLastPostId)) { - spdlog::info("found last remembered VK post"); - vkState.ready = true; - } - vkState.posts.reserve(vkState.posts.size() + aposts.size()); - for (auto i = aposts.begin(), e = aposts.end(); i != e; ++i) { - vkState.posts.emplace_back(std::move(*i)); - } - vkState.needRequest = true; - if (vkState.ready) { - spdlog::debug("last loaded vk post id is now {}", vkState.posts[0].id); - mgr->m_appState->vkLastLoadedPostId = vkState.posts[0].id; - } - fetch(); - } - void check_tg_posts(std::vector> posts) { - spdlog::info("fetched {} TG posts", posts.size()); - long oldLastPostId = mgr->m_appState->tgLastLoadedPostId; - if (posts.size() > 0) { - spdlog::info("last telegram post id is now {}", posts[0]->id_); - //mgr->m_appState->tgLastLoadedPostId = posts[0]->id_; - } - std::vector aposts = mgr->to_abstract_posts(posts); - if (mgr->drop_posts_older_than(aposts, oldLastPostId)) { - spdlog::info("found last remembered TG post"); - tgState.ready = true; - } - tgState.posts.reserve(tgState.posts.size() + aposts.size()); - for (auto i = aposts.begin(), e = aposts.end(); i != e; ++i) { - tgState.posts.emplace_back(std::move(*i)); - } - tgState.needRequest = true; - if (tgState.ready) { - spdlog::debug("last loaded tg post id is now {}", tgState.posts[0].id); - mgr->m_appState->tgLastLoadedPostId = tgState.posts[0].id; - } - fetch(); - } - }; - new_post_fetcher *f = new new_post_fetcher(this); + NewPostFetcher *f = new NewPostFetcher(this); f->onDone = [this, f](auto vkPosts, auto tgPosts){ delete f; @@ -364,6 +356,10 @@ void RepostManager::repost_timer_callback(uv_timer_t *h) { } } +void RepostManager::check_timer_callback(uv_timer_t *h) { + auto self = reinterpret_cast(h->data); +} + void RepostManager::repost(AbstractPost &post) { spdlog::debug("reposting (post length {})", post.text.length()); std::string_view signature = posts::add_signature(post, m_appConfig); diff --git a/manager.h b/manager.h index 4c18fe0..e08a5c1 100644 --- a/manager.h +++ b/manager.h @@ -14,7 +14,29 @@ namespace manager { using posts::AbstractPost; + class RepostManager; + + struct NewPostFetcher { + struct fetcher_state { + bool ready = false; + bool needRequest = true; + long offset = 0, count = 3; + std::vector posts; + }; + + RepostManager *mgr; + fetcher_state vkState, tgState; + std::function &&vkPosts, std::vector &&tgPosts)> onDone; + std::function onError; + + inline NewPostFetcher(RepostManager *m) : mgr(m) {} + void fetch(); + void check_vk_posts(std::vector posts); + void check_tg_posts(std::vector> posts); + }; + class RepostManager { + friend struct NewPostFetcher; public: RepostManager(uv_loop_t *eventLoop, tg::AuthCodeProvider tgCodeProvider, tg::PasswordProvider tgPasswordProvider, state::AppState *appState, config::AppConfig *config); RepostManager(RepostManager&) = delete; @@ -41,6 +63,7 @@ namespace manager { void enqueue_for_repost(std::vector posts); static void repost_timer_callback(uv_timer_t *h); + static void check_timer_callback(uv_timer_t *h); void repost(AbstractPost &post); state::AppState *m_appState;