Skip to content

tgbot #351

@azam-kan

Description

@azam-kan

import asyncio
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from database import Database
from payment import create_payment
import config

logging.basicConfig(level=logging.INFO)
bot = Bot(token=config.BOT_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
db = Database()

class OrderState(StatesGroup):
waiting_for_quantity = State()
waiting_for_address = State()

Команда /start

@dp.message_handler(commands=['start'])
async def start_command(message: types.Message):
user_id = message.from_user.id
username = message.from_user.username

if not db.user_exists(user_id):
    db.add_user(user_id, username)

await message.answer(
    "🛒 Добро пожаловать в наш магазин!\n\n"
    "Доступные команды:\n"
    "/catalog - Просмотреть товары\n"
    "/cart - Корзина\n"
    "/orders - Мои заказы\n"
    "/support - Поддержка"
)

Показать каталог

@dp.message_handler(commands=['catalog'])
async def show_catalog(message: types.Message):
products = db.get_all_products()

if not products:
    await message.answer("📭 Товаров пока нет")
    return

for product in products:
    caption = f"🛍️ {product[1]}\n💵 Цена: {product[2]} руб.\n📦 {product[3]}"
    
    with open(f"products/{product[4]}", 'rb') as photo:
        await message.answer_photo(
            photo,
            caption=caption,
            reply_markup=types.InlineKeyboardMarkup().add(
                types.InlineKeyboardButton(
                    "✅ Добавить в корзину",
                    callback_data=f"add_{product[0]}"
                )
            )
        )

Обработка добавления в корзину

@dp.callback_query_handler(lambda c: c.data.startswith('add_'))
async def add_to_cart(callback: types.CallbackQuery):
product_id = int(callback.data.split('_')[1])
user_id = callback.from_user.id

db.add_to_cart(user_id, product_id, 1)

await callback.answer("Товар добавлен в корзину!")
await callback.message.answer(
    "Товар добавлен. Продолжить покупки или перейти в корзину?",
    reply_markup=types.InlineKeyboardMarkup(row_width=2).add(
        types.InlineKeyboardButton("🛒 Корзина", callback_data="view_cart"),
        types.InlineKeyboardButton("📋 Каталог", callback_data="view_catalog")
    )
)

Команда /cart

@dp.message_handler(commands=['cart'])
async def view_cart(message: types.Message):
cart_items = db.get_cart(message.from_user.id)

if not cart_items:
    await message.answer("🛒 Корзина пуста")
    return

total = 0
cart_text = "🛒 Ваша корзина:\n\n"

for item in cart_items:
    product = db.get_product(item[1])
    cart_text += f"{product[1]} x{item[2]} = {product[2] * item[2]} руб.\n"
    total += product[2] * item[2]

cart_text += f"\n💰 Итого: {total} руб."

await message.answer(
    cart_text,
    reply_markup=types.InlineKeyboardMarkup().add(
        types.InlineKeyboardButton("💳 Оформить заказ", callback_data="checkout"),
        types.InlineKeyboardButton("🗑️ Очистить корзину", callback_data="clear_cart")
    )
)

Оформление заказа с оплатой

@dp.callback_query_handler(lambda c: c.data == 'checkout')
async def checkout_order(callback: types.CallbackQuery):
user_id = callback.from_user.id
cart_items = db.get_cart(user_id)

if not cart_items:
    await callback.answer("Корзина пуста!")
    return

total = sum(db.get_product(item[1])[2] * item[2] for item in cart_items)

# Создаем оплату через ЮKassa
payment_url = create_payment(total, user_id)

order_id = db.create_order(user_id, total, "ожидает оплаты")

await callback.message.answer(
    f"💳 Сумма к оплате: {total} руб.\n\n"
    f"Для оплаты перейдите по ссылке:\n{payment_url}\n\n"
    "После оплаты нажмите /paid для подтверждения",
    reply_markup=types.InlineKeyboardMarkup().add(
        types.InlineKeyboardButton("🔗 Перейти к оплате", url=payment_url)
    )
)

Админ-панель

@dp.message_handler(commands=['admin'])
async def admin_panel(message: types.Message):
if message.from_user.id not in config.ADMIN_IDS:
return

await message.answer(
    "⚙️ Панель администратора",
    reply_markup=types.InlineKeyboardMarkup(row_width=2).add(
        types.InlineKeyboardButton("📊 Статистика", callback_data="admin_stats"),
        types.InlineKeyboardButton("➕ Добавить товар", callback_data="add_product"),
        types.InlineKeyboardButton("📦 Заказы", callback_data="view_orders"),
        types.InlineKeyboardButton("📢 Рассылка", callback_data="send_broadcast")
    )
)

if name == 'main':
db.init_db() # Инициализируем базу данных
asyncio.run(dp.start_polling())

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions