Forming the BotHandlers class structure

This commit is contained in:
Kirill 2025-11-27 16:24:29 +03:00
parent ea29fa79f0
commit cdc1aa2e6b
6 changed files with 92 additions and 46 deletions

View file

@ -27,5 +27,6 @@ namespace BotConstants {
} }
namespace Text { namespace Text {
const std::string MAIN_MENU = "Вас приветствует nyanimedb бот:)\nЧего будем делать?"; const std::string MAIN_MENU = "Вас приветствует nyanimedb бот:)\nЧего будем делать?";
const std::string SAD_ERROR = "У нас что-то случилось:(\nМы обязательно скоро исправимся";
} }
} }

View file

@ -5,11 +5,12 @@
#include <string> #include <string>
#include <tgbot/tgbot.h> #include <tgbot/tgbot.h>
#include "handlers.hpp"
class AnimeBot { class AnimeBot {
private: private:
std::string token;
TgBot::Bot bot; TgBot::Bot bot;
BotHandlers handler;
public: public:
/// Init Bot /// Init Bot

View file

@ -1,3 +1,4 @@
#pragma once
#include <tgbot/tgbot.h> #include <tgbot/tgbot.h>
#include <string> #include <string>
#include <structs.hpp> #include <structs.hpp>
@ -10,12 +11,27 @@ struct HandlerResult {
class BotHandlers { class BotHandlers {
public: public:
void handleCallback(const TgBot::CallbackQuery::Ptr query); BotHandlers(TgBot::Api api) : botApi(api) {;}
/// @brief Обработка callback'ов из кнопок интерфейса
/// @param query запрос callback
void handleCallback(TgBot::CallbackQuery::Ptr query);
/// @brief Обработка сообщений боту
/// @details
/// Функция для обработки сообщений, которые юзер отправляет
/// боту. Необходима для обработки ревью и названий искомого
/// аниме. Внутри себя проверяет текущий state пользователя
/// в боте.
/// @param message обрабатываемое сообщение
void handleMessage(TgBot::Message::Ptr message);
private: private:
TgBot::Api botApi; TgBot::Api botApi;
void handleNavigation(const TgBot::CallbackQuery::Ptr query); void handleNavigation(TgBot::CallbackQuery::Ptr query);
void processCallbackImpl(TgBot::CallbackQuery::Ptr query);
/// @brief Получить очередную страницу тайтлов из списка пользователя /// @brief Получить очередную страницу тайтлов из списка пользователя
/// @param userId Идентификатор пользователя /// @param userId Идентификатор пользователя

View file

@ -39,16 +39,16 @@ TgBot::InlineKeyboardMarkup::Ptr KeyboardFactory::createMyTitles(std::vector<Tit
if(counter % 2 == 1) { if(counter % 2 == 1) {
auto button = std::make_shared<TgBot::InlineKeyboardButton>(); auto button = std::make_shared<TgBot::InlineKeyboardButton>();
button->text = BotConstants::Button::PREV; button->text = BotConstants::Button::PREV;
button->callbackData = BotConstants::Callback::LIST_PREV + std::to_string(titles[0].num); button->callbackData = BotConstants::Callback::LIST_PREV + ':' + std::to_string(titles[0].num);
layout[counter / 2].push_back(button); layout[counter / 2].push_back(button);
} }
else { else {
auto button_prev = std::make_shared<TgBot::InlineKeyboardButton>(); auto button_prev = std::make_shared<TgBot::InlineKeyboardButton>();
button_prev->text = BotConstants::Button::PREV; button_prev->text = BotConstants::Button::PREV;
button_prev->callbackData = BotConstants::Callback::LIST_PREV + std::to_string(titles[0].num); button_prev->callbackData = BotConstants::Callback::LIST_PREV + ':' + std::to_string(titles[0].num);
auto button_next = std::make_shared<TgBot::InlineKeyboardButton>(); auto button_next = std::make_shared<TgBot::InlineKeyboardButton>();
button_next->text = BotConstants::Button::NEXT; button_next->text = BotConstants::Button::NEXT;
button_next->callbackData = BotConstants::Callback::LIST_NEXT + std::to_string(titles[5].num); button_next->callbackData = BotConstants::Callback::LIST_NEXT + ':' + std::to_string(titles[5].num);
layout.push_back({button_prev, button_next}); layout.push_back({button_prev, button_next});
} }

View file

@ -3,7 +3,9 @@
#include "constants.hpp" #include "constants.hpp"
#include "handlers.hpp" #include "handlers.hpp"
AnimeBot::AnimeBot(const std::string& token) : bot(token) { AnimeBot::AnimeBot(const std::string& token)
: bot(token)
, handler(bot.getApi()) {
setupHandlers(); setupHandlers();
} }
@ -12,19 +14,12 @@ void AnimeBot::setupHandlers() {
sendMainMenu(message->chat->id); sendMainMenu(message->chat->id);
}); });
auto [text, kb] = BotHandlers::returnMyTitles(321); bot.getEvents().onCallbackQuery([this](TgBot::CallbackQuery::Ptr query) {
handler.handleCallback(query);
});
auto cp_api = bot.getApi(); bot.getEvents().onAnyMessage([this](TgBot::Message::Ptr message) {
bot.getEvents().onCallbackQuery([text, kb, cp_api](TgBot::CallbackQuery::Ptr query) { handler.handleMessage(message);
cp_api.editMessageText(
text,
query->message->chat->id,
query->message->messageId,
"",
"",
nullptr,
kb
);
}); });
} }
@ -36,9 +31,3 @@ void AnimeBot::sendMainMenu(int64_t chatId) {
TgBot::Bot& AnimeBot::getBot() { TgBot::Bot& AnimeBot::getBot() {
return bot; return bot;
} }
/*
void AnimeBot::showMyTitles() {
}
*/

View file

@ -3,15 +3,23 @@
#include "structs.hpp" #include "structs.hpp"
#include "constants.hpp" #include "constants.hpp"
void BotHandlers::handleCallback(const TgBot::CallbackQuery::Ptr query) { void BotHandlers::handleCallback(TgBot::CallbackQuery::Ptr query) {
std::string data = query -> data; if (!query) {
// TODO: log
if (data.starts_with(BotConstants::Callback::NAVIGATION)) { return;
handleNavigation(query);
} }
try {
// TODO: Тут mutex на многопоточке
botApi.answerCallbackQuery(query->id);
} catch (const std::exception& e) {
std::cerr << "answerCallbackQuery error";
//TODO: обработка ошибки
}
processCallbackImpl(query);
} }
/// В угоду потокобезопасности создаем новый экземпляр TgBot::Api
HandlerResult BotHandlers::returnMyTitles(int64_t userId) { HandlerResult BotHandlers::returnMyTitles(int64_t userId) {
// Здесь должен происходить запрос на сервер // Здесь должен происходить запрос на сервер
std::vector<Title> titles = {{123, "Школа мертвяков", "", 1}, {321, "KissXsis", "", 2}}; std::vector<Title> titles = {{123, "Школа мертвяков", "", 1}, {321, "KissXsis", "", 2}};
@ -23,6 +31,37 @@ HandlerResult BotHandlers::returnMyTitles(int64_t userId) {
return result; return result;
} }
void BotHandlers::handleNavigation(const TgBot::CallbackQuery::Ptr query) { void BotHandlers::handleNavigation(TgBot::CallbackQuery::Ptr query) {
const std::string& data = query->data;
if (data == BotConstants::Callback::MY_TITLES) {
auto [text, kb] = BotHandlers::returnMyTitles(321);
botApi.editMessageText(
text,
query->message->chat->id,
query->message->messageId,
"",
"",
nullptr,
kb
);
}
else {
botApi.sendMessage(query->message->chat->id, BotConstants::Text::SAD_ERROR, nullptr, nullptr);
}
}
void BotHandlers::handleMessage(TgBot::Message::Ptr message) {
//TODO: просмотр состояния пользователя
return; return;
} }
void BotHandlers::processCallbackImpl(TgBot::CallbackQuery::Ptr query) {
const std::string& data = query->data;
if (data.starts_with(BotConstants::Callback::NAVIGATION)) {
handleNavigation(query);
}
else {
botApi.sendMessage(query->message->chat->id, BotConstants::Text::SAD_ERROR, nullptr, nullptr);
}
}