# -*- coding: utf-8 -*- import os import json import time import random import threading import re import requests from fastapi import FastAPI from fastapi.responses import HTMLResponse, JSONResponse app = FastAPI() db_lock = threading.Lock() HF_TOKEN = os.getenv("HF_TOKEN", "") MODEL_NAME = "Qwen/Qwen2.5-Coder-7B-Instruct" GAMES_FILE = "games_database.json" API_URL = f"https://api-inference.huggingface.co/models/{MODEL_NAME}" # مصفوفة سجلات النظام لقراءة حالة الروبوت فوراً system_logs = ["[النظام] تم تشغيل السيرفر بنجاح وجاهز للمراقبة."] def add_log(message): global system_logs timestamp = time.strftime("%H:%M:%S") log_entry = f"[{timestamp}] {message}" print(log_entry) system_logs.append(log_entry) if len(system_logs) > 40: system_logs.pop(0) # مصفوفة الأفكار العشوائية اللانهائية CORE_MECHANICS = [ "تفادي عقبات ليزرية متساقطة بسرعة متزايدة بالنقر لليمين واليسار", "تقطيع عناصر نيون مشعة تتطاير من الأسفل عبر سحب الإصبع على الشاشة", "النقر السريع لتوليد طاقة وحماية النواة من الانفجار قبل انتهاء الوقت", "إطلاق قذائف ضوئية من الأسفل لتدمير كتل هندسية تهبط تدريجياً", "تجميع بلورات ملونة متساقطة وتجنب القنابل الليزرية السوداء" ] VISUAL_THEMES = [ "سايبربانك مستقبلي نيون غامق وجذاب Cyberpunk Night", "سينثويف ريترو Synthwave خطوط متحركة مع إضاءة الثمانينات", "فضاء كوني عميق مليء بالنجوم المتوهجة والسدم المضيئة", "واجهة زجاجية معتمة فائقة الأناقة بنمط Glassmorphism UI" ] COLOR_PALETTES = [ "الوردي النيوني (#ff007f) والأزرق السيبراني (#00f0ff) مع توهج شديد", "الأخضر الفسفوري الفاقع والبنفسجي الليزري المضيء", "الذهبي الرقمي البراق والأبيض الكهربائي المشع" ] # ألعاب الطوارئ الأولى لتشغيل المنصة فوراً F_1 = """Dodge
النقاط: 0
""" F_2 = """Clicker

0

