Files
shveitechbot/main.py
2026-03-11 20:26:38 +07:00

81 lines
2.3 KiB
Python

import os
import asyncio
import logging
from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from redis.asyncio import Redis
from aiogram.client.session.aiohttp import AiohttpSession
from config import BOT_TOKEN, REDIS_URL
from handlers import admins_routers, client_routers
from middlewares.di import DIMiddleware
from middlewares.repository import RepositoryMiddleware
from middlewares.session import DBSessionMiddleware
from misc.redis import RedisClient
from repositories.categories import CategoriesRepository
from repositories.invoices import InvoiceRepository
from repositories.order_items import OrderItemRepository
from repositories.orders import OrderRepository
from repositories.products import ProductRepository
from services import OrderService
from db.base import async_session
from services.catalogue import CatalogueService
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
os.makedirs("static/img", exist_ok=True)
async def main():
dp = Dispatcher()
aiohttp_session = AiohttpSession(proxy="http://127.0.0.1:2080")
bot = Bot(
token=BOT_TOKEN,
default=DefaultBotProperties(parse_mode="HTML"),
session=aiohttp_session,
)
# DB services creation
order_repository = OrderRepository()
order_items_repository = OrderItemRepository()
order_service = OrderService(order_repository, order_items_repository)
category_repository = CategoriesRepository()
product_repository = ProductRepository()
catalogue_service = CatalogueService(product_repository, category_repository)
invoice_repository = InvoiceRepository()
# Additional Initiations
r = Redis.from_url(REDIS_URL)
redis_client = RedisClient(r)
# DI Middleware Init
dp.update.middleware(DIMiddleware(order_service, catalogue_service, redis_client))
dp.update.middleware(DBSessionMiddleware(async_session))
dp.update.middleware(
RepositoryMiddleware(
order_repository,
category_repository,
product_repository,
order_items_repository,
invoice_repository,
)
)
for ar in admins_routers:
dp.include_router(ar)
for cr in client_routers:
dp.include_router(cr)
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())