Nnjj

🧩 Syntax:
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.fsm.storage.memory import MemoryStorage  # تغییر مسیر
from aiogram.fsm.context import FSMContext  # تغییر مسیر
from aiogram.fsm.state import State, StatesGroup  # تغییر مسیر
import sqlite3

# تنظیمات اولیه
API_TOKEN = '8066029104:AAH6ll2BnXLEU3z8CytDV8RWURbxKM_N3R8'  # توکن ربات خود را اینجا وارد کنید
CHANNEL_ID = '@SACRIFICECODM'  # شناسه کانال تلگرام
YOUTUBE_LINK = 'https://youtube.com/sacrificecodm'  # لینک کانال یوتیوب
ADMIN_ID =  5172157462 # شناسه عددی ادمین خود را وارد کنید

# تنظیمات لاگ
logging.basicConfig(level=logging.INFO)

# اتصال به دیتابیس SQLite
conn = sqlite3.connect('bot.db', check_same_thread=False)
cursor = conn.cursor()

# ایجاد جداول دیتابیس
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
    user_id INTEGER PRIMARY KEY,
    is_golden INTEGER DEFAULT 0,
    invites INTEGER DEFAULT 0
)
''')
cursor.execute('''
CREATE TABLE IF NOT EXISTS requests (
    request_id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER,
    status TEXT DEFAULT 'pending',
    screenshot_message_id INTEGER
)
''')
conn.commit()

# راه‌اندازی ربات
bot = Bot(token=API_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(storage=storage)  # تغییر در ایجاد Dispatcher

# تعریف وضعیت‌ها
class Form(StatesGroup):
    waiting_for_screenshot = State()

# تابع بررسی عضویت در کانال
async def check_membership(user_id):
    try:
        member = await bot.get_chat_member(CHANNEL_ID, user_id)
        return member.status != 'left'
    except:
        return False

# دستور /start
@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    user_id = message.from_user.id
    ref = message.get_args()  # دریافت ref_id از لینک دعوت

    # بررسی عضویت
    if not await check_membership(user_id):
        await message.reply(f"لطفاً ابتدا در کانال {CHANNEL_ID} عضو شوید:\nhttps://t.me/{CHANNEL_ID[1:]}")
        return

    # ثبت کاربر در دیتابیس
    cursor.execute("INSERT OR IGNORE INTO users (user_id) VALUES (?)", (user_id,))
    conn.commit()

    # مدیریت دعوت‌ها
    if ref and ref.startswith('ref_'):
        ref_id = int(ref.split('_')[1])
        if ref_id != user_id:
            cursor.execute("UPDATE users SET invites = invites + 1 WHERE user_id = ?", (ref_id,))
            conn.commit()
            cursor.execute("SELECT invites FROM users WHERE user_id = ?", (ref_id,))
            invites = cursor.fetchone()[0]
            if invites >= 1:
                cursor.execute("UPDATE users SET is_golden = 1 WHERE user_id = ?", (ref_id,))
                conn.commit()

    # ارسال لینک دعوت
    invite_link = f"https://t.me/{(await bot.get_me()).username}?start=ref_{user_id}"
    await message.reply(f"به ربات خوش آمدید!\nلینک دعوت شما: {invite_link}\nبرای طلایی شدن، حداقل یک نفر را دعوت کنید.")

    # نمایش منو
    keyboard = types.InlineKeyboardMarkup()
    if cursor.execute("SELECT is_golden FROM users WHERE user_id = ?", (user_id,)).fetchone()[0]:
        keyboard.add(types.InlineKeyboardButton("🎁 دریافت اکانت رایگان", callback_data="get_account"))
    await message.reply("منوی اصلی:", reply_markup=keyboard)

# دکمه دریافت اکانت رایگان
@dp.callback_query_handler(lambda c: c.data == 'get_account')
async def get_account(callback_query: types.CallbackQuery):
    user_id = callback_query.from_user.id
    await callback_query.answer()

    await bot.send_message(user_id, f"لطفاً کانال یوتیوب زیر را سابسکرایب کنید و اسکرین‌شات بفرستید:\n{YOUTUBE_LINK}")
    await dp.current_state(user=user_id).set_state(Form.waiting_for_screenshot)  # تغییر در تنظیم استیت

# دریافت اسکرین‌شات
@dp.message_handler(content_types=['photo'], state=Form.waiting_for_screenshot)
async def receive_screenshot(message: types.Message, state: FSMContext):
    user_id = message.from_user.id
    screenshot = message.photo[-1].file_id

    # ثبت درخواست
    cursor.execute("INSERT INTO requests (user_id, screenshot_message_id) VALUES (?, ?)", (user_id, message.message_id))
    conn.commit()

    # فوروارد به ادمین
    await bot.forward_message(ADMIN_ID, user_id, message.message_id)
    await bot.send_message(ADMIN_ID, f"درخواست جدید از کاربر {user_id}", reply_markup=types.InlineKeyboardMarkup().add(
        types.InlineKeyboardButton("✅ تایید", callback_data=f"approve_{user_id}"),
        types.InlineKeyboardButton("❌ رد", callback_data=f"reject_{user_id}")
    ))

    await message.reply("اسکرین‌شات شما ارسال شد. منتظر تایید باشید.")
    await state.clear()  # تغییر در پاک کردن استیت

# مدیریت درخواست‌ها توسط ادمین
@dp.callback_query_handler(lambda c: c.data.startswith(('approve_', 'reject_')))
async def process_request(callback_query: types.CallbackQuery):
    action, user_id = callback_query.data.split('_')
    user_id = int(user_id)

    if callback_query.from_user.id != ADMIN_ID:
        await callback_query.answer("شما ادمین نیستید!", show_alert=True)
        return

    if action == 'approve':
        account = "نام کاربری: example\nرمز عبور: 123456"  # اینجا می‌توانید اکانت را از دیتابیس بخوانید
        await bot.send_message(user_id, f"تبریک! اکانت رایگان شما:\n{account}")
        cursor.execute("UPDATE requests SET status = 'approved' WHERE user_id = ?", (user_id,))
    else:
        await bot.send_message(user_id, "اسکرین‌شات شما رد شد. دوباره تلاش کنید.")
        cursor.execute("UPDATE requests SET status = 'rejected' WHERE user_id = ?", (user_id,))

    conn.commit()
    await callback_query.answer("انجام شد!")

if __name__ == '__main__':
    from aiogram import executor
    executor.start_polling(dp, skip_updates=True)