#include "config.h" #include "manager.h" #include "spdlog/spdlog.h" #include "state.h" #include #include #include #include #include void on_signal(uv_signal_t *h, int signum) { uv_stop(uv_default_loop()); } void create_signal_handles(uv_loop_t *loop, uv_signal_t handles[2]) { uv_signal_init(loop, handles); uv_signal_start(handles, on_signal, SIGINT); uv_signal_init(loop, handles + 1); uv_signal_start(handles + 1, on_signal, SIGTERM); } int main() { uv_loop_t *loop = uv_default_loop(); spdlog::set_level(spdlog::level::trace); uv_signal_t signalHandles[2] = {}; create_signal_handles(loop, signalHandles); state::AppState state; try { state = state::AppState("bridge_state.json"); spdlog::info("state: {}", state.to_string()); } catch (state::InvalidSavedStateException &e) { spdlog::error("invalid saved state: {}", e.message); return 1; } config::AppConfig config("bridge_config.json"); if (config.tgApiId == 0 || config.tgApiHash.empty() || config.tgPhoneNumber.empty() || config.vkServiceKey.empty() || (config.vkSource.index() == 0 && std::get(config.vkSource) == 0) || config.tgSourceId == 0 || config.tgDestinationId == 0) { spdlog::error("incomplete config file"); return 2; } std::function)> tgAuthCodeProvider = [](auto set_code){ spdlog::warn("/!\\ hanging event loop to request code"); std::string code; std::cin >> code; set_code(code); }; std::function)> tgPasswordProvider = [](auto set_password){ spdlog::warn("/!\\ hanging event loop to request password"); std::string password; std::cin >> password; set_password(password); }; manager::RepostManager manager(loop, tgAuthCodeProvider, tgPasswordProvider, &state, &config); manager.start(); uv_run(loop, UV_RUN_DEFAULT); spdlog::info("event loop ended"); state.save(); return 0; }