from engine.flow_router import route_message from sessions import get_session, upsert_session def normalize_text(text: str) -> str: return (text or "").strip().lower() def detect_gender(text: str): """ تخمين خفيف وآمن: - female - male - None """ t = normalize_text(text) female_markers = [ "انا مهتمه", "مهتمه", "عايزه", "عاوزه", "عاوزة", "عايزة", "حابه", "حابة", "محتاجه", "محتاجة", "انا ام", "انا ماما", "انا والده", ] male_markers = [ "انا مهتم", "مهتم", "عايز", "حابب", "محتاج", "انا اب", "انا بابا", "انا والد", ] for marker in female_markers: if marker in t: return "female" for marker in male_markers: if marker in t: return "male" return None def merge_flow_data(old_data: dict, new_data: dict): merged = dict(old_data or {}) merged.update(new_data or {}) return merged def process_message(bot_number: str, customer_phone: str, text: str): session = get_session(customer_phone, bot_number) if not session: session = { "current_state": "START", "flow_type": None, "flow_data": { "uid": f"{bot_number}__{customer_phone}", "customer_phone": customer_phone, "bot_number": bot_number, } } state = session.get("current_state", "START") old_flow_data = session.get("flow_data", {}) or {} # تأكد إن البيانات الأساسية موجودة دائمًا base_flow_data = merge_flow_data(old_flow_data, { "uid": old_flow_data.get("uid") or f"{bot_number}__{customer_phone}", "customer_phone": customer_phone, "bot_number": bot_number, }) # خزّن gender لو واضح، لكن ما تمسحهوش لو كان موجود قبل كده detected_gender = detect_gender(text) if detected_gender and not base_flow_data.get("gender"): base_flow_data["gender"] = detected_gender # ابني session محدثة قبل التوجيه working_session = dict(session) working_session["flow_data"] = base_flow_data result = route_message(state, text, working_session) next_state = result["next_state"] result_flow_data = result.get("flow_data", base_flow_data) or {} # ندمج بدل ما نستبدل عشان ما نفقدش uid / gender / customer info final_flow_data = merge_flow_data(base_flow_data, result_flow_data) flow_type = final_flow_data.get("customer_type") or session.get("flow_type") upsert_session( customer_phone=customer_phone, bot_number=bot_number, current_state=next_state, flow_type=flow_type, flow_data=final_flow_data, last_message=text, ) result["flow_data"] = final_flow_data return result