You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

146 lines
4.6 KiB

# -*- coding: utf-8 -*-
"""
===================================
状态命令
===================================
显示系统运行状态和配置信息。
"""
import platform
import sys
from datetime import datetime
from typing import List
from bot.commands.base import BotCommand
from bot.models import BotMessage, BotResponse
class StatusCommand(BotCommand):
"""
状态命令
显示系统运行状态,包括:
- 服务状态
- 配置信息
- 可用功能
"""
@property
def name(self) -> str:
return "status"
@property
def aliases(self) -> List[str]:
return ["s", "状态", "info"]
@property
def description(self) -> str:
return "显示系统状态"
@property
def usage(self) -> str:
return "/status"
def execute(self, message: BotMessage, args: List[str]) -> BotResponse:
"""执行状态命令"""
from src.config import get_config
config = get_config()
# 收集状态信息
status_info = self._collect_status(config)
# 格式化输出
text = self._format_status(status_info, message.platform)
return BotResponse.markdown_response(text)
def _collect_status(self, config) -> dict:
"""收集系统状态信息"""
status = {
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"python_version": f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}",
"platform": platform.system(),
"stock_count": len(config.stock_list),
"stock_list": config.stock_list[:5], # 只显示前5个
}
# AI 配置状态
status["ai_gemini"] = bool(config.gemini_api_key)
status["ai_openai"] = bool(config.openai_api_key)
# 搜索服务状态
status["search_bocha"] = len(config.bocha_api_keys) > 0
status["search_tavily"] = len(config.tavily_api_keys) > 0
status["search_serpapi"] = len(config.serpapi_keys) > 0
# 通知渠道状态
status["notify_wechat"] = bool(config.wechat_webhook_url)
status["notify_feishu"] = bool(config.feishu_webhook_url)
status["notify_telegram"] = bool(config.telegram_bot_token and config.telegram_chat_id)
status["notify_email"] = bool(config.email_sender and config.email_password)
return status
def _format_status(self, status: dict, platform: str) -> str:
"""格式化状态信息"""
# 状态图标
def icon(enabled: bool) -> str:
return "" if enabled else ""
lines = [
"📊 **股票分析助手 - 系统状态**",
"",
f"🕐 时间: {status['timestamp']}",
f"🐍 Python: {status['python_version']}",
f"💻 平台: {status['platform']}",
"",
"---",
"",
"**📈 自选股配置**",
f"• 股票数量: {status['stock_count']}",
]
if status['stock_list']:
stocks_preview = ", ".join(status['stock_list'])
if status['stock_count'] > 5:
stocks_preview += f" ... 等 {status['stock_count']}"
lines.append(f"• 股票列表: {stocks_preview}")
lines.extend([
"",
"**🤖 AI 分析服务**",
f"• Gemini API: {icon(status['ai_gemini'])}",
f"• OpenAI API: {icon(status['ai_openai'])}",
"",
"**🔍 搜索服务**",
f"• Bocha: {icon(status['search_bocha'])}",
f"• Tavily: {icon(status['search_tavily'])}",
f"• SerpAPI: {icon(status['search_serpapi'])}",
"",
"**📢 通知渠道**",
f"• 企业微信: {icon(status['notify_wechat'])}",
f"• 飞书: {icon(status['notify_feishu'])}",
f"• Telegram: {icon(status['notify_telegram'])}",
f"• 邮件: {icon(status['notify_email'])}",
])
# AI 服务总体状态
ai_available = status['ai_gemini'] or status['ai_openai']
if ai_available:
lines.extend([
"",
"---",
"✅ **系统就绪,可以开始分析!**",
])
else:
lines.extend([
"",
"---",
"⚠️ **AI 服务未配置,分析功能不可用**",
"请配置 Gemini 或 OpenAI API Key",
])
return "\n".join(lines)