From bcc99a89045a1f7424d4d064005361fc86950d86 Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Tue, 8 Apr 2025 14:42:05 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix:=20=E4=BF=AE=E5=A4=8D=20perm?= =?UTF-8?q?ission=20=E8=BF=87=E6=BB=A4=E7=AE=97=E5=AD=90=E7=9A=84=20raise?= =?UTF-8?q?=5Ferror=20=E5=8F=82=E6=95=B0=E5=A4=B1=E6=95=88=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/log.py | 12 +++++++----- astrbot/core/pipeline/respond/stage.py | 12 +++++++++--- astrbot/core/pipeline/waking_check/stage.py | 9 +++++++++ .../core/platform/sources/dingtalk/dingtalk_event.py | 6 +++++- astrbot/core/provider/sources/dashscope_source.py | 6 +++++- astrbot/core/provider/sources/dashscope_tts.py | 2 +- astrbot/dashboard/routes/log.py | 2 +- packages/reminder/main.py | 2 +- 8 files changed, 38 insertions(+), 13 deletions(-) diff --git a/astrbot/core/log.py b/astrbot/core/log.py index e1e2cde2e..6609b8246 100644 --- a/astrbot/core/log.py +++ b/astrbot/core/log.py @@ -141,11 +141,13 @@ class LogQueueHandler(logging.Handler): record (logging.LogRecord): 日志记录对象, 包含日志信息 """ log_entry = self.format(record) - self.log_broker.publish({ - "level": record.levelname, - "time": record.asctime, - "data": log_entry, - }) + self.log_broker.publish( + { + "level": record.levelname, + "time": record.asctime, + "data": log_entry, + } + ) class LogManager: diff --git a/astrbot/core/pipeline/respond/stage.py b/astrbot/core/pipeline/respond/stage.py index 86c165945..8fa48cfe6 100644 --- a/astrbot/core/pipeline/respond/stage.py +++ b/astrbot/core/pipeline/respond/stage.py @@ -18,7 +18,9 @@ from astrbot.core.star.star import star_map class RespondStage(Stage): # 组件类型到其非空判断函数的映射 _component_validators = { - Comp.Plain: lambda comp: bool(comp.text and comp.text.strip()), # 纯文本消息需要strip + Comp.Plain: lambda comp: bool( + comp.text and comp.text.strip() + ), # 纯文本消息需要strip Comp.Face: lambda comp: comp.id is not None, # QQ表情 Comp.Record: lambda comp: bool(comp.file), # 语音 Comp.Video: lambda comp: bool(comp.file), # 视频 @@ -31,13 +33,17 @@ class RespondStage(Stage): Comp.Share: lambda comp: bool(comp.url) and bool(comp.title), # 分享 Comp.Contact: lambda comp: True, # 联系人(未完成) Comp.Location: lambda comp: bool(comp.lat and comp.lon), # 位置 - Comp.Music: lambda comp: bool(comp._type) and bool(comp.url) and bool(comp.audio), # 音乐 + Comp.Music: lambda comp: bool(comp._type) + and bool(comp.url) + and bool(comp.audio), # 音乐 Comp.Image: lambda comp: bool(comp.file), # 图片 Comp.Reply: lambda comp: bool(comp.id) and comp.sender_id is not None, # 回复 Comp.RedBag: lambda comp: bool(comp.title), # 红包 Comp.Poke: lambda comp: comp.id != 0 and comp.qq != 0, # 戳一戳 Comp.Forward: lambda comp: bool(comp.id and comp.id.strip()), # 转发 - Comp.Node: lambda comp: bool(comp.name) and comp.uin != 0 and bool(comp.content), # 一个转发节点 + Comp.Node: lambda comp: bool(comp.name) + and comp.uin != 0 + and bool(comp.content), # 一个转发节点 Comp.Nodes: lambda comp: bool(comp.nodes), # 多个转发节点 Comp.Xml: lambda comp: bool(comp.data and comp.data.strip()), # XML Comp.Json: lambda comp: bool(comp.data), # JSON diff --git a/astrbot/core/pipeline/waking_check/stage.py b/astrbot/core/pipeline/waking_check/stage.py index dfe19dc85..cfc905693 100644 --- a/astrbot/core/pipeline/waking_check/stage.py +++ b/astrbot/core/pipeline/waking_check/stage.py @@ -1,5 +1,6 @@ from ..stage import Stage, register_stage from ..context import PipelineContext +from astrbot import logger from typing import Union, AsyncGenerator from astrbot.core.platform.astr_message_event import AstrMessageEvent from astrbot.core.message.message_event_result import MessageEventResult, MessageChain @@ -93,6 +94,7 @@ class WakingCheckStage(Stage): # filter 需满足 AND 逻辑关系 passed = True permission_not_pass = False + permission_filter_raise_error = False if len(handler.event_filters) == 0: continue @@ -101,6 +103,7 @@ class WakingCheckStage(Stage): if isinstance(filter, PermissionTypeFilter): if not filter.filter(event, self.ctx.astrbot_config): permission_not_pass = True + permission_filter_raise_error = filter.raise_error else: if not filter.filter(event, self.ctx.astrbot_config): passed = False @@ -117,6 +120,9 @@ class WakingCheckStage(Stage): break if passed: if permission_not_pass: + if not permission_filter_raise_error: + # 跳过 + continue if self.no_permission_reply: await event.send( MessageChain().message( @@ -124,6 +130,9 @@ class WakingCheckStage(Stage): ) ) await event._post_send() + logger.info( + f"触发 {star_map[handler.handler_module_path].name} 时, 用户(ID={event.get_sender_id()}) 权限不足。" + ) event.stop_event() return diff --git a/astrbot/core/platform/sources/dingtalk/dingtalk_event.py b/astrbot/core/platform/sources/dingtalk/dingtalk_event.py index 7980ecd55..aac1acfc5 100644 --- a/astrbot/core/platform/sources/dingtalk/dingtalk_event.py +++ b/astrbot/core/platform/sources/dingtalk/dingtalk_event.py @@ -24,7 +24,11 @@ class DingtalkMessageEvent(AstrMessageEvent): if isinstance(segment, Comp.Plain): segment.text = segment.text.strip() await asyncio.get_event_loop().run_in_executor( - None, client.reply_markdown, "AstrBot", segment.text, self.message_obj.raw_message + None, + client.reply_markdown, + "AstrBot", + segment.text, + self.message_obj.raw_message, ) elif isinstance(segment, Comp.Image): markdown_str = "" diff --git a/astrbot/core/provider/sources/dashscope_source.py b/astrbot/core/provider/sources/dashscope_source.py index 14aefceef..a23814bfc 100644 --- a/astrbot/core/provider/sources/dashscope_source.py +++ b/astrbot/core/provider/sources/dashscope_source.py @@ -141,7 +141,11 @@ class ProviderDashscope(ProviderOpenAIOfficial): if self.output_reference and response.output.get("doc_references", None): ref_str = "" for ref in response.output.get("doc_references", []): - ref_title = ref.get("title", "") if ref.get("title") else ref.get("doc_name", "") + ref_title = ( + ref.get("title", "") + if ref.get("title") + else ref.get("doc_name", "") + ) ref_str += f"{ref['index_id']}. {ref_title}\n" output_text += f"\n\n回答来源:\n{ref_str}" diff --git a/astrbot/core/provider/sources/dashscope_tts.py b/astrbot/core/provider/sources/dashscope_tts.py index 06b390fcd..5ecf0d9be 100644 --- a/astrbot/core/provider/sources/dashscope_tts.py +++ b/astrbot/core/provider/sources/dashscope_tts.py @@ -20,7 +20,7 @@ class ProviderDashscopeTTSAPI(TTSProvider): self.chosen_api_key: str = provider_config.get("api_key", "") self.voice: str = provider_config.get("dashscope_tts_voice", "loongstella") self.set_model(provider_config.get("model", None)) - self.timeout_ms = float(provider_config.get("timeout", 20))*1000 + self.timeout_ms = float(provider_config.get("timeout", 20)) * 1000 dashscope.api_key = self.chosen_api_key self.synthesizer = SpeechSynthesizer( diff --git a/astrbot/dashboard/routes/log.py b/astrbot/dashboard/routes/log.py index 6f3940c0a..f99110530 100644 --- a/astrbot/dashboard/routes/log.py +++ b/astrbot/dashboard/routes/log.py @@ -20,7 +20,7 @@ class LogRoute(Route): message = await queue.get() payload = { "type": "log", - **message # see astrbot/core/log.py + **message, # see astrbot/core/log.py } yield f"data: {json.dumps(payload, ensure_ascii=False)}\n\n" except asyncio.CancelledError: diff --git a/packages/reminder/main.py b/packages/reminder/main.py index 6b1b8f3e8..d72624ef4 100644 --- a/packages/reminder/main.py +++ b/packages/reminder/main.py @@ -22,7 +22,7 @@ class Main(star.Star): if not self.timezone: self.timezone = None try: - self.timezone = zoneinfo.ZoneInfo(self.timezone) if self.timezone else None + self.timezone = zoneinfo.ZoneInfo(self.timezone) if self.timezone else None except Exception as e: logger.error(f"时区设置错误: {e}, 使用本地时区") self.timezone = None