shortener-bot/main.cpp
2024-10-10 19:06:59 +00:00

92 lines
2.5 KiB
C++

#include <iostream>
#include <memory>
#include <spdlog/spdlog.h>
#include <uv.h>
#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<spdlog::sinks::ansicolor_sink<spdlog::details::console_mutex>>(stdout, spdlog::color_mode::automatic);
loggingSink->set_color(spdlog::level::debug, "\033[38;5;61m");
auto logger = std::make_shared<spdlog::logger>("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<uv_signal_t, decltype(deleter)> 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;
}