82 lines
2.4 KiB
Python
82 lines
2.4 KiB
Python
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)
|