import asyncio import logging from datetime import datetime from aiosend import CryptoPay, TESTNET, MAINNET from aiogram import Bot, Dispatcher from aiogram.enums import ParseMode from aiogram.fsm.storage.memory import MemoryStorage from aiogram.client.default import DefaultBotProperties from config import ( BOT_TOKEN, LOG_BOT_TOKEN, ADMIN_ID, SHOP_NAME, CRYPTO_PAY_TOKEN, CRYPTO_PAY_NETWORK, ) from db.storage import load_config, load_stats from handlers import admin, start, upload, user from runtime import set_bots, set_cp from utils.logging import log_admin async def main() -> None: defaults = DefaultBotProperties(parse_mode=ParseMode.HTML) bot = Bot(token=BOT_TOKEN, default=defaults) log_bot = Bot(token=LOG_BOT_TOKEN, default=defaults) if LOG_BOT_TOKEN else None cp_net = TESTNET if CRYPTO_PAY_NETWORK.lower() == "testnet" else MAINNET cp = CryptoPay(token=CRYPTO_PAY_TOKEN, network=cp_net) set_cp(cp) set_bots(bot, log_bot) dp = Dispatcher(storage=MemoryStorage()) dp.include_router(start.router) dp.include_router(user.router) dp.include_router(admin.router) dp.include_router(upload.router) load_config() load_stats() await log_admin( bot, ADMIN_ID, f"🟢 {SHOP_NAME} запущен\n⏰ {datetime.now().strftime('%d.%m.%Y %H:%M:%S')}", log_bot, ) try: await dp.start_polling(bot) finally: if log_bot: await log_bot.session.close() await bot.session.close() if __name__ == "__main__": logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s", handlers=[ logging.FileHandler("bot.log", encoding="utf-8"), logging.StreamHandler(), ], ) asyncio.run(main())