Refactored some of the code.

git-svn-id: svn://192.168.202.10@350 3d104415-ff17-0410-8863-d5cf3c621b8a
This commit is contained in:
jaywhy
2006-10-11 21:34:33 +00:00
parent fd347d4ab8
commit 7b452f905b
5 changed files with 277 additions and 143 deletions
+28 -127
View File
@@ -1,11 +1,13 @@
package Astguiclient::AGI;
use strict;
use Asterisk::AGI;
use Time::HiRes qw( gettimeofday tv_interval usleep );
use base qw/Astguiclient Class::Accessor::Fast/;
__PACKAGE__->mk_accessors( qw/ agi input / );
use Asterisk::AGI;
use Astguiclient::AGI::CallLog;
use Astguiclient::AGI::Transfer;
__PACKAGE__->mk_accessors( qw/ agi method path params / );
=head1 NAME
@@ -28,151 +30,50 @@ sub new {
return $self;
}
=head2 call_log
=head2 input
=cut
sub call_log {
sub input {
my $self = shift;
my $dbh = $self->dbi;
if( $self->agi->{'extension'} =~ /h/i ) {
$dbh->do("UPDATE call_log SET end_time = NOW() WHERE uniqueid = ?", undef, $self->input->{'uniqueid'});
} else {
my $i = $self->input;
$dbh->do("INSERT INTO call_log
SET uniqueid = ?, channel = ?, type = ?, server_ip = ?,
extension = ?, start_time = now(), end_time = ?"
undef,
$i->{'uniqueid'},$i->{'channel'},$i->{type},
$self->config->file->{'Server'}{'Server_ip'},$i->{'extension'}
);
}
}
=head2 vdad_transfer
Runs when a call comes in from the VICIDIAL_auto_dialer. This script will
Send the calls out to the reps that are logged in.
0 Channel is down and available
1 Channel is down, but reserved
2 Channel is off hook
3 Digits (or equivalent) have been dialed
4 Line is ringing
5 Remote end is ringing
6 Line is up
7 Line is busy
=cut
#NOTE: This function isn't nearly complete.
# Where else is this log functionality?
# Is there other transfer or voicemail calls?
sub vdad_transfer {
my $self = shift;
# Caller id houses the leadid and campaignid, sent by place_call()
my($lead_id, $campaign_id) = split(/:/, $self->input->{callerid});
my $campaign = $self->campaign->find( id => $campaign_id );
# When a call is answered, this timer begins.
my $drop_start_timer;
# Time for the start of the loop
my $start_timer = [gettimeofday];
# Amount of time you should wait for answer before hanging up(how many rings essentially)
my $call_wait_time = '30';
TRANSFER: while( tv_interval( $start_timer, [gettimeofday] ) > $call_wait_time ) {
my $status = $self->agi->check_status();
# Line is down or busy.
if( ( $status < 3 ) ||
( $status == 7 ) ) {
last TRANSFER;
} elsif( $status == 6 ) { # Line is answered
$drop_start_timer = [gettimeofday];
}
$self->_transfer_to_agent( $campaign );
if( not defined $self->{input} ) {
$self->{input} = $self->agi->ReadParse();
if( tv_interval( $drop_start_timer, [gettimeofday] ) ) {
$self->_send_to_voicemail( $campaign );
last;
}
usleep(1*990*1000);
}
#XXX $self->_log_call( $call_status );
return $self->{input}
}
sub _log_call {
my($self, $call_status) = @_;
#XXX
# if( lc($call_status) eq 'drop' ) {
# $self->dbh->do("DELETE FROM vicidial_auto_calls where callerid = ?", undef, $callerid);
# }
# $self->dbh->do("UPDATE vicidial_log set status = ?,end_time = NOW() WHERE uniqueid = ?", undef, $status, $unique_id);
# $self->dbh->do("UPDATE vicidial_list set status='DROP' where lead_id = '$CIDlead_id'");
}
=head2 _send_to_voicemail
Transfer a call to voicemail of the campaign.
=head2 _parse_request
=cut
sub _send_to_voicemail {
my( $self, $campaign ) = @_;
sub _parse_request {
my $self = shift;
my($method, $path) = $self->{input}{'request'} =~ m/\/(\w+)\?*([^\.]*)$/;
$self->_transfer( $campaign->{voicemail_ext} );
my %params;
my(@pairs) = split(/[&;]/,$path);
foreach (@pairs) {
my($p,$v) = split('=',$_,2);
$params{$p} = $v;
}
$self->params( \%params );
$self->method( $method );
$self->path( $path );
}
=head2 _transfer
Transfers a call.
=head2 param
=cut
sub _transfer {
my( $self, $ext ) = @_;
$self->agi->set_context( 'default' );
$self->agi->set_extension( $ext );
sub param {
my($self, $param) = @_;
return $self->params->{$param};
}
=head2 _transfer_to_agent
Transfer the call to an available agent.
=cut
sub _transfer_to_agent {
my( $self, $campaign ) = @_;
my($conf_exten, $user, $extension) = $self->dbi->selectrow_arary("
SELECT conf_exten,extension FROM vicidial_live_agents
WHERE status = 'QUEUE' and server_ip = ? and campaign_id = ?
ORDER BY last_call_time limit 1",
undef,
Astguiclient->config->file->{'Server_ip'}, $campaign->{campaign_id},
);
$self->_transfer( $extension );
#XXX$self->dbh->do("UPDATE vicidial_auto_calls set status='XFER' WHERE callerid = ?", undef, $callerid);
}
=head1 AUTHOR
Jason Yates <jaywhy@gmail.com>
@@ -0,0 +1,62 @@
package Astguiclient::AGI;
use strict;
=head1 NAME
Astguiclient::AGI::CallLog - Handles FastAGI call logging.
=head1 DESCRIPTION
The module handles FastAGI call logging. The module acts sort of like
a plugin by exporting mixins.
=head2 call_log
=cut
sub call_log {
my $self = shift;
my $dbh = $self->dbi;
if( $self->agi->{'extension'} =~ /h/i ) {
$dbh->do("UPDATE call_log SET end_time = NOW() WHERE uniqueid = ?", undef, $self->input->{'uniqueid'});
} else {
my $i = $self->input;
$dbh->do("INSERT INTO call_log
SET uniqueid = ?, channel = ?, type = ?, server_ip = ?,
extension = ?, start_time = now(), end_time = ?",
undef,
$i->{'uniqueid'},$i->{'channel'},$i->{type},
$self->config->file->{'Server'}{'Server_ip'},$i->{'extension'}
);
}
}
=head1 AUTHOR
Jason Yates <jaywhy@gmail.com>
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2006 Matt Florell <vicidial@gmail.com>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
=cut
1;
@@ -0,0 +1,161 @@
package Astguiclient::AGI;
use strict;
use Time::HiRes qw( gettimeofday tv_interval usleep );
=head1 NAME
Astguiclient::AGI - Module used for AGI scripts.
=head1 DESCRIPTION
The module handles transfering calls. The module acts sort of like
a plugin by exporting mixins.
=head2 vdad_transfer
Runs when a call comes in from the VICIDIAL_auto_dialer. This script will
Send the calls out to the reps that are logged in.
0 Channel is down and available
1 Channel is down, but reserved
2 Channel is off hook
3 Digits (or equivalent) have been dialed
4 Line is ringing
5 Remote end is ringing
6 Line is up
7 Line is busy
=cut
#NOTE: This function isn't nearly complete.
# Where else is this log functionality?
# Is there other transfer or voicemail calls?
sub vdad_transfer {
my $self = shift;
# Caller id houses the leadid and campaignid, sent by place_call()
my($lead_id, $campaign_id) = split(/:/, $self->input->{callerid});
my $campaign = $self->campaign->find( id => $campaign_id );
# When a call is answered, this timer begins.
my $drop_start_timer;
# Time for the start of the loop
my $start_timer = [gettimeofday];
# Amount of time you should wait for answer before hanging up(how many rings essentially)
my $call_wait_time = '30';
TRANSFER: while( tv_interval( $start_timer, [gettimeofday] ) > $call_wait_time ) {
my $status = $self->agi->check_status();
# Line is down or busy.
if( ( $status < 3 ) ||
( $status == 7 ) ) {
last TRANSFER;
} elsif( $status == 6 ) { # Line is answered
$drop_start_timer = [gettimeofday];
}
$self->_transfer_to_agent( $campaign );
if( tv_interval( $drop_start_timer, [gettimeofday] ) ) {
$self->_send_to_voicemail( $campaign );
last;
}
usleep(1*990*1000);
}
#XXX $self->_log_call( $call_status );
}
sub _log_call {
my($self, $call_status) = @_;
#XXX
# if( lc($call_status) eq 'drop' ) {
# $self->dbh->do("DELETE FROM vicidial_auto_calls where callerid = ?", undef, $callerid);
# }
# $self->dbh->do("UPDATE vicidial_log set status = ?,end_time = NOW() WHERE uniqueid = ?", undef, $status, $unique_id);
# $self->dbh->do("UPDATE vicidial_list set status='DROP' where lead_id = '$CIDlead_id'");
}
=head2 _send_to_voicemail
Transfer a call to voicemail of the campaign.
=cut
sub _send_to_voicemail {
my( $self, $campaign ) = @_;
$self->_transfer( $campaign->{voicemail_ext} );
}
=head2 _transfer
Transfers a call.
=cut
sub _transfer {
my( $self, $ext ) = @_;
$self->agi->set_context( 'default' );
$self->agi->set_extension( $ext );
}
=head2 _transfer_to_agent
Transfer the call to an available agent.
=cut
sub _transfer_to_agent {
my( $self, $campaign ) = @_;
my($conf_exten, $user, $extension) = $self->dbi->selectrow_arary("
SELECT conf_exten,extension FROM vicidial_live_agents
WHERE status = 'QUEUE' and server_ip = ? and campaign_id = ?
ORDER BY last_call_time limit 1",
undef,
Astguiclient->config->file->{'Server_ip'}, $campaign->{campaign_id},
);
$self->_transfer( $extension );
#XXX$self->dbh->do("UPDATE vicidial_auto_calls set status='XFER' WHERE callerid = ?", undef, $callerid);
}
=head1 AUTHOR
Jason Yates <jaywhy@gmail.com>
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2006 Matt Florell <vicidial@gmail.com>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
=cut
1;
@@ -22,26 +22,35 @@ This will process the agi request from asterisk.
sub process_request {
my $self = shift;
my $agc = $self->{server}{agc};
my %input = $agc->agi->ReadParse;
use Data::Dumper;
print STDERR Dumper(\%input);
my($method, $path) = $input{'request'} =~ m/\/(\w+)\?*([^\.]*)$/;
my %params;
my(@pairs) = split(/[&;]/,$path);
foreach (@pairs) {
my($p,$v) = split('=',$_,2);
$params{$p} = $v;
}
$agc->input( \%params );
if( $agc->can( $method ) ) {
$self->_parse_request();
$self->_handle_request();
}
=head2 _handle_request
=cut
sub _handle_request {
my $self = shift;
my $agc = $self->agc;
if( $agc->can( $agc->method ) ) {
my $method = $agc->method;
$agc->$method();
} else { # Can't find that method.
$agc->agi->execute( 'NOOP' ); #NOTE is this the right thing todo?
}
}
}
=head2 agc
=cut
sub agc {
my $self = shift;
return $self->{server}{agc};
}
=head2 child_init_hook
+2 -1
View File
@@ -1,7 +1,8 @@
#!/usr/bin/perl -w
use strict;
use Test::More tests => 2;
use Test::More tests => 3;
use_ok("Astguiclient");
use_ok("Astguiclient::Daemon::AGI");
use_ok("Astguiclient::AGI");