Files
shveitechbot/main.py

81 lines
2.3 KiB
Python

import asyncio
import logging
import os
from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.client.session.aiohttp import AiohttpSession
from redis.asyncio import Redis
from config import BOT_TOKEN, PROXY_URL, REDIS_URL
from db.base import async_session
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 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=PROXY_URL)
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())