From 630c86a92d127b1b1d4b700d8d37b55eba97b11e Mon Sep 17 00:00:00 2001 From: 4hellboy4 Date: Sun, 6 Oct 2024 16:29:07 +0300 Subject: [PATCH] update: added test pay --- bot/handlers/user/model_processing.py | 49 +++++----- bot/handlers/user/page_processing.py | 136 +++++++++++++++++++------- bot/handlers/user/user_handlers.py | 31 +++++- bot/kbs/inline.py | 47 ++++++--- config.py | 5 +- 5 files changed, 190 insertions(+), 78 deletions(-) diff --git a/bot/handlers/user/model_processing.py b/bot/handlers/user/model_processing.py index 9626c71..9326182 100644 --- a/bot/handlers/user/model_processing.py +++ b/bot/handlers/user/model_processing.py @@ -2,25 +2,24 @@ from aiogram.filters.callback_data import CallbackData from aiogram.types import InlineKeyboardButton from aiogram.utils.keyboard import InlineKeyboardBuilder - models_description = { - "1o": "Это базовая модель ИИ, которая \"умеет думать\". Она хороша для выполнения повседневных задач, \n\ - таких как анализ данных, обработка текста и создание отчетов. Она подходит для малого и среднего бизнеса, \n\ - где важно автоматизировать рутинные задачи и получать быстрые результаты.\n\n\ - Выберите тариф к модели 1о.", - "1o mini": "Уменьшенная версия 1о, которая также \"умеет думать\". Эта модель менее мощная, \n\ - но зато работает быстрее на устройствах с ограниченными ресурсами, таких как смартфоны или небольшие компьютеры. \n\ - Прекрасно подойдет для мобильных приложений и стартапов, где ресурсы ограничены, но нужны умные решения.\n\n\ - Выберите тариф к модели 1о mini.", - "4o": "Это мощная модель ИИ, предназначенная для сложных и объемных задач. Она хорошо справляется \n\ - с глубоким анализом больших данных, сложными прогнозами и инновационными бизнес-проектами. \n\ - Идеальна для крупных компаний, требующих высокую производительность для динамичного принятия решений и стратегического анализа.\n\n\ - Выберите тариф к модели 4о.", - "4o mini": "Уменьшенная версия модели 4о. Она сохраняет высокую мощность при меньшем использовании ресурсов. \n\ - Подходит для сложных бизнес-задач в условиях ограниченных ресурсов, таких как аналитика в режиме реального времени \n\ - на портативных и мобильных устройствах. Отличный выбор для бизнеса, который хочет получить максимум от своих технологий \n\ - без больших затрат на оборудование.\n\n\ - Выберите тариф к модели 4о." + "1o": "Это базовая модель ИИ, которая \"умеет думать\". Она хороша для выполнения повседневных задач, \ +таких как анализ данных, обработка текста и создание отчетов. Она подходит для малого и среднего бизнеса, \ +где важно автоматизировать рутинные задачи и получать быстрые результаты.\n\n\ +Выберите тариф к модели 1о.", + "1o mini": "Уменьшенная версия 1о, которая также \"умеет думать\". Эта модель менее мощная, \ +но зато работает быстрее на устройствах с ограниченными ресурсами, таких как смартфоны или небольшие компьютеры. \ +Прекрасно подойдет для мобильных приложений и стартапов, где ресурсы ограничены, но нужны умные решения.\n\n\ +Выберите тариф к модели 1о mini.", + "4o": "Это мощная модель ИИ, предназначенная для сложных и объемных задач. Она хорошо справляется \ +с глубоким анализом больших данных, сложными прогнозами и инновационными бизнес-проектами. \ +Идеальна для крупных компаний, требующих высокую производительность для динамичного принятия решений и стратегического анализа.\n\n\ +Выберите тариф к модели 4о.", + "4o mini": "Уменьшенная версия модели 4о. Она сохраняет высокую мощность при меньшем использовании ресурсов. \ +Подходит для сложных бизнес-задач в условиях ограниченных ресурсов, таких как аналитика в режиме реального времени \ +на портативных и мобильных устройствах. Отличный выбор для бизнеса, который хочет получить максимум от своих технологий \ +без больших затрат на оборудование.\n\n\ +Выберите тариф к модели 4о." } model_prices = { @@ -89,30 +88,30 @@ name_of_model = { } class PayCallBack(CallbackData, prefix="pay"): - name_of_model: str + name: str option_of_model: str tokens: str amount: str -def get_model_page(*, name_of_model: str, sizes: tuple[int] = (1,)): - text: str = models_description[name_of_model] +def get_model_page(*, page: int, name: str): + text: str = models_description[name] 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"] - 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( text=temp_text, callback_data=PayCallBack( - name_of_model=name_of_model, + name=name, option_of_model=option_name_rus, tokens=tokens, amount=amount ).pack() )) - return text, temp_kbds.adjust(*sizes).as_markup() + return text, temp_kbds diff --git a/bot/handlers/user/page_processing.py b/bot/handlers/user/page_processing.py index c7bcf8b..f0d1ccb 100644 --- a/bot/handlers/user/page_processing.py +++ b/bot/handlers/user/page_processing.py @@ -1,39 +1,81 @@ from aiogram.types import InlineKeyboardMarkup 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 = { - 'main' : "Привет! Это Мудрый ИИ. Этот бот создан для того, чтобы вы легко и просто использовали искусственный интеллект, \n\ - и вы можете применить его абсолютно в любых целях. Этот бот содержит в себе 4 модели ИИ:\n\n\ - 1о - Супермодель, первый уровень AGI. Она умеет размышлять и выдавать осмысленные и глубокие ответы.\n\n\ - 1о mini - Супермодель, упрощенная версия 1о, но также умеет думать и помогать в сложных задачах. \n\ - В плане цены она доступнее 1о.\n\n\ - 4о - Проверенная практикой модель, которая быстро справляется с любой задачей. \n\ - Её сила в скорости и качестве результатов, подходит для длительных, средних и сложных задач.\n\n\ - 4о mini - Лайт версия 4о. Вы практически не ограничены в запросах, эта модель эффективна, когда вы только ищете решение. \n\ - Вы сможете быстро перебирать подходящие варианты, а когда найдете, то сможете спокойно пользоваться 4о, 1о или 1о m.", + 'main' : "Привет! Это Мудрый ИИ. Этот бот создан для того, чтобы вы легко и просто использовали искусственный интеллект, \ +и вы можете применить его абсолютно в любых целях. Этот бот содержит в себе 4 модели ИИ:\n\n\ +1о - Супермодель, первый уровень AGI. Она умеет размышлять и выдавать осмысленные и глубокие ответы.\n\n\ +1о mini - Супермодель, упрощенная версия 1о, но также умеет думать и помогать в сложных задачах. \n\ +В плане цены она доступнее 1о.\n\n\ +4о - Проверенная практикой модель, которая быстро справляется с любой задачей. \n\ +Её сила в скорости и качестве результатов, подходит для длительных, средних и сложных задач.\n\n\ +4о mini - Лайт версия 4о. Вы практически не ограничены в запросах, эта модель эффективна, когда вы только ищете решение. \n\ +Вы сможете быстро перебирать подходящие варианты, а когда найдете, то сможете спокойно пользоваться 4о, 1о или 1о m.", "lessons": "Список доступных уроков:\n\n\ - Чем полезен ИИ-Робот в Telegram\n\ - В этом уроке вы узнаете про возможности ИИ-Ассистента\n\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\ - Но вы точно научитесь использовать этого на 100%\n\n\ - Ссылка на бесплатное обучение - https://neirovoid.getcourse.ru/Ai_QUB" +Чем полезен ИИ-Робот в Telegram\n\ +В этом уроке вы узнаете про возможности ИИ-Ассистента\n\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\ +Но вы точно научитесь использовать этого на 100%\n\n\ +Ссылка на бесплатное обучение - 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 -async def models_description_page(page: int, name_of_model: str): - text, kbds = get_user_model_description_page(page=page, name_of_model=name_of_model) +async def models_description_page(page: int, name: str): + text, kbds = get_user_model_description_page(page=page, name=name) 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: return await main_page(page, name) - if page == 1: + elif page == 1: return await lessons_page(page, name) - if page == 2: + elif page == 2: return await tarif_page(page, name) - if 4 <= page <= 7: - return models_description_page(page, name_of_model) \ No newline at end of file + elif page == 3: + 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) + diff --git a/bot/handlers/user/user_handlers.py b/bot/handlers/user/user_handlers.py index 240d1c5..4ca160c 100644 --- a/bot/handlers/user/user_handlers.py +++ b/bot/handlers/user/user_handlers.py @@ -1,8 +1,11 @@ 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.kbs.inline import PageCallBack +from config import shop_api_token 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.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) + + + + + diff --git a/bot/kbs/inline.py b/bot/kbs/inline.py index 25efe30..33e9124 100644 --- a/bot/kbs/inline.py +++ b/bot/kbs/inline.py @@ -8,13 +8,12 @@ from bot.handlers.user.model_processing import get_model_page class PageCallBack(CallbackData, prefix="page"): page: int page_name: str - name_of_model: str def get_user_main_btns(*, page: int): # page 0 btns = [ - InlineKeyboardButton(text="Бесплатные уроки", callback_data=PageCallBack(page=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=page+3, page_name="modelsDescription").pack()),#3 + InlineKeyboardButton(text="Бесплатные уроки", callback_data=PageCallBack(page=1, page_name="lessons").pack()),#1 + InlineKeyboardButton(text="Выбрать тариф", callback_data=PageCallBack(page=2, page_name="tarif").pack()),#2 + InlineKeyboardButton(text="Больше о моделях", callback_data=PageCallBack(page=3, page_name="more_about_models").pack()),#3 ] 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 btns = [ - InlineKeyboardButton(text="Выбрать модель", callback_data=PageCallBack(page=page + 1, page_name="tarif").pack()), # 2 - InlineKeyboardButton(text="⬅️Назад", callback_data=PageCallBack(page=page - 1, page_name="main").pack()), # 2 + InlineKeyboardButton(text="Выбрать модель", callback_data=PageCallBack(page=2, page_name="tarif").pack()), # 2 + InlineKeyboardButton(text="⬅️Назад", callback_data=PageCallBack(page=0, page_name="main").pack()), # 2 ] return get_kb_buttons(btns=btns) def get_user_tarif_page(*, page): # page 2 btns = [ - InlineKeyboardButton(text="1o", callback_data=PageCallBack(page=4, name_of_model='1o').pack()), # 4 - InlineKeyboardButton(text="1o mini", callback_data=PageCallBack(page=5, name_of_model='1o mini').pack()), # 5 - InlineKeyboardButton(text="4o", callback_data=PageCallBack(page=6, name_of_model='4o').pack()), # 6 - InlineKeyboardButton(text="4o mini", callback_data=PageCallBack(page=7, name_of_model='4o mini').pack()), # 7 - InlineKeyboardButton(text="⬅️Назад", callback_data=PageCallBack(page=page - 1, page_name="main").pack()), # 1 + InlineKeyboardButton(text="1o", callback_data=PageCallBack(page=4, page_name='1o').pack()), # 4 + InlineKeyboardButton(text="1o mini", callback_data=PageCallBack(page=5, page_name='1o mini').pack()), # 5 + InlineKeyboardButton(text="4o", callback_data=PageCallBack(page=6, page_name='4o').pack()), # 6 + InlineKeyboardButton(text="4o mini", callback_data=PageCallBack(page=7, page_name='4o mini').pack()), # 7 + InlineKeyboardButton(text="⬅️Назад", callback_data=PageCallBack(page=0, page_name="main").pack()), # 1 ] return get_kb_buttons(btns=btns) -def get_user_model_description_page(*, page: int, name_of_model: str): - text, kbd = get_model_page(name_of_model=name_of_model) +def get_user_model_description_page(*, page: int, name: str): + 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,)): kb_temp = InlineKeyboardBuilder() diff --git a/config.py b/config.py index abce423..31c4fb4 100644 --- a/config.py +++ b/config.py @@ -4,4 +4,7 @@ from dotenv import load_dotenv load_dotenv() bot_token = os.getenv("BOT_TOKEN") -admins = [367757357] \ No newline at end of file +admins = [367757357] + +shop_id = os.getenv("SHOP_ID") +shop_api_token = os.getenv("SHOP_API_TOKEN") \ No newline at end of file