Files
freeswitch_chris/did_router/src/httapi.rs

185 lines
5.1 KiB
Rust
Raw Normal View History

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};
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");
2026-03-26 23:22:35 -04:00
bridge.add_attribute("data", format!("sofia/external/{}", 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
}
2026-03-27 06:39:47 -04:00
pub fn external_number(did: Did) -> XMLElement {
let mut work = XMLElement::new("work");
let mut bridge = XMLElement::new("execute");
2026-04-01 22:17:59 -04:00
let callee_number = did.target.unwrap();
let ds = build_dial_string(&callee_number, &did.did_number);
2026-03-27 06:39:47 -04:00
bridge.add_attribute("application", "bridge");
2026-04-01 22:17:59 -04:00
bridge.add_attribute("data", &ds);
2026-03-27 06:39:47 -04:00
work.add_child(bridge).unwrap();
2026-03-25 22:41:07 -04:00
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-29 02:07:39 -04:00
add_playback_element(&mut work, &no_service_path);
2026-03-26 21:02:52 -04:00
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");
2026-03-29 02:07:39 -04:00
add_playback_element(&mut work, &night_mode_path);
2026-03-26 21:02:52 -04:00
2026-03-25 22:41:07 -04:00
work
}
pub fn custom_message(_did: Did) -> XMLElement {
let work = XMLElement::new("work");
work
}
2026-04-01 22:17:59 -04:00
fn build_dial_string(callee_number: &str, caller_number: &str) -> String {
let ds = match db::get_did_by(&caller_number) {
Ok(d) => {
if d.trunk == "3229" || d.trunk == "3401" {
format!("{{origination_caller_id_number={} }}sofia/gateway/powernet_1/{}",
caller_number,
callee_number)
} else {
format!("{{origination_caller_id_number={} }}sofia/gateway/powernet_2/{}",
caller_number,
callee_number)
}
},
Err(..) =>{
format!("{{origination_caller_id_number={} }}sofia/gateway/powernet_1/{}",
caller_number,
callee_number)
}
};
ds
}
pub fn outbound(did: &str, caller_number: &str) -> XMLElement {
2026-03-29 02:07:39 -04:00
let mut work = XMLElement::new("work");
let mut bridge = XMLElement::new("execute");
2026-04-01 22:17:59 -04:00
let ds = build_dial_string(did, caller_number);
2026-03-29 02:07:39 -04:00
bridge.add_attribute("application", "bridge");
2026-04-01 22:17:59 -04:00
bridge.add_attribute("data", &ds);
2026-03-29 02:07:39 -04:00
work.add_child(bridge).unwrap();
work
}
pub fn add_playback_element(work: &mut XMLElement ,file_path: &str) {
2026-03-26 21:02:52 -04:00
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();
}
2026-04-01 22:17:59 -04:00
pub fn build_work_element(did: &str, caller_number: &str, caller_ipaddr: &str) -> XMLElement {
2026-03-29 02:07:39 -04:00
if db::from_pbx(&caller_ipaddr).unwrap() == true {
2026-04-01 22:17:59 -04:00
outbound(did, caller_number)
2026-03-29 02:07:39 -04:00
} else {
let d = db::get_did_by(&did).unwrap();
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)
}
};
work
}
}
2026-04-01 22:17:59 -04:00
pub fn route_call(did: String, caller_number: String,caller_ipaddr: String) -> Vec<u8> {
2026-03-25 22:41:07 -04:00
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");
2026-04-01 22:17:59 -04:00
let mut work = build_work_element(&did, &caller_number, &caller_ipaddr);
2026-03-25 22:41:07 -04:00
2026-03-26 23:22:35 -04:00
let mut hangup = XMLElement::new("execute");
hangup.add_attribute("application", "hangup");
work.add_child(hangup).unwrap();
2026-03-25 22:41:07 -04:00
doc.add_child(params).unwrap();
2026-03-29 02:07:39 -04:00
let d = db::get_did_by(&did);
match d {
Ok(d) => {
if d.active == true {
doc.add_child(work).unwrap();
}
},
Err(_) => {
doc.add_child(work).unwrap();
}
2026-03-28 07:57:31 -04:00
}
2026-03-25 22:41:07 -04:00
xml.set_root_element(doc);
let mut writer: Vec<u8> = Vec::new();
xml.generate(&mut writer).unwrap();
writer
}