from werkzeug.wrappers import Response import json import frappe from .twilio_handler import Twilio, IncomingCall @frappe.whitelist() def generate_access_token(): """Returns access token that is required to authenticate Twilio Client SDK. """ twilio = Twilio.connect() if not twilio: return {} from_number = frappe.db.get_value('Twilio Agents', frappe.session.user, 'twilio_number') if not from_number: return { "ok": False, "error": "caller_phone_identity_missing", "detail": "Phone number is not mapped to the caller" } token=twilio.generate_voice_access_token(identity=frappe.session.user) return { 'token': frappe.safe_decode(token) } @frappe.whitelist(allow_guest=True) def voice(**kwargs): """This is a webhook called by twilio to get instructions when the voice call request comes to twilio server. """ def _get_caller_number(caller): identity = caller.replace('client:', '').strip() user = Twilio.emailid_from_identity(identity) return frappe.db.get_value('Twilio Agents', user, 'twilio_number') args = frappe._dict(kwargs) twilio = Twilio.connect() if not twilio: return assert args.AccountSid == twilio.account_sid assert args.ApplicationSid == twilio.application_sid # Generate TwiML instructions to make a call from_number = _get_caller_number(args.Caller) resp = twilio.generate_twilio_dial_response(from_number, args.To) # call_details = TwilioCallDetails(args, call_from=from_number) # create_call_log(call_details) return Response(resp.to_xml(), mimetype='text/xml') @frappe.whitelist(allow_guest=True) def twilio_incoming_call_handler(**kwargs): args = frappe._dict(kwargs) # call_details = TwilioCallDetails(args) # create_call_log(call_details) resp = IncomingCall(args.From, args.To).process() return Response(resp.to_xml(), mimetype='text/xml') @frappe.whitelist(allow_guest=True) def get_call_info(**kwargs): """This is a webhook called when the outgoing call status changes. E.g. 'initiated' 'ringing', 'in-progress', 'completed' etc. """ args = frappe._dict(kwargs) call_info = { 'ParentCallSid': args.ParentCallSid, 'CallSid': args.CallSid, 'CallStatus': args.CallStatus, 'CallDuration': args.CallDuration, 'From': args.From, 'To': args.To, } client = Twilio.get_twilio_client() client.calls(args.ParentCallSid).user_defined_messages.create( content=json.dumps(call_info) )