2026-03-26 21:02:52 -04:00
|
|
|
use dotenvy::dotenv;
|
|
|
|
|
use std::env;
|
2026-03-25 22:41:07 -04:00
|
|
|
use xml_builder::{XMLBuilder, XMLElement, XMLVersion};
|
|
|
|
|
use super::database as db;
|
|
|
|
|
use super::database::{DidTargetType, Did};
|
|
|
|
|
|
2026-03-26 00:30:51 -04:00
|
|
|
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/internal/{}", target).as_str());
|
|
|
|
|
|
|
|
|
|
work.add_child(bridge).unwrap();
|
|
|
|
|
|
2026-03-25 22:41:07 -04:00
|
|
|
work
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn moh(_did: Did) -> XMLElement {
|
2026-03-26 21:47:46 -04:00
|
|
|
let mut work = XMLElement::new("work");
|
|
|
|
|
|
|
|
|
|
let mut playback = XMLElement::new("playback");
|
|
|
|
|
playback.add_attribute("file", "local_stream://default");
|
|
|
|
|
work.add_child(playback).unwrap();
|
|
|
|
|
|
2026-03-25 22:41:07 -04:00
|
|
|
work
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn external_number(_did: Did) -> XMLElement {
|
|
|
|
|
let work = XMLElement::new("work");
|
|
|
|
|
work
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn no_service(_did: Did) -> XMLElement {
|
2026-03-26 21:02:52 -04:00
|
|
|
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);
|
2026-03-25 22:41:07 -04:00
|
|
|
let mut work = XMLElement::new("work");
|
|
|
|
|
|
2026-03-26 21:02:52 -04:00
|
|
|
add_playback(&mut work, &no_service_path);
|
|
|
|
|
|
2026-03-25 22:41:07 -04:00
|
|
|
work
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn night_mode(_did: Did) -> XMLElement {
|
2026-03-26 21:02:52 -04:00
|
|
|
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);
|
|
|
|
|
|
2026-03-25 22:41:07 -04:00
|
|
|
work
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn custom_message(_did: Did) -> XMLElement {
|
|
|
|
|
let work = XMLElement::new("work");
|
|
|
|
|
work
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-26 21:02:52 -04:00
|
|
|
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();
|
|
|
|
|
|
|
|
|
|
let mut hangup = XMLElement::new("execute");
|
|
|
|
|
hangup.add_attribute("application", "hangup");
|
|
|
|
|
work.add_child(hangup).unwrap();
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-25 22:41:07 -04:00
|
|
|
pub fn route_call(did: String) -> Vec<u8> {
|
|
|
|
|
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 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)
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
doc.add_child(params).unwrap();
|
|
|
|
|
doc.add_child(work).unwrap();
|
|
|
|
|
|
|
|
|
|
xml.set_root_element(doc);
|
|
|
|
|
|
|
|
|
|
let mut writer: Vec<u8> = Vec::new();
|
|
|
|
|
xml.generate(&mut writer).unwrap();
|
|
|
|
|
|
|
|
|
|
writer
|
|
|
|
|
|
|
|
|
|
}
|