/
github_better
/
GenAI
Обзор
Документация
Войти
/
github_better
/
GenAI
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Kboards.py
469 строк
21 KB
github_better
New
22 дек 2025, 08:52
22 дек 2025, 08:52
b68d8c4
Код
Авторство
О чём код?
import logging from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, ReplyKeyboardMarkup, KeyboardButton from aiogram import types from Lib.Translate_text import translate_text from Lib.Debugger import debug_print logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) def main_menu_kb(lang): debug_print(logger) """ Создает главное меню бота с inline-кнопками. :param lang: язык интерфейса для локализации текста :return: объект InlineKeyboardMarkup """ kb = InlineKeyboardMarkup(row_width=1) kb.add(InlineKeyboardButton("🎮 " + translate_text("Create a new adventure", "en", lang), callback_data="make_new_history")) kb.add(InlineKeyboardButton("📂 " + translate_text("Load the adventure", "en", lang), callback_data="load_history")) kb.add(InlineKeyboardButton("📖 " + translate_text("Game guide", "en", lang), callback_data="game_guide")) kb.add(InlineKeyboardButton("👤 " + translate_text("Profile", "en", lang), callback_data="profile")) kb.add(InlineKeyboardButton("🔔 " + translate_text("Subscription", "en", lang), callback_data="SUB")) kb.add(InlineKeyboardButton("⭐ " + translate_text("Leave a review", "en", lang), callback_data="review")) return kb def tarriffs(lang): """ Клавиатура в разделе подписки :param lang: язык интерфейса для локализации текста :return: объект InlineKeyboardMarkup """ debug_print(logger) kb = InlineKeyboardMarkup(row_width=1) kb.add(InlineKeyboardButton("🟢 " + "Minimum", callback_data="MinimumT")) kb.add(InlineKeyboardButton("🔵 " + "Usual", callback_data="UsualT")) kb.add(InlineKeyboardButton("💎 " + "Premium", callback_data="PremiumT")) kb.add(InlineKeyboardButton("♾️ " + "Unlimited", callback_data="UnlimitedT")) kb.add(InlineKeyboardButton("📝 " + translate_text("Buy text credits", "en", lang), callback_data="BuyText")) kb.add(InlineKeyboardButton("🎨 " + translate_text("Buy credits for image generation", "en", lang), callback_data="BuyImage")), kb.add(InlineKeyboardButton("⬅️ " + translate_text(" Back", "en", lang), callback_data="back_to_main")) return kb def _tariff_payment_kb_base(lang, plan_label: str, amount_currency: int, currency_code: str, amount_stars: int): debug_print(logger) """ Базовая клавиатура выбора способа оплаты для конкретного тарифа. :param lang: язык интерфейса :param plan_label: человекочитаемое имя плана (Minimum / Usual / Premium) :param amount_currency: цена в локальной валюте (число) :param currency_code: код валюты (например, 'RUB') :param amount_stars: цена в Telegram Stars (число) """ kb = InlineKeyboardMarkup(row_width=1) # Оплата в валюте пользователя: показываем сумму и код валюты kb.add( InlineKeyboardButton( "💳 " + f"{amount_currency} {currency_code}", callback_data=f"pay_{plan_label.lower()}_fiat" ) ) # Оплата в Telegram Stars – с золотой звездой kb.add( InlineKeyboardButton( "⭐️ " + f"{amount_stars} Telegram Stars", callback_data=f"pay_{plan_label.lower()}_stars" ) ) # Назад к экрану с тарифами (дергаем существующий SUB-хендлер) kb.add( InlineKeyboardButton( "⬅️ " + translate_text("Back", "en", lang), callback_data="SUB" ) ) return kb def minimum_tariff_kb(lang, currency_code: str, amount_currency: int, amount_stars: int): debug_print(logger) """ Клавиатура оплаты минимального тарифа с :param lang: язык интерфейса :param currency_code: код валюты (типа RUB) :param amount_currency: цена тарифа в данной валюте :param amount_stars: цена в звездах :return: объект InlineKeyboardMarkup """ return _tariff_payment_kb_base(lang, "Minimum", amount_currency, currency_code, amount_stars) def usual_tariff_kb(lang, currency_code: str, amount_currency: int, amount_stars: int): debug_print(logger) """ :param lang: язык интерфейса :param currency_code: код валюты (типа RUB) :param amount_currency: цена тарифа в данной валюте :param amount_stars: цена в звездах :return: объект InlineKeyboardMarkup """ return _tariff_payment_kb_base(lang, "Usual", amount_currency, currency_code, amount_stars) def premium_tariff_kb(lang, currency_code: str, amount_currency: int, amount_stars: int): debug_print(logger) """ :param lang: язык интерфейса :param currency_code: код валюты (типа RUB) :param amount_currency: цена тарифа в данной валюте :param amount_stars: цена в звездах :return: объект InlineKeyboardMarkup """ return _tariff_payment_kb_base(lang, "Premium", amount_currency, currency_code, amount_stars) def information_kb(lang): debug_print(logger) """ Создает inline-клавиатуру с разделами информации об игре. :param lang: язык интерфейса :return: объект InlineKeyboardMarkup """ kb = InlineKeyboardMarkup(row_width=1) kb.add(InlineKeyboardButton("❓ " + translate_text("How to play?", "en", lang), callback_data="how_to_play")) kb.add(InlineKeyboardButton("📋 " + translate_text("Usage rules", "en", lang), callback_data="usage_policy")) kb.add(InlineKeyboardButton("🚀 " + translate_text("Future developments", "en", lang), callback_data="future_developments")) kb.add(InlineKeyboardButton("⬅️ " + translate_text("Back", "en", lang), callback_data="back_to_main")) return kb def account_kb(lang): debug_print(logger) """ Создает меню управления аккаунтом пользователя. :param lang: язык интерфейса :return: объект InlineKeyboardMarkup """ kb = InlineKeyboardMarkup(row_width=1) kb.add(InlineKeyboardButton("🗑️ " + translate_text(" Delete adventure", "en", lang), callback_data="delete_history")) kb.add(InlineKeyboardButton("🌐 " + translate_text(" Language of chat", "en", lang), callback_data="change_language")) kb.add(InlineKeyboardButton("⚠️ " + translate_text(" Delete account", "en", lang), callback_data="delete_acc")) kb.add(InlineKeyboardButton("⬅️ " + translate_text(" Back", "en", lang), callback_data="back_to_main")) return kb def language_kb(): debug_print(logger) """ Создает клавиатуру выбора языка интерфейса. :return: объект InlineKeyboardMarkup """ kb = InlineKeyboardMarkup(row_width=2) kb.add(InlineKeyboardButton("🇬🇧 English", callback_data="lang_en"), InlineKeyboardButton("🇷🇺 Русский", callback_data="lang_ru"), InlineKeyboardButton("🇮🇹 Italiano", callback_data="lang_it")) return kb def exit_reply_kb(lang): debug_print(logger) """ Создает reply-клавиатуру с кнопкой выхода из диалога. :param lang: язык интерфейса :return: объект ReplyKeyboardMarkup """ kb = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=False) kb.add(KeyboardButton(translate_text("Exit", "en", lang))) return kb def fast_tags_kb(lang): debug_print(logger) """ Создает inline-клавиатуру с быстрыми тегами для действий в игре. :param lang: язык интерфейса :return: объект InlineKeyboardMarkup """ kb = InlineKeyboardMarkup(row_width=2) kb.add( InlineKeyboardButton("🎬 " + translate_text("Do", "en", lang), switch_inline_query_current_chat="<DO>"), InlineKeyboardButton("👁️ " + translate_text("See.", "en", lang), switch_inline_query_current_chat="<SEE>"), InlineKeyboardButton("💬 " + translate_text("Say", "en", lang), switch_inline_query_current_chat="<SAY>"), InlineKeyboardButton("💭 " + translate_text("Think", "en", lang), switch_inline_query_current_chat="<THINK>"), InlineKeyboardButton("📖 " + translate_text("Story", "en", lang), switch_inline_query_current_chat="<STORY>"), InlineKeyboardButton("🎨 " + translate_text("Draw an image", "en", lang), switch_inline_query_current_chat="<DRAW_IM>") ) return kb def fast_tags_kb_tip(lang): debug_print(logger) """ Клава быстрых тегов с дополнительными подсказками для юзера. :param lang: язык интерфейса :return: объект InlineKeyboardMarkup """ hints = [ translate_text("(write here what your character will do)", "en", lang), translate_text("(write here what your character wants to see)", "en", lang), translate_text("(write here what your character will say)", "en", lang), translate_text("(write here what your character is thinking)", "en", lang), translate_text("(Describe here an event that is guaranteed to happen)", "en", lang), translate_text("It shows you an image created from a previous message. " "Don't write anything after it.", "en", lang) ] kb = InlineKeyboardMarkup(row_width=2) kb.add( InlineKeyboardButton("🎬 " + translate_text("Do", "en", lang), switch_inline_query_current_chat=f"<DO> {hints[0]}"), InlineKeyboardButton("👁️ " + translate_text("See", "en", lang), switch_inline_query_current_chat=f"<SEE> {hints[1]}"), InlineKeyboardButton("💬 " + translate_text("Say", "en", lang), switch_inline_query_current_chat=f"<SAY> {hints[2]}"), InlineKeyboardButton("💭 " + translate_text("Think", "en", lang), switch_inline_query_current_chat=f"<THINK> {hints[3]}"), InlineKeyboardButton("📖 " + translate_text("Story", "en", lang), switch_inline_query_current_chat=f"<STORY> {hints[4]}"), InlineKeyboardButton("🎨 " + translate_text("Draw an image", "en", lang), switch_inline_query_current_chat=f"<DRAW_IM> {hints[5]}") ) return kb def current_parameters_kb(lang): debug_print(logger) """ Создает inline-клавиатуру для просмотра текущих игровых параметров. :param lang: язык интерфейса :return: объект InlineKeyboardMarkup """ kb = InlineKeyboardMarkup(row_width=2) kb.add( InlineKeyboardButton("⏰ " + translate_text("Current time", "en", lang), switch_inline_query_current_chat="<TIME>"), InlineKeyboardButton("🎒 " + translate_text("Game inventory", "en", lang), switch_inline_query_current_chat="<INV>"), InlineKeyboardButton("⚡ " + translate_text("Character's attributes", "en", lang), switch_inline_query_current_chat="<STATS>"), InlineKeyboardButton("📍 " + translate_text("Current location", "en", lang), switch_inline_query_current_chat="<LOCATION>") ) return kb def current_parameters_kb_tip(lang): debug_print(logger) """ Клава текущих параметров с дополнительными подсказками для юзера. :param lang: язык интерфейса :return: объект InlineKeyboardMarkup """ hints = [ translate_text("(This tag will send the current game time. Don't write anything after it)", "en", lang), translate_text("(This tag will send the current game inventory. Don't write anything after it.)", "en", lang), translate_text("(This tag will send the current attributes of the character. Don't write anything after it.)", "en", lang), translate_text("(This tag will send the current location of the character.) Don't write anything after it.)" , "en", lang)] kb = InlineKeyboardMarkup(row_width=2) kb.add( InlineKeyboardButton("⏰ " + translate_text("Current time", "en", lang), switch_inline_query_current_chat=f"<TIME> {hints[0]}"), InlineKeyboardButton("🎒 " + translate_text("Game inventory", "en", lang), switch_inline_query_current_chat=f"<INV> {hints[1]}"), InlineKeyboardButton("⚡ " + translate_text("Character's attributes", "en", lang), switch_inline_query_current_chat=f"<STATS> {hints[2]}"), InlineKeyboardButton("📍 " + translate_text("Current location", "en", lang), switch_inline_query_current_chat=f"<LOCATION> {hints[3]}") ) return kb def actions_with_inv_kb(lang): debug_print(logger) """ Создает inline-клавиатуру для действий с инвентарем персонажа. :param lang: язык интерфейса :return: объект InlineKeyboardMarkup """ kb = InlineKeyboardMarkup(row_width=2) kb.add( InlineKeyboardButton("➕ " + translate_text("Take item", "en", lang), switch_inline_query_current_chat="<TAKEITEM>"), InlineKeyboardButton("➖ " + translate_text("Throw away the item", "en", lang), switch_inline_query_current_chat="<DROP>"), InlineKeyboardButton("⚡ " + translate_text("Change character's attributes", "en", lang), switch_inline_query_current_chat="<CHANGESTATS>"), InlineKeyboardButton("🗺️ " + translate_text("Change character location", "en", lang), switch_inline_query_current_chat="<CHANGELOCATION>") ) return kb async def send_all_toolbars(chat_id: int, lang: str, bot, sessions, delete_previous: bool = True): debug_print(logger) """ Отправляет все панели инструментов (быстрые теги, параметры, действия с инвентарем). При повторном вызове удаляет предыдущие панели. :param chat_id: идентификатор чата :param lang: язык интерфейса :param delete_previous: флаг удаления предыдущих панелей :return: ничего не возвращает """ sess = sessions.get(chat_id) if not sess: return # --- Удаляем предыдущие панели, если есть --- if delete_previous and hasattr(sess, "last_toolbar_msgs"): for mid in sess.last_toolbar_msgs: try: await bot.delete_message(chat_id, mid) except Exception: pass # --- Отправляем новые панели --- sent_msgs = [] try: msg1 = await bot.send_message(chat_id, f"{translate_text('Quick tags', 'en', lang)}:" + "\n" + "___________________________________", reply_markup=fast_tags_kb(lang)) msg2 = await bot.send_message(chat_id, f"{translate_text('Current parameters', 'en', lang)}:" + "\n" + "___________________________________", reply_markup=current_parameters_kb(lang)) msg3 = await bot.send_message(chat_id, f"{translate_text(' Manually changing the parameters', 'en', lang)}:" + "\n" + "___________________________________", reply_markup=actions_with_inv_kb(lang)) sent_msgs.extend([msg1.message_id, msg2.message_id, msg3.message_id]) except Exception as e: logging.warning(f"[send_all_toolbars] Error while sending toolbars: {e}") return # --- Запоминаем их, чтобы удалить при следующем вводе --- sess.last_toolbar_msgs = sent_msgs async def send_all_toolbars_tip(chat_id: int, lang: str, bot, sessions, delete_previous: bool = True): debug_print(logger) """ Отправляет все панели инструментов (быстрые теги, параметры, действия с инвентарем). При повторном вызове удаляет предыдущие панели. :param chat_id: идентификатор чата :param lang: язык интерфейса :param delete_previous: флаг удаления предыдущих панелей :return: ничего не возвращает """ sess = sessions.get(chat_id) if not sess: return # --- Удаляем предыдущие панели, если есть --- if delete_previous and hasattr(sess, "last_toolbar_msgs"): for mid in sess.last_toolbar_msgs: try: await bot.delete_message(chat_id, mid) except Exception: pass # --- Отправляем новые панели --- sent_msgs = [] try: msg1 = await bot.send_message(chat_id, f"{translate_text('Quick tags', 'en', lang)}:" + "\n" + "___________________________________", reply_markup=fast_tags_kb_tip(lang)) msg2 = await bot.send_message(chat_id, f"{translate_text('Current parameters', 'en', lang)}:" + "\n" + "___________________________________", reply_markup=current_parameters_kb_tip(lang)) msg3 = await bot.send_message(chat_id, f"{translate_text(' Manually changing the parameters', 'en', lang)}:" + "\n" + "___________________________________", reply_markup=actions_with_inv_kb(lang)) sent_msgs.extend([msg1.message_id, msg2.message_id, msg3.message_id]) except Exception as e: logging.warning(f"[send_all_toolbars] Error while sending toolbars: {e}") return # --- Запоминаем их, чтобы удалить при следующем вводе --- sess.last_toolbar_msgs = sent_msgs def special_parameters_keyboard(lang): debug_print(logger) """ Клавиатура для выбора специальных параметров истории. Параметры: время начала, фантазия модели, стиль изображений, броски кубика. :param lang: язык спец параметров :return: клаву возвращает """ kb = InlineKeyboardMarkup(row_width=1) kb.add( InlineKeyboardButton( "⏰ " + translate_text("Time start history", "en", lang), callback_data="spec_time" ), InlineKeyboardButton( "✨ " + translate_text("The model's fantasy", "en", lang), callback_data="spec_fantasy" ), InlineKeyboardButton( "🎲 " + translate_text("Turn off dices ", "en", lang), callback_data="spec_drop_cubes" ), InlineKeyboardButton( "🎨 " + translate_text("Image generation style", "en", lang), callback_data="spec_generation" ), InlineKeyboardButton( "⬅️ " + translate_text("Back", "en", lang), callback_data="spec_back_to_choice" ) ) return kb def skip_or_setup_keyboard(lang): debug_print(logger) """ Клавиатура на этапе 6 перед специальными параметрами. Два варианта: пропустить или добавить параметры. :param lang: язык клавы :return: клаву возвращает """ kb = InlineKeyboardMarkup(row_width=2) kb.add( InlineKeyboardButton( "➕ " + translate_text("More parameters", "en", lang), callback_data="skip_or_setup_yes" ), InlineKeyboardButton( "⏭️ " + translate_text("Skip", "en", lang), callback_data="skip_or_setup_no" ) ) return kb def hide_reply_kb(): debug_print(logger) """ Скрывает reply-клавиатуру в чате. :return: объект ReplyKeyboardRemove """ return types.ReplyKeyboardRemove()