| 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, |
| }) |
|
|
| |
| detected_gender = detect_gender(text) |
| if detected_gender and not base_flow_data.get("gender"): |
| base_flow_data["gender"] = detected_gender |
|
|
| |
| 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 {} |
|
|
| |
| 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 |