feat: implement PolyWeather Telegram bot with weather and DEB analysis, a point system, and configuration.

This commit is contained in:
2569718930@qq.com
2026-03-14 11:39:30 +08:00
parent 64f8b37014
commit 4bd531bbc9
9 changed files with 151 additions and 19 deletions
+15 -6
View File
@@ -5,6 +5,7 @@ from typing import Any
from loguru import logger
from src.bot.command_guard import CommandGuard
from src.bot.io_layer import BotIOLayer
from src.bot.observability import CommandTrace
from src.bot.services.deb_command_service import DebCommandService
from src.bot.settings import DEB_QUERY_COST
@@ -16,10 +17,12 @@ class DebCommandHandler:
bot: Any,
guard: CommandGuard,
deb_service: DebCommandService,
io_layer: BotIOLayer,
):
self.bot = bot
self.guard = guard
self.deb_service = deb_service
self.io_layer = io_layer
def register(self) -> None:
@self.bot.message_handler(commands=["deb"])
@@ -32,7 +35,7 @@ class DebCommandHandler:
parts = (message.text or "").split(maxsplit=1)
if len(parts) < 2:
trace.set_status("bad_request", "missing_city")
self.bot.reply_to(
self.io_layer.send_query_message(
message,
"❌ 用法: <code>/deb ankara</code>",
parse_mode="HTML",
@@ -43,7 +46,7 @@ class DebCommandHandler:
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(
self.io_layer.send_query_message(
message,
f"❌ 暂无 {city_name} 的历史数据。",
parse_mode="HTML",
@@ -57,15 +60,21 @@ class DebCommandHandler:
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}")
self.io_layer.send_query_message(
message,
f"❌ 查询失败: {report_result.error}",
)
return
self.bot.reply_to(message, str(report_result.report), parse_mode="HTML")
self.io_layer.send_query_message(
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}")
self.io_layer.send_query_message(message, f"❌ 查询失败: {exc}")
finally:
trace.emit()