# -*- 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)