From 8d4d75f7fd036c002d4b3fa22221f3ff628d3619 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 20 Jul 2026 16:30:21 +0500 Subject: [PATCH] feat(crypto): add CryptoPay with network support --- .env.example | 2 ++ config.py | 5 +++++ main.py | 35 ++++++++++++++++++++++++++++------- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/.env.example b/.env.example index ae31eaf..545f7a5 100644 --- a/.env.example +++ b/.env.example @@ -1,7 +1,9 @@ # Обязательные поля BOT_TOKEN= ADMIN_ID= + CRYPTO_PAY_TOKEN= +CRYPTO_PAY_NETWORK= # Бот для логгинга (логи будут в этом боте, можно указать один и тот же бот на главный и логгинга) LOG_BOT_TOKEN= diff --git a/config.py b/config.py index ccae99b..3f24315 100644 --- a/config.py +++ b/config.py @@ -43,14 +43,18 @@ load_dotenv() BOT_TOKEN = os.getenv("BOT_TOKEN", "") LOG_BOT_TOKEN = os.getenv("LOG_BOT_TOKEN", "") or None + ADMIN_ID = _env_int("ADMIN_ID", 0) CRYPTO_PAY_TOKEN = os.getenv("CRYPTO_PAY_TOKEN", "") +CRYPTO_PAY_NETWORK = os.getenv("CRYPTO_PAY_NETWORK", "MAINNET") + SHOP_NAME = os.getenv("SHOP_NAME", "KILL UNONY MOM") SHOP_CHANNEL = os.getenv("SHOP_CHANNEL", "https://t.me/bot399_start_bot") BOT_USERNAME = os.getenv("BOT_USERNAME", "bot399_start_bot") DATABASE_DIR = _resolve_path("DATABASE_DIR", "Users") COOKIE_FILES_DIR = _resolve_path("COOKIE_FILES_DIR", "Cookies") + CONFIG_FILE = _resolve_path("BOT_CONFIG_FILE", "bot_config.json") STATS_FILE = _resolve_path("BOT_STATS_FILE", "bot_stats.json") PROXIES_FILE = _resolve_path("PROXIES_FILE", "proxies.txt") @@ -61,6 +65,7 @@ CONCURRENT_CHECKS = _env_int("CONCURRENT_CHECKS", 50) REQUEST_TIMEOUT = _env_int("REQUEST_TIMEOUT", 10) FRESHER_BATCH_SIZE = _env_int("FRESHER_BATCH_SIZE", 10) +# Инициализация DATABASE_DIR.mkdir(parents=True, exist_ok=True) COOKIE_FILES_DIR.mkdir(parents=True, exist_ok=True) diff --git a/main.py b/main.py index e4c5f40..f963a7a 100644 --- a/main.py +++ b/main.py @@ -2,12 +2,21 @@ 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 ADMIN_ID, BOT_TOKEN, LOG_BOT_TOKEN, SHOP_NAME +from config import ( + ADMIN_ID, + BOT_TOKEN, + CRYPTO_PAY_NETWORK, + CRYPTO_PAY_TOKEN, + LOG_BOT_TOKEN, + SHOP_NAME, +) from db.storage import load_config, load_stats from handlers import admin, start, upload, user from runtime import set_bots @@ -16,29 +25,40 @@ 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 set_bots(bot, log_bot) - dispatcher = Dispatcher(storage=MemoryStorage()) - dispatcher.include_router(start.router) - dispatcher.include_router(user.router) - dispatcher.include_router(admin.router) - dispatcher.include_router(upload.router) + cp_net = TESTNET if CRYPTO_PAY_NETWORK.lower() == "testnet" else MAINNET + + cp = CryptoPay(token=CRYPTO_PAY_TOKEN, network=cp_net) + 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 dispatcher.start_polling(bot) + await dp.start_polling(bot) + await cp.start_polling(bot) + finally: if log_bot: await log_bot.session.close() + + await cp.session.close() await bot.session.close() @@ -51,4 +71,5 @@ if __name__ == "__main__": logging.StreamHandler(), ], ) + asyncio.run(main())