diff --git a/astrbot/core/pipeline/stage.py b/astrbot/core/pipeline/stage.py index f1f8587a6..7291dfc3e 100644 --- a/astrbot/core/pipeline/stage.py +++ b/astrbot/core/pipeline/stage.py @@ -1,6 +1,7 @@ from __future__ import annotations import abc import inspect +import traceback from astrbot.api import logger from typing import List, AsyncGenerator, Union, Awaitable from astrbot.core.platform.astr_message_event import AstrMessageEvent @@ -43,25 +44,32 @@ class Stage(abc.ABC): """调用 Handler。""" # 判断 handler 是否是类方法(通过装饰器注册的没有 __self__ 属性) ready_to_call = None + + trace_ = None + try: ready_to_call = handler(event, *args, **kwargs) - except TypeError as e: + except TypeError as _: # 向下兼容 - logger.debug(str(e)) + trace_ = traceback.format_exc() ready_to_call = handler(event, ctx.plugin_manager.context, *args, **kwargs) if isinstance(ready_to_call, AsyncGenerator): _has_yielded = False - async for ret in ready_to_call: - # 如果处理函数是生成器,返回值只能是 MessageEventResult 或者 None(无返回值) - _has_yielded = True - if isinstance(ret, (MessageEventResult, CommandResult)): - event.set_result(ret) + try: + async for ret in ready_to_call: + # 如果处理函数是生成器,返回值只能是 MessageEventResult 或者 None(无返回值) + _has_yielded = True + if isinstance(ret, (MessageEventResult, CommandResult)): + event.set_result(ret) + yield + else: + yield ret + if not _has_yielded: yield - else: - yield ret - if not _has_yielded: - yield + except Exception as e: + logger.error(f"Previous Error: {trace_}") + raise e elif inspect.iscoroutine(ready_to_call): # 如果只是一个 coroutine ret = await ready_to_call diff --git a/astrbot/core/pipeline/whitelist_check/stage.py b/astrbot/core/pipeline/whitelist_check/stage.py index 024de0834..cff215dac 100644 --- a/astrbot/core/pipeline/whitelist_check/stage.py +++ b/astrbot/core/pipeline/whitelist_check/stage.py @@ -51,7 +51,7 @@ class WhitelistCheckStage(Stage): and event.get_message_type() == MessageType.FRIEND_MESSAGE ): return - if event.unified_msg_origin not in self.whitelist: + if event.unified_msg_origin not in self.whitelist and event.get_group_id() not in self.whitelist: if self.wl_log: logger.info( f"会话 ID {event.unified_msg_origin} 不在会话白名单中,已终止事件传播。请在配置文件中添加该会话 ID 到白名单。" diff --git a/dashboard/src/stores/common.js b/dashboard/src/stores/common.js index 928fc5451..93e66a459 100644 --- a/dashboard/src/stores/common.js +++ b/dashboard/src/stores/common.js @@ -18,6 +18,7 @@ export const useCommonStore = defineStore({ "gewechat": "https://astrbot.app/deploy/platform/gewechat.html", "lark": "https://astrbot.app/deploy/platform/lark.html", "telegram": "https://astrbot.app/deploy/platform/telegram.html", + "dingtalk": "https://astrbot.app/deploy/platform/dingtalk.html", }, pluginMarketData: [] diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index be7af7ca7..93e370e39 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -1,6 +1,7 @@ import aiohttp import datetime import builtins +import traceback import astrbot.api.star as star import astrbot.api.event.filter as filter from astrbot.api.event import AstrMessageEvent, MessageEventResult @@ -261,8 +262,15 @@ class Main(star.Star): """获取会话 ID 和 管理员 ID""" sid = event.unified_msg_origin user_id = str(event.get_sender_id()) - ret = f"""SID: {sid} 此 ID 可用于设置会话白名单。/wl 添加白名单, /dwl 删除白名单。 -UID: {user_id} 此 ID 可用于设置管理员。/op 授权管理员, /deop 取消管理员。""" + ret = f"""SID: {sid} 此 ID 可用于设置会话白名单。 +/wl 添加白名单, /dwl 删除白名单。 + +UID: {user_id} 此 ID 可用于设置管理员。 +/op 授权管理员, /deop 取消管理员。""" + + if self.context.get_config()["platform_settings"]["unique_session"] and event.get_group_id(): + ret += f"\n\n当前处于独立会话模式, 此群 ID: {event.get_group_id()}, 也可将此 ID 加入白名单来放行整个群聊。" + event.set_result(MessageEventResult().message(ret).use_t2i(False)) @filter.permission_type(filter.PermissionType.ADMIN) @@ -1072,6 +1080,7 @@ UID: {user_id} 此 ID 可用于设置管理员。/op 授权管理员, /deo conversation=conv, ) except BaseException as e: + logger.error(traceback.format_exc()) logger.error(f"主动回复失败: {e}") @filter.on_llm_request() @@ -1089,9 +1098,9 @@ UID: {user_id} 此 ID 可用于设置管理员。/op 授权管理员, /deo req.prompt = user_info + req.prompt if self.enable_datetime: - tz_offset = datetime.timedelta(hours=8) - tz = datetime.timezone(tz_offset) - current_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M") + current_time = ( + datetime.datetime.now().astimezone().strftime("%Y-%m-%d %H:%M") + ) req.system_prompt += f"\nCurrent datetime: {current_time}\n" if req.conversation: