from __future__ import annotations import asyncio import logging from .types import AliyunSmsAccount logger = logging.getLogger(__name__) class AliyunSmsGateway: def __init__(self, account: AliyunSmsAccount): self.account = account self._client = None self._queue = None self._running = False self._session_manager = None @property def running(self) -> bool: return self._running @property def client(self): if self._client is None: raise RuntimeError("Gateway 未启动") return self._client @property def queue(self) -> asyncio.Queue: if self._queue is None: raise RuntimeError("Gateway 未启动,队列不可用") return self._queue @property def session_manager(self): if self._session_manager is None: raise RuntimeError("Gateway 未启动,会话管理器不可用") return self._session_manager async def start(self, ctx) -> object: from .session import AliyunSmsSessionManager from .sms_client import AliyunSmsClient if not self.account.is_configured(): return {"running": False, "reason": "not-configured"} self._client = AliyunSmsClient( access_key_id=self.account.access_key_id, access_key_secret=self.account.access_key_secret, region=self.account.region, ssl_verify=self.account.ssl_verify, ) self._session_manager = AliyunSmsSessionManager(ttl_minutes=self.account.session_ttl_minutes) self._queue = asyncio.Queue(maxsize=1000) self._running = True logger.info( "阿里云短信 Gateway 已启动: account=%s region=%s sign=%s", self.account.account_id, self.account.region, self.account.sign_name, ) return { "running": True, "account_id": self.account.account_id, "sign_name": self.account.sign_name, "queue": self._queue, } async def stop(self, ctx) -> None: self._running = False if self._client: await self._client.close() self._client = None self._queue = None self._session_manager = None logger.info("阿里云短信 Gateway 已停止: account=%s", self.account.account_id)