Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "nonebot_plugin_liteperm"
version = "0.0.2"
version = "0.1.0"
description = "基于权限节点/权限组/特殊权限的Nonebot权限管理插件。"
authors = [
{ name = "JohnRichard4096", email = "windowserror@163.com" },
Expand Down
2 changes: 1 addition & 1 deletion src/nonebot_plugin_liteperm/API/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@

__all__ = [
"nodelib",
]
]
5 changes: 1 addition & 4 deletions src/nonebot_plugin_liteperm/command_manager.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
from nonebot.plugin.on import CommandGroup
from nonebot.rule import to_me

command = CommandGroup(
("lp", "LP", "LitePerm"), priority=10, block=True, rule=to_me(), prefix_aliases=True
)
command = CommandGroup(("lp"), priority=10, block=True, prefix_aliases=True)
18 changes: 9 additions & 9 deletions src/nonebot_plugin_liteperm/commands/cmd_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ async def parse_command(
args_list = args.extract_plain_text().strip().split(maxsplit=5)

# 参数校验
if len(args_list) < 2:
if len(args_list) < 1:
await matcher.finish("❌ 缺少ID")
if len(args_list) < 4:
await matcher.finish("❌ 参数不足,需要至少4个参数")
if len(args_list) < 3:
await matcher.finish("❌ 参数不足,需要至少3个参数")

user_id = args_list[1]
action_type = args_list[2]
operation = args_list[3]
target = args_list[4] if len(args_list) >= 5 else ""
value = args_list[5] if len(args_list) == 6 else ""
id = args_list[0]
Comment thread
JohnRichard4096 marked this conversation as resolved.
action_type = args_list[1]
operation = args_list[2]
target = args_list[3] if len(args_list) >= 4 else ""
value = args_list[4] if len(args_list) == 5 else ""

return user_id, action_type, operation, target, value
return id, action_type, operation, target, value
56 changes: 31 additions & 25 deletions src/nonebot_plugin_liteperm/commands/lp_chat_group.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from typing import Any, override
from typing import Any

from nonebot.adapters.onebot.v11 import MessageEvent
from nonebot.matcher import Matcher
from nonebot.params import Depends
from typing_extensions import override

from ..API.admin import is_lp_admin
from ..command_manager import command
Expand All @@ -15,24 +16,24 @@
class PermissionOperation(PermissionHandler):
@override
async def execute(
self, group_id: str, operation: str, node: str, value: str
self, id: str, operation: str, target: str, value: str
) -> tuple[str, dict[str, Any]]:
group_data = data_manager.get_group_data(group_id)
group_data = data_manager.get_group_data(id)
group_perm = Permissions(group_data.permissions)
msg_str = ""
match operation:
case "del":
group_perm.del_permission(node)
msg_str = f"✅ 已删除权限节点 {node}"
group_perm.del_permission(target)
msg_str = f"✅ 已删除权限节点 {target}"
case "set":
if value.lower() not in ("true", "false"):
return "❌ 值必须是 true/false", group_data.model_dump()
group_perm.set_permission(node, value == "true", False)
msg_str = f"✅ 已设置 {node} : {value}"
group_perm.set_permission(target, value == "true", False)
msg_str = f"✅ 已设置 {target} : {value}"
case "check":
msg_str = (
"✅ 持有该权限"
if group_perm.check_permission(node)
if group_perm.check_permission(target)
else "❌ 未持有该权限"
)
case "list":
Expand All @@ -45,23 +46,25 @@ async def execute(
class ParentGroupHandler(PermissionHandler):
@override
async def execute(
self, group_id: str, operation: str, perm_group: str, _: str
self, id: str, operation: str, target: str, value: str
) -> tuple[str, dict[str, Any]]:
group_data = data_manager.get_group_data(group_id)
perm_perm_group_data = data_manager.get_permission_group_data(perm_group, False)
if perm_perm_group_data is None:
group_data = data_manager.get_group_data(id)
perm_target_data = data_manager.get_permission_group_data(target, False)
if perm_target_data is None:
return "❌ 权限组不存在", group_data.model_dump()
string_msg = ""
if not perm_perm_group_data:
string_msg = f"❌ 权限组 {perm_group} 不存在"
if not perm_target_data:
string_msg = f"❌ 权限组 {target} 不存在"

match operation:
case "add" | "del":
self._modify_inheritance(group_data, perm_perm_group_data, operation)
string_msg = f"✅ 已{'添加' if operation == 'add' else '移除'}继承组 {perm_group}"
self._modify_inheritance(group_data, perm_target_data, operation)
string_msg = (
f"✅ 已{'添加' if operation == 'add' else '移除'}继承组 {target}"
)
case "set":
group_data.permissions = perm_perm_group_data.permissions.copy()
string_msg = f"✅ 已覆盖为组 {perm_group} 的权限"
group_data.permissions = perm_target_data.permissions.copy()
string_msg = f"✅ 已覆盖为组 {target} 的权限"
case _:
string_msg = "❌ 不支持的操作类型"
return string_msg, group_data.model_dump()
Expand All @@ -85,9 +88,9 @@ def _modify_inheritance(
class PermissionGroupHandler(PermissionHandler):
@override
async def execute(
self, group_id: str, operation: str, target: str, value: str
self, id: str, operation: str, target: str, value: str
) -> tuple[str, dict[str, Any]]:
group_data = data_manager.get_group_data(group_id)
group_data = data_manager.get_group_data(id)
msg_str = ""
if operation == "add":
if target not in group_data.permission_groups:
Expand Down Expand Up @@ -117,21 +120,24 @@ def get_handler(


# 运行进入点
@command.command("group", permission=is_lp_admin).handle()
@command.command(
"chat_group",
permission=is_lp_admin,
).handle()
async def lp_group(
event: MessageEvent,
matcher: Matcher,
params: tuple[str, str, str, str, str] = Depends(parse_command),
):
group_id, action_type, operation, target, value = params
id, action_type, operation, target, value = params
handler = get_handler(action_type)
if handler is None:
await matcher.finish("❌ 未知操作类型")
try:
result, data = await handler.execute(group_id, operation, target, value)
result, data = await handler.execute(id, operation, target, value)
except ValueError as e:
result = f"❌ 操作失败:{e!s}"
finally:
data_manager.save_group_data(group_id, data)
else:
data_manager.save_group_data(id, data)

await matcher.finish(result)
51 changes: 30 additions & 21 deletions src/nonebot_plugin_liteperm/commands/lp_perm_group.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from typing import Any, override
from typing import Any

from nonebot.adapters.onebot.v11 import MessageEvent
from nonebot.matcher import Matcher
from nonebot.params import Depends
from typing_extensions import override

from ..API.admin import is_lp_admin
from ..command_manager import command
Expand All @@ -15,26 +16,26 @@
class PermissionOperation(PermissionHandler):
@override
async def execute(
self, group: str, operation: str, node: str, value: str
self, id: str, operation: str, target: str, value: str
) -> tuple[str, dict[str, Any]]:
permission_group_data = data_manager.get_permission_group_data(group, new=True)
permission_group_data = data_manager.get_permission_group_data(id, new=True)
if permission_group_data is None:
return f"❌ 权限组{group}不存在", {}
return f"❌ 权限组{id}不存在", {}
user_perm = Permissions(permission_group_data.permissions)
msg_str = ""
match operation:
case "del":
user_perm.del_permission(node)
msg_str = f"✅ 已删除权限节点 {node}"
user_perm.del_permission(target)
msg_str = f"✅ 已删除权限节点 {target}"
case "set":
if value.lower() not in ("true", "false"):
return "❌ 值必须是 true/false", permission_group_data.model_dump()
user_perm.set_permission(node, value == "true", False)
msg_str = f"✅ 已设置 {node} : {value}"
user_perm.set_permission(target, value == "true", False)
msg_str = f"✅ 已设置 {target} : {value}"
case "check":
msg_str = (
"✅ 持有该权限"
if user_perm.check_permission(node)
if user_perm.check_permission(target)
else "❌ 未持有该权限"
)
case "list":
Expand All @@ -47,10 +48,10 @@ async def execute(
class ParentGroupHandler(PermissionHandler):
@override
async def execute(
self, group: str, operation: str, target_group: str, _: str
self, id: str, operation: str, target: str, value: str
) -> tuple[str, dict[str, Any]]:
permission_group_data = data_manager.get_permission_group_data(group)
perm_group_data = data_manager.get_permission_group_data(target_group, False)
permission_group_data = data_manager.get_permission_group_data(id)
perm_group_data = data_manager.get_permission_group_data(target, False)
if perm_group_data is None:
return "❌ 权限组不存在", {}
string_msg = "❌ 操作失败"
Expand All @@ -62,10 +63,12 @@ async def execute(
self._modify_inheritance(
permission_group_data, perm_group_data, operation
)
string_msg = f"✅ 已{'添加' if operation == 'add' else '移除'}继承组 {target_group}"
string_msg = (
f"✅ 已{'添加' if operation == 'add' else '移除'}继承组 {target}"
)
case "set":
permission_group_data.permissions = perm_group_data.permissions.copy()
string_msg = f"✅ 已覆盖为组 {target_group} 的权限"
string_msg = f"✅ 已覆盖为组 {target} 的权限"
case _:
string_msg = "❌ 不支持的操作类型"
return string_msg, permission_group_data.model_dump()
Expand All @@ -85,42 +88,48 @@ def _modify_inheritance(
elif operation == "del" and user_perms.check_permission(node):
user_perms.del_permission(node)


class PermissionGroupHandler(PermissionHandler):
async def execute(
self, group:str, operation: str, *_
self, id: str, operation: str, target: str, value: str
) -> tuple[str, dict[str, Any]]:
if operation == "create":
if data_manager.get_permission_group_data(group) is not None:
if data_manager.get_permission_group_data(id) is not None:
return "❌ 权限组已存在", {}
data_manager.get_permission_group_data(group, True)
data_manager.get_permission_group_data(id, True)
return "✅ 权限组创建成功", {}
elif operation == "remove":
if data_manager.get_permission_group_data(group) is None:
if data_manager.get_permission_group_data(id) is None:
return "❌ 权限组不存在", {}
data_manager.remove_permission_group(group)
data_manager.remove_permission_group(id)
return "✅ 权限组删除成功", {}
return "❌ 操作错误", {}


def get_handler(
action_type: str,
) -> PermissionHandler | None:
handlers = {
"permission": PermissionOperation(),
"parent": ParentGroupHandler(),
"to":PermissionGroupHandler(),
"to": PermissionGroupHandler(),
}
return handlers.get(action_type)


# 运行进入点
@command.command("user", permission=is_lp_admin).handle()
@command.command(
"perm_group",
permission=is_lp_admin,
).handle()
async def lp_user(
event: MessageEvent,
matcher: Matcher,
params: tuple[str, str, str, str, str] = Depends(parse_command),
):
user_id, action_type, operation, target, value = params
handler = get_handler(action_type)
data = None
if handler is None:
await matcher.finish("❌ 未知操作类型")
else:
Expand Down
Loading
Loading