Scripts (версия 3.xx)/Приём SMS: различия между версиями
McBurns (обсуждение | вклад) (Новая страница: « Category:Помощь (версия 3.xx)») |
McBurns (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
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 ('Отправка ответного сообщения <i>%s</i> по номеру %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 (); | |||
} |
Версия 09:28, 18 октября 2013
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 ();
}