microsoft / microsoft/OmniParser

tgbot

Open
#351 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Jupyter Notebook
Stars
25.4k
Forks
2.2k
PR merge metrics
No merged PRs in 30d

Description

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())

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

The issue contains standalone Python code for an aiogram Telegram bot, including database access and payment handling, but names no repository file, test, requested behavior, or expected outcome. Clarify what change is wanted and how this bot should integrate with OmniParser before attempting implementation.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
backend, database, payments
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
10/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.