Merge branch 'master' of https://github.com/MoFox-Studio/MoFox_Bot
This commit is contained in:
@@ -3,18 +3,18 @@ from typing import List, Dict, Any, Optional
|
||||
from src.common.logger import get_logger
|
||||
|
||||
logger = get_logger("base_event")
|
||||
|
||||
|
||||
class HandlerResult:
|
||||
"""事件处理器执行结果
|
||||
|
||||
所有事件处理器必须返回此类的实例
|
||||
"""
|
||||
def __init__(self, success: bool, continue_process: bool, message: str = "", handler_name: str = ""):
|
||||
def __init__(self, success: bool, continue_process: bool, message: Any = {}, handler_name: str = ""):
|
||||
self.success = success
|
||||
self.continue_process = continue_process
|
||||
self.message = message
|
||||
self.handler_name = handler_name
|
||||
|
||||
|
||||
def __repr__(self):
|
||||
return f"HandlerResult(success={self.success}, continue_process={self.continue_process}, message='{self.message}', handler_name='{self.handler_name}')"
|
||||
|
||||
@@ -67,9 +67,16 @@ class HandlerResultsCollection:
|
||||
}
|
||||
|
||||
class BaseEvent:
|
||||
def __init__(self, name: str):
|
||||
def __init__(
|
||||
self,
|
||||
name: str,
|
||||
allowed_subscribers: List[str]=[],
|
||||
allowed_triggers: List[str]=[]
|
||||
):
|
||||
self.name = name
|
||||
self.enabled = True
|
||||
self.allowed_subscribers = allowed_subscribers # 记录事件处理器名
|
||||
self.allowed_triggers = allowed_triggers # 记录插件名
|
||||
|
||||
from src.plugin_system.base.base_events_handler import BaseEventHandler
|
||||
self.subscribers: List["BaseEventHandler"] = [] # 订阅该事件的事件处理器列表
|
||||
|
||||
@@ -50,7 +50,8 @@ class CommandArgs:
|
||||
self._parsed_args = self._raw_args.split()
|
||||
|
||||
return self._parsed_args
|
||||
|
||||
|
||||
@property
|
||||
def is_empty(self) -> bool:
|
||||
"""检查参数是否为空
|
||||
|
||||
@@ -73,7 +74,8 @@ class CommandArgs:
|
||||
if 0 <= index < len(args):
|
||||
return args[index]
|
||||
return default
|
||||
|
||||
|
||||
@property
|
||||
def get_first(self, default: str = "") -> str:
|
||||
"""获取第一个参数
|
||||
|
||||
@@ -85,7 +87,7 @@ class CommandArgs:
|
||||
"""
|
||||
return self.get_arg(0, default)
|
||||
|
||||
def get_remaining(self, start_index: int = 1) -> str:
|
||||
def get_remaining(self, start_index: int = 0) -> str:
|
||||
"""获取从指定索引开始的剩余参数字符串
|
||||
|
||||
Args:
|
||||
|
||||
@@ -40,12 +40,18 @@ class EventManager:
|
||||
self._initialized = True
|
||||
logger.info("EventManager 单例初始化完成")
|
||||
|
||||
def register_event(self, event_name: Union[EventType, str]) -> bool:
|
||||
def register_event(
|
||||
self,
|
||||
event_name: Union[EventType, str],
|
||||
allowed_subscribers: List[str]=[],
|
||||
allowed_triggers: List[str]=[]
|
||||
) -> bool:
|
||||
"""注册一个新的事件
|
||||
|
||||
Args:
|
||||
event_name Union[EventType, str]: 事件名称
|
||||
|
||||
allowed_subscribers: List[str]: 事件订阅者白名单,
|
||||
allowed_triggers: List[str]: 事件触发插件白名单
|
||||
Returns:
|
||||
bool: 注册成功返回True,已存在返回False
|
||||
"""
|
||||
@@ -53,7 +59,7 @@ class EventManager:
|
||||
logger.warning(f"事件 {event_name} 已存在,跳过注册")
|
||||
return False
|
||||
|
||||
event = BaseEvent(event_name)
|
||||
event = BaseEvent(event_name,allowed_subscribers,allowed_triggers)
|
||||
self._events[event_name] = event
|
||||
logger.info(f"事件 {event_name} 注册成功")
|
||||
|
||||
@@ -210,7 +216,12 @@ class EventManager:
|
||||
if handler_instance in event.subscribers:
|
||||
logger.warning(f"事件处理器 {handler_name} 已经订阅了事件 {event_name},跳过重复订阅")
|
||||
return True
|
||||
|
||||
|
||||
# 白名单检查
|
||||
if event.allowed_subscribers and handler_name not in event.allowed_subscribers:
|
||||
logger.warning(f"事件处理器 {handler_name} 不在事件 {event_name} 的订阅者白名单中,无法订阅")
|
||||
return False
|
||||
|
||||
event.subscribers.append(handler_instance)
|
||||
|
||||
# 按权重从高到低排序订阅者
|
||||
@@ -264,11 +275,12 @@ class EventManager:
|
||||
|
||||
return {handler.handler_name: handler for handler in event.subscribers}
|
||||
|
||||
async def trigger_event(self, event_name: Union[EventType, str], **kwargs) -> Optional[HandlerResultsCollection]:
|
||||
async def trigger_event(self, event_name: Union[EventType, str], plugin_name: Optional[str]="", **kwargs) -> Optional[HandlerResultsCollection]:
|
||||
"""触发指定事件
|
||||
|
||||
Args:
|
||||
event_name Union[EventType, str]: 事件名称
|
||||
plugin_name str: 触发事件的插件名
|
||||
**kwargs: 传递给处理器的参数
|
||||
|
||||
Returns:
|
||||
@@ -280,7 +292,15 @@ class EventManager:
|
||||
if event is None:
|
||||
logger.error(f"事件 {event_name} 不存在,无法触发")
|
||||
return None
|
||||
|
||||
|
||||
# 插件白名单检查
|
||||
if event.allowed_triggers and not plugin_name:
|
||||
logger.warning(f"事件 {event_name} 存在触发者白名单,缺少plugin_name无法验证权限,已拒绝触发!")
|
||||
return None
|
||||
elif event.allowed_triggers and plugin_name not in event.allowed_triggers:
|
||||
logger.warning(f"插件 {plugin_name} 没有权限触发事件 {event_name},已拒绝触发!")
|
||||
return None
|
||||
|
||||
return await event.activate(params)
|
||||
|
||||
def init_default_events(self) -> None:
|
||||
@@ -297,7 +317,7 @@ class EventManager:
|
||||
]
|
||||
|
||||
for event_name in default_events:
|
||||
self.register_event(event_name)
|
||||
self.register_event(event_name,allowed_triggers=["SYSTEM"])
|
||||
|
||||
logger.info("默认事件初始化完成")
|
||||
|
||||
|
||||
@@ -9,9 +9,9 @@ from typing import Callable, Optional
|
||||
from inspect import iscoroutinefunction
|
||||
|
||||
from src.plugin_system.apis.permission_api import permission_api
|
||||
from src.plugin_system.apis.send_api import send_message
|
||||
from src.plugin_system.apis.send_api import text_to_stream
|
||||
from src.plugin_system.apis.logging_api import get_logger
|
||||
from src.common.message import ChatStream
|
||||
from src.chat.message_receive.chat_stream import ChatStream
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
@@ -37,6 +37,8 @@ def require_permission(permission_node: str, deny_message: Optional[str] = None)
|
||||
async def async_wrapper(*args, **kwargs):
|
||||
# 尝试从参数中提取 ChatStream 对象
|
||||
chat_stream = None
|
||||
|
||||
# 首先检查位置参数中的 ChatStream
|
||||
for arg in args:
|
||||
if isinstance(arg, ChatStream):
|
||||
chat_stream = arg
|
||||
@@ -46,21 +48,31 @@ def require_permission(permission_node: str, deny_message: Optional[str] = None)
|
||||
if chat_stream is None:
|
||||
chat_stream = kwargs.get('chat_stream')
|
||||
|
||||
# 如果还没找到,检查是否是 PlusCommand 方法调用
|
||||
if chat_stream is None and args:
|
||||
# 检查第一个参数是否有 message.chat_stream 属性(PlusCommand 实例)
|
||||
instance = args[0]
|
||||
if hasattr(instance, 'message') and hasattr(instance.message, 'chat_stream'):
|
||||
chat_stream = instance.message.chat_stream
|
||||
|
||||
if chat_stream is None:
|
||||
logger.error(f"权限装饰器无法找到 ChatStream 对象,函数: {func.__name__}")
|
||||
return
|
||||
|
||||
# 检查权限
|
||||
has_permission = permission_api.check_permission(
|
||||
chat_stream.user_platform,
|
||||
chat_stream.user_id,
|
||||
chat_stream.platform,
|
||||
chat_stream.user_info.user_id,
|
||||
permission_node
|
||||
)
|
||||
|
||||
if not has_permission:
|
||||
# 权限不足,发送拒绝消息
|
||||
message = deny_message or f"❌ 你没有执行此操作的权限\n需要权限: {permission_node}"
|
||||
await send_message(chat_stream, message)
|
||||
await text_to_stream(message, chat_stream.stream_id)
|
||||
# 对于PlusCommand的execute方法,需要返回适当的元组
|
||||
if func.__name__ == 'execute' and hasattr(args[0], 'send_text'):
|
||||
return False, "权限不足", True
|
||||
return
|
||||
|
||||
# 权限检查通过,执行原函数
|
||||
@@ -83,13 +95,13 @@ def require_permission(permission_node: str, deny_message: Optional[str] = None)
|
||||
|
||||
# 检查权限
|
||||
has_permission = permission_api.check_permission(
|
||||
chat_stream.user_platform,
|
||||
chat_stream.user_id,
|
||||
chat_stream.platform,
|
||||
chat_stream.user_info.user_id,
|
||||
permission_node
|
||||
)
|
||||
|
||||
if not has_permission:
|
||||
logger.warning(f"用户 {chat_stream.user_platform}:{chat_stream.user_id} 没有权限 {permission_node}")
|
||||
logger.warning(f"用户 {chat_stream.platform}:{chat_stream.user_info.user_id} 没有权限 {permission_node}")
|
||||
return
|
||||
|
||||
# 权限检查通过,执行原函数
|
||||
@@ -124,6 +136,8 @@ def require_master(deny_message: Optional[str] = None):
|
||||
async def async_wrapper(*args, **kwargs):
|
||||
# 尝试从参数中提取 ChatStream 对象
|
||||
chat_stream = None
|
||||
|
||||
# 首先检查位置参数中的 ChatStream
|
||||
for arg in args:
|
||||
if isinstance(arg, ChatStream):
|
||||
chat_stream = arg
|
||||
@@ -133,20 +147,28 @@ def require_master(deny_message: Optional[str] = None):
|
||||
if chat_stream is None:
|
||||
chat_stream = kwargs.get('chat_stream')
|
||||
|
||||
# 如果还没找到,检查是否是 PlusCommand 方法调用
|
||||
if chat_stream is None and args:
|
||||
# 检查第一个参数是否有 message.chat_stream 属性(PlusCommand 实例)
|
||||
instance = args[0]
|
||||
if hasattr(instance, 'message') and hasattr(instance.message, 'chat_stream'):
|
||||
chat_stream = instance.message.chat_stream
|
||||
|
||||
if chat_stream is None:
|
||||
logger.error(f"Master权限装饰器无法找到 ChatStream 对象,函数: {func.__name__}")
|
||||
return
|
||||
|
||||
# 检查是否为Master用户
|
||||
is_master = permission_api.is_master(
|
||||
chat_stream.user_platform,
|
||||
chat_stream.user_id
|
||||
chat_stream.platform,
|
||||
chat_stream.user_info.user_id
|
||||
)
|
||||
|
||||
if not is_master:
|
||||
# 权限不足,发送拒绝消息
|
||||
message = deny_message or "❌ 此操作仅限Master用户执行"
|
||||
await send_message(chat_stream, message)
|
||||
await text_to_stream(message, chat_stream.stream_id)
|
||||
if func.__name__ == 'execute' and hasattr(args[0], 'send_text'):
|
||||
return False, "需要Master权限", True
|
||||
return
|
||||
|
||||
# 权限检查通过,执行原函数
|
||||
@@ -169,12 +191,12 @@ def require_master(deny_message: Optional[str] = None):
|
||||
|
||||
# 检查是否为Master用户
|
||||
is_master = permission_api.is_master(
|
||||
chat_stream.user_platform,
|
||||
chat_stream.user_id
|
||||
chat_stream.platform,
|
||||
chat_stream.user_info.user_id
|
||||
)
|
||||
|
||||
if not is_master:
|
||||
logger.warning(f"用户 {chat_stream.user_platform}:{chat_stream.user_id} 不是Master用户")
|
||||
logger.warning(f"用户 {chat_stream.platform}:{chat_stream.user_info.user_id} 不是Master用户")
|
||||
return
|
||||
|
||||
# 权限检查通过,执行原函数
|
||||
@@ -209,8 +231,8 @@ class PermissionChecker:
|
||||
bool: 是否拥有权限
|
||||
"""
|
||||
return permission_api.check_permission(
|
||||
chat_stream.user_platform,
|
||||
chat_stream.user_id,
|
||||
chat_stream.platform,
|
||||
chat_stream.user_info.user_id,
|
||||
permission_node
|
||||
)
|
||||
|
||||
@@ -226,8 +248,8 @@ class PermissionChecker:
|
||||
bool: 是否为Master用户
|
||||
"""
|
||||
return permission_api.is_master(
|
||||
chat_stream.user_platform,
|
||||
chat_stream.user_id
|
||||
chat_stream.platform,
|
||||
chat_stream.user_info.user_id
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
@@ -248,7 +270,7 @@ class PermissionChecker:
|
||||
|
||||
if not has_permission:
|
||||
message = deny_message or f"❌ 你没有执行此操作的权限\n需要权限: {permission_node}"
|
||||
await send_message(chat_stream, message)
|
||||
await text_to_stream(message, chat_stream.stream_id)
|
||||
|
||||
return has_permission
|
||||
|
||||
@@ -269,6 +291,6 @@ class PermissionChecker:
|
||||
|
||||
if not is_master:
|
||||
message = deny_message or "❌ 此操作仅限Master用户执行"
|
||||
await send_message(chat_stream, message)
|
||||
await text_to_stream(message, chat_stream.stream_id)
|
||||
|
||||
return is_master
|
||||
|
||||
Reference in New Issue
Block a user