Hunting groups for incoming calls
This applicaton redirects incoming calls to one extensions in the “hunting group”.
If there are three registered users in the hunting group and there is an incoming call, the first call is redirected to 501, the second to 502 and the third to 503. The next incoming call is redirected to 501 and the next to 502…
There are three defined extension:
- 100 – redirects all incoming calls to one of the extension in the hunting group.
- 108 – adds callers extension to the hunting group (at the end)
- 109 – removes callers extension from the hunting group
extensions.conf
;get the next available extension from hunting group 100 (command g)
exten => 100,n,agi,hunting.php|100|g
exten => 100,n,dial,SIP/${HUNTEXTEN}
exten => 100,n,hangup
;add current extension from hunting group (command a)
exten => 108,1,answer
exten => 108,n,set,HUNTGROUP=100
exten => 108,n,agi,hunting.php|${HUNTGROUP}|a|${CALLERID(num)}
exten => 108,n,playback,hunting-add
exten => 108,n,playback,hunting-yourextension
exten => 108,n,playback,hunting-togroup
exten => 108,n,saydigits,${HUNTGROUP}
exten => 108,n,hangup
;remove current extension from hunting group (command r)
exten => 109,1,answer
exten => 109,n,set,HUNTGROUP=100
exten => 109,n,agi,hunting.php|${HUNTGROUP}|r|${CALLERID(num)}
exten => 109,n,playback,hunting-remove
exten => 109,n,playback,hunting-yourextension
exten => 109,n,playback,hunting-fromgroup
exten => 109,n,saydigits,${HUNTGROUP}
exten => 109,n,hangup
;add given extension from hunting group (command a)
exten => 208,1,answer
exten => 208,n,set,HUNTGROUP=100
exten => 208,n,set,HUNTEXTEN=120
exten => 208,n,agi,hunting.php|${HUNTGROUP}|a|${HUNTEXTEN}
exten => 208,n,playback,hunting-add
exten => 208,n,saydigits,${HUNTEXTEN}
exten => 208,n,playback,hunting-togroup
exten => 208,n,saydigits,${HUNTGROUP}
exten => 208,n,hangup
;remove given extension from hunting group (command r)
exten => 209,1,answer
exten => 209,n,set,HUNTGROUP=100
exten => 209,n,set,HUNTEXTEN=120
exten => 209,n,agi,hunting.php|${HUNTGROUP}|r|${HUNTEXTEN}
exten => 209,n,playback,hunting-remove
exten => 209,n,saydigits,${HUNTEXTEN}
exten => 209,n,playback,hunting-fromgroup
exten => 209,n,saydigits,${HUNTGROUP}
exten => 209,n,hangup
hunting.php
#!/usr/bin/php -q
<?php
//hunting groups for asterisk
//copyright (c) 2007 felix simmet
function loadgroup($group) {
$filename="$huntingfilename$group"; //build filename
if(file_exists($filename)) { //make sure file exists
$filehandler=fopen($filename,"r"); //open file for read
while(!feof($filehandler)) { //read while not end of file
$line=fgets($filehandler); //read line
$line=trim($line); //remove trailing spaces & CR & LF
if($line!="") { //if line is not empty
$extensions[]=$line; //add extension
}
}
fclose($filehandler); //close file
}
}
function savegroup($group) {
$filename="$huntingfilename$group"; //build filename
$filehandler=fopen($filename,"w"); //open file for write
foreach($extensions as $key => $value) { //work with every item
if($value!="") { //if value is not empty
fwrite($filehandler,$value . "\n"); //write extension + CR
}
}
fclose($filehandler); //close file
}
function addextension($extension) {
if(!in_array($extension,$extensions)) { //extension is not in extensions-list
$extensions[]=$extension; //add to extensions list
return true; //quit function and return true
} else { //not in list ->
return false; //quit function and return false
}
}
function removeextension($extension) {
$key=array_search($extension,$extensions);
if($key!==false) { //extension was found
$extensions[$key]=""; //remove extensions (set empty)
} else { //extension not found
return false;
}
}
function getnextextension() {
$nextextension=$extensions[0]; //get first extension
array_shift($extensions); //remove first extension
$extensions[]=$nextextension; //add extension at the end
return $nextextension; //returns next extension
}
# --- settings
#the filename where the extensions are stored (group number will be added at the end of the filename)
$huntingfilename="/tmp/huntinggroup-";
# --- internal variables
$extensions=array();
# --- set some php parameters for agi interface
ob_implicit_flush(false);
set_time_limit(30);
error_reporting(0);
# --- open stdin & stdout for agi communications
$stdin=fopen("php://stdin", "r");
$stdout=fopen("php://stdout", "w");
# --- get agi variables
while(!feof($stdin)) {
$temp=fgets($stdin);
$temp=str_replace("\n","",$temp);
$s=explode(":",$temp);
$agivar[$s[0]]=trim($s[1]);
if(($temp=="") || ($temp=="\n"))
{
break;
}
}
# --- get variables from asterisk
$group=$argv[1];
$command=$argv[2];
$extension=$argv[3];
if(($group!="") && ($command!="")) { //enough arguments???
loadgroup($group); //load current group settings
if($command=="g") { //get next extension -> put to variable HUNTEXT
$huntext=getnextextension();
fwrite($stdout,"SET VARIABLE HUNTEXTEN $huntext\n"); //write agi command
}
if(($extension!="")) { //enough arguments???
if($command=="a") { //add given extension
addextension($extension);
}
if($command=="r") { //remove given extension
removeextension($extension);
}
}
savegroup($group); //save group settings
}
# --- close all files
fclose($stdin);
fclose($stdout);
exit;
?>
create-voice.sh
#!/bin/sh
echo "Adding" | text2wave -F 8000 > /var/lib/asterisk/sounds/hunting-add.wav
echo "Removing" | text2wave -F 8000 > /var/lib/asterisk/sounds/hunting-remove.wav
echo "your extension" | text2wave -F 8000 > /var/lib/asterisk/sounds/hunting-yourextension.wav
echo "to hunting group" | text2wave -F 8000 > /var/lib/asterisk/sounds/hunting-togroup.wav
echo "from hunting group" | text2wave -F 8000 > /var/lib/asterisk/sounds/hunting-fromgroup.wav
exit 0