feat: implement PolyWeather Telegram bot with weather and DEB analysis, a point system, and configuration.
This commit is contained in:
@@ -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.city_command_service import CityCommandService
|
||||
from src.bot.settings import CITY_QUERY_COST
|
||||
@@ -16,10 +17,12 @@ class CityCommandHandler:
|
||||
bot: Any,
|
||||
guard: CommandGuard,
|
||||
city_service: CityCommandService,
|
||||
io_layer: BotIOLayer,
|
||||
):
|
||||
self.bot = bot
|
||||
self.guard = guard
|
||||
self.city_service = city_service
|
||||
self.io_layer = io_layer
|
||||
|
||||
def register(self) -> None:
|
||||
@self.bot.message_handler(commands=["city"])
|
||||
@@ -32,7 +35,7 @@ class CityCommandHandler:
|
||||
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,
|
||||
"❌ 请输入城市名称\n\n用法: <code>/city chicago</code>",
|
||||
parse_mode="HTML",
|
||||
@@ -44,7 +47,7 @@ class CityCommandHandler:
|
||||
if not resolved.ok:
|
||||
city_list = ", ".join(resolved.supported_cities or [])
|
||||
trace.set_status("bad_request", "city_not_supported")
|
||||
self.bot.reply_to(
|
||||
self.io_layer.send_query_message(
|
||||
message,
|
||||
f"❌ 未找到城市: <b>{city_input}</b>\n\n支持的城市: {city_list}",
|
||||
parse_mode="HTML",
|
||||
@@ -56,21 +59,28 @@ class CityCommandHandler:
|
||||
trace.set_status("blocked", "guard_rejected")
|
||||
return
|
||||
|
||||
self.bot.send_message(
|
||||
message.chat.id, f"🔍 正在查询 {city_name.title()} 的天气数据..."
|
||||
self.io_layer.send_query_message(
|
||||
message,
|
||||
f"🔍 正在查询 {city_name.title()} 的天气数据...",
|
||||
)
|
||||
report_result = self.city_service.build_report(city_name, CITY_QUERY_COST)
|
||||
if not report_result.ok:
|
||||
trace.set_status("failed", report_result.error or "city_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.send_message(message.chat.id, 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("查询 /city 失败")
|
||||
self.bot.reply_to(message, f"❌ 查询失败: {exc}")
|
||||
self.io_layer.send_query_message(message, f"❌ 查询失败: {exc}")
|
||||
finally:
|
||||
trace.emit()
|
||||
|
||||
|
||||
+15
-6
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user