implement periodic VK post checking

This commit is contained in:
Slavasil 2024-11-22 11:11:52 +03:00
parent 48dca58dfc
commit f472cd3b6c
2 changed files with 46 additions and 19 deletions

View File

@ -13,6 +13,7 @@
using namespace manager; using namespace manager;
const unsigned long REPOST_INTERVAL = 2000; 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) 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) { : m_vk(eventLoop), m_tg(eventLoop, config->tgApiId, config->tgApiHash, config->tgPhoneNumber) {
@ -70,6 +71,11 @@ void RepostManager::start() {
m_tg.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() { void NewPostFetcher::fetch() {
if (vkState.ready && tgState.ready) { if (vkState.ready && tgState.ready) {
onDone(std::move(vkState.posts), std::move(tgState.posts)); onDone(std::move(vkState.posts), std::move(tgState.posts));
@ -152,7 +158,7 @@ void NewPostFetcher::check_vk_posts(std::vector<vk::Post> posts) {
vkState.posts.emplace_back(std::move(*i)); vkState.posts.emplace_back(std::move(*i));
} }
vkState.needRequest = true; 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); spdlog::debug("last loaded vk post id is now {}", vkState.posts[0].id);
mgr->m_appState->vkLastLoadedPostId = vkState.posts[0].id; mgr->m_appState->vkLastLoadedPostId = vkState.posts[0].id;
} }
@ -175,7 +181,7 @@ void NewPostFetcher::check_tg_posts(std::vector<td::tl::unique_ptr<td_api::messa
tgState.posts.emplace_back(std::move(*i)); tgState.posts.emplace_back(std::move(*i));
} }
tgState.needRequest = true; tgState.needRequest = true;
if (tgState.ready) { if (tgState.ready && !tgState.posts.empty()) {
spdlog::debug("last loaded tg post id is now {}", tgState.posts[0].id); spdlog::debug("last loaded tg post id is now {}", tgState.posts[0].id);
mgr->m_appState->tgLastLoadedPostId = tgState.posts[0].id; mgr->m_appState->tgLastLoadedPostId = tgState.posts[0].id;
} }
@ -186,10 +192,21 @@ void RepostManager::on_clients_ready() {
m_appState->vkLastLoadedPostId = m_appState->vkLastPostId; m_appState->vkLastLoadedPostId = m_appState->vkLastPostId;
m_appState->tgLastLoadedPostId = m_appState->tgLastPostId; 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){ f->onDone = [this, f](auto vkPosts, auto tgPosts){
delete f; delete f;
on_new_posts(vkPosts, tgPosts);
};
f->onError = [f](){
delete f;
};
f->fetch();
}
void RepostManager::on_new_posts(std::vector<AbstractPost> vkPosts, std::vector<AbstractPost> tgPosts) {
spdlog::info("collected {} new vk posts and {} new tg posts", vkPosts.size(), tgPosts.size()); spdlog::info("collected {} new vk posts and {} new tg posts", vkPosts.size(), tgPosts.size());
std::vector<AbstractPost> mergedPosts; std::vector<AbstractPost> mergedPosts;
int totalSize = vkPosts.size() + tgPosts.size(); int totalSize = vkPosts.size() + tgPosts.size();
@ -205,13 +222,9 @@ void RepostManager::on_clients_ready() {
} }
spdlog::info("sorted {} posts", totalSize); spdlog::info("sorted {} posts", totalSize);
enqueue_for_repost(mergedPosts); enqueue_for_repost(mergedPosts);
};
f->onError = [f](){ spdlog::info("scheduling next check");
delete f; uv_timer_start(m_checkTimer, &RepostManager::check_timer_callback, VK_CHECK_INTERVAL, 0);
};
f->fetch();
} }
void RepostManager::collect_all_vk_posts(std::function<void(std::vector<vk::Post>)> callback) { void RepostManager::collect_all_vk_posts(std::function<void(std::vector<vk::Post>)> callback) {
@ -358,6 +371,19 @@ void RepostManager::repost_timer_callback(uv_timer_t *h) {
void RepostManager::check_timer_callback(uv_timer_t *h) { void RepostManager::check_timer_callback(uv_timer_t *h) {
auto self = reinterpret_cast<RepostManager*>(h->data); auto self = reinterpret_cast<RepostManager*>(h->data);
spdlog::info("checking VK posts");
NewPostFetcher *f = new NewPostFetcher(self, true, false);
f->onDone = [self, f](std::vector<AbstractPost> &&vkPosts, std::vector<AbstractPost> &&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) { void RepostManager::repost(AbstractPost &post) {

View File

@ -29,7 +29,7 @@ namespace manager {
std::function<void(std::vector<AbstractPost> &&vkPosts, std::vector<AbstractPost> &&tgPosts)> onDone; std::function<void(std::vector<AbstractPost> &&vkPosts, std::vector<AbstractPost> &&tgPosts)> onDone;
std::function<void()> onError; std::function<void()> onError;
inline NewPostFetcher(RepostManager *m) : mgr(m) {} NewPostFetcher(RepostManager *m, bool fetchVk, bool fetchTg);
void fetch(); void fetch();
void check_vk_posts(std::vector<vk::Post> posts); void check_vk_posts(std::vector<vk::Post> posts);
void check_tg_posts(std::vector<td::tl::unique_ptr<td_api::message>> posts); void check_tg_posts(std::vector<td::tl::unique_ptr<td_api::message>> posts);
@ -45,6 +45,7 @@ namespace manager {
private: private:
void on_clients_ready(); void on_clients_ready();
void load_more_telegram_chats(); void load_more_telegram_chats();
void on_new_posts(std::vector<AbstractPost> vkPosts, std::vector<AbstractPost> tgPosts);
void collect_all_vk_posts(std::function<void(std::vector<vk::Post>)> callback); void collect_all_vk_posts(std::function<void(std::vector<vk::Post>)> callback);
void collect_all_tg_posts(std::function<void(std::vector<td::tl::unique_ptr<td_api::message>>)> callback); void collect_all_tg_posts(std::function<void(std::vector<td::tl::unique_ptr<td_api::message>>)> callback);