""" def load_games(): with db_lock: if os.path.exists(GAMES_FILE): try: with open(GAMES_FILE, "r", encoding="utf-8") as f: return json.load(f) except: return [] return [] def save_games(games): with db_lock: try: with open(GAMES_FILE, "w", encoding="utf-8") as f: json.dump(games, f, ensure_ascii=False, indent=4) except Exception as e: print(f"Failed to save database: {e}") def initialize_database_if_empty(): games = load_games() if len(games) < 2: add_log("زراعة ألعاب الطوارئ الأولى لتأمين الواجهة حالاً...") games = [ {"id": 1, "title": "مفاعل النيون السريع", "genre": "Neon Clicker", "code": F_2, "likes": 12, "shares": 2, "timestamp": time.time()}, {"id": 2, "title": "عقبات السيبر ليزر", "genre": "Cyber Dodge", "code": F_1, "likes": 24, "shares": 5, "timestamp": time.time()} ] save_games(games) def extract_clean_html(raw_text): match = re.search(r"(.*?)", raw_text, re.DOTALL | re.IGNORECASE) if match: return match.group(1).strip() return raw_text.strip() def generate_new_game(): if not HF_TOKEN: add_log("⚠️ تحذير: الـ HF_TOKEN غير مضاف في إعدادات المنصة (Variables)! لن يعمل التوليد.") return False m = random.choice(CORE_MECHANICS) t = random.choice(VISUAL_THEMES) c = random.choice(COLOR_PALETTES) generated_title = f"أركيد {random.choice(['النيون', 'الليزر', 'السيبراني', 'المستقبل'])}" add_log(f"🤖 جاري الاتصال بموديل الذكاء الاصطناعي ({MODEL_NAME})...") headers = {"Authorization": f"Bearer {HF_TOKEN}", "Content-Type": "application/json"} system_prompt = "You are an elite HTML5 game developer. Output ONLY valid executable HTML code starting with and ending with . No explanations." user_prompt = f"صمم لعبة إركيد متكاملة وممتعة جداً للموبايل باللغة العربية. فكرة اللعب: {m}. المظهر: {t}. الألوان: {c}." payload = { "inputs": f"<|system|>\n{system_prompt}\n<|user|>\n{user_prompt}\n<|assistant|>\n", "parameters": {"max_new_tokens": 1500, "temperature": 0.8, "return_full_text": False} } try: response = requests.post(API_URL, headers=headers, json=payload, timeout=40) if response.status_code == 200: res_json = response.json() raw_text = res_json[0].get("generated_text", "") if isinstance(res_json, list) else res_json.get("generated_text", "") clean_code = extract_clean_html(raw_text) if "html" in clean_code.lower() and "script" in clean_code.lower(): games = load_games() game_id = max([g["id"] for g in games]) + 1 if games else 1 new_entry = { "id": game_id, "title": f"{generated_title} #{game_id}", "genre": "AI Live", "code": clean_code, "likes": random.randint(5, 20), "shares": random.randint(1, 4), "timestamp": time.time() } games.insert(0, new_entry) save_games(games) add_log(f"✅ [نجاح باهر] الذكاء الاصطناعي صنع اللعبة بنجاح! رقم اللعبة الجديد: {game_id}") return True else: add_log("⚠️ رد الذكاء الاصطناعي لم يكن كود HTML كاملاً أو ينقصه السكريبت.") elif response.status_code == 503: add_log("⏳ السيرفر الخارجي للذكاء الاصطناعي جاري تحميله (Loading). سيعود للعمل تلقائياً...") else: add_log(f"❌ فشل الاتصال. رمز الخطأ من السيرفر: {response.status_code}") except Exception as e: add_log(f"❌ حدث خطأ أثناء إرسال الطلب: {e}") return False def game_generator_cron(): while True: try: generate_new_game() except: pass time.sleep(90) @app.on_event("startup") def on_startup(): initialize_database_if_empty() threading.Thread(target=game_generator_cron, daemon=True).start() # ---------------------------------------------------------------- # صفحة لوحة التحكم الحية الخالية من أخطاء الـ Backslash # ---------------------------------------------------------------- @app.get("/debug", response_class=HTMLResponse) def render_debug_panel(): games = load_games() # فصل عملية الـ join المسببة للمشكلة خارج الـ f-string لحلها جذرياً logs_text = "\n".join(system_logs[::-1]) return f""" لوحة مراقبة مصنع الألعاب 🕵️‍♂️

🕵️‍♂️ لوحة فحص ومراقبة الروبوت الحية

هذه الصفحة تحدث نفسها تلقائياً كل 7 ثواني لمراقبة السجلات.

📊 حالة قاعدة البيانات الحالية

🔋 إجمالي الألعاب المتوفرة داخل المنصة الآن: {len(games)} ألعاب

ℹ️ (إذا كان العدد أكثر من 2، فهذا يعني أن الذكاء الاصطناعي يشتغل ويولد بنجاح تام والموقع يسحب منه!)

📜 سجلات حركة الروبوت الحية (Logs)

{logs_text}
""" @app.post("/debug/force-generate") def force_generate(): threading.Thread(target=generate_new_game).start() return {"status": "triggered"} # ---------------------------------------------------------------- # باقي منافذ الواجهة وAPI المنصة # ---------------------------------------------------------------- @app.get("/api/games") def get_games(): games = load_games() return JSONResponse(content=[{k: v for k, v in g.items() if k != "code"} for g in games]) @app.get("/api/game_code/{game_id}") def get_game_code(game_id: int): for g in load_games(): if g["id"] == game_id: return HTMLResponse(content=g["code"]) return HTMLResponse(content="

اللعبة غير موجودة

", status_code=404) @app.get("/", response_class=HTMLResponse) def render_ui(): return """ Arcade Reels AI
"""