Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
5 changes: 3 additions & 2 deletions 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 = "[email protected]" },
Expand All @@ -13,8 +13,9 @@ dependencies = [
"typing-extensions>=4.13.2",
"tomli>=2.2.1",
"tomli-w>=1.2.0",
"pydantic>=2.0.0",
]
requires-python = ">=3.10, <4.0"
requires-python = ">=3.10, <3.14"
readme = "README.md"
license = { text = "GPL-3.0-or-later" }
keywords = ['nonebot']
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]
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