#!/usr/bin/php -q verbose ("${date_time}: ${line}"); } declare(ticks = 1); if (function_exists('pcntl_signal')) pcntl_signal(SIGHUP, SIG_IGN); error_reporting(E_ALL ^ (E_NOTICE | E_WARNING)); include (dirname(__FILE__)."/libs_a2billing/db_php_lib/Class.Table.php"); include (dirname(__FILE__)."/libs_a2billing/Class.A2Billing.php"); include (dirname(__FILE__)."/libs_a2billing/Class.RateEngine.php"); include (dirname(__FILE__)."/libs_a2billing/phpagi_2_14/phpagi.php"); include (dirname(__FILE__)."/libs_a2billing/phpagi_2_14/phpagi-asmanager.php"); $charge_callback=0; $G_startime = time(); $agi_date = "Release : 13 August 2006"; $agi_version = "1.2.3 (BrainCoral)"; /********** CREATE THE AGI INSTANCE + ANSWER THE CALL **********/ $agi = new AGI(); $idconfig = 1; $mode = 'standard'; $cardNum = $agi->request ["agi_accountcode"]; $mode = 'standard'; $agi->verbose('line:'.__LINE__.' - '."MODE : $mode \n"); $A2B = new A2Billing(); $A2B -> load_conf($agi, NULL, 0, $idconfig); $A2B -> CC_TESTING = isset($A2B->agiconfig['debugshell']) && $A2B->agiconfig['debugshell']; /* GET THE AGI PARAMETER */ $A2B -> get_agi_request_parameter ($agi); if (!$A2B -> DbConnect()){ $agi-> stream_file('prepaid-final', '#'); exit; } $instance_table = new Table(); $A2B -> set_instance_table ($instance_table); function SayMessagesCount ($agi, $oldOrNew, $count) { $agi->stream_file ("vm-youhave"); switch ($count) { case 0: $agi->stream_file ("vm-no"); $agi->stream_file ("vm-${oldOrNew}"); $agi->stream_file ("vm-messages"); break; case 1: $agi->say_number (1); $agi->stream_file ("vm-${oldOrNew}"); $agi->stream_file ("vm-message"); break; default: $agi->say_number ($count); $agi->stream_file ("vm-${oldOrNew}"); $agi->stream_file ("vm-messages"); break; } } function RecordFile ($agi, $directory, $recordIntro, $maxLen) { global $cardID; $recordIt = true; $ok = false; $errorCount = 0; while (!$ok) { if ($recordIt) { // Record the file $agi->stream_file ($recordIntro); $agi->record_file ("a2billing/voicemail/temp/" . $cardID, "gsm", "#", $maxLen * 1000, 0, true, 5); } // Ask the caller what to do with the recording $resDTMF = $agi->stream_file ("a2billing/voicemail/recording-review", "1238"); $input = $resDTMF ["result"]; if (($input == 0) || ($input == -1)) { // Nothing pressed, wait for 2 seconds $resDTMF = $agi->stream_file ("silence/2", "1238"); $input = $resDTMF ["result"]; } switch ($input) { case 49: // The caller pressed 1 // Accept the recording $ok = true; copy ("/var/lib/asterisk/sounds/a2billing/voicemail/temp/" . $cardID . ".gsm", "/var/lib/asterisk/sounds/a2billing/voicemail/" . $directory . "/" . $cardID . ".gsm"); break; case 50: // The caller pressed 2 // Hear the recording $recordIt = false; $agi->stream_file ("/var/lib/asterisk/sounds/a2billing/voicemail/temp/" . $cardID, "#"); break; case 51: // The caller pressed 3 // Record again $recordIt = true; break; case 56: // The caller pressed 8 // Exit without saving $ok = true; break; default: $errorCount++; if ($errorCount >= 3) return -1; $recordIt = false; } } // Remove the temporary file unlink ("/var/lib/asterisk/sounds/a2billing/voicemail/temp/" . $cardID . ".gsm"); return 0; } function MailboxOperations ($agi) { // Options for handling the mailbox $errorCount = 0; while (1) { // Ask the caller what to do with the recording $resDTMF = $agi->stream_file ("a2billing/voicemail/box-options", "12358"); $input = $resDTMF ["result"]; if (($input == 0) || ($input == -1)) { // Nothing pressed, wait for 2 seconds $resDTMF = $agi->stream_file ("silence/2", "12358"); $input = $resDTMF ["result"]; } switch ($input) { case 49: // The caller pressed 1 // Record the unavailable message RecordFile ($agi, "unavailable", "vm-rec-unv", 60); break; case 50: // The caller pressed 2 // Record the busy message RecordFile ($agi, "busy", "vm-rec-busy", 60); break; case 51: // The caller pressed 3 // Record the name RecordFile ($agi, "name", "vm-rec-name", 5); break; case 53: // The caller pressed 5 // Change the password $resDTMF = $agi->stream_file ("vm-newpassword", "#"); $newPassword1 = $resDTMF ["result"]; if ($newPassword1 . ";" == ";") break; $resDTMF = $agi->stream_file ("vm-reenterpassword", "#"); $newPassword2 = $resDTMF ["result"]; if ($newPassword2 . ";" == ";") break; if (substr ($newPassword1, -1) == '#') $newPassword1 = substr ($newPassword1, strlen ($newPassword1) - 1); if (substr ($newPassword2, -1) == '#') $newPassword2 = substr ($newPassword1, strlen ($newPassword1) - 1); if ($newPassword1 == $newPassword2) { // Passwords match, change the db $query = "UPDATE cc_card SET voicemail_password='" . $newPassword1 . "') WHERE (id=" . $cardID . ");"; $result = $A2B -> instance_table -> SQLExec ($A2B->DBHandle, $query); $agi->stream_file ("vm-passchanged"); } else { // Passwords do not match $agi->stream_file ("vm-mismatch"); } break; case 56: // The caller pressed 8 // Exit return 0; default: $errorCount++; if ($errorCount >= 3) return -1; } } } // Ask the caller to enter his password $ok = false; $errorCount = 0; while (!$ok) { $errorCount++; $resDTMF = $agi->get_data ("agent-pass", 5000, 5); $password = $resDTMF ["result"]; if ($password . ";" != ";") { if (substr ($password, -1) == '#') $password = substr ($password, strlen ($password) - 1); $query = "SELECT id,voicemail_active FROM cc_card WHERE ((voicemail_password='" . $password . "') AND (username='" . $cardNum . "'));"; $result = $A2B -> instance_table -> SQLExec ($A2B->DBHandle, $query); $ok = (is_array($result)); } if ($ok) { $cardID = $result[0][0]; $active = $result[0][1]; } else { $agi->stream_file ("vm-incorrect"); if ($errorCount >= 3) { $agi->stream_file ("vm-goodbye"); exit (); } } } if ($active == 0) { // Mailbox is not active $agi->stream_file ("a2billing/voicemail/mailbox_not_active"); exit (); } // Check how many new and heard messages the user has $query = "SELECT Count(Id) FROM cc_voicemail WHERE ((Heard=0) AND (Deleted=0) AND (CardNumber=". $cardID . "));"; $result = $A2B -> instance_table -> SQLExec ($A2B->DBHandle, $query); if (is_array ($result)) $newMessagesCount = $result[0][0]; else $newMessagesCount = 0; $query = "SELECT Count(Id) FROM cc_voicemail WHERE ((Heard=1) AND (Deleted=0) AND (CardNumber=". $cardID . "));"; $result = $A2B -> instance_table -> SQLExec ($A2B->DBHandle, $query); if (is_array ($result)) $oldMessagesCount = $result[0][0]; else $oldMessagesCount = 0; // Tell the caller how many messages he has if (($newMessagesCount == 0) && ($oldMessagesCount == 0)) { // No new or heard messages, exit the app $agi->stream_file ("vm-youhave"); $agi->stream_file ("vm-no"); $agi->stream_file ("vm-messages"); MailboxOperations ($agi); exit (1); } for ($loop = 0; $loop < 2; $loop++) { if (($loop == 0) && ($newMessagesCount == 0)) continue; if (($loop == 1) && ($oldMessagesCount == 0)) continue; $messagesCount = $loop == 0 ? $newMessagesCount : $oldMessagesCount; SayMessagesCount($agi, $loop == 0 ? "INBOX" : "Old", $messagesCount); $query = "SELECT Id,MessageFile,MessageDate,CallerID FROM cc_voicemail WHERE ((Heard=" . $loop . ") AND (Deleted=0) AND (CardNumber=". $cardID . "));"; $resultArray = $A2B -> instance_table -> SQLExec ($A2B->DBHandle, $query); for ($indx = 0; $indx < $messagesCount; $indx++) { $messageId = $resultArray [$indx][0]; $fileName = $resultArray [$indx][1]; $messageDateTime = $resultArray [$indx][2]; $callerID = $resultArray [$indx][3]; WriteLog ("Message ID is ${messageId}"); WriteLog ("File name is ${fileName}"); WriteLog ("Message date and time is ${messageDateTime}}"); WriteLog ("Caller ID is ${callerID}"); $year = substr($messageDateTime, 0, 4); $month = substr($messageDateTime, 5, 2); $day = substr($messageDateTime, 8, 2); $hour = substr($messageDateTime, 11, 2); $minute = substr($messageDateTime, 14, 2); $todayTS = strtotime (date ("Y-m-d") . " 00:00:00"); $messageTS = strtotime ($year . "-" . $month . "-" . $day . " 00:00:00"); $continueLoop = 0; // Say the date and time of the message $resDTMF = $agi->stream_file ("vm-received", "03456"); $input = $resDTMF ["result"]; if ($todayTS != $messageTS) { // The message was not recieved toady, say the date if (($todayTS - $messageTS) == 60 * 60 * 24) { // The message was recieved yesterday if (($input == "") || (!$input)) { $resDTMF = $agi->stream_file ("digits/yesterday", "03456"); $input = $resDTMF ["result"]; } } else { // Not yesterday if (($input == "") || (!$input)) { $resDTMF = $agi->stream_file ("digits/mon-" . $month, "03456"); $input = $resDTMF ["result"]; } if (($input == "") || (!$input)) { $resDTMF = $agi->say_number ($day, "03456"); $input = $resDTMF ["result"]; } } } // Say the hour if (($input == "") || (!$input)) { $resDTMF = $agi->stream_file ("letters/at", "03456"); $input = $resDTMF ["result"]; } if (($input == "") || (!$input)) { $resDTMF = $agi->say_number ($hour, "03456"); $input = $resDTMF ["result"]; } if (($input == "") || (!$input)) { if (($minute + 0) >= 10) $resDTMF = $agi->say_number ($minute, "03456"); else $resDTMF = $agi->say_digits ($minute, "03456"); $input = $resDTMF ["result"]; } if ($input) { // The caller pressed something when the hour was said, check it out $continueLoop = 1; switch ($input) { case 51: // The caller pressed 3 // Mailbox operations MailboxOperations ($agi); $indx--; break; case 52: // The caller pressed 4 // Hear the next message break; case 52: // The caller pressed 5 // Hear the message again $indx--; $continueLoop = 1; case 54: // The caller pressed 6 // Hear the previous message $indx -= 2; break; case 48: // The caller pressed 0 // Delete the message $query = "UPDATE cc_voicemail SET Deleted=1 WHERE (Id=" . $messageId . ");"; $result = $A2B -> instance_table -> SQLExec ($A2B->DBHandle, $query, 0); $agi->stream_file ("vm-deleted"); break; default: $continueLoop = 0; break; } } if ($continueLoop == 1) continue; // Say the caller ID if (($callerID) && ($callerID != "")) { WriteLog ("Playing vm-from-phonenumber"); $resDTMF = $agi->stream_file ("vm-from-phonenumber", "03456"); $input = $resDTMF ["result"]; if (($input == "") || (!$input)) { WriteLog ("Saying digits"); $resDTMF = $agi->say_digits ($callerID, "03456"); $input = $resDTMF ["result"]; } WriteLog ("Caller ID finished"); } if ($input) { // The caller pressed something when the hour was said, check it out $continueLoop = 1; switch ($input) { case 51: // The caller pressed 3 // Mailbox operations MailboxOperations ($agi); $indx--; break; case 52: // The caller pressed 4 // Hear the next message break; case 52: // The caller pressed 5 // Hear the message again $indx--; $continueLoop = 1; case 54: // The caller pressed 6 // Hear the previous message $indx -= 2; break; case 48: // The caller pressed 0 // Delete the message $query = "UPDATE cc_voicemail SET Deleted=1 WHERE (Id=" . $messageId . ");"; $result = $A2B -> instance_table -> SQLExec ($A2B->DBHandle, $query, 0); $agi->stream_file ("vm-deleted"); break; default: $continueLoop = 0; break; } } if ($continueLoop == 1) continue; // Play the message $resDTMF = $agi->stream_file ($fileName, "03456"); $input = $resDTMF ["result"]; if ($loop == 0) { $query = "UPDATE cc_voicemail SET Heard=1 WHERE (Id=" . $messageId . ");"; $result = $A2B -> instance_table -> SQLExec ($A2B->DBHandle, $query, 0); } if (($input == "") || (!$input)) { $resDTMF = $agi->stream_file ("a2billing/voicemail/hear_messages_menu", "03456"); $input = $resDTMF ["result"]; } switch ($input) { case 51: // The caller pressed 3 // Mailbox operations MailboxOperations ($agi); $indx--; break; case 52: // The caller pressed 4 // Hear the next message break; case 52: // The caller pressed 5 // Hear the message again $indx--; $continueLoop = 1; case 54: // The caller pressed 6 // Hear the previous message $indx -= 2; break; case 48: // The caller pressed 0 // Delete the message $query = "UPDATE cc_voicemail SET Deleted=1 WHERE (Id=" . $messageId . ");"; $result = $A2B -> instance_table -> SQLExec ($A2B->DBHandle, $query, 0); $agi->stream_file ("vm-deleted"); break; } } } // No more messages - finish $agi->stream_file ("vm-nomore"); MailboxOperations ($agi); ?>