Scripts (версия 3.xx)/Приём SMS
eval (GetFileContent ('Common\\Classes\\Script.js')); // необходимо для работоспособности сценария var Script = new Script (); // необходимо для работоспособности сценария
// =================== Подключение модулей =================== eval (Script.GetFileContent ('Common\\Classes\\Database.js')); // База данных eval (Script.GetFileContent ('Common\\Classes\\Time.js')); // Расписание eval (Script.GetFileContent ('Common\\Classes\\SMS.js')); // Работа с сообщениями eval (Script.GetFileContent ('Common\\Classes\\Device.js')); // Устройство eval (Script.GetFileContent ('Common\\Classes\\DataSearch.js')); // Поиск данных
// локальные модули для конкретного решения eval (Script.GetFileContent ('Solutions\\Basic\\ReceiveSMS\\Info.js')); // Информация и статистика eval (Script.GetFileContent ('Solutions\\Basic\\ReceiveSMS\\CAnswerMode.js')); eval (Script.GetFileContent ('Solutions\\Basic\\ReceiveSMS\\CDataWriteSMS.js')); // Запись данных
// =================== Начало работы сценария ===================
Script.InLogInfo ('Старт');
try {
var Info = new CInfo (); var Device = new CDevice ();
if (Device.Open ()) {
var Time = new CTime ();
if (!Time.CheckTime ()) Device.Wait (1000); // Ждём наступления времени обзвона
while (Time.CheckTime ()) { // Выполняем, пока совпадает время обзвона
var AnswerMode = new CAnswerMode ();
AnswerMode.Purge (); // Проверка на необходимость удаления имеющихся сообщений
var Database = new CDatabase ();
if (Database.Open ()) {
while (!Script.IsStop ()) { // Основной цикл ожидания входящих SMS
Script.WaitPause (); // Ожидание, если нажали на Паузу
var SMSList = Device.SMSList ();
if (SMSList.length) {
Script.InLogInfo ('Количество входящих SMS сообщений: ' + SMSList.length);
for (var i in SMSList) {
if (Script.IsStop ()) break;
try {
var Phone = SMSList[i].Phone;
if (Phone) Script.InLogInfo ('Входящее сообщение от %s поступило', Phone); else Script.InLogInfo ('Входящее сообщение поступило');
var SMS; var OutText = (SMSList[i].Text + ).replace(/'/g, ""); // Экранируем одинарные кавычки
var DataSearchSMS = new CDataSearch ();
if (AnswerMode.IsAnswer ()) { // Ответное сообщение требуется
if (AnswerMode.IsSearch ()) { // Есть поиск в БД
var Record = DataSearchSMS.GetRecord (Database, Phone);
if (Record.Fetch () && Phone) { // Нашли телефон в БД
SMS = Script.GetConfig ('SMS', 'Found'); OutText = Record.GetExpressionValue (SMS.Text); Info.Ok++; // добавляем найденный телефон в статистику } else { // НЕ нашли
SMS = Script.GetConfig ('SMS', 'NotFound'); OutText = Record.GetExpressionValue (SMS.Text); Info.Fail++; // добавляем неизвестный телефон в статистику }
Record.Close (); } else { // Общее сообщение без поиска в БД SMS = Script.GetConfig ('SMS', 'ForAll'); } }
OutText = Script.GetExpressionValue (OutText, {'intext': OutText, 'inphone': Phone});
Info.All++; // Увеличиваем счетчик принятых звонков в статистике Info.Update (DataSearchSMS.IsSearch ()); // Показываем статистику
if (AnswerMode.IsRecord ()) { // Если запись
DataWrite = new CDataWriteSMS ();
var Query = Script.GetExpressionValue (DataWrite.Query (), {'ColumnSMS': OutText, 'ColumnPhone': Phone, 'intext': OutText, 'inphone': Phone});
try {
Script.InLogInfo ('Сохранение входящего SMS'); Database.Query (Query); Script.InLogInfo ('Сохранение входящего SMS завершено'); } catch (Err) { Script.InLogError ('Ошибка в SQL запросе для записи входящего SMS: %s. %s. Код ошибки: %s', Query, Err.description, Err.number); Script.StopError (); } }
if (AnswerMode.IsAnswer ()) { // Если требуется ответ
if (Script.IsStop ()) break;
try {
if (/^[\+0-9]+$/.test (Phone)) {
Script.InLogInfo ('Отправка ответного сообщения %s по номеру %s', OutText, Phone);
var ResultSend = Device.SendSMS (SMSList[i].Phone, OutText, SMS.Sender);
switch (ResultSend) { case 0: Script.InLogInfo ('Ответное сообщение отправлено успешно'); break; case 4: Script.InLogError ('Отправка ответного сообщения прервана пользователем'); break; case 5: Script.InLogError ('Время ожидания отправки ответного сообщения истекло'); break; default: Script.InLogError ('Неизвестная ошибка отправки ответного сообщения: ' + ResultSend); break; } } else { Script.InLogError ('Номер телефона %s не цифровой. Ответное сообщене не отправлено.', Phone); }
} catch (Err) { Script.InLogError ('Ошибка отправки ответного SMS: ' + Err.description); } }
Script.InLogInfo ('Удаление входящего SMS (Id = %s)', SMSList[i].Id);
Device.DeleteSMS (SMSList[i].Id);
Script.InLogInfo ('Удаление входящего SMS (Id = %s) завершено', SMSList[i].Id);
Script.InLogInfo ('Входящее SMS № %s обработано', Info.All); } catch (Err) { Script.InLogError ('Ошибка обработки входящего сообщения. %s. Код ошибки: %s', Err.description, Err.number); if (Script.StopError ()) break; } } }
Script.InLogInfo ('Поступившие SMS обработаны');
Script.InLogInfo ('Ожидание входящего сообщения...');
switch (Device.WaitForSMS (Time.TimeOut ())) { // Ждем входящего СМС заданное время
case 0: // СМС поступило break;
default: Script.Stop (); } } }
Database.Close ();
if (Script.IsStop ()) break; }
Device.Close (); }
Script.InLogInfo ('Стоп');
} catch (Err) {
Script.InLogError ('Ошибка при работe сценария. %s. Код ошибки: %s', Err.description, Err.number); if (Database) Database.Close (); if (Device ) Device.Close ();
}