Scripts (версия 3.xx)/Приём SMS: различия между версиями
Перейти к навигации
Перейти к поиску
McBurns (обсуждение | вклад) (Новая страница: « Category:Помощь (версия 3.xx)») |
McBurns (обсуждение | вклад) |
||
(не показаны 4 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
<syntaxhighlight lang="javascript"> | |||
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 InText = (SMSList[i].Text + '').replace(/'/g, "''"); // Экранируем одинарные кавычки | |||
var OutText = ''; | |||
Script.InLogInfo ('"' + InText + '"'); | |||
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': InText, | |||
'inphone': Phone}); | |||
Info.All++; // Увеличиваем счетчик принятых звонков в статистике | |||
Info.Update (DataSearchSMS.IsSearch ()); // Показываем статистику | |||
if (AnswerMode.IsRecord ()) { // Если запись | |||
DataWrite = new CDataWriteSMS (); | |||
var Query = Script.GetExpressionValue (DataWrite.Query (), | |||
{'ColumnSMS': InText, | |||
'ColumnPhone': Phone, | |||
'intext': InText, | |||
'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.WaitForIncoming (Time.TimeOut (), 2)) { // Ждем входящего СМС заданное время | |||
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 (); | |||
} | |||
</syntaxhighlight> | |||
[[Category:Помощь (версия 3.xx)]] | [[Category:Помощь (версия 3.xx)]] |
Текущая версия на 07:38, 24 февраля 2014
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 InText = (SMSList[i].Text + '').replace(/'/g, "''"); // Экранируем одинарные кавычки
var OutText = '';
Script.InLogInfo ('"' + InText + '"');
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': InText,
'inphone': Phone});
Info.All++; // Увеличиваем счетчик принятых звонков в статистике
Info.Update (DataSearchSMS.IsSearch ()); // Показываем статистику
if (AnswerMode.IsRecord ()) { // Если запись
DataWrite = new CDataWriteSMS ();
var Query = Script.GetExpressionValue (DataWrite.Query (),
{'ColumnSMS': InText,
'ColumnPhone': Phone,
'intext': InText,
'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.WaitForIncoming (Time.TimeOut (), 2)) { // Ждем входящего СМС заданное время
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 ();
}