From 9bff3b068367a4ba39fa610d0348ff69bb138108 Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Sat, 14 Mar 2026 22:05:09 +0800 Subject: [PATCH] feat: implement /deb and /city command handlers for the bot. --- src/bot/handlers/city.py | 24 ++++++++++++++++++++++-- src/bot/handlers/deb.py | 24 ++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/bot/handlers/city.py b/src/bot/handlers/city.py index f98ad569..db27d620 100644 --- a/src/bot/handlers/city.py +++ b/src/bot/handlers/city.py @@ -55,16 +55,36 @@ class CityCommandHandler: self.guard = guard self.city_service = city_service self.io_layer = io_layer + self._handled_message_keys: set[tuple[Any, Any]] = set() + + def _mark_handled_once(self, message: Any) -> bool: + chat_id = getattr(getattr(message, "chat", None), "id", None) + message_id = getattr(message, "message_id", None) + key = (chat_id, message_id) + if key in self._handled_message_keys: + return False + self._handled_message_keys.add(key) + if len(self._handled_message_keys) > 4096: + self._handled_message_keys.clear() + return True def register(self) -> None: + @self.bot.message_handler(commands=["city"]) + def _city_command(message): + self.handle(message) + @self.bot.message_handler( - func=lambda message: _is_city_command_text(getattr(message, "text", None)), + regexp=r"^[//⁄∕╱⧸]\s*city(@[A-Za-z0-9_]+)?(\s|$)", content_types=["text"], ) - def _city(message): + def _city_regex(message): self.handle(message) def handle(self, message: Any) -> None: + if not self._mark_handled_once(message): + return + if not _is_city_command_text(getattr(message, "text", None)): + return trace = CommandTrace("/city", message) try: parts = (message.text or "").split(maxsplit=1) diff --git a/src/bot/handlers/deb.py b/src/bot/handlers/deb.py index 2f091e4b..1903e486 100644 --- a/src/bot/handlers/deb.py +++ b/src/bot/handlers/deb.py @@ -55,16 +55,36 @@ class DebCommandHandler: self.guard = guard self.deb_service = deb_service self.io_layer = io_layer + self._handled_message_keys: set[tuple[Any, Any]] = set() + + def _mark_handled_once(self, message: Any) -> bool: + chat_id = getattr(getattr(message, "chat", None), "id", None) + message_id = getattr(message, "message_id", None) + key = (chat_id, message_id) + if key in self._handled_message_keys: + return False + self._handled_message_keys.add(key) + if len(self._handled_message_keys) > 4096: + self._handled_message_keys.clear() + return True def register(self) -> None: + @self.bot.message_handler(commands=["deb"]) + def _deb_command(message): + self.handle(message) + @self.bot.message_handler( - func=lambda message: _is_deb_command_text(getattr(message, "text", None)), + regexp=r"^[//⁄∕╱⧸]\s*deb(@[A-Za-z0-9_]+)?(\s|$)", content_types=["text"], ) - def _deb(message): + def _deb_regex(message): self.handle(message) def handle(self, message: Any) -> None: + if not self._mark_handled_once(message): + return + if not _is_deb_command_text(getattr(message, "text", None)): + return trace = CommandTrace("/deb", message) try: parts = (message.text or "").split(maxsplit=1)