mmcs-quotes-bridge/manager.h

81 lines
3.2 KiB
C++

#pragma once
#include "config.h"
#include "posts.h"
#include "state.h"
#include "tg.h"
#include "vk.h"
#include <functional>
#include <queue>
#include <vector>
namespace manager {
namespace td_api = td::td_api;
using posts::AbstractPost;
class RepostManager;
struct NewPostFetcher {
struct fetcher_state {
bool ready = false;
bool needRequest = true;
long offset = 0, count = 3;
std::vector<AbstractPost> posts;
};
RepostManager *mgr;
fetcher_state vkState, tgState;
std::function<void(std::vector<AbstractPost> &&vkPosts, std::vector<AbstractPost> &&tgPosts)> onDone;
std::function<void()> onError;
NewPostFetcher(RepostManager *m, bool fetchVk, bool fetchTg);
void fetch();
void check_vk_posts(std::vector<vk::Post> posts);
void check_tg_posts(std::vector<td::tl::unique_ptr<td_api::message>> 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;
~RepostManager();
void start();
private:
void on_clients_ready();
void load_more_telegram_chats();
void on_new_posts(std::vector<AbstractPost> vkPosts, std::vector<AbstractPost> tgPosts);
void on_tg_message(td_api::updateNewMessage &update);
void recheck_vk_posts(std::function<void()> onDone);
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_last_vk_posts(int count, std::function<void(std::vector<vk::Post>)> callback);
void collect_last_tg_posts(int count, std::function<void(std::vector<td::tl::unique_ptr<td_api::message>>)> callback);
void collect_vk_posts_from(int offset, int count, std::function<void(std::vector<vk::Post>)> callback);
void collect_tg_posts_from(long from, int count, std::function<void(std::vector<td::tl::unique_ptr<td_api::message>>)> callback);
void collect_vk_posts_from__intermediate(int offset, int count, std::shared_ptr<std::vector<vk::Post>> intermediateResult, std::function<void(std::vector<vk::Post>)> callback);
void collect_tg_posts_from__intermediate(long from, int count, std::shared_ptr<std::vector<td::tl::unique_ptr<td_api::message>>> intermediateResult, std::function<void(std::vector<td::tl::unique_ptr<td_api::message>>)> callback);
bool drop_posts_older_than(std::vector<AbstractPost> &posts, long lastPostId);
std::vector<AbstractPost> to_abstract_posts(std::vector<vk::Post> &posts);
std::vector<AbstractPost> to_abstract_posts(std::vector<td::tl::unique_ptr<td_api::message>> &posts);
void enqueue_for_repost(std::vector<AbstractPost> 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;
config::AppConfig *m_appConfig;
vk::VKClient m_vk;
tg::TelegramClient m_tg;
std::queue<AbstractPost> m_repostQueue;
uv_timer_t *m_repostTimer = nullptr;
uv_timer_t *m_checkTimer = nullptr;
};
}