Upgrade 3CX to v18 and get it hosted free!

Hunting groups for incoming calls

Author image

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


Article Reviews

Write a Review

Your email address will not be published. Required fields are marked *

Required Field. Minimum 5 characters.

Required Field. Minimum 5 characters, maximum 50.

Required field.There is an error with this field.

Required Field.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

There are no reviews for this article. Be the first one to write a review.
Get 3CX - Absolutely Free!
Link up your team and customers Phone System Live Chat Video Conferencing

Hosted or Self-managed. Up to 10 users free forever. No credit card. Try risk free.

3CX
A 3CX Account with that email already exists. You will be redirected to the Customer Portal to sign in or reset your password if you've forgotten it.