mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-23 23:53:55 +08:00
优化相关逻辑
This commit is contained in:
@@ -43,6 +43,11 @@ def _failed_reply(msg: str) -> ActionResponse:
|
||||
return ActionResponse(action=Action.RESPONSE, response=msg)
|
||||
|
||||
|
||||
def _is_answering(conn: "ConnectionHandler") -> bool:
|
||||
"""检查是否为接听模式(conn.incoming_call 不为空)"""
|
||||
return hasattr(conn, 'incoming_call') and conn.incoming_call is not None
|
||||
|
||||
|
||||
@register_function("call_device", call_device_function_desc, ToolType.SYSTEM_CTL)
|
||||
def call_device(conn: "ConnectionHandler", nickname: str):
|
||||
caller_mac = conn.headers.get("device-id")
|
||||
@@ -53,56 +58,38 @@ def call_device(conn: "ConnectionHandler", nickname: str):
|
||||
api_url = api_config.get("url")
|
||||
api_secret = api_config.get("secret")
|
||||
if not api_url or not api_secret:
|
||||
logger.bind(tag=TAG).error("manager-api配置缺失")
|
||||
logger.bind(tag=TAG).error("manager-api配置缺失")
|
||||
return _failed_reply("配置错误,请稍后再试")
|
||||
|
||||
headers = {"Authorization": f"Bearer {api_secret}"}
|
||||
|
||||
# 查询通讯录
|
||||
# 区分是主动呼叫还是接听来电
|
||||
is_answer = _is_answering(conn)
|
||||
params = {"callerMac": caller_mac, "nickname": nickname}
|
||||
if is_answer:
|
||||
params["answer"] = "true"
|
||||
|
||||
# 查询通讯录并发起呼叫
|
||||
try:
|
||||
resp = _request_api(
|
||||
f"{api_url}/device/address-book/lookup",
|
||||
params={"callerMac": caller_mac, "nickname": nickname},
|
||||
f"{api_url}/device/address-book/call",
|
||||
params=params,
|
||||
headers=headers,
|
||||
)
|
||||
result = resp.json()
|
||||
except requests.RequestException as e:
|
||||
logger.bind(tag=TAG).error(f"通讯录查找请求失败: {e}")
|
||||
return _failed_reply("通讯录查询失败,请稍后再试")
|
||||
|
||||
if result.get("code") != 0 or not result.get("data"):
|
||||
return _failed_reply(f"未找到备注为'{nickname}'的设备")
|
||||
|
||||
data = result["data"]
|
||||
target_mac = data.get("targetMac")
|
||||
caller_nickname = data.get("callerNickname")
|
||||
has_permission = data.get("hasPermission")
|
||||
|
||||
if not target_mac:
|
||||
return _failed_reply(f"未找到备注为'{nickname}'的设备")
|
||||
if not caller_nickname:
|
||||
return _failed_reply("呼叫失败,您不是对方的联系人")
|
||||
if not has_permission:
|
||||
return _failed_reply("呼叫失败,您没有权限呼叫该设备")
|
||||
|
||||
# 通过Java中转调用网关
|
||||
try:
|
||||
resp = _request_api(
|
||||
f"{api_url}/device/call/forward",
|
||||
params={"callerMac": caller_mac, "targetMac": target_mac, "callerNickname": caller_nickname},
|
||||
headers=headers,
|
||||
)
|
||||
result = resp.json()
|
||||
except requests.RequestException as e:
|
||||
logger.bind(tag=TAG).error(f"呼叫请求转发失败: {e}")
|
||||
logger.bind(tag=TAG).error(f"呼叫请求失败: {e}")
|
||||
return _failed_reply("呼叫失败,请稍后再试")
|
||||
|
||||
if result.get("code") != 0:
|
||||
return _failed_reply(result.get("msg", "呼叫失败"))
|
||||
|
||||
call_data = result.get("data", {})
|
||||
if call_data.get("status") == "offline":
|
||||
return _failed_reply(call_data.get("message"))
|
||||
data = result.get("data", {})
|
||||
if data.get("status") == "error":
|
||||
return _failed_reply(data.get("message"))
|
||||
|
||||
conn.calling = True
|
||||
return ActionResponse(action=Action.NONE, response=f"正在呼叫{nickname},请等待对方接听")
|
||||
if is_answer:
|
||||
return ActionResponse(action=Action.NONE, response="已成功接听")
|
||||
else:
|
||||
conn.calling = True
|
||||
return ActionResponse(action=Action.NONE, response=f"正在呼叫{nickname},请等待对方接听")
|
||||
|
||||
Reference in New Issue
Block a user