implement periodic VK post checking
This commit is contained in:
parent
48dca58dfc
commit
f472cd3b6c
44
manager.cpp
44
manager.cpp
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user