trabajo-afectivo/app/models/cti/driver/placetel.rb

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