774056846 4 months ago
parent
commit
c9c748218a
2 changed files with 38 additions and 14 deletions
  1. 4 2
      src/core/callcenter/call.py
  2. 34 12
      src/core/callcenter/esl/client.py

+ 4 - 2
src/core/callcenter/call.py

@@ -55,8 +55,10 @@ class CallService:
             pass
         custom_device_id = devices[0]
         self.logger.info('debugger::hold, custom_device_id=%s'%custom_device_id)
-        self.client.bridge_break(custom_device_id)
-        Cache.set_need_play_hold_music(call_info.call_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 success custom_device_id=%s'%custom_device_id, flush=True)
 
     def cancel_hold(self, call_info: CallInfo, device_id):

+ 34 - 12
src/core/callcenter/esl/client.py

@@ -40,6 +40,7 @@ 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'
@@ -82,19 +83,40 @@ 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:
-                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)
+                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))
 
     def choose_thread_pool_executor(self, e):
         call_id = EslEventUtil.getCallId(e)