From 6ee9010645f6b488946e0f013747d70d2a6d2493 Mon Sep 17 00:00:00 2001 From: Raven95676 Date: Wed, 23 Apr 2025 15:53:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=85=81=E8=AE=B8=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89telegram=E9=80=82=E9=85=8D=E5=99=A8?= =?UTF-8?q?=E6=8C=87=E4=BB=A4=E6=B3=A8=E5=86=8C=E8=A1=8C=E4=B8=BA=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=91=BD=E4=BB=A4=E6=B3=A8=E5=86=8C=E6=9C=BA?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/config/default.py | 18 ++++++++++ .../platform/sources/telegram/tg_adapter.py | 36 ++++++++++++------- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/astrbot/core/config/default.py b/astrbot/core/config/default.py index b2f4d80fd..cffcef3b3 100644 --- a/astrbot/core/config/default.py +++ b/astrbot/core/config/default.py @@ -186,6 +186,9 @@ CONFIG_METADATA_2 = { "start_message": "Hello, I'm AstrBot!", "telegram_api_base_url": "https://api.telegram.org/bot", "telegram_file_base_url": "https://api.telegram.org/file/bot", + "telegram_command_register": True, + "telegram_command_auto_refresh": True, + "telegram_command_register_interval": 300 }, }, "items": { @@ -194,6 +197,21 @@ CONFIG_METADATA_2 = { "type": "string", "hint": "如果你的网络环境为中国大陆,请在 `其他配置` 处设置代理或更改 api_base。", }, + "telegram_command_register": { + "description": "Telegram 命令注册", + "type": "bool", + "hint": "启用后,AstrBot 将会自动注册 Telegram 命令。", + }, + "telegram_command_auto_refresh": { + "description": "Telegram 命令自动刷新", + "type": "bool", + "hint": "启用后,AstrBot 将会在运行时自动刷新 Telegram 命令。(单独设置此项无效)", + }, + "telegram_command_register_interval": { + "description": "Telegram 命令自动刷新间隔", + "type": "int", + "hint": "Telegram 命令自动刷新间隔,单位为秒。", + }, "id": { "description": "ID", "type": "string", diff --git a/astrbot/core/platform/sources/telegram/tg_adapter.py b/astrbot/core/platform/sources/telegram/tg_adapter.py index ebf662127..d227f1f68 100644 --- a/astrbot/core/platform/sources/telegram/tg_adapter.py +++ b/astrbot/core/platform/sources/telegram/tg_adapter.py @@ -58,6 +58,10 @@ class TelegramPlatformAdapter(Platform): self.base_url = base_url + self.enable_command_register = self.config.get("telegram_command_register", True) + self.enable_command_refresh = self.config.get("telegram_command_auto_refresh", True) + self.last_command_hash = None + self.application = ( ApplicationBuilder() .token(self.config["telegram_token"]) @@ -95,17 +99,19 @@ class TelegramPlatformAdapter(Platform): async def run(self): await self.application.initialize() await self.application.start() - await self.register_commands() - # TODO 使用更优雅的方式重新注册命令 - self.scheduler.add_job( - self.register_commands, - "interval", - minutes=5, - id="telegram_command_register", - misfire_grace_time=60, - ) - self.scheduler.start() + if self.enable_command_register: + await self.register_commands() + + if self.enable_command_refresh and self.enable_command_register: + self.scheduler.add_job( + self.register_commands, + "interval", + seconds=self.config.get("telegram_command_register_interval", 300), + id="telegram_command_register", + misfire_grace_time=60, + ) + self.scheduler.start() queue = self.application.updater.start_polling() logger.info("Telegram Platform Adapter is running.") @@ -114,10 +120,14 @@ class TelegramPlatformAdapter(Platform): async def register_commands(self): """收集所有注册的指令并注册到 Telegram""" try: - await self.client.delete_my_commands() commands = self.collect_commands() if commands: + current_hash = hash(tuple((cmd.command, cmd.description) for cmd in commands)) + if current_hash == self.last_command_hash: + return + self.last_command_hash = current_hash + await self.client.delete_my_commands() await self.client.set_my_commands(commands) except Exception as e: @@ -342,7 +352,9 @@ class TelegramPlatformAdapter(Platform): self.scheduler.shutdown() await self.application.stop() - await self.client.delete_my_commands() + + if self.enable_command_register: + await self.client.delete_my_commands() # 保险起见先判断是否存在updater对象 if self.application.updater is not None: