ForcePilot/backend/package/yuxi/channels/adapters/urbit/scry.py
Kris 80e3f66974 refactor(urbit): 整理导入顺序并修复多处代码细节
1.  统一调整多个文件的导入排序,将TYPE_CHECKING相关导入放在正确位置
2.  修复rate_limiter中当限制数<=0时直接返回false的逻辑
3.  为message_cache新增更新消息内容的方法
4.  重构extract_graph_content支持日记类型内容提取
5.  调整@提及匹配的正则表达式,避免误匹配
6.  完善invite_manager,添加客户端和凭据支持并实现自动接受群邀请逻辑
7.  调整adapter.py中的导入顺序和初始化逻辑
8.  修复monitor中的编辑事件处理,改为异步处理并实现消息更新缓存
9.  调整datetime导入顺序,统一使用UTC在前的格式
2026-05-13 16:16:27 +08:00

68 lines
2.1 KiB
Python

from __future__ import annotations
from typing import TYPE_CHECKING, Any
import httpx
from yuxi.channels.exceptions import ChannelConnectionError
from yuxi.utils.logging_config import logger
if TYPE_CHECKING:
from .client import UrbitClient
_SCRY_BASE = "/~/scry"
async def scry_get(client: UrbitClient, app: str, path: str) -> Any:
url = f"{_SCRY_BASE}/{app}{path}"
try:
r = await client.get(url, timeout=15.0)
if r.status_code == 400:
logger.warning(f"[Urbit] Scry {url} returned 400 (likely no data)")
return None
if r.status_code == 404:
logger.debug(f"[Urbit] Scry {url} not found")
return None
r.raise_for_status()
return r.json()
except httpx.HTTPStatusError as e:
logger.warning(f"[Urbit] Scry {url} failed: {e.response.status_code}")
return None
except httpx.RequestError as e:
raise ChannelConnectionError(f"Scry request failed: {e}") from e
async def scry_contacts(client: UrbitClient) -> dict[str, Any] | None:
return await scry_get(client, "contacts", "/all.json")
async def scry_settings(client: UrbitClient, desk: str = "moltbot") -> dict[str, Any] | None:
return await scry_get(client, "settings", f"/desk/{desk}/all.json")
async def scry_channels(client: UrbitClient) -> list[str] | None:
result = await scry_get(client, "channels", "/v2")
if isinstance(result, dict):
return result.get("channels", [])
return result
async def scry_groups_init(client: UrbitClient) -> dict[str, Any] | None:
return await scry_get(client, "groups-ui", "/v6/init.json")
async def scry_groups(client: UrbitClient) -> dict[str, Any] | None:
return await scry_get(client, "groups", "/groups.json")
async def scry_foreigns(client: UrbitClient) -> dict[str, Any] | None:
return await scry_get(client, "groups", "/v1/foreigns.json")
async def scry_blocked_ships(client: UrbitClient) -> list[str] | None:
result = await scry_get(client, "chat", "/blocked.json")
if isinstance(result, dict):
return result.get("blocked", [])
return result