فهرست منبع

Merge branch 'master' of ssh://gitlab.fuxicarbon.com:1111/client_service/voice-gateway-service

余尚辉 6 ماه پیش
والد
کامیت
e7fc2a0fce

+ 11 - 0
src/core/callcenter/cache.py

@@ -9,6 +9,7 @@ from src.core.datasource import RedisHandler
 
 cacheDay = 7
 deviceCall = {}
+deviceUserPart = {}
 redis_handler = RedisHandler()
 print(redis_handler.redis.info())
 
@@ -75,6 +76,16 @@ def add_device(device_id, call_id):
     deviceCall[device_id] = call_id
 
 
+def get_user_part(device_id):
+    return deviceUserPart.get(device_id)
+
+
+def add_device_user_part(device_id, user_part):
+    if not device_id or not user_part:
+        return
+    deviceUserPart[device_id] = user_part
+
+
 def get_route_gateway(saas_id):
     return RouteGateway(id=1,
                         saas_id=saas_id,

+ 1 - 0
src/core/callcenter/esl/client.py

@@ -21,6 +21,7 @@ from src.core.callcenter.esl.handler.default_esl_event_handler import DefaultEsl
 from src.core.voip.bot import BotAgent
 from src.core.voip.constant import *
 
+
 class InboundClient:
 
     def __init__(self, logger):

+ 7 - 0
src/core/callcenter/esl/handler/channel_hangup_handler.py

@@ -26,6 +26,7 @@ class ChannelHangupHandler(EslEventHandler):
         self.logger.info(json.loads(event.serialize('json')))
         call_id = EslEventUtil.getCallId(event)
         if not call_id:
+            self.release(event)
             self.logger.info("call_id is null")
             return
         call = Cache.get_call_info(call_id)
@@ -91,6 +92,12 @@ class ChannelHangupHandler(EslEventHandler):
         self.hangup_dir(call, device, cause)
         Cache.add_call_info(call)
 
+    def release(self, event):
+        device_id = event.getHeader("Unique-ID")
+        user_part = Cache.get_user_part(device_id)
+        self.logger.info(f"release device_id={device_id}, user_part={user_part}")
+        self.bot_agent.release(user_part)
+
     def next_cmd(self, call: CallInfo, device: DeviceInfo, next_command: NextCommand, cause):
         # 呼入转到坐席,坐席拒接和坐席sip呼不通的时候,都需要再次转回来到技能组排队。
         if NextType.NEXT_CALL_BRIDGE == next_command.next_type or NextType.NEXT_LISTEN_CALL == next_command.next_type:

+ 5 - 4
src/core/callcenter/esl/handler/channel_park_handler.py

@@ -2,6 +2,7 @@
 # encoding:utf-8
 
 import json
+import src.core.callcenter.cache as Cache
 from src.core.callcenter.esl.annotation import EslEventName
 from src.core.callcenter.esl.constant.event_names import CHANNEL_PARK
 from src.core.callcenter.esl.handler.esl_event_handler import EslEventHandler
@@ -19,18 +20,18 @@ class ChannelParkHandler(EslEventHandler):
             self.process_fxo_calling(event)
             return
 
-
     def process_fxo_calling(self, event):
         kwargs = json.loads(event.serialize('json'))
         destination = self.bot_agent.register(**kwargs)
         # destination = '1001'
         # 获取通话的 UUID
-        call_uuid = event.getHeader("Unique-ID")
+        device_id = event.getHeader("Unique-ID")
         service = event.getHeader("variable_service")
-        print(f"Incoming call with UUID: {call_uuid}  {service} is transfer to {destination}")
+        print(f"Incoming call with UUID: {device_id}  {service} is transfer to {destination}")
         # self.inbound_client.con.execute("transfer", f"{destination} XML default", call_uuid)
         # self.con.execute("answer", "", call_uuid)
-        self.inbound_client.con.execute("bridge", f"user/{destination}", call_uuid)
+        Cache.add_device_user_part(device_id, destination)
+        self.inbound_client.con.execute("bridge", f"user/{destination}", device_id)
 
         # destination = "user/1001"
         # msg = ESL.ESLevent("sendmsg", call_uuid)

+ 1 - 2
src/core/datasource.py

@@ -183,9 +183,8 @@ class MysqlHandler:
 @singleton
 class RedisHandler:
 
-    def __init__(self, host='172.16.12.24', port=6379, db=0, password='^YHN&UJM'):
+    def __init__(self, host=SERVE_HOST, port=6379, db=0, password='^YHN&UJM'):
         try:
-            host = SERVE_HOST
             print(f"redis_host:{host}")
             self.redis = StrictRedis(
                 connection_pool=ConnectionPool(host=host, port=port, db=db, password=password))

+ 8 - 4
src/core/voip/bot.py

@@ -75,10 +75,9 @@ class MyAudioMediaPort(pj.AudioMediaPort):
 
             player_queue_size = self.call.player_queue.qsize()
             if (player_queue_size > 0 and not self.cur_player_file) or (player_queue_size > 0 and play_complete):
-                print('onFrameReceived:player_queu_size=', player_queue_size, 'play_complete=', play_complete)
+                print('onFrameReceived:player_queue_size=', player_queue_size, 'play_complete=', play_complete)
                 self.cur_player_file = self.get_player_file()
                 self.call.send_bot_speaker(self.cur_player_file)
-
         except:
             pass
 
@@ -221,6 +220,7 @@ class MyCall(pj.Call):
         self.player.startTransmit(self.aud_med)
 
     def on_receiver_asr_result(self, message, *args):
+        print(message)
         self.user_asr_text_queue.put(message)
 
     def on_media_player_complete(self, player_id):
@@ -241,8 +241,7 @@ class MyCall(pj.Call):
 
 class BotAgent:
 
-    def __init__(self, logger, user_part_range=range(1001, 1011), host="172.16.12.24", port="5060", password="slibra@#123456"):
-    # def __init__(self, logger, user_part_range=range(1001, 1011), host="pbx.fuxicarbon.com", port="5060", password="slibra@#123456"):
+    def __init__(self, logger, user_part_range=range(1001, 1011), host=SERVE_HOST, port="5060", password="slibra@#123456"):
         self.logger = logger
         self.user_part_range, self.host, self.port, self.password = user_part_range, host, port, password
         self.user_part_pool = queue.Queue(maxsize=len(user_part_range))
@@ -338,6 +337,10 @@ class BotAgent:
         self.release(user_part)
 
     def release(self, user_part):
+        if not user_part:
+            self.logger.info("release, user_part is None")
+            return
+
         def element_in_queue(q, element):
             with q.mutex:  # 确保线程安全
                 for item in list(q.queue):  # 将队列转换为列表进行遍历
@@ -346,6 +349,7 @@ class BotAgent:
             return False
 
         if element_in_queue(self.user_part_pool, user_part):
+            self.logger.info("release, already exists, user_part :%d, pool.size :%d", user_part, self.user_part_pool.qsize())
             return
         self.user_part_pool.put(user_part)
         self.logger.info("release, user_part :%d, pool.size :%d", user_part, self.user_part_pool.qsize())

+ 2 - 1
src/core/voip/constant.py

@@ -33,7 +33,8 @@ def build_demo_script():
     return res
 
 
-SERVE_HOST = os.environ.get("SERVE_HOST")
+# SERVE_HOST = os.environ.get("SERVE_HOST")
+SERVE_HOST = "172.16.12.24"
 MYSQL_PASSWORD = 'EKoAe3H8xybQKrFPApXM'
 
 if SERVE_HOST != "192.168.100.159":