call.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #!/usr/bin/env python3
  2. # encoding:utf-8
  3. import time
  4. from datetime import datetime
  5. import src.core.callcenter.cache as Cache
  6. from src.core.callcenter.constant import saasId, HOLD_MUSIC_PATH
  7. from src.core.callcenter.enumeration import CallCause, Direction, NextType, DeviceType, CdrType
  8. from src.core.callcenter.api import AgentCallRequest, CallInfo, HangupCallRequest, CheckInCallRequest, \
  9. DeviceInfo, NextCommand, MakeCallContext
  10. from src.core.callcenter.esl.constant.sip_header_constant import sipHeaderServiceId, sipHeaderCtiFlowId
  11. from src.core.callcenter.snowflake import Snowflake
  12. class CallService:
  13. def __init__(self, client, logger):
  14. self.client = client
  15. self.logger = logger
  16. self.snowflake = Snowflake()
  17. def call(self, request: AgentCallRequest):
  18. call_id = 'C' + str(self.snowflake.next_id())
  19. device_id = 'D' + str(self.snowflake.next_id())
  20. # now = lambda: int(round(time.time() * 1000))
  21. now = datetime.utcnow().timestamp()
  22. agent = Cache.get_agent_info(request.saas_id, request.agent_id)
  23. route_gateway = Cache.get_route_gateway(request.saas_id)
  24. call_info = CallInfo(cti_flow_id=request.cti_flow_id, call_id=call_id, agent_key=agent.agent_number, sip_server=agent.sip_server,
  25. caller=agent.agent_number, called=request.called, direction=Direction.INBOUND.code,
  26. caller_display=request.caller_display, called_display=request.called_display,
  27. call_type=request.call_type.code, call_time=now, follow_data=request.follow_data,
  28. uuid1=request.uuid1, uuid2=request.uuid2, saas_id=saasId)
  29. device_info = DeviceInfo(cti_flow_id=request.cti_flow_id, device_id=device_id, call_time=now, call_id=call_id, device_type=DeviceType.AGENT.code,
  30. agent_key=agent.agent_number, caller_display=route_gateway.name, cdr_type=CdrType.INBOUND.code)
  31. call_info.device_list.append(device_id)
  32. call_info.next_commands.append(NextCommand(device_id, NextType.NEXT_CALL_OTHER.code))
  33. call_info.device_info_map = {device_id: device_info}
  34. Cache.add_call_info(call_info)
  35. context = MakeCallContext(display=request.called, caller=request.called, called=request.caller,
  36. call_id=call_id, device_id=device_id, device_type=device_info.device_type,
  37. call_type=call_info.call_type, sip_server=call_info.sip_server,
  38. sip_header_map={sipHeaderCtiFlowId: request.cti_flow_id})
  39. self.client.make_call_new(context)
  40. return call_id
  41. def hold(self, call_info: CallInfo, device_id):
  42. devices = call_info.device_list
  43. try:
  44. devices.remove(device_id)
  45. except:
  46. pass
  47. custom_device_id = devices[0]
  48. print('debugger::hold, custom_device_id=%s'%custom_device_id, flush=True)
  49. self.client.bridge_break(custom_device_id)
  50. self.client.hold_play(custom_device_id, HOLD_MUSIC_PATH)
  51. def cancel_hold(self, call_info: CallInfo, device_id):
  52. self.client.bridge_call(call_info.call_id, call_info.device_list[0], call_info.device_list[1])
  53. def transfer(self, call_info: CallInfo, agent_number, service_id):
  54. caller = call_info.called
  55. call_id = call_info.call_id
  56. agent = Cache.get_agent_info(call_info.saas_id, call_info.agent_key)
  57. device_id = 'D' + str(self.snowflake.next_id())
  58. # now = lambda: int(round(time.time() * 1000))
  59. now = datetime.utcnow().timestamp()
  60. device_info = DeviceInfo(device_id=device_id, caller=caller, display=caller, called=agent_number, call_id=call_id,
  61. call_time=now, cdr_type=CdrType.TRANSFER.code, device_type=DeviceType.AGENT.code)
  62. call_info.device_list.append(device_id)
  63. call_info.caller = agent_number
  64. call_info.device_info_map[device_id] = device_info
  65. call_info.next_commands.append(NextCommand(device_info.device_id, NextType.NEXT_TRANSFER_CALL.code, call_info.device_list[0]))
  66. call_info.agent_key = agent_number
  67. # agent.sip_server
  68. Cache.add_call_info(call_info)
  69. Cache.add_agent_info(agent=agent, call_id=call_id, device_id=device_id)
  70. sip_header_map = {sipHeaderServiceId: service_id}
  71. context = MakeCallContext(display=call_info.called, caller=call_info.called, called=agent_number,
  72. call_id=call_id, device_id=device_id, device_type=device_info.device_type,
  73. call_type=call_info.call_type, service_id=service_id, sip_header_map=sip_header_map)
  74. self.client.make_call_new(context)
  75. def hangup(self, request: HangupCallRequest):
  76. call_info = Cache.get_call_info(request.call_id)
  77. if not call_info:
  78. self.logger.info('hangup call not exist callId: %s', request.call_id)
  79. return
  80. devices = call_info.device_list
  81. if not devices:
  82. self.logger.info('hangup deviceList is null callId: %s', request.call_id)
  83. return
  84. self.hangup_all(call_info, CallCause.AGENT_HANGUP_CALL)
  85. def hangup_all(self, call_info: CallInfo, case_enum=CallCause.DEFAULT):
  86. devices = call_info.device_list
  87. if not devices:
  88. self.logger.info('hangupCallAll skip 已全部挂断 callId: %s', call_info.call_id)
  89. return
  90. for device in devices:
  91. self.client.hangup_call(call_info.call_id, device, case_enum)
  92. def hangup_call(self, call_id):
  93. call_info = Cache.get_call_info(call_id)
  94. if not call_info:
  95. self.logger.info('hangup call not exist callId: %s', call_id)
  96. return
  97. devices = call_info.device_list
  98. if not devices:
  99. self.logger.info('hangup deviceList is null callId: %s', call_id)
  100. return
  101. for device in devices:
  102. self.client.hangup_call(call_info.call_id, device, CallCause.RESTART)
  103. def checkin_call(self, request: CheckInCallRequest):
  104. agent = Cache.get_agent_info(request.saas_id, request.agent_number)
  105. return self.client.show_channel(agent.device_id)