92 lines
2.5 KiB
C++
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;
|
|
}
|