Я пытаюсь заставить пользователей записывать сообщение, повесить трубку и продолжить вызов, набрать очереди и воспроизвести запись.
Я прошел большую часть пути, но сейчас, когда я звоню Queue()
в расширении h он немедленно вешает трубку (участники очереди получают вызов примерно в течение 1 мс). Хотя я использую вариант c
Мой диалплан (сокращен для краткости)
[standard-gn-helpdesk-corona-afterhours]
; Hangup Extension
exten => h,1, NoOp(hangup standard-gn-helpdesk-corona-afterhours)
same => n, Gosub(sub-queue-gn-afterhours,s,1)
same => n, Return()
exten => s,1, NoOp(standard-gn-helpdesk-corona-afterhours)
same => n, Record(gn_ah_recording%d:ulaw)
same => n, Hangup()
; Callee has hungup by this point. `h` should be executed
[playback-recorded-message]
exten => s,1, NoOp(playback-recorded-message)
same => n, Playback(${RECORDED_FILE})
[sub-queue-gn-afterhours]
exten => s,1,NoOp(sub-queue-gn-afterhours)
; Has the `c` option which allows the queue to continue when callee hangs
same => n,Queue(GNAfterHours1,tkc,,,540,,,playback-recorded-message)
same => n,Return()
Любые предложения будут полезны. Я буду вынужден использовать Dial()
вместо этого с F
вариант?
На самом деле я не мог найти способ обойти все возникшие проблемы, мое окончательное решение оказалось хакерским обходным путем с использованием AGI для инициирования нового вызова с использованием локального канала. Мой план набора номеров выглядел примерно так:
[standard-gn-helpdesk-corona-afterhours]
; Hangup Extension
exten => h,1, NoOp(hangup standard-gn-helpdesk-corona-afterhours)
same => n, AGI(dial-playback-recorded-messages.php)
same => n, Hangup()
exten => s,1, NoOp(standard-gn-helpdesk-corona-afterhours)
same => n, Record(gn_ah_recording%d:wav)
same => n, Hangup()
; Callee has hungup by this point. `h` should be executed
[playback-recorded-message]
exten => s,1, NoOp(playback-recorded-message)
same => n, Playback(${RECORDED_FILE})
[sub-queue-gn-afterhours]
exten => s,1,NoOp(sub-queue-gn-afterhours)
; Total hack! This is bad practice, but I don't have shared func and I couldn't find another way to keep this variable in scope when using Queue -> Sub
same => n, Set(GLOBAL(RECORDED_FILE)=${RECORDED_FILE})
same => n,Queue(GNAfterHours1,tk,,,540,,,playback-recorded-message)
same => n,Return()
[from-internal-default]
; Outbound dial for AH
exten => 8745111,1, Answer()
same => n, Gosub(sub-queue-gn-afterhours,s,1)
same => n, Hangup()
; Inbound dial for AH
exten => 8745112,1, Answer()
same => n, Wait(3600)
same => n, Hangup()
Мой сценарий AGI выглядел так (урезан для простоты)
<?php
$recordingFile = $agi->get_variable("RECORDED_FILE", true);
$hasAh = (string) $agi->get_variable("HAS_AFTERHOURS", true);
$originateMsg = new OriginateAction('local/8745112@from-internal-default');
$originateMsg->setContext('from-internal-default');
$originateMsg->setPriority('1');
$originateMsg->setExtension('8745111');
$originateMsg->setAsync(true);
$originateMsg->setTimeout(19000);
$originateMsg->setVariable('RECORDED_FILE', $recordingFile);
$originateMsg->setVariable('HAS_AFTERHOURS', $hasAh);
$response = $pamiClient->send($originateMsg);
Как это устроено:
8745112
и набор местного внутреннего номера 8745111
8745112
просто ждет, чтобы соединение оставалось открытым8745111
перемещается в очередь, после подключения вызова запускается подпрограмма очереди сообщений playback-recorded-message
который воспроизводит сообщениеЯ уверен, что есть гораздо лучшее и менее хакерское решение, но с моим уровнем понимания Asterisk это лучшее, что я мог придумать. Надеюсь, это кому-то поможет