Pull to refresh

Comments 19

Порекомендовать им ознакомиться с нашей статьей, как вариант. Ну или обратиться к правительству и законодательно обязать :)
Вы сообщаете клиенту о примерном периоде времени, в течении которого ему перезвонит оператор?
Да, в коде есть часть где сообщается время ожидания в очереди, оно, по сути, равно времени через которое ему перезвонят, если он решил воспользоваться коллбэком. Перед тем как его отключить можно ему сообщить. Будет что-то в духе:
// Обработчик нажатий на кнопки
function handleToneReceived(e) {
    if (e.tone == "#") {
        callback = true;
        originalCall.removeEventListener(CallEvents.PlaybackFinished, handlePlaybackFinished);
        originalCall.say("Оператор перезвонит Вам менее чем через " + (ewt + 1) + minutesWord, Language.RU_RUSSIAN_FEMALE);
        originalCall.addEventListener(CallEvents.PlaybackFinished, function(callevent) {
             originalCall.hangup(); // <--  несмотря на отсутствие звонков сессия не завершится
        });
    }
}

Данные ewt и minutesWord можно взять из обработчика ACDEvents.Waiting
А выбор есть у клиента, ждать ответа или ждать обратного звонка? Или Вы это решаете за него?
Если внимательно посмотреть на код, то можно увидеть ответ на ваш вопрос:
"Вы находитесь в очереди под номером " + acdevent.position +
            ". Оператор ответит Вам менее чем через " + (acdevent.ewt + 1) + minutesWord +
            " Вы также можете нажать решетку и мы сами перезвоним вам как только оператор будет готов обслужить ваш вызов."
Зачем мне внимательно смотреть ваш код? У нас используется совсем другая платформа. Мне интересны именно ключевые моменты самой идеи, а не конкретная реализация на какой-то там платформе. Трудно было просто ответить на вопрос?
По-моему я вполне ответил на ваш вопрос. Статья про конкретную реализацию.
Ответили, только при этом не упустили шанса упрекнуть человека в его невнимательности.
// Делаем коллбэк
originalCall = VoxEngine.callUser(callerid);
Опечатка с callUser/callPSTN?

Непонятно, почему сессия не завершается — как сценарий определяет (по подключению модуля ACD / наличию переменной callback)? И как её тогда завершить, если функционал callback'a не нужен, а модуль очередей нужен?

Как долго висит выполнение сценария, если все операторы заняты — часы, дни, бесконечно? Как удалить callback-звонок из очереди?
Да, совершенно верно, опечатка :) Спасибо, что заметили, сейчас поправим. Сессия не будет завершаться, если был использован модуль ACD и добавление в очередь, в таком состоянии сессия будет жить 2 часа, после чего самоуничтожится, так как мы исходим из того, что очередь все-таки быстрее обрабатывается. Callback-звонок из очереди можно удалить, получив media_session_access_url и сделав по нему запрос, в обработчике которого вызвать функцию cleanup
Еще вопрос:
// Отправляем звонок оператору
request.addEventListener(ACDEvents.OperatorReached, function (acdevent) {
if (callback)
Если callback=false (звонивший не нажимал решетку), то что происходит таком случае в else? Входящего звонка же уже нет (звонивший положил трубку), то есть соединять не с кем — просто корректно завершается сессия?

Вообще, очень хочется, чтобы функция callback'a была включаема по-желанию, а не по-умолчанию. Чтобы очередь не засорялась звонящими, которые положили трубку и не захотели callback'a. Ведь сейчас, как я понял, даже если они не выбрали callback, они всё равно попадают в очередь и висят там два часа, что влияет на количество абонентов и время ожидания, которое сообщается новым звонящим.
Если callback = false, то человек будет дальше висеть и слушать музыку и обновления на тему сколько ему еще ждать осталось. Этот пример как раз про включение по желанию при нажатии клиентом #, если он не хочет чтобы ему перезвонили, то пусть слушает дальше музыку пока ему не ответят, а если он сам положит трубку, то сессию надо просто убить VoxEngine.terminate и все.
По коду в примере, при нажатие звонящим решетки срабатывает hangup, который вызывает disconnect и выполнение cleanup, в котором выполняется VoxEngine.terminate. Если же звонящий просто кладет трубку, то выполняется тот же самый disconnect->cleanup->terminate. Почему же в одном случае сессия не убивается, а в другом убивается? Или hangup не вызывает событие disconnect?

По поводу callback=false, в том куске который я привел для примера, при выполнение else будет выполнен
VoxEngine.sendMediaBetween(acdevent.operatorCall, originalCall);
но originalCall уже не существует, так как абонент повесил трубку, но в очереди еще висит, и сценарий висит, поэтому я и спрашиваю что получится — корректно ли завершится всё?
Да, есть небольшая недоработка. Поправил функцию cleanup
if (!callback) VoxEngine.terminate();


Можно еще, как вариант, в случае если callback, то сделать
originalCall.removeEventListener(CallEvents.Disconnected, cleanup);
Получается terminate полностью завершит сценарий и из очереди абонент исчезнет, если он не выбрал callback и положил трубку?
Да, сессия завершится после terminate
Теперь всё ясно, спасибо :)
Это Вам спасибо, что нашли несколько весьма досадных ошибок в сценарии :)
Sign up to leave a comment.