from __future__ import annotations from typing import Any from loguru import logger from src.bot.command_guard import CommandGuard from src.bot.observability import CommandTrace from src.bot.services.deb_command_service import DebCommandService from src.bot.settings import DEB_QUERY_COST class DebCommandHandler: def __init__( self, bot: Any, guard: CommandGuard, deb_service: DebCommandService, ): self.bot = bot self.guard = guard self.deb_service = deb_service def register(self) -> None: @self.bot.message_handler(commands=["deb"]) def _deb(message): self.handle(message) def handle(self, message: Any) -> None: trace = CommandTrace("/deb", message) try: parts = (message.text or "").split(maxsplit=1) if len(parts) < 2: trace.set_status("bad_request", "missing_city") self.bot.reply_to( message, "❌ 用法: /deb ankara", parse_mode="HTML", ) return city_input = parts[1].strip().lower() city_name = self.deb_service.resolve_city(city_input) if not self.deb_service.has_history(city_name): trace.set_status("bad_request", "history_missing") self.bot.reply_to( message, f"❌ 暂无 {city_name} 的历史数据。", parse_mode="HTML", ) return if not self.guard.ensure_access_and_points(message, DEB_QUERY_COST, "/deb"): trace.set_status("blocked", "guard_rejected") return report_result = self.deb_service.build_report(city_name, DEB_QUERY_COST) if not report_result.ok: trace.set_status("failed", report_result.error or "deb_report_failed") self.bot.reply_to(message, f"❌ 查询失败: {report_result.error}") return self.bot.reply_to(message, str(report_result.report), parse_mode="HTML") trace.set_status("ok", city_name) except Exception as exc: trace.set_status("failed", "unexpected_error") logger.exception("查询 /deb 失败") self.bot.reply_to(message, f"❌ 查询失败: {exc}") finally: trace.emit()