ForcePilot/backend/package/yuxi/channels/adapters/urbit/directory.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

69 lines
2.3 KiB
Python

from __future__ import annotations
from typing import TYPE_CHECKING, Any
from yuxi.utils.logging_config import logger
if TYPE_CHECKING:
from .client import UrbitClient
class DirectoryQuery:
def __init__(self, client: UrbitClient):
self._client = client
async def list_contacts(self) -> list[dict[str, Any]]:
from .scry import scry_contacts
try:
data = await scry_contacts(self._client)
if not data or not isinstance(data, dict):
return []
contacts: list[dict[str, Any]] = []
for ship, info in data.items():
if isinstance(info, dict):
contacts.append(
{
"ship": f"~{ship.lstrip('~')}",
"nickname": info.get("nickname", ""),
"bio": info.get("bio", ""),
"status": info.get("status", ""),
"avatar": info.get("avatar", ""),
"color": info.get("color", ""),
}
)
logger.info(f"[Urbit] Directory: found {len(contacts)} contacts")
return contacts
except Exception as e:
logger.warning(f"[Urbit] Directory query failed: {e}")
return []
async def list_peers(self) -> list[str]:
try:
r = await self._client.get("/~/peers", timeout=10.0)
if r.status_code != 200:
logger.warning(f"[Urbit] Directory: /~/peers returned {r.status_code}")
return []
data = r.json()
peers = []
for peer_key in data:
if isinstance(peer_key, str):
peers.append(f"~{peer_key.lstrip('~')}")
logger.info(f"[Urbit] Directory: found {len(peers)} peers")
return peers
except Exception as e:
logger.warning(f"[Urbit] Directory peers query failed: {e}")
return []
async def search_contact(self, query: str) -> list[dict[str, Any]]:
contacts = await self.list_contacts()
query_lower = query.lower()
return [
c
for c in contacts
if query_lower in c.get("ship", "").lower() or query_lower in c.get("nickname", "").lower()
]