774056846 2 months ago
parent
commit
cc7883f555
2 changed files with 40 additions and 47 deletions
  1. 5 5
      src/core/callcenter/call.py
  2. 35 42
      src/core/callcenter/esl/client.py

+ 5 - 5
src/core/callcenter/call.py

@@ -54,11 +54,11 @@ class CallService:
         except:
             pass
         custom_device_id = devices[0]
-        self.logger.info('debugger::hold, custom_device_id=%s'%custom_device_id)
-        self.client.sync_invoke_method("bridge_break", method_args=(custom_device_id,))
-        self.client.sync_invoke_method("hold_play", method_args=(custom_device_id,HOLD_MUSIC_PATH))
-        # self.client.bridge_break(custom_device_id)
-        # Cache.set_need_play_hold_music(call_info.call_id)
+        print('debugger::hold, custom_device_id=%s'%custom_device_id, flush=True)
+        # self.client.sync_invoke_method("bridge_break", method_args=(custom_device_id,))
+        # self.client.sync_invoke_method("hold_play", method_args=(custom_device_id,HOLD_MUSIC_PATH))
+        self.client.bridge_break(custom_device_id)
+        Cache.set_need_play_hold_music(call_info.call_id)
         print('debugger::hold success custom_device_id=%s'%custom_device_id, flush=True)
 
     def cancel_hold(self, call_info: CallInfo, device_id):

+ 35 - 42
src/core/callcenter/esl/client.py

@@ -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):
         """播放超时主动挂机"""