У меня есть список телефонов, которые должны вызываться моим приложением Twilio очень часто. У меня есть задание cron, которое запускается каждую минуту и составляет список всех телефонов, которые должны быть вызваны в следующую минуту. Список содержит вызовы, которые запланированы на следующую минуту, а также вызовы, которые не были завершены должным образом в течение последнего часа.
Для каждого телефона в списке у меня есть код, который выглядит следующим образом (в Ruby), чтобы начать список телефонных звонков (список «телефоны»), которые будут выполняться параллельно, и этот фрагмент выполняется каждую минуту.
phones.each do |phone|
callbackurl="http://myapp.com/twiliocallback?phone=#{phone.id}"
data={:from=>'16135551234',
:to=>phone.number,
:url=>callbackurl
}
client=Twilio::REST::Client.new(ACCOUNT_SID, ACCOUNT_TOKEN, :ssl_verify_peer => false)
client.account.calls.create data
end
Однако, если телефонный звонок занимает больше минуты, я не хочу, чтобы задание cron инициировало вызов на тот же номер, когда он уже разговаривает с Twilio. Кроме того, если человек вешает трубку во время разговора до того, как я смогу обновить статус, я хочу, чтобы этот номер снова вызывался, вызванный последующим хроном.
Я знаю, что мне нужен атрибут состояния для телефонного звонка (например, phone.status) со значениями NOT_STARTED, IN_PROGRESS и SUCCESSFULLY_COMPLETED и атрибутом twilio_status (например, phone.twilio_status), со значениями TWILIO_NOT_STARTED, TWILIO TWILIO_COMPLETED.
Звонки начинаются как
phone.status="NOT_STARTED"
phone.twilio_status="TWILIO_NOT_STARTED"
и, как только я создаю телефонный звонок, я могу обновить статус звонка:
phone.status="IN_PROGRESS"
phone.twilio_status="TWILIO_IN_PROGRESS"
Если вызов успешно завершен в пределах пути успеха, я могу установить статус
phone.status="SUCCESSFULLY_COMPLETED"
Если я могу выяснить, когда звонок отключился от Twilio, то я могу сказать, был ли звонок отменен, выполнив это
is_aborted? = twilio.status=="IN_PROGRESS" && twilio.twilio_status=="TWILIO_COMPLETED"
Однако я не знаю, как запустить код
phone.twilio_status="TWLIO_COMPLETED"
для определенного телефонного звонка, когда телефонный звонок зависает в середине рабочего процесса Twilio или даже в конце рабочего процесса.
У Twilio, похоже, есть URL-адрес обратного вызова, который можно вызвать после завершения телефонного вызова, но неясно, как обработчик обратного вызова может выяснить, какой из параллельных вызовов завершен. Есть ли способ сделать это, чтобы я мог пометить правильный вызов с правильным статусом?