use dotenvy::dotenv; use std::env; use xml_builder::{XMLBuilder, XMLElement, XMLVersion}; use super::database as db; use super::database::{DidTargetType, Did}; pub fn url(did: Did) -> XMLElement { let mut work = XMLElement::new("work"); let mut bridge = XMLElement::new("execute"); let target = did.target.unwrap(); bridge.add_attribute("application", "bridge"); bridge.add_attribute("data", format!("sofia/external/{}", target).as_str()); work.add_child(bridge).unwrap(); work } pub fn moh(_did: Did) -> XMLElement { let mut work = XMLElement::new("work"); let mut playback = XMLElement::new("playback"); playback.add_attribute("file", "local_stream://default"); work.add_child(playback).unwrap(); work } pub fn external_number(_did: Did) -> XMLElement { let work = XMLElement::new("work"); work } pub fn no_service(_did: Did) -> XMLElement { dotenv().ok(); let sound_path = env::var("SOUND_PATH").expect("SOUND_PATH must be set"); let no_service_path = format!("{}/no_service.wav", sound_path); let mut work = XMLElement::new("work"); add_playback(&mut work, &no_service_path); work } pub fn night_mode(_did: Did) -> XMLElement { dotenv().ok(); let sound_path = env::var("SOUND_PATH").expect("SOUND_PATH must be set"); let night_mode_path = format!("{}/night_mode.wav", sound_path); let mut work = XMLElement::new("work"); add_playback(&mut work, &night_mode_path); work } pub fn custom_message(_did: Did) -> XMLElement { let work = XMLElement::new("work"); work } pub fn add_playback(work: &mut XMLElement ,file_path: &str) { let mut answer = XMLElement::new("execute"); answer.add_attribute("application", "answer"); work.add_child(answer).unwrap(); let mut playback = XMLElement::new("playback"); playback.add_attribute("file", &file_path); work.add_child(playback).unwrap(); } pub fn route_call(did: String) -> Vec { let d = db::get_did_by(&did).unwrap(); let mut xml = XMLBuilder::new() .version(XMLVersion::XML1_1) .encoding("UTF-8".into()) .build(); let mut doc = XMLElement::new("document"); doc.add_attribute("type", "xml/freeswitch-httapi"); let params = XMLElement::new("params"); let mut work = match d.target_type { DidTargetType::Url => { url(d) }, DidTargetType::Moh => { moh(d) }, DidTargetType::ExternalNumber => { external_number(d) }, DidTargetType::NoService => { no_service(d) }, DidTargetType::NightMode => { night_mode(d) }, DidTargetType::CustomMessage => { custom_message(d) } }; let mut hangup = XMLElement::new("execute"); hangup.add_attribute("application", "hangup"); work.add_child(hangup).unwrap(); doc.add_child(params).unwrap(); doc.add_child(work).unwrap(); xml.set_root_element(doc); let mut writer: Vec = Vec::new(); xml.generate(&mut writer).unwrap(); writer }