#include #include #include #include #include "telegram_client.h" const char *APP_GREETING = "--------------------\n"\ "| shortener-bot v0 |\n"\ "--------------------\n\n"; struct context { TelegramClient *tg; }; void async_startup(uv_idle_t *h); void configure_blocked_signals(); void configure_logging(); void configure_shutdown_signals(uv_loop_t *loop, context *ctx); void print_greeting(); void shutdown_signal_handler(uv_signal_t *h, int signum); int main() { configure_logging(); configure_blocked_signals(); print_greeting(); uv_loop_t *defaultLoop = uv_default_loop(); context ctx; spdlog::info("Creating Telegram client"); TelegramClient tg(defaultLoop); ctx.tg = &tg; uv_idle_t startupHandle; uv_idle_init(defaultLoop, &startupHandle); uv_idle_start(&startupHandle, async_startup); configure_shutdown_signals(defaultLoop, &ctx); spdlog::info("Entering event loop"); uv_run(defaultLoop, UV_RUN_DEFAULT); spdlog::info("Leaving event loop"); spdlog::info("Cleaning up"); return 0; } void async_startup(uv_idle_t *h) { spdlog::info("Starting up"); uv_close((uv_handle_t*)h, nullptr); } void configure_logging() { auto loggingSink = std::make_shared>(stdout, spdlog::color_mode::automatic); loggingSink->set_color(spdlog::level::debug, "\033[38;5;61m"); auto logger = std::make_shared("main", loggingSink); spdlog::set_default_logger(logger); spdlog::set_level(spdlog::level::debug); } void configure_blocked_signals() { sigset_t signalSet; sigemptyset(&signalSet); sigaddset(&signalSet, SIGUSR1); sigaddset(&signalSet, SIGUSR2); sigaddset(&signalSet, SIGHUP); sigprocmask(SIG_BLOCK, &signalSet, nullptr); } void register_signal_handle(uv_loop_t *loop, context *ctx, int signum, void(*signal_handler)(uv_signal_t*, int)) { auto deleter = [](uv_signal_t *handle) { uv_close((uv_handle_t*)handle, [](uv_handle_t *h){ delete h; }); }; std::unique_ptr handle(new uv_signal_t, deleter); uv_signal_init(loop, handle.get()); uv_signal_start(handle.get(), signal_handler, signum); } void configure_shutdown_signals(uv_loop_t *loop, context *ctx) { register_signal_handle(loop, ctx, SIGINT, shutdown_signal_handler); } void shutdown_signal_handler(uv_signal_t *h, int signum) { spdlog::info("Stopping"); uv_stop(uv_default_loop()); } void print_greeting() { std::cout << APP_GREETING << std::flush; }