update: added test pay
This commit is contained in:
parent
726db59025
commit
630c86a92d
@ -2,25 +2,24 @@ from aiogram.filters.callback_data import CallbackData
|
|||||||
from aiogram.types import InlineKeyboardButton
|
from aiogram.types import InlineKeyboardButton
|
||||||
from aiogram.utils.keyboard import InlineKeyboardBuilder
|
from aiogram.utils.keyboard import InlineKeyboardBuilder
|
||||||
|
|
||||||
|
|
||||||
models_description = {
|
models_description = {
|
||||||
"1o": "Это базовая модель ИИ, которая \"умеет думать\". Она хороша для выполнения повседневных задач, \n\
|
"1o": "Это базовая модель ИИ, которая \"умеет думать\". Она хороша для выполнения повседневных задач, \
|
||||||
таких как анализ данных, обработка текста и создание отчетов. Она подходит для малого и среднего бизнеса, \n\
|
таких как анализ данных, обработка текста и создание отчетов. Она подходит для малого и среднего бизнеса, \
|
||||||
где важно автоматизировать рутинные задачи и получать быстрые результаты.\n\n\
|
где важно автоматизировать рутинные задачи и получать быстрые результаты.\n\n\
|
||||||
Выберите тариф к модели 1о.",
|
Выберите тариф к модели 1о.",
|
||||||
"1o mini": "Уменьшенная версия 1о, которая также \"умеет думать\". Эта модель менее мощная, \n\
|
"1o mini": "Уменьшенная версия 1о, которая также \"умеет думать\". Эта модель менее мощная, \
|
||||||
но зато работает быстрее на устройствах с ограниченными ресурсами, таких как смартфоны или небольшие компьютеры. \n\
|
но зато работает быстрее на устройствах с ограниченными ресурсами, таких как смартфоны или небольшие компьютеры. \
|
||||||
Прекрасно подойдет для мобильных приложений и стартапов, где ресурсы ограничены, но нужны умные решения.\n\n\
|
Прекрасно подойдет для мобильных приложений и стартапов, где ресурсы ограничены, но нужны умные решения.\n\n\
|
||||||
Выберите тариф к модели 1о mini.",
|
Выберите тариф к модели 1о mini.",
|
||||||
"4o": "Это мощная модель ИИ, предназначенная для сложных и объемных задач. Она хорошо справляется \n\
|
"4o": "Это мощная модель ИИ, предназначенная для сложных и объемных задач. Она хорошо справляется \
|
||||||
с глубоким анализом больших данных, сложными прогнозами и инновационными бизнес-проектами. \n\
|
с глубоким анализом больших данных, сложными прогнозами и инновационными бизнес-проектами. \
|
||||||
Идеальна для крупных компаний, требующих высокую производительность для динамичного принятия решений и стратегического анализа.\n\n\
|
Идеальна для крупных компаний, требующих высокую производительность для динамичного принятия решений и стратегического анализа.\n\n\
|
||||||
Выберите тариф к модели 4о.",
|
Выберите тариф к модели 4о.",
|
||||||
"4o mini": "Уменьшенная версия модели 4о. Она сохраняет высокую мощность при меньшем использовании ресурсов. \n\
|
"4o mini": "Уменьшенная версия модели 4о. Она сохраняет высокую мощность при меньшем использовании ресурсов. \
|
||||||
Подходит для сложных бизнес-задач в условиях ограниченных ресурсов, таких как аналитика в режиме реального времени \n\
|
Подходит для сложных бизнес-задач в условиях ограниченных ресурсов, таких как аналитика в режиме реального времени \
|
||||||
на портативных и мобильных устройствах. Отличный выбор для бизнеса, который хочет получить максимум от своих технологий \n\
|
на портативных и мобильных устройствах. Отличный выбор для бизнеса, который хочет получить максимум от своих технологий \
|
||||||
без больших затрат на оборудование.\n\n\
|
без больших затрат на оборудование.\n\n\
|
||||||
Выберите тариф к модели 4о."
|
Выберите тариф к модели 4о."
|
||||||
}
|
}
|
||||||
|
|
||||||
model_prices = {
|
model_prices = {
|
||||||
@ -89,30 +88,30 @@ name_of_model = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class PayCallBack(CallbackData, prefix="pay"):
|
class PayCallBack(CallbackData, prefix="pay"):
|
||||||
name_of_model: str
|
name: str
|
||||||
option_of_model: str
|
option_of_model: str
|
||||||
tokens: str
|
tokens: str
|
||||||
amount: str
|
amount: str
|
||||||
|
|
||||||
def get_model_page(*, name_of_model: str, sizes: tuple[int] = (1,)):
|
def get_model_page(*, page: int, name: str):
|
||||||
text: str = models_description[name_of_model]
|
text: str = models_description[name]
|
||||||
|
|
||||||
temp_kbds: InlineKeyboardBuilder = InlineKeyboardBuilder()
|
temp_kbds: InlineKeyboardBuilder = InlineKeyboardBuilder()
|
||||||
|
|
||||||
for option_name, item in models_description[name_of_model].items():
|
for option_name, item in model_prices[name].items():
|
||||||
option_name_rus, tokens, amount = name_of_model[option_name], item["tokens"], item["amount"]
|
option_name_rus, tokens, amount = name_of_model[option_name], item["tokens"], item["amount"]
|
||||||
temp_text = f"{name_of_model[option_name]} \n {tokens} запросов за {amount} RUB"
|
temp_text = f"{name_of_model[option_name]} | {tokens} запросов за {amount} RUB"
|
||||||
temp_kbds.add(InlineKeyboardButton(
|
temp_kbds.add(InlineKeyboardButton(
|
||||||
text=temp_text,
|
text=temp_text,
|
||||||
callback_data=PayCallBack(
|
callback_data=PayCallBack(
|
||||||
name_of_model=name_of_model,
|
name=name,
|
||||||
option_of_model=option_name_rus,
|
option_of_model=option_name_rus,
|
||||||
tokens=tokens,
|
tokens=tokens,
|
||||||
amount=amount
|
amount=amount
|
||||||
).pack()
|
).pack()
|
||||||
))
|
))
|
||||||
|
|
||||||
return text, temp_kbds.adjust(*sizes).as_markup()
|
return text, temp_kbds
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,39 +1,81 @@
|
|||||||
from aiogram.types import InlineKeyboardMarkup
|
from aiogram.types import InlineKeyboardMarkup
|
||||||
|
|
||||||
from bot.kbs.inline import get_user_main_btns, get_user_lessons_page, get_user_tarif_page, \
|
from bot.kbs.inline import get_user_main_btns, get_user_lessons_page, get_user_tarif_page, \
|
||||||
get_user_model_description_page
|
get_user_model_description_page, get_more_about_modules_page, get_price_list_page
|
||||||
|
|
||||||
page_info = {
|
page_info = {
|
||||||
'main' : "Привет! Это Мудрый ИИ. Этот бот создан для того, чтобы вы легко и просто использовали искусственный интеллект, \n\
|
'main' : "Привет! Это Мудрый ИИ. Этот бот создан для того, чтобы вы легко и просто использовали искусственный интеллект, \
|
||||||
и вы можете применить его абсолютно в любых целях. Этот бот содержит в себе 4 модели ИИ:\n\n\
|
и вы можете применить его абсолютно в любых целях. Этот бот содержит в себе 4 модели ИИ:\n\n\
|
||||||
1о - Супермодель, первый уровень AGI. Она умеет размышлять и выдавать осмысленные и глубокие ответы.\n\n\
|
1о - Супермодель, первый уровень AGI. Она умеет размышлять и выдавать осмысленные и глубокие ответы.\n\n\
|
||||||
1о mini - Супермодель, упрощенная версия 1о, но также умеет думать и помогать в сложных задачах. \n\
|
1о mini - Супермодель, упрощенная версия 1о, но также умеет думать и помогать в сложных задачах. \n\
|
||||||
В плане цены она доступнее 1о.\n\n\
|
В плане цены она доступнее 1о.\n\n\
|
||||||
4о - Проверенная практикой модель, которая быстро справляется с любой задачей. \n\
|
4о - Проверенная практикой модель, которая быстро справляется с любой задачей. \n\
|
||||||
Её сила в скорости и качестве результатов, подходит для длительных, средних и сложных задач.\n\n\
|
Её сила в скорости и качестве результатов, подходит для длительных, средних и сложных задач.\n\n\
|
||||||
4о mini - Лайт версия 4о. Вы практически не ограничены в запросах, эта модель эффективна, когда вы только ищете решение. \n\
|
4о mini - Лайт версия 4о. Вы практически не ограничены в запросах, эта модель эффективна, когда вы только ищете решение. \n\
|
||||||
Вы сможете быстро перебирать подходящие варианты, а когда найдете, то сможете спокойно пользоваться 4о, 1о или 1о m.",
|
Вы сможете быстро перебирать подходящие варианты, а когда найдете, то сможете спокойно пользоваться 4о, 1о или 1о m.",
|
||||||
"lessons": "Список доступных уроков:\n\n\
|
"lessons": "Список доступных уроков:\n\n\
|
||||||
Чем полезен ИИ-Робот в Telegram\n\
|
Чем полезен ИИ-Робот в Telegram\n\
|
||||||
В этом уроке вы узнаете про возможности ИИ-Ассистента\n\n\
|
В этом уроке вы узнаете про возможности ИИ-Ассистента\n\n\
|
||||||
Первые шаги с ИИ в Telegram Боте\n\
|
Первые шаги с ИИ в Telegram Боте\n\
|
||||||
Выходим в интернет с помощью ИИ\n\n\
|
Выходим в интернет с помощью ИИ\n\n\
|
||||||
Загружаем в ИИ-бота информацией о вас\n\
|
Загружаем в ИИ-бота информацией о вас\n\
|
||||||
Первые шаги в обучении ИИ\n\n\
|
Первые шаги в обучении ИИ\n\n\
|
||||||
Решение повторяющихся задач\n\
|
Решение повторяющихся задач\n\
|
||||||
В этом уроке мы быстро создаем чек-листы, регламенты, правила\n\n\
|
В этом уроке мы быстро создаем чек-листы, регламенты, правила\n\n\
|
||||||
Основные методы по обучению ИИ-Бота\n\
|
Основные методы по обучению ИИ-Бота\n\
|
||||||
Вы научитесь правильно обучать вашего нейросотрудника\n\n\
|
Вы научитесь правильно обучать вашего нейросотрудника\n\n\
|
||||||
Исследование рынка с помощью ИИ\n\
|
Исследование рынка с помощью ИИ\n\
|
||||||
В этом уроке вы узнаете как через ИИ-Ассистента исследовать рынок и находить новые возможности\n\n\
|
В этом уроке вы узнаете как через ИИ-Ассистента исследовать рынок и находить новые возможности\n\n\
|
||||||
Сегментирование целевой аудитории\n\
|
Сегментирование целевой аудитории\n\
|
||||||
Сможете создавать портреты ЦА с помощью ИИ-Ассистента\n\n\
|
Сможете создавать портреты ЦА с помощью ИИ-Ассистента\n\n\
|
||||||
Основы технического промта\n\
|
Основы технического промта\n\
|
||||||
В этом уроке вы узнаете основу создания промт\n\n\
|
В этом уроке вы узнаете основу создания промт\n\n\
|
||||||
Эти уроки раскрывают потенциал по управлению ИИ-ботом, однако некоторые функции из уроков ваш бот не сможет сделать,\n\
|
Эти уроки раскрывают потенциал по управлению ИИ-ботом, однако некоторые функции из уроков ваш бот не сможет сделать,\n\
|
||||||
например, поставить встречи в гугл календаре или работать с файлами.\n\
|
например, поставить встречи в гугл календаре или работать с файлами.\n\
|
||||||
Но вы точно научитесь использовать этого на 100%\n\n\
|
Но вы точно научитесь использовать этого на 100%\n\n\
|
||||||
Ссылка на бесплатное обучение - https://neirovoid.getcourse.ru/Ai_QUB"
|
Ссылка на бесплатное обучение - https://neirovoid.getcourse.ru/Ai_QUB",
|
||||||
|
"tarif": "Выберите модель:",
|
||||||
|
"more_about_models": "Больше о моделях",
|
||||||
|
"price_list": "1O:\n\
|
||||||
|
Базовый\n\
|
||||||
|
- Количество запросов: 60\n\
|
||||||
|
- Цена для пользователя: 2000 RUB\n\n\
|
||||||
|
Продвинутый\n\
|
||||||
|
- Количество запросов: 128\n\
|
||||||
|
- Цена для пользователя: 3500 RUB\n\n\
|
||||||
|
Профессиональный\n\
|
||||||
|
- Количество запросов: 300\n\
|
||||||
|
- Цена для пользователя: 7500 RUB\n\n\
|
||||||
|
1O mini:\n\
|
||||||
|
Базовый\n\
|
||||||
|
- Количество запросов: 50\n\
|
||||||
|
- Цена для пользователя: 900 RUB\n\n\
|
||||||
|
Продвинутый\n\
|
||||||
|
- Количество запросов: 100\n\
|
||||||
|
- Цена для пользователя: 1500 RUB\n\n\
|
||||||
|
Профессиональный\n\
|
||||||
|
- Количество запросов: 270\n\
|
||||||
|
- Цена для пользователя: 2700 RUB\n\n\
|
||||||
|
4O:\n\
|
||||||
|
Базовый\n\
|
||||||
|
- Количество запросов: 100\n\
|
||||||
|
- Цена для пользователя: 1500 RUB\n\n\
|
||||||
|
Продвинутый\n\
|
||||||
|
- Количество запросов: 150\n\
|
||||||
|
- Цена для пользователя: 2000 RUB\n\n\
|
||||||
|
Профессиональный\n\
|
||||||
|
- Количество запросов: 303\n\
|
||||||
|
- Цена для пользователя: 3750 RUB\n\n\
|
||||||
|
4O mini:\n\
|
||||||
|
Базовый\n\
|
||||||
|
- Количество запросов: 800\n\
|
||||||
|
- Цена для пользователя: 400 RUB\n\n\
|
||||||
|
Продвинутый\n\
|
||||||
|
- Количество запросов: 1650\n\
|
||||||
|
- Цена для пользователя: 650 RUB\n\n\
|
||||||
|
Профессиональный\n\
|
||||||
|
- Количество запросов: 3300\n\
|
||||||
|
- Цена для пользователя: 1250 RUB",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -55,18 +97,38 @@ async def tarif_page(page: int, name: str):
|
|||||||
|
|
||||||
return text, kbds
|
return text, kbds
|
||||||
|
|
||||||
async def models_description_page(page: int, name_of_model: str):
|
async def models_description_page(page: int, name: str):
|
||||||
text, kbds = get_user_model_description_page(page=page, name_of_model=name_of_model)
|
text, kbds = get_user_model_description_page(page=page, name=name)
|
||||||
|
|
||||||
return text, kbds
|
return text, kbds
|
||||||
|
|
||||||
async def get_page_content(page: int, name: str, name_of_model: str = ""):
|
async def more_about_models_page(page: int, name: str):
|
||||||
|
kbds: InlineKeyboardMarkup = get_more_about_modules_page(page=page)
|
||||||
|
text = page_info[name]
|
||||||
|
|
||||||
|
return text, kbds
|
||||||
|
|
||||||
|
async def price_list_page(page: int, name: str):
|
||||||
|
kbds: InlineKeyboardMarkup = get_price_list_page(page=page)
|
||||||
|
text = page_info[name]
|
||||||
|
|
||||||
|
return text, kbds
|
||||||
|
|
||||||
|
async def get_page_content(page: int, name: str):
|
||||||
|
|
||||||
if page == 0:
|
if page == 0:
|
||||||
return await main_page(page, name)
|
return await main_page(page, name)
|
||||||
if page == 1:
|
elif page == 1:
|
||||||
return await lessons_page(page, name)
|
return await lessons_page(page, name)
|
||||||
if page == 2:
|
elif page == 2:
|
||||||
return await tarif_page(page, name)
|
return await tarif_page(page, name)
|
||||||
if 4 <= page <= 7:
|
elif page == 3:
|
||||||
return models_description_page(page, name_of_model)
|
return await more_about_models_page(page, name)
|
||||||
|
elif 4 <= page <= 7:
|
||||||
|
return await models_description_page(page, name)
|
||||||
|
elif page == 8:
|
||||||
|
#TODO
|
||||||
|
...
|
||||||
|
elif page == 9:
|
||||||
|
return await price_list_page(page, name)
|
||||||
|
|
||||||
|
@ -1,8 +1,11 @@
|
|||||||
from aiogram import Router, types
|
from aiogram import Router, types
|
||||||
from aiogram.filters import CommandStart
|
from aiogram.filters import CommandStart, Command
|
||||||
|
from aiogram.types import LabeledPrice, PreCheckoutQuery
|
||||||
|
|
||||||
|
from bot.handlers.user.model_processing import PayCallBack
|
||||||
from bot.handlers.user.page_processing import get_page_content
|
from bot.handlers.user.page_processing import get_page_content
|
||||||
from bot.kbs.inline import PageCallBack
|
from bot.kbs.inline import PageCallBack
|
||||||
|
from config import shop_api_token
|
||||||
|
|
||||||
user = Router()
|
user = Router()
|
||||||
|
|
||||||
@ -23,3 +26,29 @@ async def user_pages(callback: types.CallbackQuery, callback_data: PageCallBack)
|
|||||||
|
|
||||||
await callback.message.edit_text(text, reply_markup=reply_markup)
|
await callback.message.edit_text(text, reply_markup=reply_markup)
|
||||||
await callback.answer()
|
await callback.answer()
|
||||||
|
|
||||||
|
@user.callback_query(PayCallBack.filter())
|
||||||
|
async def buy(callback: types.CallbackQuery, callback_data: PayCallBack):
|
||||||
|
|
||||||
|
await callback.message.bot.send_invoice(
|
||||||
|
chat_id=callback.from_user.id,
|
||||||
|
description=f'{callback_data.tokens} токенов за {callback_data.amount} RUB для модели {callback_data.name}',
|
||||||
|
title=f'{callback_data.option_of_model} подписка на {callback_data.name}',
|
||||||
|
payload=f'sub_{callback_data.name}',
|
||||||
|
provider_token=shop_api_token,
|
||||||
|
start_parameter='test',
|
||||||
|
currency="RUB",
|
||||||
|
prices=[LabeledPrice(
|
||||||
|
label=f'Оплата токенов для {callback_data.option_of_model}',
|
||||||
|
amount=int(callback_data.amount)*100,
|
||||||
|
)],
|
||||||
|
)
|
||||||
|
|
||||||
|
@user.pre_checkout_query()
|
||||||
|
async def procces_pre_checkout_query(pre_checkout_query: PreCheckoutQuery):
|
||||||
|
await pre_checkout_query.answer(ok=True)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,13 +8,12 @@ from bot.handlers.user.model_processing import get_model_page
|
|||||||
class PageCallBack(CallbackData, prefix="page"):
|
class PageCallBack(CallbackData, prefix="page"):
|
||||||
page: int
|
page: int
|
||||||
page_name: str
|
page_name: str
|
||||||
name_of_model: str
|
|
||||||
|
|
||||||
def get_user_main_btns(*, page: int): # page 0
|
def get_user_main_btns(*, page: int): # page 0
|
||||||
btns = [
|
btns = [
|
||||||
InlineKeyboardButton(text="Бесплатные уроки", callback_data=PageCallBack(page=page+1, page_name="lessons").pack()),#1
|
InlineKeyboardButton(text="Бесплатные уроки", callback_data=PageCallBack(page=1, page_name="lessons").pack()),#1
|
||||||
InlineKeyboardButton(text="Выбрать тариф", callback_data=PageCallBack(page=page+2, page_name="tarif").pack()),#2
|
InlineKeyboardButton(text="Выбрать тариф", callback_data=PageCallBack(page=2, page_name="tarif").pack()),#2
|
||||||
InlineKeyboardButton(text="Больше о моделях", callback_data=PageCallBack(page=page+3, page_name="modelsDescription").pack()),#3
|
InlineKeyboardButton(text="Больше о моделях", callback_data=PageCallBack(page=3, page_name="more_about_models").pack()),#3
|
||||||
]
|
]
|
||||||
|
|
||||||
return get_kb_buttons(btns=btns)
|
return get_kb_buttons(btns=btns)
|
||||||
@ -22,27 +21,47 @@ def get_user_main_btns(*, page: int): # page 0
|
|||||||
|
|
||||||
def get_user_lessons_page(*, page): # page 1
|
def get_user_lessons_page(*, page): # page 1
|
||||||
btns = [
|
btns = [
|
||||||
InlineKeyboardButton(text="Выбрать модель", callback_data=PageCallBack(page=page + 1, page_name="tarif").pack()), # 2
|
InlineKeyboardButton(text="Выбрать модель", callback_data=PageCallBack(page=2, page_name="tarif").pack()), # 2
|
||||||
InlineKeyboardButton(text="⬅️Назад", callback_data=PageCallBack(page=page - 1, page_name="main").pack()), # 2
|
InlineKeyboardButton(text="⬅️Назад", callback_data=PageCallBack(page=0, page_name="main").pack()), # 2
|
||||||
]
|
]
|
||||||
|
|
||||||
return get_kb_buttons(btns=btns)
|
return get_kb_buttons(btns=btns)
|
||||||
|
|
||||||
def get_user_tarif_page(*, page): # page 2
|
def get_user_tarif_page(*, page): # page 2
|
||||||
btns = [
|
btns = [
|
||||||
InlineKeyboardButton(text="1o", callback_data=PageCallBack(page=4, name_of_model='1o').pack()), # 4
|
InlineKeyboardButton(text="1o", callback_data=PageCallBack(page=4, page_name='1o').pack()), # 4
|
||||||
InlineKeyboardButton(text="1o mini", callback_data=PageCallBack(page=5, name_of_model='1o mini').pack()), # 5
|
InlineKeyboardButton(text="1o mini", callback_data=PageCallBack(page=5, page_name='1o mini').pack()), # 5
|
||||||
InlineKeyboardButton(text="4o", callback_data=PageCallBack(page=6, name_of_model='4o').pack()), # 6
|
InlineKeyboardButton(text="4o", callback_data=PageCallBack(page=6, page_name='4o').pack()), # 6
|
||||||
InlineKeyboardButton(text="4o mini", callback_data=PageCallBack(page=7, name_of_model='4o mini').pack()), # 7
|
InlineKeyboardButton(text="4o mini", callback_data=PageCallBack(page=7, page_name='4o mini').pack()), # 7
|
||||||
InlineKeyboardButton(text="⬅️Назад", callback_data=PageCallBack(page=page - 1, page_name="main").pack()), # 1
|
InlineKeyboardButton(text="⬅️Назад", callback_data=PageCallBack(page=0, page_name="main").pack()), # 1
|
||||||
]
|
]
|
||||||
|
|
||||||
return get_kb_buttons(btns=btns)
|
return get_kb_buttons(btns=btns)
|
||||||
|
|
||||||
def get_user_model_description_page(*, page: int, name_of_model: str):
|
def get_user_model_description_page(*, page: int, name: str):
|
||||||
text, kbd = get_model_page(name_of_model=name_of_model)
|
text, kbd = get_model_page(page=page, name=name)
|
||||||
|
|
||||||
|
kbd.add(InlineKeyboardButton(text="⬅️Назад", callback_data=PageCallBack(page=2, page_name="tarif").pack()),)
|
||||||
|
|
||||||
|
return text, kbd.adjust(*(1,)).as_markup()
|
||||||
|
|
||||||
|
def get_more_about_modules_page(*, page: int): # page 3
|
||||||
|
btns = [
|
||||||
|
InlineKeyboardButton(text="Как узнать, какая модель мне подходит", callback_data=PageCallBack(page=8, page_name='match_model').pack()),
|
||||||
|
InlineKeyboardButton(text="Узнать стоимость моделей", callback_data=PageCallBack(page=9, page_name='price_list').pack()),
|
||||||
|
InlineKeyboardButton(text="Выбрать модель", callback_data=PageCallBack(page=2, page_name="tarif").pack()), # 2
|
||||||
|
InlineKeyboardButton(text="⬅️Назад", callback_data=PageCallBack(page=0, page_name="main").pack()),
|
||||||
|
]
|
||||||
|
|
||||||
|
return get_kb_buttons(btns=btns)
|
||||||
|
|
||||||
|
def get_price_list_page(*, page: int):
|
||||||
|
btns = [
|
||||||
|
InlineKeyboardButton(text="⬅️Назад", callback_data=PageCallBack(page=3, page_name="more_about_models").pack()),
|
||||||
|
]
|
||||||
|
|
||||||
|
return get_kb_buttons(btns=btns)
|
||||||
|
|
||||||
return text, kbd
|
|
||||||
|
|
||||||
def get_kb_buttons(*, btns: list[InlineKeyboardButton], sizes: tuple[int] = (1,)):
|
def get_kb_buttons(*, btns: list[InlineKeyboardButton], sizes: tuple[int] = (1,)):
|
||||||
kb_temp = InlineKeyboardBuilder()
|
kb_temp = InlineKeyboardBuilder()
|
||||||
|
Loading…
Reference in New Issue
Block a user