import discord from discord.ext import commands, tasks from discord import app_commands from discord.ui import Button, View, Select import asyncio import random import os from datetime import datetime # ======================================================= # الإعدادات الأساسية (الثوابت) # ======================================================= TARGET_GUILD_ID = 1463693244897693779 # أيدي السيرفر المسموح OWNER_ROLE_ID = 1492516779598155877 # أيدي رتبة المالك للتحكم # ======================================================= # الأذكار والتذكيرات (القائمة الكاملة) # ======================================================= REMINDERS = [ "🌸 سبحان الله وبحمده، سبحان الله العظيم", "✨ اللهم صل وسلم على نبينا محمد", "📿 أستغفر الله العظيم وأتوب إليه", "🕊️ لا حول ولا قوة إلا بالله", "🌿 سبحان الله، والحمد لله، ولا إله إلا الله، والله أكبر", "🌸 سبحان الله", "✨ الحمد لله", "📿 الله أكبر", "🕊️ لا إله إلا الله", "🌿 اللهم اغفر لي", "🌸 اللهم ارحمني", "✨ اللهم تب علي", "📿 اللهم ارزقني", "🕊️ حسبي الله ونعم الوكيل", "🌿 توكلت على الله", "🌸 رب اغفر لي ولوالدي", "✨ اللهم اجعلني من الصالحين", "📿 اللهم اهدني", "🕊️ اللهم ثبتني", "🌿 اللهم ارزقني الجنة", "🌸 اللهم أجرني من النار", "✨ يا رب", "📿 يا الله", "🕊️ يا حي يا قيوم برحمتك أستغيث", "🌿 اللهم إني أسألك العافية", "🌸 اللهم إني أسألك الهدى والتقى", "✨ اللهم إني أعوذ بك من الهم والحزن", "📿 اللهم إني أعوذ بك من العجز والكسل", "🕊️ اللهم إني أعوذ بك من الجبن والبخل", "🌿 اللهم إني أعوذ بك من غلبة الدين وقهر الرجال", "🌸 اللهم اجعل القرآن ربيع قلبي", "✨ اللهم نور قلبي", "📿 اللهم طهر قلبي", "🕊️ اللهم أصلح حالي", "🌿 اللهم اجعلني من الذاكرين", "🌸 اللهم اجعلني من الشاكرين", "✨ اللهم اجعلني من الصابرين", "📿 اللهم اجعلني من التوابين", "🕊️ اللهم اجعلني من المتقين", "🌿 اللهم اجعلني من المحسنين", "🌸 اللهم ارزقني الإخلاص", "✨ اللهم ارزقني الصدق", "📿 اللهم ارزقني حسن الخاتمة", "🕊️ اللهم اجعل قبري روضة من رياض الجنة", "🌿 اللهم اجعلني من أهل الجنة", "🌸 اللهم ارزقني الفردوس الأعلى", "✨ اللهم لا تحرمني من رحمتك", "📿 اللهم لا تكلني إلى نفسي", "🕊️ اللهم ارحم موتانا", "🌿 اللهم اشف مرضانا", "🌸 اللهم فرج همومنا", "✨ اللهم اقض ديوننا", "📿 اللهم وسع رزقنا", "🕊️ اللهم بارك لنا", "🌿 اللهم احفظنا", "🌸 اللهم انصرنا", "✨ اللهم اجعلنا من عبادك الصالحين", "📿 اللهم ارزقنا رضاك", "🕊️ اللهم اجعلنا من أهل الذكر", "🌿 اللهم ارزقنا حبك", "🌸 اللهم ارزقنا حب نبيك", "✨ اللهم اجعلنا من المتوكلين", "📿 اللهم ارزقنا الصبر", "🕊️ اللهم ارزقنا اليقين", "🌿 اللهم اجعلنا من الذاكرين الله كثيرا", "🌸 اللهم اجعلنا من القانتين", "✨ اللهم ارزقنا حسن الظن بك", "📿 اللهم اجعلنا من المقبولين", "🕊️ اللهم ارزقنا لذة النظر إلى وجهك", "🌿 اللهم اجعلنا من الفائزين", "🌸 اللهم اجعلنا من أهل الفردوس", "✨ اللهم اجعلنا من عتقائك من النار", "📿 اللهم اجعلنا من المستغفرين", "🕊️ اللهم اجعلنا من الراجعين إليك", "🌿 اللهم اجعلنا من المنيبين", "🌸 اللهم ارزقنا التوبة النصوح", "✨ اللهم تقبل منا", "📿 اللهم اغفر لنا", "🕊️ اللهم ارحمنا", "🌿 اللهم تب علينا", "🌸 اللهم اهدنا", "✨ اللهم احفظنا من كل سوء", "📿 اللهم اجعلنا من الصالحين", "🕊️ اللهم ارزقنا الجنة بغير حساب", "🌿 اللهم اجعلنا من أهل القرآن", "🌸 اللهم اجعل القرآن شفيعاً لنا", "✨ اللهم اجعل القرآن حجة لنا", "📿 اللهم اجعلنا من الذين يستمعون القول فيتبعون أحسنه", "🕊️ اللهم اجعلنا من أولي الألباب", "🌿 اللهم ارزقنا العلم النافع", "🌸 اللهم ارزقنا العمل الصالح", "✨ اللهم ارزقنا الإيمان الكامل", "📿 اللهم اجعلنا من أهل التقوى", "🕊️ اللهم اجعلنا من الصادقين", "🌿 اللهم اجعلنا من المخلصين", "🌸 اللهم اجعلنا من عبادك المقربين", "✨ اللهم اجعلنا من الذاكرين الشاكرين", "📿 اللهم اجعلنا من الصابرين المحتسبين" ] # ======================================================= # قائمة 30 قارئ (بدون اختصار) # ======================================================= RECITERS = [ {"name": "إذاعة تلاوات منوعة", "desc": "بث مباشر لتلاوات مختارة", "url": "https://qurango.net/radio/tarateel"}, {"name": "عبدالباسط عبدالصمد", "desc": "تلاوة مجودة بصوت خاشع", "url": "https://qurango.net/radio/abdulbasit_abdulsamad_mjawwad"}, {"name": "مشاري العفاسي", "desc": "تلاوة هادئة ومريحة", "url": "https://qurango.net/radio/mishary_alafasi"}, {"name": "ياسر الدوسري", "desc": "تلاوات مميزة من الحرم", "url": "https://qurango.net/radio/yasser_aldosari"}, {"name": "ماهر المعيقلي", "desc": "تلاوة عذبة وشهيرة", "url": "https://qurango.net/radio/maher_al_muaiqly"}, {"name": "أحمد بن علي العجمي", "desc": "تلاوة خاشعة", "url": "https://qurango.net/radio/ahmad_alajmy"}, {"name": "سعد الغامدي", "desc": "تلاوة مريحة للقلب", "url": "https://qurango.net/radio/saad_alghamidi"}, {"name": "سعود الشريم", "desc": "من تلاوات الحرم المكي", "url": "https://qurango.net/radio/saud_alshuraim"}, {"name": "عبدالرحمن السديس", "desc": "تلاوة الحرم المكي الشريف", "url": "https://qurango.net/radio/abdulrahman_alsudaes"}, {"name": "محمود خليل الحصري", "desc": "تلاوة مرتلة دقيقة", "url": "https://qurango.net/radio/mahmoud_khalil_alhussary"}, {"name": "علي عبدالله جابر", "desc": "تلاوة مميزة", "url": "https://qurango.net/radio/ali_jaber"}, {"name": "محمد أيوب", "desc": "تلاوة حجازية", "url": "https://qurango.net/radio/mohammed_ayyub"}, {"name": "محمد صديق المنشاوي", "desc": "تلاوة خاشعة جداً", "url": "https://qurango.net/radio/mohammed_siddiq_alminshawi"}, {"name": "أبوبكر الشاطري", "desc": "تلاوة هادئة", "url": "https://qurango.net/radio/abubakr_alshatri"}, {"name": "عبدالله بصفر", "desc": "تلاوة عذبة", "url": "https://qurango.net/radio/abdullah_basfer"}, {"name": "عبدالمحسن القاسم", "desc": "إمام المسجد النبوي", "url": "https://qurango.net/radio/abdulmohsin_alqasim"}, {"name": "عبدالودود حنيف", "desc": "تلاوة رائعة", "url": "https://qurango.net/radio/abdulwadood_haneef"}, {"name": "علي عبدالرحمن الحذيفي", "desc": "من تلاوات المسجد النبوي", "url": "https://qurango.net/radio/ali_alhuthaifi"}, {"name": "فارس عباد", "desc": "تلاوة مؤثرة", "url": "https://qurango.net/radio/fares_abbad"}, {"name": "محمد جبريل", "desc": "تلاوة مشهورة", "url": "https://qurango.net/radio/mohammed_jibreel"}, {"name": "محمد الطبلاوي", "desc": "من كبار القراء", "url": "https://qurango.net/radio/mohammad_altablaway"}, {"name": "محمود علي البنا", "desc": "تلاوة كلاسيكية", "url": "https://qurango.net/radio/mahmoud_ali__albanna"}, {"name": "مصطفى إسماعيل", "desc": "تلاوة مجودة", "url": "https://qurango.net/radio/mustafa_ismail"}, {"name": "هاني الرفاعي", "desc": "تلاوة بكائية", "url": "https://qurango.net/radio/hani_arrifai"}, {"name": "يحيى حوا", "desc": "تلاوة هادئة", "url": "https://qurango.net/radio/yahya_hawwa"}, {"name": "خالد القحطاني", "desc": "تلاوة خاشعة", "url": "https://qurango.net/radio/khalid_alqahtani"}, {"name": "صلاح البدير", "desc": "إمام المسجد النبوي", "url": "https://qurango.net/radio/salah_albudair"}, {"name": "صلاح بو خاطر", "desc": "تلاوة ندية", "url": "https://qurango.net/radio/salah_bukhatir"}, {"name": "عبدالرشيد صوفي", "desc": "تلاوة مميزة بروايات", "url": "https://qurango.net/radio/abdulrasheed_soufi"}, {"name": "عبدالله عواد الجهني", "desc": "إمام الحرم المكي", "url": "https://qurango.net/radio/abdullah_aljuhani"} ] # --- متغيرات التحكم بالبث --- current_reciter_index = 0 current_volume = 1.0 # إعدادات أكثر أماناً لتجنب حظر IP من السيرفرات الصوتية FFMPEG_OPTIONS = { 'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn -sn -dn -bufsize 500k -max_muxing_queue_size 1024' } # ======================================================= # تجهيز واجهة الأزرار (Control Panel) # ======================================================= class ReciterSelect(Select): def __init__(self): options = [] for i, r in enumerate(RECITERS[:25]): options.append(discord.SelectOption(label=r['name'], description=r['desc'][:50], value=str(i))) super().__init__(placeholder="اختر القارئ من القائمة السريعة...", min_values=1, max_values=1, options=options, custom_id="select_reciter") async def callback(self, interaction: discord.Interaction): role = interaction.guild.get_role(OWNER_ROLE_ID) if role not in interaction.user.roles: return await interaction.response.send_message("❌ لا تملك صلاحية.", ephemeral=True) global current_reciter_index current_reciter_index = int(self.values[0]) vc = interaction.guild.voice_client if vc: await play_current_reciter(vc) try: await interaction.response.send_message(f"🎙️ تم التغيير إلى: {RECITERS[current_reciter_index]['name']}", ephemeral=True) await log_event(interaction.guild, f"🎙️ **{interaction.user.name}** قام بتغيير القارئ إلى: {RECITERS[current_reciter_index]['name']}") except: pass class ControlPanelView(View): def __init__(self): super().__init__(timeout=None) self.add_item(ReciterSelect()) async def check_owner(self, interaction: discord.Interaction): role = interaction.guild.get_role(OWNER_ROLE_ID) if role and role in interaction.user.roles: return True try: await interaction.response.send_message("❌ عذراً، لا تملك الصلاحية (رتبة المالك المطلوبة).", ephemeral=True) except: pass return False @discord.ui.button(label="⏸️ / ▶️ إيقاف وتشغيل", style=discord.ButtonStyle.primary, custom_id="btn_toggle") async def toggle_btn(self, interaction: discord.Interaction, button: Button): if not await self.check_owner(interaction): return vc = interaction.guild.voice_client try: if vc: if vc.is_paused(): vc.resume() await interaction.response.send_message("▶️ تم استئناف البث.", ephemeral=True) await log_event(interaction.guild, f"▶️ **{interaction.user.name}** قام باستئناف البث.") elif vc.is_playing(): vc.pause() await interaction.response.send_message("⏸️ تم إيقاف البث مؤقتاً.", ephemeral=True) await log_event(interaction.guild, f"⏸️ **{interaction.user.name}** قام بإيقاف البث يدوياً.") else: await play_current_reciter(vc) await interaction.response.send_message("▶️ تم تشغيل البث.", ephemeral=True) else: await interaction.response.send_message("❌ البوت غير متصل.", ephemeral=True) except: pass @discord.ui.button(label="⏭️ التالي", style=discord.ButtonStyle.secondary, custom_id="btn_next") async def next_btn(self, interaction: discord.Interaction, button: Button): if not await self.check_owner(interaction): return global current_reciter_index current_reciter_index = (current_reciter_index + 1) % len(RECITERS) vc = interaction.guild.voice_client if vc: await play_current_reciter(vc) try: await interaction.response.send_message(f"⏭️ تم الانتقال إلى: {RECITERS[current_reciter_index]['name']}", ephemeral=True) await log_event(interaction.guild, f"⏭️ **{interaction.user.name}** انتقل للقارئ: {RECITERS[current_reciter_index]['name']}") except: pass @discord.ui.button(label="⏮️ السابق", style=discord.ButtonStyle.secondary, custom_id="btn_prev") async def prev_btn(self, interaction: discord.Interaction, button: Button): if not await self.check_owner(interaction): return global current_reciter_index current_reciter_index = (current_reciter_index - 1) % len(RECITERS) vc = interaction.guild.voice_client if vc: await play_current_reciter(vc) try: await interaction.response.send_message(f"⏮️ تم الرجوع إلى: {RECITERS[current_reciter_index]['name']}", ephemeral=True) await log_event(interaction.guild, f"⏮️ **{interaction.user.name}** رجع للقارئ: {RECITERS[current_reciter_index]['name']}") except: pass class QuranBot(commands.Bot): def __init__(self): intents = discord.Intents.default() intents.message_content = True intents.voice_states = True intents.guilds = True super().__init__(command_prefix="!", intents=intents) async def setup_hook(self): self.add_view(ControlPanelView()) await self.tree.sync() print("✅ تم مزامنة الأوامر والأزرار بنجاح.") bot = QuranBot() # ======================================================= # دوال مساعدة وحماية من الحظر # ======================================================= async def log_event(guild: discord.Guild, message: str): log_channel = discord.utils.get(guild.text_channels, name="📜-سجلات-البوت") time_now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") if log_channel: try: await log_channel.send(f"`[{time_now}]` {message}") except: pass # منع توقف البوت إذا رفض ديسكورد إرسال الرسالة بسبب Rate Limit print(f"[{time_now}] {message}") def is_owner_and_in_control(): async def predicate(interaction: discord.Interaction): if not interaction.guild: try: await interaction.response.send_message("❌ هذا الأمر مخصص للاستخدام داخل السيرفر فقط.", ephemeral=True) except: pass return False if interaction.channel.name != "🛠️ غرفة التحكم (للمالك)": try: await interaction.response.send_message("❌ عذراً، لا يمكنك استخدام الأوامر إلا داخل 🛠️ غرفة التحكم.", ephemeral=True) except: pass return False role = interaction.guild.get_role(OWNER_ROLE_ID) if role and role in interaction.user.roles: return True try: await interaction.response.send_message("❌ عذراً، لا تملك الصلاحية (رتبة المالك المطلوبة).", ephemeral=True) except: pass return False return app_commands.check(predicate) async def play_current_reciter(vc: discord.VoiceClient): try: if vc.is_playing() or vc.is_paused(): vc.stop() await asyncio.sleep(1) # تأخير بسيط لحماية الـ API من ضغط الطلبات reciter = RECITERS[current_reciter_index] audio_source = discord.FFmpegPCMAudio(reciter["url"], **FFMPEG_OPTIONS) vc.play(discord.PCMVolumeTransformer(audio_source, volume=current_volume)) except Exception as e: print(f"⚠️ خطأ أثناء التشغيل (تم تجاوزه): {e}") # ======================================================= # هندسة القنوات والأحداث # ======================================================= @bot.event async def on_ready(): # حالة مستقرة وآمنة تظهر للمستخدمين await bot.change_presence(status=discord.Status.online, activity=discord.Activity(type=discord.ActivityType.listening, name="القرآن الكريم 24/7 🎧")) print(f"🤖 البوت {bot.user} متصل بشبكة ديسكورد بنجاح وهو الآن (Online).") # فحص هادئ للسيرفرات for guild in bot.guilds: if guild.id != TARGET_GUILD_ID: print(f"👢 جاري مغادرة سيرفر غريب بهدوء: {guild.name}") await asyncio.sleep(2) # تأخير لمنع الطرد المتعدد السريع try: await guild.leave() except: pass else: await check_and_create_channels(guild) await log_event(guild, "🚀 **تم إقلاع النظام والبوت متصل الآن.**") # تشغيل نبض القلب (فحص كل 5 دقائق) if not heartbeat_task.is_running(): heartbeat_task.start() @bot.event async def on_guild_join(guild): print(f"📥 البوت دخل سيرفر جديد: {guild.name}") await asyncio.sleep(2) # حماية API ديسكورد if guild.id != TARGET_GUILD_ID: try: await guild.leave() except: pass else: await check_and_create_channels(guild) await log_event(guild, "🚀 **تم إضافة البوت للسيرفر الصحيح وبدء التشغيل!**") async def check_and_create_channels(guild): category_name = "إذاعة القرآن الكريم" broadcast_vc_name = "🎧 استماع القرآن (بث عام)" control_vc_name = "🛠️ غرفة التحكم (للمالك)" log_channel_name = "📜-سجلات-البوت" category = discord.utils.get(guild.categories, name=category_name) broadcast_vc = discord.utils.get(guild.voice_channels, name=broadcast_vc_name) control_vc = discord.utils.get(guild.voice_channels, name=control_vc_name) log_tc = discord.utils.get(guild.text_channels, name=log_channel_name) owner_role = guild.get_role(OWNER_ROLE_ID) try: if not category: category = await guild.create_category(category_name) await asyncio.sleep(1) if not log_tc: overwrites_log = { guild.default_role: discord.PermissionOverwrite(view_channel=False), bot.user: discord.PermissionOverwrite(view_channel=True, send_messages=True, read_message_history=True) } if owner_role: overwrites_log[owner_role] = discord.PermissionOverwrite(view_channel=True, read_message_history=True) log_tc = await guild.create_text_channel(log_channel_name, category=category, overwrites=overwrites_log) await asyncio.sleep(1) if not broadcast_vc: overwrites_broadcast = { guild.default_role: discord.PermissionOverwrite( view_channel=True, connect=True, read_message_history=True, speak=False, send_messages=False, add_reactions=False, stream=False ), bot.user: discord.PermissionOverwrite(connect=True, speak=True, send_messages=True, administrator=True) } broadcast_vc = await guild.create_voice_channel(broadcast_vc_name, category=category, overwrites=overwrites_broadcast) await asyncio.sleep(1) if not control_vc: overwrites_control = { guild.default_role: discord.PermissionOverwrite(view_channel=False, connect=False), bot.user: discord.PermissionOverwrite(view_channel=True, connect=True, send_messages=True) } if owner_role: overwrites_control[owner_role] = discord.PermissionOverwrite(view_channel=True, connect=True, send_messages=True) control_vc = await guild.create_voice_channel(control_vc_name, category=category, overwrites=overwrites_control, user_limit=99) embed = discord.Embed( title="🎛️ لوحة تحكم الإذاعة الذكية", description="استخدم الأزرار أدناه للتحكم السريع في البث، أو اختر القارئ من القائمة المنسدلة.\n\n*ملاحظة: يمكنك أيضاً استخدام الأوامر مثل `/volume` هنا فقط.*", color=discord.Color.dark_theme() ) embed.set_footer(text="SaaS Pro Dashboard") await control_vc.send(embed=embed, view=ControlPanelView()) # اتصال البوت if not guild.voice_client: vc = await broadcast_vc.connect() await asyncio.sleep(2) # استقرار الاتصال await play_current_reciter(vc) human_members = sum(1 for m in broadcast_vc.members if not m.bot) if human_members == 0: vc.pause() await log_event(guild, "⏸️ القناة فارغة، تم وضع البث في وضع الاستعداد (لتجنب ضغط الشبكة).") else: await log_event(guild, "▶️ تم البدء بالبث لوجود مستمعين في القناة.") except Exception as e: print(f"⚠️ تحذير أثناء إنشاء القنوات (قد يكون بسبب ضغط الطلبات): {e}") @bot.event async def on_voice_state_update(member, before, after): if member.bot: return guild = member.guild if guild.id != TARGET_GUILD_ID: return bot_vc = guild.voice_client if not bot_vc: return try: # حالة دخول عضو if after.channel and after.channel.id == bot_vc.channel.id: if bot_vc.is_paused(): bot_vc.resume() await log_event(guild, f"▶️ استئناف البث التلقائي لدخول مستمع.") embed = discord.Embed( title="أهلاً بك في مجلس الذكر 🕊️", description=random.choice(REMINDERS), color=discord.Color.gold() ) embed.set_footer(text=f"القارئ الحالي: {RECITERS[current_reciter_index]['name']}") try: await after.channel.send(content=f"مرحباً بك {member.mention}", embed=embed, delete_after=60) except: pass # حالة خروج عضو elif before.channel and before.channel.id == bot_vc.channel.id: human_members = sum(1 for m in before.channel.members if not m.bot) if human_members == 0 and bot_vc.is_playing(): bot_vc.pause() except: pass # منع أي خطأ مفاجئ من إيقاف البوت # ======================================================= # مهمة الفحص الهادئ (Heartbeat) # ======================================================= @tasks.loop(minutes=5) async def heartbeat_task(): """هذه الدالة تفحص البوت كل 5 دقائق لضمان عدم فصله من ديسكورد""" try: guild = bot.get_guild(TARGET_GUILD_ID) if guild and guild.voice_client: human_members = sum(1 for m in guild.voice_client.channel.members if not m.bot) # إذا كان هناك ناس والصوت متوقف بالخطأ، نقوم بتشغيله if human_members > 0 and not guild.voice_client.is_playing() and not guild.voice_client.is_paused(): await play_current_reciter(guild.voice_client) await log_event(guild, "🔄 تم إعادة إنعاش البث التلقائي بواسطة نظام الحماية (Heartbeat).") except: pass # ======================================================= # أوامر السلاش (محصورة في غرفة التحكم) # ======================================================= @bot.tree.command(name="play_radio", description="▶️ تشغيل بث القرآن إجبارياً") @is_owner_and_in_control() async def play_radio(interaction: discord.Interaction): vc = interaction.guild.voice_client try: if not vc: return await interaction.response.send_message("❌ البوت غير متصل.", ephemeral=True) if vc.is_paused(): vc.resume() else: await play_current_reciter(vc) await interaction.response.send_message(f"▶️ تم التشغيل: **{RECITERS[current_reciter_index]['name']}**", ephemeral=True) await log_event(interaction.guild, f"▶️ تم التشغيل عبر أمر /play_radio") except: pass @bot.tree.command(name="stop_radio", description="⏹️ إيقاف البث مؤقتاً") @is_owner_and_in_control() async def stop_radio(interaction: discord.Interaction): vc = interaction.guild.voice_client try: if vc and vc.is_playing(): vc.pause() await interaction.response.send_message("⏹️ تم الإيقاف.", ephemeral=True) await log_event(interaction.guild, f"⏹️ تم الإيقاف عبر أمر /stop_radio") else: await interaction.response.send_message("⚠️ متوقف بالفعل.", ephemeral=True) except: pass @bot.tree.command(name="volume", description="🔊 التحكم بدرجة الصوت (من 1 إلى 100)") @app_commands.describe(level="درجة الصوت من 1 إلى 100") @is_owner_and_in_control() async def set_volume(interaction: discord.Interaction, level: int): global current_volume try: if level < 1 or level > 100: return await interaction.response.send_message("❌ يرجى إدخال رقم بين 1 و 100.", ephemeral=True) current_volume = level / 100.0 vc = interaction.guild.voice_client if vc and vc.source: vc.source.volume = current_volume await interaction.response.send_message(f"🔊 تم تغيير درجة الصوت إلى: **{level}%**", ephemeral=True) await log_event(interaction.guild, f"🔊 تم تغيير درجة الصوت إلى {level}%") except: pass # ======================================================= # التشغيل والـ Keep Alive # ======================================================= try: from keep_alive import keep_alive keep_alive() except Exception: pass if __name__ == "__main__": TOKEN = os.environ.get("DISCORD_TOKEN") if TOKEN: bot.run(TOKEN) else: print("❌ التوكن مفقود! يرجى التأكد من وضعه في المتغيرات البيئية (Secrets).")