|
@@ -40,7 +40,6 @@ class InboundClient:
|
|
|
self.is_stopping = False
|
|
|
self.logger = logger
|
|
|
self.bot_agent = agent
|
|
|
- self.cmd_queue = queue.Queue()
|
|
|
self.handler_table = self.scan_esl_event_handlers()
|
|
|
self.default_event_handler = DefaultEslEventHandler(self, self.bot_agent, self.logger)
|
|
|
self.host, self.port, self.password = SERVE_HOST, '8021', '4918257983818884358'
|
|
@@ -83,40 +82,19 @@ class InboundClient:
|
|
|
if self.con.connected():
|
|
|
self.logger.info('inbound esl connected ... ')
|
|
|
self.con.events('plain', 'all') #CHANNEL_ORIGINATE,CHANNEL_PROGRESS,CHANNEL_PROGRESS_MEDIA,CHANNEL_ANSWER,CHANNEL_HANGUP,CUSTOM,PLAYBACK_START,PLAYBACK_STOP,DETECTED_TONE
|
|
|
- threading.Thread(target=self.recv_event, args=()).start()
|
|
|
while not self.is_stopping:
|
|
|
- self.invoke_method()
|
|
|
-
|
|
|
- def recv_event(self):
|
|
|
- while not self.is_stopping:
|
|
|
- e = self.con.recvEvent()
|
|
|
- # if e:
|
|
|
- # self.logger.info(json.loads(e.serialize('json')))
|
|
|
- event_name = e.getHeader("Event-Name")
|
|
|
- if event_name == "SERVER_DISCONNECTED":
|
|
|
- self.logger.info('come in SERVER_DISCONNECTED case')
|
|
|
- self.con.disconnect()
|
|
|
- time.sleep(3)
|
|
|
- self.start()
|
|
|
- else:
|
|
|
- # threading.Thread(target=self.process_esl_event, args=(e,)).start()
|
|
|
- self.choose_thread_pool_executor(e).submit(self.process_esl_event, e)
|
|
|
-
|
|
|
- def invoke_method(self):
|
|
|
- try:
|
|
|
- if self.cmd_queue.qsize() <= 0:
|
|
|
- return
|
|
|
- method_name, method_args = self.cmd_queue.get_nowait()
|
|
|
- self.logger.info('debugger::invoke_method, method_name=%s'%method_name)
|
|
|
- method = getattr(self, method_name)
|
|
|
- if callable(method):
|
|
|
- result = method(*method_args)
|
|
|
- return result
|
|
|
- except:
|
|
|
- pass
|
|
|
-
|
|
|
- def sync_invoke_method(self, method_name, method_args=()):
|
|
|
- self.cmd_queue.put_nowait((method_name, method_args))
|
|
|
+ e = self.con.recvEvent()
|
|
|
+ # if e:
|
|
|
+ # self.logger.info(json.loads(e.serialize('json')))
|
|
|
+ event_name = e.getHeader("Event-Name")
|
|
|
+ if event_name == "SERVER_DISCONNECTED":
|
|
|
+ self.logger.info('come in SERVER_DISCONNECTED case')
|
|
|
+ self.con.disconnect()
|
|
|
+ time.sleep(3)
|
|
|
+ self.start()
|
|
|
+ else:
|
|
|
+ # threading.Thread(target=self.process_esl_event, args=(e,)).start()
|
|
|
+ self.choose_thread_pool_executor(e).submit(self.process_esl_event, e)
|
|
|
|
|
|
def choose_thread_pool_executor(self, e):
|
|
|
call_id = EslEventUtil.getCallId(e)
|
|
@@ -441,13 +419,19 @@ class InboundClient:
|
|
|
device_id,
|
|
|
" -both 'set:hangup_after_bridge=false,set:park_after_bridge=true,set:" + SIP_HEADER + sipHeaderHoldMusic + "=true,park:' inline "
|
|
|
]
|
|
|
+ _con = None
|
|
|
try:
|
|
|
arg = ''.join(builder)
|
|
|
- self.logger.info('debugger::bridge_break, arg=%s'%arg)
|
|
|
- self.con.api(TRANSFER, arg)
|
|
|
- print('debugger::bridge_break success, arg=%s'%arg, flush=True)
|
|
|
+ _con = ESL.ESLconnection(self.host, self.port, self.password)
|
|
|
+ if _con.connected():
|
|
|
+ print('debugger::bridge_break, arg=%s'%arg, flush=True)
|
|
|
+ _con.api(TRANSFER, arg)
|
|
|
+ print('debugger::bridge_break success, arg=%s'%arg, flush=True)
|
|
|
except:
|
|
|
traceback.print_exc()
|
|
|
+ finally:
|
|
|
+ if _con:
|
|
|
+ _con.disconnect()
|
|
|
|
|
|
def play_file(self, call_id, device_id, file, sync):
|
|
|
"""放音"""
|
|
@@ -479,11 +463,20 @@ class InboundClient:
|
|
|
" ",
|
|
|
SMF_ALEG
|
|
|
]
|
|
|
- print('debugger::hold_play, device_id=%s, play=%s' % (device_id, play), flush=True)
|
|
|
- arg = ''.join(builder)
|
|
|
- print('debugger::hold_play, arg=%s' % arg, flush=True)
|
|
|
- self.con.bgapi(UUID_BROADCAST, arg)
|
|
|
- print('debugger::hold_play success, arg=%s' % arg, flush=True)
|
|
|
+ _con = None
|
|
|
+ try:
|
|
|
+ arg = ''.join(builder)
|
|
|
+ print('debugger::hold_play, device_id=%s, play=%s' % (device_id, play), flush=True)
|
|
|
+ _con = ESL.ESLconnection(self.host, self.port, self.password)
|
|
|
+ if _con.connected():
|
|
|
+ print('debugger::hold_play, arg=%s' % arg, flush=True)
|
|
|
+ _con.bgapi(UUID_BROADCAST, arg)
|
|
|
+ print('debugger::hold_play success, arg=%s' % arg, flush=True)
|
|
|
+ except:
|
|
|
+ traceback.print_exc()
|
|
|
+ finally:
|
|
|
+ if _con:
|
|
|
+ _con.disconnect()
|
|
|
|
|
|
def play_timeout(self, call_id, timeout):
|
|
|
"""播放超时主动挂机"""
|