Шрифт:
jay = Customer.find_by_name "Jay Phillips"
jay.phone_number # Выполняем выражение SELECT
jay.total_bill # Выполняем вычисления по нескольким выражениям SELECT
jay.group.customers.average :usage_this_month jay.group.destroy
jay.group = Group.create description => "New cool group!",
:hourly_rate => 1.23
jay.save
Интеграция с базой данных стала здесь намного более естественной, а диалпланы Asterisk выглядят более выразительными. Ниже представлен пример диалплана поставщика сервисов, который налагает ограничение на суммарную продолжительность исходящих звонков, используя информацию из базы данных. Постараемся сохранить простоту:
# Предположим, сервис VoIP предлагается клиентам,
# которые могут быть идентифицированы по их callerid.
service {
# Строка кода ниже реализует выражение SQL SELECT
# по отношению к нашей базе данных. Метод
# find_by_phone_number был создан автоматически,
# потому что ActiveRecord обнаружила в базе данных
# столбец phone_number. Adhearsion создает для нас
# переменную callerid.
caller = Customer.find_by_phone_number callerid
usage = caller.usage_this_month if usage >= 100.hours
play "sorry-cant-let-you-do-that" else
play %w'to-hear-your-account-balance press-1
otherwise wait-moment' choice = wait_for_digit 3.seconds
p choice if choice == 1
charge = usage / 60.0 * caller.group.hourly_rate play %W"your-account will-reflect-charge-of
$#{charge} this month for #{usage / 60} minutes and #{usage % 60} seconds"
end
# Мы также можем записать значение свойства
# usage_this_month объекта caller. По завершении
# выполнения метода time новое значение для этого
# абонента будет внесено в базу данных. caller.usage_this_month += time do
# Засекаем время выполнения данного фрагмента кода. dial IAX/'main-trunk'/extension
end
caller.save
end
Надежная интеграция с базой данных, которую обеспечивает Adhear- sion, упрощает управление и разработку для офисной АТС. Хранящаяся централизованно информация позволяет Asterisk напрямую интегрироваться с другими сервисами, обеспечивая при этом более ценные сервисы, которые не могут быть реализованы в рамках традиционных технологий разработки в Asterisk.
Распространение и повторное использование кода
Приложение Adhearsion располагается в одной папке, поэтому полностью скопировать VoIP-приложение - не сложнее, чем архивировать файлы. Наверное, впервые в сообществе Asterisk разработчики могут запросто обмениваться друг с другом удачными приложениями и дорабатывать их. Кстати, весьма поощряется предоставление кода собственных приложений Adhearsion.
Кроме того, на локальном уровне расширения инфраструктуры Adhear- sion, называемые помощниками, могут использоваться повторно или создаваться самостоятельно. Помощниками могут быть как целые вспомогательные инфраструктуры, такие как Micromenus для интеграции с телефонными микроброузерами, так и обычный новый метод диал- плана, который возвращает выбираемые случайным образом цитаты Оскара Уайльда.
Ниже представлен простой помощник Adhearsion, написанный на Ruby. Он создает новый метод, который будет существовать во всей инфраструктуре, включая диалплан. В целях сохранения простоты метод загружает XML-документ по заданному URL HTTP и преобразует его в Ruby-объект Hash (тип ассоциативного массива Ruby): def remote_parse url
Hash.from_xml open(url).read
end
Заметьте, что вспомогательный файл может включать только эти три строки. При загрузке Adhearsion выполняет сценарий таким образом, что все описанные методы или классы становятся доступными во всей системе.
Для некоторых задач, в частности задач масштабирования Adhearsion, может потребоваться обеспечить в узких местах эффективность короля производительности: языка программирования С. Ниже представлен пример помощника Adhearsion, который возвращает факториал заданного числа:
int fast_factorial(int input) { int fact = 1, count = 1; while(count <= input) { fact *= count++;
}
return fact;
Опять же, приведенный здесь код может составлять все содержимое вспомогательного файла. В данном случае, поскольку код написан на С, файл должен называться factorial.alien.c. Это указывает Adhearsion запустить алгоритм для чтения файла, добавить стандартные заголовки разработки языков С и Ruby, скомпилировать файл, кэшировать общий объект, загрузить его в интерпретатор и затем создать для С-ме- тода оболочку на Ruby. Ниже представлен диалплан, который просто воспроизводит факториал шести, используя этот помощник на С:
fast_test {
num = fast_factorial 6 play num
}
Заметьте, что С-метод становится первоклассным методом на Ruby. Числовые объекты Ruby, преданные в метод, преобразуются в элементарный тип С int, а затем возвращаемое значение преобразуется обратно в числовой объект Ruby.
Вспомогательные файлы предлагают простой, но надежный способ расширения инструментария VoIP-специалиста. Но главное - полезными помощниками можно обмениваться, отчего выиграет все сообщество.
Интеграция с настольным телефоном с использованием Micromenus