feat(tgbot-front): start handleError func develop

This commit is contained in:
Kirill 2025-12-04 16:38:18 +03:00
parent ccf9722bb7
commit 6123ee039b
5 changed files with 57 additions and 14 deletions

View file

@ -8,4 +8,7 @@ public:
/// Create keyboard for My_Titles
static TgBot::InlineKeyboardMarkup::Ptr createMyTitles(std::vector<Title> titles);
/// Create keyboard for sendError
static TgBot::InlineKeyboardMarkup::Ptr createError(const std::string& errorCallback);
};

View file

@ -8,6 +8,7 @@ namespace BotConstants {
const int64_t DISP_REVIEW_NUM = 4; // Количество ревью, отображаемых на страничке
namespace Button {
const std::string TO_MAIN_MENU = "Главное меню";
const std::string FIND_ANIME = "Найти аниме";
const std::string MY_TITLES = "Мои тайтлы";
const std::string PREV = "<<Назад";
@ -24,11 +25,15 @@ namespace BotConstants {
const std::string WANT = STATUS + "want";
const std::string THROWN = STATUS + "thrown";
const std::string NAVIGATION = "navigation:";
const std::string MAIN_MENU = NAVIGATION + "main_menu";
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 NAV_BACK = NAVIGATION + "back"; // Возврат по стеку состояний
const std::string CHOICE = "choice:";
const std::string ERROR = "error:";
const std::string ERROR_NAVIGATION = ERROR + NAVIGATION;
const std::string ERROR_AUTH = ERROR + "auth";
}
namespace Text {
const std::string MAIN_MENU = "Вас приветствует nyanimedb бот:)\nЧего будем делать?";

View file

@ -59,7 +59,9 @@ private:
TgBot::Api botApi;
std::unordered_map<int64_t, UserContext> userContexts;
void handleNavigation(TgBot::CallbackQuery::Ptr query);
void handleNavigation(TgBot::CallbackQuery::Ptr query, UserContext& ctx);
void handleError(TgBot::CallbackQuery::Ptr query, UserContext& ctx);
void processCallbackImpl(TgBot::CallbackQuery::Ptr query);

View file

@ -67,3 +67,13 @@ TgBot::InlineKeyboardMarkup::Ptr KeyboardFactory::createMyTitles(std::vector<Tit
return keyboard;
}
TgBot::InlineKeyboardMarkup::Ptr KeyboardFactory::createError(const std::string& errorCallback) {
auto keyboard = std::make_shared<TgBot::InlineKeyboardMarkup>();
TgBot::InlineKeyboardButton::Ptr button(new TgBot::InlineKeyboardButton);
button->text = BotConstants::Button::TO_MAIN_MENU;
button->callbackData = errorCallback;
keyboard->inlineKeyboard = {{button}};
return keyboard;
}

View file

@ -38,16 +38,6 @@ void BotHandlers::handleMessage(TgBot::Message::Ptr message) {
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);
}
}
void BotHandlers::handleNavigation(TgBot::CallbackQuery::Ptr query) {
int64_t userId = query->from->id;
auto it = userContexts.find(userId);
if (it == userContexts.end()) {
@ -58,6 +48,19 @@ void BotHandlers::handleNavigation(TgBot::CallbackQuery::Ptr query) {
}
UserContext& ctx = it->second;
if (data.starts_with(BotConstants::Callback::NAVIGATION)) {
handleNavigation(query, ctx);
}
else if (data.starts_with(BotConstants::Callback::ERROR)) {
handleError(query, ctx);
}
else {
botApi.sendMessage(query->message->chat->id, BotConstants::Text::SAD_ERROR, nullptr, nullptr);
}
}
void BotHandlers::handleNavigation(TgBot::CallbackQuery::Ptr query, UserContext& ctx) {
const auto& current = ctx.history.back(); // текущий экран
const std::string& data = query->data;
@ -187,7 +190,13 @@ HandlerResult BotHandlers::showMainMenu() {
void BotHandlers::sendError(TgBot::CallbackQuery::Ptr query, const std::string& errText) {
//TODO: посылать сообщение с кнопкой возврата в главное меню
auto keyboard = nullptr;
TgBot::InlineKeyboardMarkup::Ptr keyboard;
if (errText == BotConstants::Text::SAD_ERROR) {
keyboard = KeyboardFactory::createError(BotConstants::Callback::ERROR_NAVIGATION);
}
else if (errText == BotConstants::Text::AUTH_ERROR) {
keyboard = nullptr; //KeyboardFactory::createError(BotConstants::Callback::ERROR_AUTH);
}
editMessage(query, {errText, keyboard});
}
@ -221,8 +230,6 @@ std::optional<NavigationStep> BotHandlers::computeNextStep(
return NavigationStep{UserState::VIEWING_REVIEW, reviewId};
}
break;
// Добавляйте другие переходы по мере роста функционала
*/
default:
break;
@ -233,4 +240,20 @@ std::optional<NavigationStep> BotHandlers::computeNextStep(
void BotHandlers::createInitContext(int64_t chatId) {
NavigationStep init = {UserState::MAIN_MENU, BotConstants::NULL_PAYLOAD};
userContexts[chatId] = {chatId, {init}};
}
void BotHandlers::handleError(TgBot::CallbackQuery::Ptr query, UserContext& ctx) {
const std::string& data = query->data;
if(data == BotConstants::Callback::ERROR_NAVIGATION) {
ctx.history.clear();
ctx.history.push_back({UserState::MAIN_MENU, 0});
auto result = showMainMenu();
editMessage(query, result);
}
else if(data == BotConstants::Callback::ERROR_AUTH) {
// TODO: продумать логику
HandlerResult result = {BotConstants::Text::AUTH_ERROR, nullptr};
editMessage(query, result);
}
}