ソースを参照

outgoing callbacks

Hal De 2 年 前
コミット
d8272ec2e2
2 ファイル変更118 行追加10 行削除
  1. 62 1
      app/app.py
  2. 56 9
      app0/app.py

+ 62 - 1
app/app.py

@@ -254,6 +254,8 @@ async def getVariableFromChannel(callid,channel,variable_source,variable_destina
     if (value):
       app.logger.warning('set {}={} for {} from channel'.format(variable_destination,value,callid))
       app.cache['cel_calls'][callid][variable_destination] = value
+    else:
+      app.logger.warning('can\'t get {} for {} from channel'.format(variable_source,callid))
 
 @manager.register_event('CEL')
 async def celCallback(mngr: Manager, msg: Message):
@@ -282,7 +284,7 @@ async def celCallback(mngr: Manager, msg: Message):
     app.cache['cel_calls'][lid]['all_channels'] = {}
     app.cache['cel_calls'][lid]['transfers'] = []
     #app.cache['cel_calls'][lid]['mix_monitors'] = []
-    if (msg.Context=='from-internal'):
+    if (msg.Context.startswith('from-internal')):
       sip_call_id = await amiChannelGetVar(msg.Channel,"PJSIP_HEADER(read,UniqueId)")
       #if( False and   not sip_call_id):
       #  sip_call_id = await amiChannelGetVar(msg.Channel,"PJSIP_HEADER(read,Call-ID)")
@@ -292,6 +294,18 @@ async def celCallback(mngr: Manager, msg: Message):
       await getVariableFromPJSIP(lid,msg.Channel,"CallerNumber","ANumber")
       #await getVariableFromPJSIP(lid,msg.Channel,"CallerNumber")
       await getVariableFromPJSIP(lid,msg.Channel,"BNumber")
+      if (len(msg.Exten)>=7):
+        device = msg.CallerIDnum
+        user = device
+        if device in app.cache['usermap']:
+          user = app.cache['usermap'][device]
+        start = datetime.strptime(msg.EventTime,"%Y-%m-%d %H:%M:%S")
+        _cb = {'webhook_name': "outgoing_start",
+               'callId':msg.LinkedID,
+               'ANumber': user,
+               'BNumber': msg.Exten}
+        app.logger.warning('outgoing cb {}'.format(_cb))
+        reply = await doCallback(device, _cb)
     else:
       await getVariableFromChannel(lid,msg.Channel,"ALERT_INFO","AlertInfo")
     
@@ -427,6 +441,28 @@ async def celCallback(mngr: Manager, msg: Message):
           _cb['speakingTime'] = (end-answer).total_seconds()
         app.logger.warning('c2c cb {}'.format(_cb))
         reply = await doCallback(call["c2c_device"], _cb)
+      elif (firstMessage.Context.startswith('from-internal') and len(firstMessage.Exten)>=7):
+        call = app.cache['cel_calls'][lid]
+        device = firstMessage.CallerIDnum
+        user = device
+        if device in app.cache['usermap']:
+          user = app.cache['usermap'][device]
+        start = datetime.strptime(firstMessage.EventTime,"%Y-%m-%d %H:%M:%S")
+        end = datetime.strptime(msg.EventTime,"%Y-%m-%d %H:%M:%S")
+        _cb = {'webhook_name': "outgoing_end",
+               'callId':msg.LinkedID,
+               'speakingTime': 0,
+               'waitingTime': (end-start).total_seconds(),
+               'answered': False,
+               'ANumber': user,
+               'BNumber': firstMessage.Exten}
+        if "answer_time" in call:
+          answer = datetime.strptime(call["answer_time"],"%Y-%m-%d %H:%M:%S")
+          _cb["answered"] = True
+          _cb['waitingTime'] = (answer-start).total_seconds()
+          _cb['speakingTime'] = (end-answer).total_seconds()
+        app.logger.warning('outgoing cb {}'.format(_cb))
+        reply = await doCallback(device, _cb)
       app.cache['cel_calls'].pop(lid, False)
       app.cache['cel_queue_calls'].pop(lid, False)
       
@@ -1289,6 +1325,31 @@ class Originate_test(Resource):
     #  else:
     #    return errorReply(reply.message)
 
+@app.route('/registration_call/<numberB>')
+class registration_call(Resource):
+  @authRequired
+  @app.param('numberB', 'User calling ', 'path')
+  @app.response(HTTPStatus.OK, 'Json reply')
+  @app.response(HTTPStatus.UNAUTHORIZED, 'Authorization required')
+  async def get(self,  numberB):
+    if  (not request.admin):
+      abort(401)
+    numberB = re.sub('\D', '', numberB);
+    row = await db.fetch_one(query='SELECT phone FROM phone_registration WHERE active=1 order by rand() limit 1');
+    numberA = row['phone'];
+    _act = { 'Action':'Originate',
+             'Channel':'Local/{}@regcall-legA'.format(numberB),
+             'Context':'regcall-legB',
+             'Exten':numberB,
+             'Priority': '1',
+             'Async':'true',
+             'Callerid': '{} <{}>'.format(numberA, numberA)
+             }
+    app.logger.warning(_act)
+    await manager.send_action(_act)
+    return successfullyOriginated(numberA, numberB)
+
+
 @app.route('/autocall/<numberA>/<numberB>')
 class Autocall(Resource):
   @authRequired

+ 56 - 9
app0/app.py

@@ -292,6 +292,19 @@ async def celCallback(mngr: Manager, msg: Message):
       await getVariableFromPJSIP(lid,msg.Channel,"CallerNumber","ANumber")
       #await getVariableFromPJSIP(lid,msg.Channel,"CallerNumber")
       await getVariableFromPJSIP(lid,msg.Channel,"BNumber")
+      if (len(msg.Exten)>=7):
+        device = msg.CallerIDnum
+        user = device
+        if device in app.cache['usermap']:
+          user = app.cache['usermap'][device]
+        start = datetime.strptime(msg.EventTime,"%Y-%m-%d %H:%M:%S")
+        _cb = {'webhook_name': "outgoing_start",
+               'callId':msg.LinkedID,
+               'ANumber': user,
+               'BNumber': msg.Exten}
+        app.logger.warning('outgoing cb {}'.format(_cb))
+        reply = await doCallback(device, _cb)
+
     else:
       await getVariableFromChannel(lid,msg.Channel,"ALERT_INFO","AlertInfo")
     
@@ -410,16 +423,46 @@ async def celCallback(mngr: Manager, msg: Message):
         (f,s) = t
         await db.execute(query='update cdr set transfer_from=(select distinct linkedid from cdr where uniqueid=:first) where linkedid=:second;',values={'first': f,'second': s})
       if ("c2c_start_time" in app.cache['cel_calls'][lid]):
+        app.logger.warning('c2c values {}'.format(app.cache['cel_calls'][lid]))
         call = app.cache['cel_calls'][lid]
+        start = datetime.strptime(call["c2c_start_time"],"%Y-%m-%d %H:%M:%S")
+        end = datetime.strptime(msg.EventTime,"%Y-%m-%d %H:%M:%S")
         _cb = {'webhook_name': "c2c_end",
-               'asteriskCallId':msg.LinkedID,
-               'start_time': call["c2c_start_time"],
-               'end_time': msg.EventTime,
+               'callId':msg.LinkedID,
+               'speakingTime': 0,
+               'waitingTime': (end-start).total_seconds(),
+               'answered': False,
                'ANumber': call["c2c_user"],
                'BNumber': call["c2c_phone"]}
         if "answer_time" in call:
-         _cb["answer_time"]=call["answer_time"]
+          answer = datetime.strptime(call["answer_time"],"%Y-%m-%d %H:%M:%S")
+          _cb["answered"] = True
+          _cb['waitingTime'] = (answer-start).total_seconds()
+          _cb['speakingTime'] = (end-answer).total_seconds()
         app.logger.warning('c2c cb {}'.format(_cb))
+        reply = await doCallback(call["c2c_device"], _cb)
+      elif (firstMessage.Context.startswith('from-internal') and len(firstMessage.Exten)>=7):
+        call = app.cache['cel_calls'][lid]
+        device = msg.CallerIDnum
+        user = device
+        if device in app.cache['usermap']:
+          user = app.cache['usermap'][device]
+        start = datetime.strptime(firstMessage.EventTime,"%Y-%m-%d %H:%M:%S")
+        end = datetime.strptime(msg.EventTime,"%Y-%m-%d %H:%M:%S")
+        _cb = {'webhook_name': "outgoing_end",
+               'callId':msg.LinkedID,
+               'speakingTime': 0,
+               'waitingTime': (end-start).total_seconds(),
+               'answered': False,
+               'ANumber': user,
+               'BNumber': firstMessage.Exten}
+        if "answer_time" in call:
+          answer = datetime.strptime(call["answer_time"],"%Y-%m-%d %H:%M:%S")
+          _cb["answered"] = True
+          _cb['waitingTime'] = (answer-start).total_seconds()
+          _cb['speakingTime'] = (end-answer).total_seconds()
+        app.logger.warning('outgoing cb {}'.format(_cb))
+        reply = await doCallback(device, _cb)
       app.cache['cel_calls'].pop(lid, False)
       app.cache['cel_queue_calls'].pop(lid, False)
       
@@ -440,16 +483,20 @@ async def celCallback(mngr: Manager, msg: Message):
         _cb[vn] = vv
       reply = await doCallbackPostfix(callback_type,postfix, _cb)
     if (msg.EventName == 'USER_DEFINED') and (msg.UserDefType == 'START_C2C'):
-        app.logger.warning('c2c event {}'.format(msg))
         app.cache['cel_calls'][lid]["c2c_start_time"]=msg.EventTime
-        app.cache['cel_calls'][lid]["c2c_user"] = msg.CallerIDnum
+        device = msg.CallerIDnum 
+        app.cache['cel_calls'][lid]["c2c_device"] = device
+        if device in app.cache['usermap']:
+          app.cache['cel_calls'][lid]["c2c_user"] = app.cache['usermap'][device]
+        else:
+          app.cache['cel_calls'][lid]["c2c_user"] = device
         app.cache['cel_calls'][lid]["c2c_phone"] = msg.Exten
         _cb = {'webhook_name': "c2c_start",
-             'asteriskCallId':msg.LinkedID,
-             'start_time': msg.EventTime,
-             'ANumber': msg.CallerIDnum,
+             'callId':msg.LinkedID,
+             'ANumber': app.cache['cel_calls'][lid]["c2c_user"],
              'BNumber': msg.Exten}
         app.logger.warning('c2c cb {}'.format(_cb))
+        reply = await doCallback(device, _cb)
 
 async def getCDR(start=None,
                  end=None,