microsoft / microsoft/OmniParser
tgbot
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
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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