// // Example AEL config file // globals { CONSOLE=Console/dsp; TRUNKMSD=0; //MSD digits to strip (usually 1 or 0) TRUNCPROTO=SIP; TRUNK=sunrocket; PSTN=pstn-spa3k; PSTNPROTO=SIP; TARIOPROTO=SIP; TARIO=tario; CPPROTO=SIP; CPACKET1=callpacket1; CPACKET2=callpacket2; SELLVOIP=1577040314; SVPROTO=IAX2; }; macro stdexten (ext , dev ) { PrivacyManager(3,10); if("${PRIVACYMGRSTATUS}" = "FAILED") { Playback(vm-goodbye); Hangup(); }; AGI(calleridnamelookup.agi); Dial(${dev}/${ext},30,t); switch(${DIALSTATUS}) { case BUSY: Voicemail(b${ext}); break; default: Voicemail(u${ext}); }; catch a { VoiceMailMain(${ext}); return; }; }; macro announce_minutes(minutes) { Playback(vm-youhave); SayNumber(${minutes}); Playback(vm-minutes); Wait(1); }; // Check if given provider allows only some free minutes per month // and announce number of free minutes remaining. // The limit will be reset monthly by cron job. // The macro sets the following variables: // MINUTES_LIMIT - number of free minutes per month // MINUTES_USED - number of free minutes used in the current month // PROVIDER - provider name macro checkanddial(prov,proto,ext,arg1,arg2,arg3,arg4) { Set(MINUTES_LIMIT=0); Set(MINUTES_USED=0); Set(PROVIDER=${prov}); if(${DB_EXISTS(Provider/${prov}/used)}) Set(MINUTES_USED=${DB_RESULT}); country_c = 0; switch(${LEN(${ext})}) { //assuming all international numbers are 11 digits long. case 10: //NXXNXXXXXX country_c=1; break; case 11: //XNXXNXXXXXX country_c = ${ext:0:1}; break; default: //011XNXXNXXXXXX country_c = ${ext:3:1}; break; }; if("${prov}" = "${TRUNK}" & ${country_c} != 1) { // SunRocket international calls Set(MINUTES_LIMIT=${DB(Provider/${prov}/limit)}); &announce_minutes($[${MINUTES_LIMIT} - ${MINUTES_USED}]); }; if("${prov}" = "${CPACKET1}" | "${prov}" = "${CPACKET2}") { // Callpacket has a limit on domestic calls Set(MINUTES_LIMIT=${DB(Provider/${prov}/limit)}); &announce_minutes($[${MINUTES_LIMIT} - ${MINUTES_USED}]); }; DeadAGI(dial.agi,${proto}/${ext}@${prov},${arg1},${arg2},${arg3},${arg4}); }; macro trunkdial(ext) { // Dial sunrocket and set correct collerid if("${CALLERID(num)}" = "1") { Set(CALLERID(num)=7322271653); } else { Set(CALLERID(num)=7326260100); }; Set(CALLERID(name)=Sergey Okhapkin); &checkanddial(${TRUNK},${TRUNCPROTO},${ext},60,T); Hangup; }; macro checklocal(ext) { // lookup the number in DB and call the number via pstn or sunrocket Set(AREACODE=${ext:0:3}); Set(EXCHANGE=${ext:3:3}); Set(IS_LOCAL=${DB_EXISTS(localnum/${AREACODE}/${EXCHANGE})}); if(${IS_LOCAL}) { &checkanddial(${PSTN},${PSTNPROTO},${ext},60,T); if ("${DIALSTATUS}" = "BUSY") &trunkdial(${ext}); } else &trunkdial(${ext}); }; macro autodial(ext) { // Find Least Cost Route LCDial(${ext},60,T); if("${DIALSTATUS}" = "NOPROVIDER") Playback(invalid); Hangup(); }; context default { // Calls to us s => { Wait(1); Answer; start: Set(TIMEOUT(digit)=3); Set(TIMEOUT(response)=10); repeat: for (x=0; ${x} < 5; x=${x} + 1) { Background(home/greeting); WaitExten(); }; }; t => jump *; i => { // invalid extension Playback(invalid); goto s|repeat; }; _* => { Playback(vm-goodbye); Wait(1); Hangup; }; 1 => &stdexten(1,SIP/1); 2 => &stdexten(2,SIP/2); 3 => &stdexten(3,SIP/3); 2271653 => jump 1; 7322271653 => jump 1; 17322271653 => jump 1; 6260100 => jump 2; 7326260100 => jump 2; 17326260100 => jump 2; 8058701100 => jump 2; 3103622835 => jump 2; sos => jump 2; 1400898 => jump 2; 6260101 => jump s; 7326260101 => jump s; 17326260101 => jump s; 2271677 => jump 3; 7322271677 => jump 3; 17322271677 => jump 3; galka => jump 3; 911 => Dial(${PSTNPROTO}/911@${PSTN},60,); 380 => Dial(SIP/topspeen@212.40.38.70,60,T); // Fun stuff 100 => { SayUnixTime(); goto s|start; }; 101 => { // Voicemail VoicemailMain(${CALLERID(num)}); Hangup; }; 102 => MusicOnHold(); // 103 => { // Wait(1); //start: // Read(NUMBER,vm-enter-num-to-call); // LCDial(${NUMBER},T); // goto start; // }; 105 => jump s@phrase-menu; 7312 => { ForkCDR; Set(CALLERID(name)=Sergey Okhapkin); Set(CALLERID(num)=7326260100); DISA(1111|home); }; }; context goiax { s => { Answer(); Ringing(); Wait(1); start: Read(NUMBER,vm-enter-num-to-call); Set(CALLERID(name)=Central NJ); Dial(IAX2/14301@fwdOUT/q${NUMBER},60,T); goto start; }; }; context phrase-menu { s => { Answer; // Answer the line TIMEOUT(digit)=2; // Set Digit Timeout to 5 seconds TIMEOUT(response)=10; // Set Response Timeout to 10 seconds BackGround(custom/phrase-menu); // Play main menu. }; 1 => { // Phrase Recording Wait(1); Read(PHRASEID|custom/enter-phrase-num); Wait(2); // give yourself 2 secs to take a breath and wait for beep Record(custom/${PHRASEID}:gsm); Wait(2); Playback(custom/${PHRASEID}); Wait(1); jump s; }; 2 => { // Phrase review Wait(1); Read(PHRASEID|custom/enter-phrase-num); Wait(1); Playback(custom/${PHRASEID}); Wait(1); jump s; }; t => Hangup; i => { Playback(custom/invalid-option); jump s; }; }; context outbound { // North America seven-, ten- and eleven digits _NXXXXXX => &autodial(1732${EXTEN}); _NXXNXXXXXX => &autodial(1${EXTEN}); _ZNXXNXXXXX. => &autodial(${EXTEN}); // Toll free numbers via PSTN // _1800NXXXXXX => &checkanddial(${PSTN},${PSTNPROTO},${EXTEN},60,T); // _1888NXXXXXX => &checkanddial(${PSTN},${PSTNPROTO},${EXTEN},60,T); // _1877NXXXXXX => &checkanddial(${PSTN},${PSTNPROTO},${EXTEN},60,T); // _1866NXXXXXX => &checkanddial(${PSTN},${PSTNPROTO},${EXTEN},60,T); _011. => { //International context accessed through trunk &trunkdial(${EXTEN}); }; _012. => { //fwdOUT Set(CALLERID(name)=Central NJ); Dial(IAX2/14301@fwdOUT/q${EXTEN:3},60,T); }; _013X. => { //NECC Dial(${PSTNPROTO}/011${EXTEN:3}@${PSTN},60,T); }; _0131. => { //NECC to US Dial(${PSTNPROTO}/${EXTEN:3}@${PSTN},60,T); }; _014. => { //TARIO by SIP ID Set(CALLERID(name)=Sergey Okhapkin); Set(CALLERID(num)=1400898); Dial(${TARIOPROTO}/${EXTEN:3}@${TARIO},60,T); }; _0157. => { //TARIO outbound Russia Set(CALLERID(name)=Sergey Okhapkin); Set(CALLERID(num)=1400898); Dial(${TARIOPROTO}/8${EXTEN:4}@${TARIO},60,T); }; // _015. => { //TARIO outbound international // CALLERID(name)="Sergey Okhapkin"; // CALLERID(num)=1400898; // Dial(${TARIOPROTO}/810${EXTEN:3}@${TARIO},60,T); // }; _0161NXXNXXXXXX => { //Callpacket outbound USA/Canada &checkanddial(${CPACKET1},${CPPROTO},${EXTEN:3},60,T); }; _0171NXXNXXXXXX => { //Callpacket outbound USA/Canada &checkanddial(${CPACKET2},${CPPROTO},${EXTEN:3},60,T); }; _0181NXXNXXXXXX => { //sellvoip outbound USA/Canada Dial(${SVPROTO}/${SELLVOIP}@${SELLVOIP}/${EXTEN:3},60,T); }; _019. => { //Voipbuster Dial(IAX2/sokhapkin@voipbuster/00${EXTEN:3},60,T); }; }; context home { //calls from us includes { default; outbound; }; }; context sunrocket-in { 7322271653 => jump s; 7326260100 => jump 2@default; s => { if("${CALLERID(num)}" = "sunrocketcom") Set(CALLERID(num)=); switch(${CALLERID(RDNIS)}) { case 7326260100: jump 2@default; break; case 7326260101: jump s@default; break; default: jump 1@default; break; }; }; }; context pstn-in { 3 => { if ("${CALLERID(num)}" = "7322271677") Set(CALLERID(num)=); jump 3@default; }; }; context tario.net-in { _X. => { Set(CALLERID(name)=); if("${CALLERID(num):-11:1}" = "8") Set(CALLERID(num)=7${CALLERID(num):1}); if("${SIP_HEADER(To)}" = "") { jump 3@default; } else if("${SIP_HEADER(To)}" = "") { jump 1@default; } else jump 2@default; }; }; context from-callpacket { 8058701100 => jump 2@default; 3103622835 => { Answer; Ringing; Wait(10); Voicemail(b3103622835); Hangup; }; a => Hangup; }; context fromfwdOUT { // make sure we only accept US and Canada calls, limit to 30 minutes includes { fromfwdOUT-catchbad; fromfwdOUT-isgood; fromfwdOUT-catchall; }; }; context fromfwdOUT-isgood { _17326260100 => jump 2@default; _17326260101 => jump s@default; _17322271653 => jump 1@default; _17322271677 => jump 3@default; _1NXXNXXXXXX => { Set(CALLERID(name)=Sergey Okhapkin); // Set(CALLERID(num)=7326260100); // Dial(${TRUNCPROTO}/*67${EXTEN:${TRUNKMSD}}@${TRUNK},60,,L(1800000:60000)); Dial(${CPPROTO}/${EXTEN}@${CPACKET2},60,,L(1800000:60000)); }; }; context fromfwdOUT-catchbad { //block bahamas, etc _1900. => congestion ; //N11 _1XXX976. => congestion ; //N11 _1XXX555. => congestion ; //N11 _1X11. => congestion ; //N11 _1867. => congestion ; //Yukon (sorry mike) // exten => _1NPA Country _1242. => congestion; //BAHAMAS _1246. => congestion; //BARBADOS _1264. => congestion; //ANGUILLA _1268. => congestion; //ANTIGUA/BARBUDA _1284. => congestion; //BRITISH VIRGIN ISLANDS _1345. => congestion; //CAYMAN ISLANDS _1441. => congestion; //BERMUDA _1473. => congestion; //GRENADA _1649. => congestion; //TURKS & CAICOS ISLANDS _1664. => congestion; //MONTSERRAT _1758. => congestion; //ST. LUCIA _1767. => congestion; //DOMINICA _1784. => congestion; //ST. VINCENT & GRENADINES _1809. => congestion; //DOMINICAN REPUBLIC _1829. => congestion; //DOMINICAN REPUBLIC _1868. => congestion; //TRINIDAD AND TOBAGO _1869. => congestion; //ST. KITTS AND NEVIS _1876. => congestion; //JAMAICA _1787. => congestion; //Puerto Rico 787, 939 $0.07 _1939. => congestion; //Puerto Rico 787, 939 $0.07 _1671. => congestion; //Guam 671 $0.08 _1340. => congestion; //U.S. Virgin Islands 340 $0.06 }; context fromfwdOUT-catchall { _X. => Congestion; h => Hangup ; //hangup event i => Hangup ; //invalid event t => Hangup ; //timeout event }; context ael-demo { s => { Wait(1); Answer(); TIMEOUT(digit)=5; TIMEOUT(response)=10; restart: Background(demo-congrats); instructions: for (x=0; ${x} < 3; x=${x} + 1) { Background(demo-instruct); WaitExten(); }; }; 2 => { Background(demo-moreinfo); goto s|instructions; }; 3 => { LANGUAGE()=fr; goto s|restart; }; 500 => { Playback(demo-abouttotry); Dial(IAX2/guest@misery.digium.com); Playback(demo-nogo); goto s|instructions; }; 600 => { Playback(demo-echotest); Echo(); Playback(demo-echodone); goto s|instructions; }; _1234 => &std-exten-ael(${EXTEN}, "IAX2"); # => { Playback(demo-thanks); Hangup(); }; t => jump #; i => Playback(invalid); };