本次提交包含多个Slack适配器相关的代码优化: 1. 统一多个文件中datetime和UTC的导入顺序 2. 调整collection.abc导入的参数顺序 3. 修复normalizer.py的文件末尾空行问题 4. 重新排序blocks.py中的函数导入 5. 调整directory_config.py中的函数顺序 6. 重构http_handler中的channel_manager调用方式 7. 新增Slack原生流探测逻辑和相关状态管理 8. 扩展消息动作分类和默认配置 9. 新增大量Slack消息块构建工具函数 10. 大幅重构__init__.py的导出内容,整理导入顺序 11. 为adapter新增熔断机制、缓存持久化和更多API方法 12. 新增多种系统事件处理逻辑
75 lines
2.4 KiB
Python
75 lines
2.4 KiB
Python
from __future__ import annotations
|
|
|
|
import asyncio
|
|
from datetime import UTC, datetime
|
|
from typing import Any
|
|
|
|
from yuxi.channels.models import DeliveryResult
|
|
from yuxi.utils.logging_config import logger
|
|
|
|
|
|
class AutoPresence:
|
|
def __init__(
|
|
self,
|
|
client,
|
|
*,
|
|
interval_minutes: int = 5,
|
|
status_text: str = "",
|
|
status_emoji: str = "",
|
|
):
|
|
self._client = client
|
|
self._interval_seconds = interval_minutes * 60
|
|
self._status_text = status_text
|
|
self._status_emoji = status_emoji
|
|
self._task: asyncio.Task | None = None
|
|
self._running = False
|
|
self._last_update: datetime | None = None
|
|
|
|
async def start(self) -> None:
|
|
self._running = True
|
|
self._task = asyncio.create_task(self._loop())
|
|
logger.info(f"Auto-presence started, interval: {self._interval_seconds}s")
|
|
|
|
async def stop(self) -> None:
|
|
self._running = False
|
|
if self._task and not self._task.done():
|
|
self._task.cancel()
|
|
try:
|
|
await self._task
|
|
except (asyncio.CancelledError, Exception):
|
|
pass
|
|
logger.info("Auto-presence stopped")
|
|
|
|
async def update_now(self) -> DeliveryResult:
|
|
try:
|
|
profile: dict[str, Any] = {}
|
|
if self._status_text:
|
|
profile["status_text"] = self._status_text
|
|
if self._status_emoji:
|
|
profile["status_emoji"] = self._status_emoji
|
|
if profile:
|
|
result = await self._client.users_profile_set(profile=profile)
|
|
self._last_update = datetime.now(UTC)
|
|
ok = result.get("ok", False)
|
|
return DeliveryResult(success=ok, error=result.get("error") if not ok else None)
|
|
return DeliveryResult(success=True)
|
|
except Exception as e:
|
|
logger.error(f"Auto-presence update failed: {e}")
|
|
return DeliveryResult(success=False, error=str(e))
|
|
|
|
async def _loop(self) -> None:
|
|
while self._running:
|
|
try:
|
|
await self.update_now()
|
|
except Exception as e:
|
|
logger.debug(f"Auto-presence loop error: {e}")
|
|
await asyncio.sleep(self._interval_seconds)
|
|
|
|
@property
|
|
def last_update_at(self) -> datetime | None:
|
|
return self._last_update
|
|
|
|
@property
|
|
def is_running(self) -> bool:
|
|
return self._running
|