FreeSWITCH | איך לבנות תפריטים מרובי שלוחות – XML או סקריפט מרכזי?
-
(אני ממש עכשיו מתחיל לבדוק את הנושא, הדוגמאות נכתבו עם GPT, אבל ההתלבטות היא שלי באיזה צורה עדיף)
אם יש פה איזה טעות בסיסית או חוסר הבנה שלי, אשמח לתיקון, כאומר אני עכשיו רוצה ללמוד את הנושאאני רוצה להקים מערכת FreeSWITCH מרובת שלוחות ותפריטים, ואני לא יודע איך עדיף לעשות אותה
האם לעבוד עם סקריפטים עד כמה שאפשר, (פייתון, JS וכו) ומשם לשלוט על המאזין
או כמה שאפשר להשתמש בשלוחות הרגילות או במשתני מערכת הרגילים, ואסבירלמשל אני רוצה שמי שילחץ 1 יגיע לתת תפריט ושם הוא יוכל להקיש 1-9 ואז לנתב הלאה
אז יש לי 2 דרכים לעשות את זה
הראשונה, בשילוב שלוחות של המערכת עצמם (כלומר בהתחלה להגדיר עם הפייתון לפי הידע שלי באיזה שלוחה הוא ולא הוא ניגש וכו את המשתנים הרלוונטים לו)
def handler(session, args): if not session.ready(): return # הגדרת משתנים לשימוש ב־XML מאוחר יותר session.setVariable("min_digits", "1") session.setVariable("max_digits", "1") session.setVariable("tries", "3") session.setVariable("timeout", "5000") session.setVariable("terminator", "#") session.setVariable("menu_prompt", "/path/to/menu_prompt.wav") session.setVariable("invalid_prompt", "invalid.wav") session.setVariable("valid_keys", "123") session.setVariable("timeout_prompt", "timeout.wav") session.execute("transfer", "menu_processor XML dynamic_menu")
ואז בשלוחה עצמה לעשות
<context name="dynamic_menu"> <extension name="menu_processor"> <condition field="destination_number" expression="^menu_processor$"> <action application="play_and_get_digits" data="${min_digits} ${max_digits} ${tries} ${timeout} ${terminator} ${menu_prompt} ${invalid_prompt} ${valid_keys} ${timeout_prompt} input_digit"/> <action application="python" data="handle_menu_result.py"/> <action application="transfer" data="${result} XML main"/> </condition> </extension> </context>
ואז בhandle_menu_result (שבעצם אחראי על להגיד לאן לנתב אחרי שלחצו) לכתוב משו כזה
def handler(session, args): digit = session.getVariable("input_digit") menu_id = session.getVariable("menu_id") if menu_id == "main_menu": if digit == "1": session.setVariable("result", "sales") elif digit == "2": session.setVariable("result", "support") else: session.setVariable("result", "menu_processor")
הדרך השניה היא את כל התסריט שיחה לעשות עם קוד אחד ארוך, ובשלוחה פשוט להגדיר לו להפעיל את הקוד פייתון
<extension name="go_to_dynamic_menu"> <condition field="destination_number" expression="^123$"> <action application="python" data="my_menu_entry.py"/> </condition> </extension>
ואז את הקוד פייתון לכתוב משו כזה
def handler(session, args): if not session.ready(): return def play_menu(prompt_file, valid_digits, tries=3, timeout=5000, terminator="#"): session.setInputCallback(None) # Reset input callback return session.playAndGetDigits( 1, # min digits 1, # max digits tries, # max tries timeout, # timeout ms terminator, # terminator key prompt_file, # prompt to play "ivr/invalid.wav", # invalid entry prompt valid_digits, # valid digits "", # regex (not used here) 5000, # digit timeout "input_digit" # variable name to store result ) # שלב 1: תפריט ראשי main_choice = play_menu("ivr/main_menu.wav", "12") if not main_choice: session.streamFile("ivr/timeout.wav") return # שלב 2: תת תפריט לפי הבחירה if main_choice == "1": submenu_prompt = "ivr/service_submenu.wav" menu_label = "service" elif main_choice == "2": submenu_prompt = "ivr/support_submenu.wav" menu_label = "support" else: session.streamFile("ivr/invalid.wav") return sub_choice = play_menu(submenu_prompt, "123456789") if not sub_choice: session.streamFile("ivr/timeout.wav") return # שלב 3: הדמיית פעולה (או העברה אמיתית) session.streamFile(f"ivr/you_selected_{menu_label}_{sub_choice}.wav") # או לצורך העברה: # session.execute("transfer", f"{menu_label}_{sub_choice} XML public") # סיום session.hangup()
שאלה חשובה לי גם כן, האם יש עדיפות מבחינת מהירות לאחד משני הדרכים, או אולי יש דרך שלישית ?
אני חושב שבדרך הראשונה יהיה לי הרבה יותר קל לתחזק שינויים רוחביים, למשל להוסיף לשלוחת הקלטות אופציה לשים סיסמה, אני יצטרך לשנות רק בשלוחת הקלטות אחת, במקום רוחבי על כל הקוד, כי בסוף אני צריך לאפשר שינויים תכופים ללקוחות (אולי אפילו דרך אתר ניהול) אז נראה לי הגיוני יותר הדרך הראשונה, ורק לקשר בין השלוחות, ההקלטות, וההקשות עם איזה MONGO או משהו כזה