--- astcc.agi 2004-07-14 05:22:27.000000000 +0200 +++ astcc.agi.new 2004-07-23 00:01:35.000000000 +0200 @@ -5,11 +5,31 @@ # Copyright (C) 2004, Digium, Inc. # # Mark Spencer # # This program is Free Software and is distributed under the # terms of the GNU General Public License version 2 or later # at your option. # +# +# Usage-example: +# +# ; +# ; Card-number and number to dial derived from command-line. +# ; Call script with the card-number as first arg and the number +# ; to dial as the second arg. +# ; +# exten => _00XXXXXXXXX,1,DeadAGI(astcc.agi,${CALLERIDNUM},${EXTEN}) +# exten => _00XXXXXXXXX,2,Hangup +# +# ; +# ; Prompt the caller for the card-number and the number to dial. +# ; +# exten => 1234,1,Answer +# exten => 1234,2,DeadAGI(astcc.agi) +# exten => 1234,3,Hangup +# + use DBI; use Asterisk::AGI; @@ -38,6 +58,8 @@ my ($cardinfo) = @_; $dbh->do("UPDATE cards SET used=" . $dbh->quote($cardinfo->{used}) . " WHERE number=" . $dbh->quote($cardinfo->{number})); + $dbh->do("UPDATE cards SET inuse=" . $dbh->quote($cardinfo->{inuse}) . " WHERE number=" . + $dbh->quote($cardinfo->{number})); } sub getcard() { @@ -151,7 +173,7 @@ sub saycost() { my ($carddata, $numdata, $credit) = @_; - my $incsecs, $incmins; + my ($incsecs, $incmins); $adjcost = ($numdata->{cost} * (10000 + $carddata->{markup})) / 10000; $adjconn = ($numdata->{connectcost} * (10000 + $carddata->{markup})) / 10000; # print STDERR "Adjusted cost is $adjcost with $adjconn fee\n"; @@ -228,6 +250,13 @@ $dialstatus = $AGI->get_variable("DIALSTATUS"); return $dialstatus; } + if ($res->{tech} eq "Zap") { + $dialstr = "Zap/$res->{path}/$phone|30|HL(" . ($maxtime * 60 * 1000) . ":60000:30000)"; + $res = $AGI->exec("DIAL $dialstr"); + $answeredtime = $AGI->get_variable("ANSWEREDTIME"); + $dialstatus = $AGI->get_variable("DIALSTATUS"); + return $dialstatus; + } return "CHANUNAVAIL"; } @@ -244,9 +273,33 @@ } +sub checkinuse() { + my ($cardno) = @_; + my $carddata = &getcard($cardno); + if ($carddata->{inuse}) { + $AGI->stream_file("your"); + $AGI->stream_file("card-number"); + $AGI->stream_file("is-in-use"); + $AGI->stream_file("please-try-again"); + $AGI->stream_file("later"); + $AGI->stream_file("vm-goodbye"); + exit(0); + } +return; +} + +sub setinuse() { + my ($cardno, $inuse) = @_; + my $carddata = &getcard($cardno); + $carddata->{inuse} = $inuse; + &savedata($carddata); + return; +} + # # Answer the line right away # +my ($calleridnum, $phoneno) = @ARGV; $AGI->answer(); # # Play a nice tone @@ -264,14 +317,32 @@ exit(0) if $res < 0; my $cardno; my $callerid = $input{callerid}; -while(!$carddata->{number}) { - $tries++; - print STDERR "Pre-res is \"$res\"\n"; - if (length($res) > 0) { - $cardno = $AGI->get_data("astcc-silence"); - } else { - $cardno = $AGI->get_data("astcc-accountnum"); +if (!$calleridnum && !$phoneno) { + while(!$carddata->{number}) { + $tries++; + print STDERR "Pre-res is \"$res\"\n"; + if (length($res) > 0) { + $cardno = $AGI->get_data("astcc-silence"); + } else { + $cardno = $AGI->get_data("astcc-accountnum"); + } + exit if $cardno < 0; + $cardno = $res . $cardno; + print STDERR "Card no is $cardno\n"; + exit(0) if $cardno < 0; + $carddata = &getcard($cardno); + if (!$carddata->{number}) { + $res = &mystreamfile("astcc-badaccount"); + exit(0) if $res < 0; + if ($tries > 2) { + $AGI->stream_file("vm-goodbye"); + exit(0); + } + } } +} +else { + $cardno = $calleridnum; exit if $cardno < 0; $cardno = $res . $cardno; print STDERR "Card no is $cardno\n"; @@ -279,45 +350,78 @@ $carddata = &getcard($cardno); if (!$carddata->{number}) { $res = &mystreamfile("astcc-badaccount"); - exit(0) if $res < 0; - if ($tries > 2) { - $AGI->stream_file("vm-goodbye"); - exit(0); - } + $AGI->stream_file("vm-goodbye"); + exit(0); } } + # # At this point we have a valid card number. # +&checkinuse($carddata->{number}); +&setinuse($carddata->{number}, 1); + $res = &tell_time($carddata); if ($credit < 1) { - $AGI->streamfile("vm-goodbye"); + $AGI->stream_file("vm-goodbye"); + &setinuse($carddata->{number}, 0); + exit(0); +} + +if ($res < 0) { + &setinuse($carddata->{number}, 0); exit(0); } -exit(0) if $res < 0; $tries = 0; -while(!$numdata->{pattern}) { - $tries++; - print STDERR "Pre-res is \"$res\"\n"; - if (length($res) > 0) { - $phoneno = $AGI->get_data("astcc-silence"); - } else { - $phoneno = $AGI->get_data("astcc-phonenum"); +if (!$phoneno) { + while(!$numdata->{pattern}) { + $tries++; + print STDERR "Pre-res is \"$res\"\n"; + if (length($res) > 0) { + $phoneno = $AGI->get_data("astcc-silence"); + } else { + $phoneno = $AGI->get_data("astcc-phonenum"); + } + + if ($phoneno < 0) { + &setinuse($carddata->{number}, 0); + exit; + } + + $phoneno = $res . $phoneno; + print STDERR "Phone number is $phoneno\n"; + if ($phoneno < 0) { + &setinuse($carddata->{number}, 0); + exit(0); + } + $numdata = &getphone($phoneno); + if (!$numdata->{pattern}) { + $res = &mystreamfile("astcc-badphone"); + if ($res < 0) { + &setinuse($carddata->{number}, 0); + exit(0); + } + if ($tries > 2) { + $AGI->stream_file("vm-goodbye"); + &setinuse($carddata->{number}, 0); + exit(0); + } + } + } +} +else { + if ($phoneno < 0) { + &setinuse($carddata->{number}, 0); + exit(0); } - exit if $phoneno < 0; - $phoneno = $res . $phoneno; - print STDERR "Phone number is $phoneno\n"; - exit(0) if $phoneno < 0; $numdata = &getphone($phoneno); if (!$numdata->{pattern}) { $res = &mystreamfile("astcc-badphone"); - exit(0) if $res < 0; - if ($tries > 2) { - $AGI->stream_file("vm-goodbye"); - exit(0); - } + $AGI->stream_file("vm-goodbye"); + &setinuse($carddata->{number}, 0); + exit(0); } } @@ -330,17 +434,29 @@ if (($adjconn > $credit) || (($adjconn < 1) && ($adjcost > $credit))){ $res = &mystreamfile("astcc-notenough"); $AGI->stream_file("vm-goodbye") if (!$res); + &setinuse($carddata->{number}, 0); exit(0); } -$res = &mystreamfile("astcc-pleasewait"); -exit(0) if $res < 0; $maxmins = int(($credit - $adjconn) / $adjcost); +if ($maxmins <= 0.1) { + $res = &mystreamfile("astcc-notenough"); + $AGI->stream_file("vm-goodbye") if (!$res); + &setinuse($carddata->{number}, 0); + exit(0); +} + +$res = &mystreamfile("astcc-pleasewait"); + +if ($res < 0) { + &setinuse($carddata->{number}, 0); + exit(0); +} my @trunks = split(/:/, $numdata->{trunks}); foreach $trunk (@trunks) { - $res = &trytrunk($trunk, $phoneno); + $res = &trytrunk($trunk, $phoneno, $maxmins); if (!($res eq "CHANUNAVAIL") && !($res eq "CONGESTION")) { # Ooh, something actually happend! if ($res eq "BUSY") { @@ -359,10 +475,11 @@ &savecdr($cardno, $callerid, $phoneno, $trunk, $res, $answeredtime, $cost); &savedata($carddata); } + &setinuse($carddata->{number}, 0); exit(0); } } $res = &mystreamfile("astcc-unavail"); &savecdr($cardno, $callerid, $phoneno, $trunk, $res, 0, 0); +&setinuse($carddata->{number}, 0); exit(0); -