import asyncio
from telegram import Update
from telegram.ext import Application, CommandHandler, CallbackContext
import requests
from apscheduler.schedulers.background import BackgroundScheduler

# ذخیره سیگنال‌های فعال
active_signals = {}

# دریافت قیمت لحظه‌ای ارز
def fetch_crypto_price_usd(crypto_id):
    try:
        url = f"https://api.coingecko.com/api/v3/simple/price?ids={crypto_id}&vs_currencies=usd"
        response = requests.get(url)
        response.raise_for_status()
        data = response.json()
        return float(data[crypto_id]['usd'])
    except Exception as e:
        print(f"Error fetching data: {e}")
        return None

# ذخیره سیگنال در حافظه
def add_signal(user_id, crypto_id, entry_price, targets, stop_loss, usdt_to_irr):
    if user_id not in active_signals:
        active_signals[user_id] = []
    signal = {
        "crypto_id": crypto_id,
        "entry_price": entry_price,
        "targets": targets,
        "stop_loss": stop_loss,
        "usdt_to_irr": usdt_to_irr
    }
    if signal not in active_signals[user_id]:
        active_signals[user_id].append(signal)
        return True
    return False

# بررسی دوره‌ای قیمت‌ها
async def check_prices(context: CallbackContext):
    for user_id, signals in active_signals.items():
        for signal in signals:
            crypto_id = signal["crypto_id"]
            current_price = fetch_crypto_price_usd(crypto_id)
            if current_price is None:
                continue  # اگر قیمت دریافت نشد
            targets = signal["targets"]
            stop_loss = signal["stop_loss"]
            usdt_to_irr = signal["usdt_to_irr"]

            # بررسی هدف‌ها
            for i, target in enumerate(targets, 1):
                if current_price >= target:
                    await context.bot.send_message(
                        chat_id=user_id,
                        text=(
                            f"🎯 هدف {i} برای {crypto_id.capitalize()} رسید!\n"
                            f"💵 قیمت فعلی: {current_price * usdt_to_irr:,.0f} ریال\n"
                        )
                    )
                    await context.bot.send_audio(chat_id=user_id, audio=open("goal_reached.mp3", "rb"))
                    signals.remove(signal)
                    break

            # بررسی حد ضرر
            if current_price <= stop_loss:
                await context.bot.send_message(
                    chat_id=user_id,
                    text=(
                        f"❌ حد ضرر برای {crypto_id.capitalize()} فعال شد!\n"
                        f"💵 قیمت فعلی: {current_price * usdt_to_irr:,.0f} ریال\n"
                    )
                )
                await context.bot.send_audio(chat_id=user_id, audio=open("stop_loss.mp3", "rb"))
                signals.remove(signal)
                break

# دستور برای اضافه کردن سیگنال
async def add_signal_command(update: Update, context: CallbackContext) -> None:
    try:
        user_id = update.message.chat_id
        crypto_id = context.args[0].lower()  # نام ارز دیجیتال
        entry_price = float(context.args[1])  # قیمت ورود
        stop_loss = float(context.args[2])  # حد ضرر
        targets = list(map(float, context.args[3:-1]))  # همه اهداف
        usdt_to_irr = float(context.args[-1])  # نرخ تتر به ریال

        if add_signal(user_id, crypto_id, entry_price, targets, stop_loss, usdt_to_irr):
            await update.message.reply_text(
                f"✅ سیگنال برای {crypto_id.capitalize()} ثبت شد.\n"
                f"💵 قیمت ورود: {entry_price * usdt_to_irr:,.0f} ریال\n"
                f"🎯 اهداف: {[t * usdt_to_irr for t in targets]}\n"
                f"📉 حد ضرر: {stop_loss * usdt_to_irr:,.0f} ریال\n"
            )
        else:
            await update.message.reply_text("❌ این سیگنال قبلاً ثبت شده است.")
    except IndexError:
        await update.message.reply_text("❌ لطفاً اطلاعات کامل سیگنال را وارد کنید.")
    except ValueError:
        await update.message.reply_text("❌ لطفاً مقادیر را به‌صورت عدد وارد کنید.")

# راه‌اندازی ربات
async def main():
    TOKEN = "<TRUFFLEHOG_REDACTED_TELEGRAMBOTTOKEN>"  # توکن جدید
    application = Application.builder().token(TOKEN).build()  # استفاده از Application.builder به جای Updater

    # اضافه کردن دستورها
    application.add_handler(CommandHandler("addsignal", add_signal_command))

    # اضافه کردن بررسی دوره‌ای با استفاده از job_queue
    scheduler = BackgroundScheduler()
    scheduler.add_job(lambda: check_prices(application), 'interval', minutes=5)  # هر 5 دقیقه یکبار
    scheduler.start()

    # شروع ربات
    await application.run_polling()

if __name__ == "__main__":
    asyncio.run(main())  # اجرای حلقه اصلی با asyncio
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-6-155d4e01cd56> in <cell line: 117>()
    116 
    117 if __name__ == "__main__":
--> 118     asyncio.run(main())  # اجرای حلقه اصلی با asyncio

/usr/lib/python3.10/asyncio/runners.py in run(main, debug)
     31     """
     32     if events._get_running_loop() is not None:
---> 33         raise RuntimeError(
     34             "asyncio.run() cannot be called from a running event loop")
     35 

RuntimeError: asyncio.run() cannot be called from a running event loop
کد رو با خطا برات فرستادم. ببین چه راهی برای خطا موجود هست