153 lines
3.9 KiB
Ruby
153 lines
3.9 KiB
Ruby
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
|
|
|
class Cti::Driver::Placetel < Cti::Driver::Base
|
|
|
|
def config
|
|
Setting.get('placetel_config')
|
|
end
|
|
|
|
def mapping(params)
|
|
|
|
# do event mapping
|
|
case params['event']
|
|
when 'IncomingCall'
|
|
params['direction'] = 'in'
|
|
params['event'] = 'newCall'
|
|
when 'HungUp'
|
|
params['event'] = 'hangup'
|
|
when 'OutgoingCall'
|
|
params['direction'] = 'out'
|
|
params['event'] = 'newCall'
|
|
when 'CallAccepted'
|
|
params['event'] = 'answer'
|
|
end
|
|
|
|
# lookup current direction if not given
|
|
if params['direction'].blank?
|
|
entry = Cti::Log.find_by(call_id: params[:call_id])
|
|
if entry
|
|
params['direction'] = entry.direction
|
|
end
|
|
end
|
|
|
|
# lookup caller if not given
|
|
if params['user'].blank?
|
|
# by from parameter for outgoing calls
|
|
if params['direction'] == 'out' && params['from']&.include?('@')
|
|
params['user'] = get_voip_user_by_peer(params['from'])
|
|
end
|
|
|
|
# by peer parameter for incoming calls
|
|
if params['direction'] == 'in' && params['peer'].present?
|
|
params['user'] = get_voip_user_by_peer(params['peer'])
|
|
end
|
|
end
|
|
|
|
# do case mapping
|
|
case params['type']
|
|
when 'missed'
|
|
params['cause'] = 'cancel'
|
|
when 'voicemail'
|
|
params['cause'] = 'voicemail'
|
|
when 'blocked'
|
|
params['cause'] = 'blocked'
|
|
when 'accepted'
|
|
params['cause'] = 'normalClearing'
|
|
end
|
|
|
|
params
|
|
end
|
|
|
|
def push_open_ticket_screen_recipient
|
|
|
|
# try to find answering which answered call
|
|
user = nil
|
|
|
|
# based on peer
|
|
if @params['peer'].present?
|
|
user_id = get_user_id_by_peer(@params['peer'])
|
|
if user_id.present?
|
|
user = if User.exists?(user_id)
|
|
User.find(user_id)
|
|
else
|
|
User.find_by(email: user_id.downcase)
|
|
end
|
|
end
|
|
end
|
|
|
|
user
|
|
end
|
|
|
|
def get_voip_user_by_peer(peer)
|
|
load_voip_users[peer]
|
|
end
|
|
|
|
def load_voip_users
|
|
return {} if @config.blank? || @config[:api_token].blank?
|
|
|
|
list = Cache.read('placetelGetVoipUsers')
|
|
return list if list
|
|
|
|
response = UserAgent.get(
|
|
'https://api.placetel.de/v2/sip_users',
|
|
{},
|
|
{
|
|
headers: {
|
|
Authorization: "Bearer #{@config[:api_token]}",
|
|
},
|
|
log: {
|
|
facility: 'placetel',
|
|
},
|
|
json: true,
|
|
open_timeout: 4,
|
|
read_timeout: 6,
|
|
total_timeout: 6,
|
|
verify_ssl: true,
|
|
},
|
|
)
|
|
|
|
if !response.success?
|
|
Rails.logger.error "Can't fetch getVoipUsers from '#{url}', http code: #{response.code}"
|
|
Cache.write('placetelGetVoipUsers', {}, { expires_in: 1.hour })
|
|
return {}
|
|
end
|
|
result = response.data
|
|
if result.blank?
|
|
Rails.logger.error "Can't fetch getVoipUsers from '#{url}', result: #{response.inspect}"
|
|
Cache.write('placetelGetVoipUsers', {}, { expires_in: 1.hour })
|
|
return {}
|
|
end
|
|
if result.is_a?(Hash) && (result['result'] == '-1' || result['result_code'] == 'error')
|
|
Rails.logger.error "Can't fetch getVoipUsers from '#{url}', result: #{result.inspect}"
|
|
Cache.write('placetelGetVoipUsers', {}, { expires_in: 1.hour })
|
|
return {}
|
|
end
|
|
if !result.is_a?(Array)
|
|
Rails.logger.error "Can't fetch getVoipUsers from '#{url}', result: #{result.inspect}"
|
|
Cache.write('placetelGetVoipUsers', {}, { expires_in: 1.hour })
|
|
return {}
|
|
end
|
|
|
|
list = {}
|
|
result.each do |entry|
|
|
next if entry['name'].blank?
|
|
next if entry['sipuid'].blank?
|
|
|
|
list[entry['sipuid']] = entry['name']
|
|
end
|
|
Cache.write('placetelGetVoipUsers', list, { expires_in: 24.hours })
|
|
list
|
|
end
|
|
|
|
def get_user_id_by_peer(peer)
|
|
return if @config.blank? || @config[:user_device_map].blank?
|
|
|
|
@config[:user_device_map].each do |row|
|
|
next if row[:user_id].blank?
|
|
return row[:user_id] if row[:device_id] == peer
|
|
end
|
|
|
|
nil
|
|
end
|
|
|
|
end
|