diff --git a/modules/bot/front/.gitignore b/modules/bot/front/.gitignore index 567609b..c315271 100644 --- a/modules/bot/front/.gitignore +++ b/modules/bot/front/.gitignore @@ -1 +1,4 @@ build/ +out/ +.vscode +api/generated-client \ No newline at end of file diff --git a/modules/bot/front/include/constants.hpp b/modules/bot/front/include/constants.hpp index 595a369..75e691e 100644 --- a/modules/bot/front/include/constants.hpp +++ b/modules/bot/front/include/constants.hpp @@ -11,21 +11,22 @@ namespace BotConstants { } namespace Callback { const std::string ACTION = "action:"; - const std::string FIND_ANIME = ACTION + "find_anime"; - const std::string ADD_REVIEW = ACTION + "add_review"; - const std::string ADD_STATUS = ACTION + "add_status"; - const std::string STATUS = "status:"; - const std::string WATCHING = STATUS + "watching"; - const std::string SEEN = STATUS + "seen"; - const std::string WANT = STATUS + "want"; - const std::string THROWN = STATUS + "thrown"; + const std::string FIND_ANIME = ACTION + "find_anime"; + const std::string ADD_REVIEW = ACTION + "add_review"; + const std::string ADD_STATUS = ACTION + "add_status"; + const std::string STATUS = "status:"; + const std::string WATCHING = STATUS + "watching"; + const std::string SEEN = STATUS + "seen"; + const std::string WANT = STATUS + "want"; + const std::string THROWN = STATUS + "thrown"; const std::string NAVIGATION = "navigation:"; - const std::string MY_TITLES = NAVIGATION + "my_titles"; - const std::string LIST_PREV = NAVIGATION + "prev"; - const std::string LIST_NEXT = NAVIGATION + "next"; + const std::string MY_TITLES = NAVIGATION + "my_titles"; + const std::string LIST_PREV = NAVIGATION + "prev"; + const std::string LIST_NEXT = NAVIGATION + "next"; const std::string CHOICE = "choice:"; } namespace Text { const std::string MAIN_MENU = "Вас приветствует nyanimedb бот:)\nЧего будем делать?"; + const std::string SAD_ERROR = "У нас что-то случилось:(\nМы обязательно скоро исправимся"; } } diff --git a/modules/bot/front/include/front.hpp b/modules/bot/front/include/front.hpp index f2c6485..4d37ec8 100644 --- a/modules/bot/front/include/front.hpp +++ b/modules/bot/front/include/front.hpp @@ -5,11 +5,12 @@ #include #include +#include "handlers.hpp" class AnimeBot { private: - std::string token; TgBot::Bot bot; + BotHandlers handler; public: /// Init Bot diff --git a/modules/bot/front/include/handlers.hpp b/modules/bot/front/include/handlers.hpp index 27aee3a..7440d00 100644 --- a/modules/bot/front/include/handlers.hpp +++ b/modules/bot/front/include/handlers.hpp @@ -1,3 +1,4 @@ +#pragma once #include #include #include @@ -9,13 +10,28 @@ struct HandlerResult { }; class BotHandlers { -public: - void handleCallback(const TgBot::CallbackQuery::Ptr query); +public: + 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: TgBot::Api botApi; - void handleNavigation(const TgBot::CallbackQuery::Ptr query); + void handleNavigation(TgBot::CallbackQuery::Ptr query); + + void processCallbackImpl(TgBot::CallbackQuery::Ptr query); /// @brief Получить очередную страницу тайтлов из списка пользователя /// @param userId Идентификатор пользователя diff --git a/modules/bot/front/src/KeyboardFactory.cpp b/modules/bot/front/src/KeyboardFactory.cpp index bc1bdd0..fc1a3fd 100644 --- a/modules/bot/front/src/KeyboardFactory.cpp +++ b/modules/bot/front/src/KeyboardFactory.cpp @@ -39,16 +39,16 @@ TgBot::InlineKeyboardMarkup::Ptr KeyboardFactory::createMyTitles(std::vector(); 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); } else { auto button_prev = std::make_shared(); 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(); 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}); } diff --git a/modules/bot/front/src/front.cpp b/modules/bot/front/src/front.cpp index e6d3034..9ee010c 100644 --- a/modules/bot/front/src/front.cpp +++ b/modules/bot/front/src/front.cpp @@ -3,7 +3,9 @@ #include "constants.hpp" #include "handlers.hpp" -AnimeBot::AnimeBot(const std::string& token) : bot(token) { +AnimeBot::AnimeBot(const std::string& token) + : bot(token) + , handler(bot.getApi()) { setupHandlers(); } @@ -11,20 +13,13 @@ void AnimeBot::setupHandlers() { bot.getEvents().onCommand("start", [this](TgBot::Message::Ptr message) { sendMainMenu(message->chat->id); }); + + bot.getEvents().onCallbackQuery([this](TgBot::CallbackQuery::Ptr query) { + handler.handleCallback(query); + }); - auto [text, kb] = BotHandlers::returnMyTitles(321); - - auto cp_api = bot.getApi(); - bot.getEvents().onCallbackQuery([text, kb, cp_api](TgBot::CallbackQuery::Ptr query) { - cp_api.editMessageText( - text, - query->message->chat->id, - query->message->messageId, - "", - "", - nullptr, - kb - ); + bot.getEvents().onAnyMessage([this](TgBot::Message::Ptr message) { + handler.handleMessage(message); }); } @@ -35,10 +30,4 @@ void AnimeBot::sendMainMenu(int64_t chatId) { TgBot::Bot& AnimeBot::getBot() { return bot; -} - -/* -void AnimeBot::showMyTitles() { - -} -*/ +} \ No newline at end of file diff --git a/modules/bot/front/src/handlers.cpp b/modules/bot/front/src/handlers.cpp index cbd90da..4ae1040 100644 --- a/modules/bot/front/src/handlers.cpp +++ b/modules/bot/front/src/handlers.cpp @@ -3,15 +3,23 @@ #include "structs.hpp" #include "constants.hpp" -void BotHandlers::handleCallback(const TgBot::CallbackQuery::Ptr query) { - std::string data = query -> data; - - if (data.starts_with(BotConstants::Callback::NAVIGATION)) { - handleNavigation(query); +void BotHandlers::handleCallback(TgBot::CallbackQuery::Ptr query) { + if (!query) { + // TODO: log + return; } + + 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) { // Здесь должен происходить запрос на сервер std::vector titles = {{123, "Школа мертвяков", "", 1}, {321, "KissXsis", "", 2}}; @@ -23,6 +31,37 @@ HandlerResult BotHandlers::returnMyTitles(int64_t userId) { 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; } + +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); + } +}