From f472cd3b6cd4d9e11c1c7a5fd3be1cb0248fe761 Mon Sep 17 00:00:00 2001 From: Slavasil Date: Fri, 22 Nov 2024 11:11:52 +0300 Subject: [PATCH] implement periodic VK post checking --- manager.cpp | 62 +++++++++++++++++++++++++++++++++++++---------------- manager.h | 3 ++- 2 files changed, 46 insertions(+), 19 deletions(-) diff --git a/manager.cpp b/manager.cpp index 31f2fc9..d62962a 100644 --- a/manager.cpp +++ b/manager.cpp @@ -13,6 +13,7 @@ using namespace manager; const unsigned long REPOST_INTERVAL = 2000; +const unsigned long VK_CHECK_INTERVAL = 600000; RepostManager::RepostManager(uv_loop_t *eventLoop, tg::AuthCodeProvider tgCodeProvider, tg::PasswordProvider tgPasswordProvider, state::AppState *appState, config::AppConfig *config) : m_vk(eventLoop), m_tg(eventLoop, config->tgApiId, config->tgApiHash, config->tgPhoneNumber) { @@ -70,6 +71,11 @@ void RepostManager::start() { m_tg.start(); } +NewPostFetcher::NewPostFetcher(RepostManager *m, bool fetchVk, bool fetchTg) : mgr(m) { + if (!fetchVk) vkState.ready = true; + if (!fetchTg) tgState.ready = true; +} + void NewPostFetcher::fetch() { if (vkState.ready && tgState.ready) { onDone(std::move(vkState.posts), std::move(tgState.posts)); @@ -152,7 +158,7 @@ void NewPostFetcher::check_vk_posts(std::vector posts) { vkState.posts.emplace_back(std::move(*i)); } vkState.needRequest = true; - if (vkState.ready) { + if (vkState.ready && !vkState.posts.empty()) { spdlog::debug("last loaded vk post id is now {}", vkState.posts[0].id); mgr->m_appState->vkLastLoadedPostId = vkState.posts[0].id; } @@ -175,7 +181,7 @@ void NewPostFetcher::check_tg_posts(std::vectorm_appState->tgLastLoadedPostId = tgState.posts[0].id; } @@ -186,25 +192,11 @@ void RepostManager::on_clients_ready() { m_appState->vkLastLoadedPostId = m_appState->vkLastPostId; m_appState->tgLastLoadedPostId = m_appState->tgLastPostId; - NewPostFetcher *f = new NewPostFetcher(this); + NewPostFetcher *f = new NewPostFetcher(this, true, true); f->onDone = [this, f](auto vkPosts, auto tgPosts){ delete f; - spdlog::info("collected {} new vk posts and {} new tg posts", vkPosts.size(), tgPosts.size()); - std::vector mergedPosts; - int totalSize = vkPosts.size() + tgPosts.size(); - mergedPosts.reserve(totalSize); - int vkIdx = vkPosts.size() - 1; - int tgIdx = tgPosts.size() - 1; - for (int i = 0; i < totalSize; ++i) { - if (tgIdx < 0 || vkPosts[vkIdx].date < tgPosts[tgIdx].date) { - mergedPosts.emplace_back(std::move(vkPosts[vkIdx--])); - } else { - mergedPosts.emplace_back(std::move(tgPosts[tgIdx--])); - } - } - spdlog::info("sorted {} posts", totalSize); - enqueue_for_repost(mergedPosts); + on_new_posts(vkPosts, tgPosts); }; f->onError = [f](){ @@ -214,6 +206,27 @@ void RepostManager::on_clients_ready() { f->fetch(); } +void RepostManager::on_new_posts(std::vector vkPosts, std::vector tgPosts) { + spdlog::info("collected {} new vk posts and {} new tg posts", vkPosts.size(), tgPosts.size()); + std::vector mergedPosts; + int totalSize = vkPosts.size() + tgPosts.size(); + mergedPosts.reserve(totalSize); + int vkIdx = vkPosts.size() - 1; + int tgIdx = tgPosts.size() - 1; + for (int i = 0; i < totalSize; ++i) { + if (tgIdx < 0 || vkPosts[vkIdx].date < tgPosts[tgIdx].date) { + mergedPosts.emplace_back(std::move(vkPosts[vkIdx--])); + } else { + mergedPosts.emplace_back(std::move(tgPosts[tgIdx--])); + } + } + spdlog::info("sorted {} posts", totalSize); + enqueue_for_repost(mergedPosts); + + spdlog::info("scheduling next check"); + uv_timer_start(m_checkTimer, &RepostManager::check_timer_callback, VK_CHECK_INTERVAL, 0); +} + void RepostManager::collect_all_vk_posts(std::function)> callback) { collect_last_vk_posts(std::numeric_limits::max(), callback); } @@ -358,6 +371,19 @@ void RepostManager::repost_timer_callback(uv_timer_t *h) { void RepostManager::check_timer_callback(uv_timer_t *h) { auto self = reinterpret_cast(h->data); + + spdlog::info("checking VK posts"); + NewPostFetcher *f = new NewPostFetcher(self, true, false); + f->onDone = [self, f](std::vector &&vkPosts, std::vector &&tgPosts){ + delete f; + spdlog::info("checked VK posts"); + self->on_new_posts(vkPosts, tgPosts); + }; + f->onError = [f](){ + delete f; + spdlog::error("failed to check VK posts"); + }; + f->fetch(); } void RepostManager::repost(AbstractPost &post) { diff --git a/manager.h b/manager.h index e08a5c1..da8ce11 100644 --- a/manager.h +++ b/manager.h @@ -29,7 +29,7 @@ namespace manager { std::function &&vkPosts, std::vector &&tgPosts)> onDone; std::function onError; - inline NewPostFetcher(RepostManager *m) : mgr(m) {} + NewPostFetcher(RepostManager *m, bool fetchVk, bool fetchTg); void fetch(); void check_vk_posts(std::vector posts); void check_tg_posts(std::vector> posts); @@ -45,6 +45,7 @@ namespace manager { private: void on_clients_ready(); void load_more_telegram_chats(); + void on_new_posts(std::vector vkPosts, std::vector tgPosts); void collect_all_vk_posts(std::function)> callback); void collect_all_tg_posts(std::function>)> callback);