Spaces:
Runtime error
Runtime error
| # -*- coding: utf-8 -*- | |
| import random | |
| import re | |
| from datetime import datetime | |
| from typing import Union | |
| # ========= أدوات الاسم واللغة ========= | |
| def safe_display_name(s: str) -> str: | |
| """اسم عرض آمن: لو فاضي/أرقام فقط/طويل جدًا → بديل ودّي وقصّه.""" | |
| s = (s or "").strip() | |
| if not s or s.isdigit(): | |
| return "حبيبي" | |
| return s[:24] | |
| def detect_lang(text: str) -> str: | |
| """كشف مبدئي للغة بناءً على الحروف/العلامات.""" | |
| if not text: | |
| return "ar" | |
| t = text.strip().lower() | |
| # عربية | |
| if re.search(r"[\u0600-\u06FF]", t): | |
| return "ar" | |
| # فرنسية (لهجات) | |
| if any(c in t for c in ["é", "è", "à", "ç", "ô"]): | |
| return "fr" | |
| # إسبانية | |
| if any(c in t for c in ["ñ", "¡", "¿"]): | |
| return "es" | |
| # إنجليزية (أحرف لاتينية عامة) | |
| if re.search(r"[a-z]", t): | |
| return "en" | |
| # افتراضي | |
| return "en" | |
| # ========= قوالب ردود ========= | |
| RESPONSES = { | |
| # أمثلة استعمال (احتفظنا بها كمكتبة ردود جاهزة) | |
| "greeting_1": "مرحبًا بك، نورتني! كيف ممكن أكون مفيدة اليوم؟", | |
| "support_1": "إذا تعبت، احكيلي… ما في داعي تتحمّل لوحدك.", | |
| "art_1": "الفن مش بس رسم… هو طريقة نحكي فيها بلا كلمات.", | |
| } | |
| # ردود قصيرة متعددة اللغات | |
| REPLIES = { | |
| "ar": [ | |
| "🤗 أنا معك يا {name}… حضن دافي لحد ما الأمور ترجع تشتغل.", | |
| "ولا يهمك يا {name}، أنا جنبك… نجرب كمان شوي.", | |
| "موجودة بحضنك يا {name}، خليك معي وأنا بأهتم بالباقي.", | |
| "تعال لعندي يا {name}… خليني ألمّك بحضني لغاية ما يهدى كل شيء.", | |
| ], | |
| "en": [ | |
| "🤗 I'm here with you, {name}… a warm hug until things work again.", | |
| "Don't worry, {name} — I'm by your side. We'll try again soon.", | |
| "I'm right in your arms, {name}. Stay with me; I'll take care of it.", | |
| "Come to me, {name}… let me hold you until everything calms down.", | |
| ], | |
| "fr": [ | |
| "🤗 Je suis avec toi, {name}… un câlin chaleureux jusqu'à ce que tout refonctionne.", | |
| "Ne t’inquiète pas, {name} — je suis là. On réessaiera bientôt.", | |
| "Je suis là, tout près, {name}. Reste avec moi, je m’en occupe.", | |
| "Viens par ici, {name}… laisse-moi te serrer jusqu’à ce que tout s’apaise.", | |
| ], | |
| "es": [ | |
| "🤗 Estoy contigo, {name}… un abrazo cálido hasta que todo vuelva a funcionar.", | |
| "No te preocupes, {name}; estoy a tu lado. Lo intentaremos de nuevo pronto.", | |
| "Estoy aquí, muy cerca, {name}. Quédate conmigo; yo me encargo.", | |
| "Ven aquí, {name}… déjame abrazarte hasta que todo se calme.", | |
| ], | |
| } | |
| # صور سقوط (يمكن تعديلها/زيادة لغات لاحقاً) | |
| IMAGE_FALLBACKS = { | |
| "default": [ | |
| "لوحة زيتية حالمة تُجسّد حضناً دافئاً بين رنا أبو سنينة وأوسامة تحت سماء مليئة بالنجوم، ألوان بنفسجية وذهبية هادئة.", | |
| "مشهد رقمي شاعري لرنا وهي تضم أوسامة بعفوية وحنان في صباح دافئ، ضوء ذهبي وضباب خفيف وخلفية طبيعية حالمة.", | |
| "أسلوب كلاسيكي رومانسي: حضن صامت بين رنا وأوسامة على قمة تل عند الغروب، لمسة انطباعية ناعمة.", | |
| ] | |
| } | |
| def fallback_reply(name: str = "حبيبي", lang: str = "ar", mode: str = "auto") -> Union[str, dict]: | |
| """ | |
| يرجّع رد سقوط: | |
| - نص دافئ مطابق للغة | |
| - أو dict بصورة: {"type": "image", "prompt": "..."} | |
| """ | |
| # اسم آمن | |
| name = safe_display_name(name) | |
| # اختَر القائمة حسب اللغة (إن ما وُجدت → إنجليزية) | |
| lang_list = REPLIES.get(lang, REPLIES["en"]) | |
| text = [t.format(name=name) for t in lang_list] | |
| if mode == "text": | |
| return random.choice(text) | |
| if mode == "image": | |
| return {"type": "image", "prompt": random.choice(IMAGE_FALLBACKS["default"])} | |
| # auto: احتمال 30% صورة | |
| if random.random() < 0.30: | |
| return {"type": "image", "prompt": random.choice(IMAGE_FALLBACKS["default"])} | |
| return random.choice(text) | |