import asyncio import sqlite3 import uvicorn from fastapi import FastAPI from aiogram import Bot, Dispatcher, types, F from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, WebAppInfo from datetime import datetime app = FastAPI() # --- 1. إعدادات المربع الذهبي (The Golden Square Config) --- BOTS_CONFIG = [ {"name": "DooVoo 1", "token": "8628327909:AAETtkAFrUYUMwBhpv3BWsTWH09-fErd8WM", "block_id": "26019"}, {"name": "DooVoo 2", "token": "8560559090:AAE_3s0huP67ciyYFtZj8DZfXrrYNXpp89Q", "block_id": "26019"}, {"name": "DooVoo 3", "token": "8645395608:AAHqU7rNc4WhGDixx8ueL9bdylLw6u57vpg", "block_id": "26019"}, {"name": "DooVoo 4", "token": "8675940898:AAH_6LtNk1ZABExeV7XxXl4xM2DLFxA4Tcc", "block_id": "26019"} ] # --- 2. قاعدة البيانات المركزية (Unified Database) --- def init_db(): conn = sqlite3.connect('doovoo_network.db') c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS users (user_id TEXT PRIMARY KEY, username TEXT, ad_views INTEGER DEFAULT 0, joined_at TEXT)''') conn.commit() conn.close() init_db() # --- 3. وظيفة تشغيل البوتات (Bot Engine) --- async def start_single_bot(config): bot = Bot(token=config['token']) dp = Dispatcher() # أ) الأمر /start @dp.message(F.text == "/start") async def handle_start(message: types.Message): user_id = str(message.from_user.id) username = message.from_user.username or "User" conn = sqlite3.connect('doovoo_network.db') c = conn.cursor() c.execute("INSERT OR IGNORE INTO users (user_id, username, joined_at) VALUES (?, ?, ?)", (user_id, username, datetime.now().strftime("%Y-%m-%d %H:%M:%S"))) conn.commit() conn.close() url = f"https://render.adsgram.ai/show?blockId={config['block_id']}&userId={user_id}" kb = InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="💰 Watch Ad & Earn", web_app=WebAppInfo(url=url))], [InlineKeyboardButton(text="📊 My Stats", callback_data="check_stats")] ]) await message.answer( f"🚀 مرحباً بك في {config['name']}!\n\n" f"كليكي على الزر باش تتفرج وتربح. " f"نقاطك غتبان هنا بمجرد ما تبدا المشاهدة!", reply_markup=kb ) # ب) معالجة زر "My Stats" (اللي قلتي ماخداماش) @dp.callback_query(F.data == "check_stats") async def process_stats(callback_query: types.CallbackQuery): user_id = str(callback_query.from_user.id) conn = sqlite3.connect('doovoo_network.db') c = conn.cursor() c.execute("SELECT ad_views FROM users WHERE user_id = ?", (user_id,)) result = c.fetchone() conn.close() views = result[0] if result else 0 await callback_query.answer() # تحييد حالة الانتظار في التليغرام await callback_query.message.answer( f"📊 إحصائياتك في DooVoo Network:\n\n" f"📺 عدد المشاهدات: {views}\n" f"⏳ حالة الحساب: في انتظار تفعيل الإعلانات..." ) print(f"✅ Bot {config['name']} is LIVE!") try: await dp.start_polling(bot) except Exception as e: print(f"❌ Error in {config['name']}: {e}") # --- 4. الـ Reward API (الرابط اللي كيعلمنا أن الإعلان تشاف) --- @app.get("/reward") async def reward_user(userId: str): conn = sqlite3.connect('doovoo_network.db') c = conn.cursor() c.execute("UPDATE users SET ad_views = ad_views + 1 WHERE user_id = ?", (userId,)) conn.commit() conn.close() return {"status": "success", "msg": "Reward added!"} # --- 5. لوحة التحكم المركزية (Admin Dashboard) --- @app.get("/admin/network") async def get_network_stats(): conn = sqlite3.connect('doovoo_network.db') c = conn.cursor() c.execute("SELECT COUNT(*), SUM(ad_views) FROM users") total_users, total_views = c.fetchone() conn.close() return { "active_bots": len(BOTS_CONFIG), "total_users": total_users, "total_views": total_views or 0 } @app.on_event("startup") async def on_startup(): for config in BOTS_CONFIG: asyncio.create_task(start_single_bot(config)) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=7860)