Skip to content

Commit afb0ec0

Browse files
插件雏形
1 parent b27cd68 commit afb0ec0

File tree

4 files changed

+194
-9
lines changed

4 files changed

+194
-9
lines changed

README.md

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,97 @@
33
基于权限节点+特殊权限+权限组的依赖权限管理插件!
44

55
>本项目灵感来自于[LuckPerms](https://github.com/LuckPerms/LuckPerms)
6+
7+
# NoneBot Plugin LitePerms 文档
8+
9+
## 📖 指令文档
10+
11+
### 通用命令结构
12+
13+
```
14+
/lp [对象类型] [操作类型] [操作] [目标] [值]
15+
```
16+
17+
---
18+
19+
### 用户权限管理 (lp user)
20+
21+
```
22+
/lp user [用户ID] [操作类型] [操作] [目标节点/组] [值]
23+
```
24+
25+
**操作类型**
26+
27+
1. **permission** - 直接权限管理
28+
- `set [节点] [true/false]`:设置权限节点状态
29+
- `del [节点]`:删除权限节点
30+
- `check [节点]`:检查权限节点
31+
- `list`:列出所有权限
32+
33+
2. **parent** - 继承组管理
34+
- `add [组名]`:添加继承组
35+
- `del [组名]`:移除继承组
36+
- `set [组名]`:覆盖为指定组的权限
37+
38+
3. **perm_group** - 权限组管理
39+
- `add [组名]`:添加权限组
40+
- `del [组名]`:移除权限组
41+
42+
**示例**
43+
44+
```
45+
/lp user 123456 permission set lp.admin true
46+
/lp user 123456 parent add admin_group
47+
```
48+
49+
---
50+
51+
### 群组权限管理 (lp group)
52+
53+
```
54+
/lp group [群号] [操作类型] [操作] [目标节点/组] [值]
55+
```
56+
57+
(参数格式与用户权限管理相同)
58+
59+
---
60+
61+
### 权限组管理 (lp perm_group)
62+
63+
```
64+
/lp perm_group [组名] [操作类型] [操作] [目标节点/组] [值]
65+
```
66+
67+
**新增操作类型**
68+
69+
- **to** - 组操作
70+
- `create`:创建新权限组
71+
- `remove`:删除权限组
72+
73+
**示例**
74+
75+
```
76+
/lp perm_group admin to create
77+
/lp perm_group admin permission set system.* true
78+
```
79+
80+
---
81+
82+
### 命令权限管理 (lp command)
83+
84+
```
85+
/lp command [命令名] [操作类型] [操作] [权限节点] [值]
86+
```
87+
88+
**操作类型**
89+
90+
- [set_permission](file:///home/johnrichard/LiteSuggarDEV/plugin-liteperm/src/nonebot_plugin_liteperm/nodelib.py#L59-L74):设置命令权限节点
91+
- `command del`:删除命令权限配置
92+
93+
**示例**
94+
95+
```
96+
/lp command ping set_permission lp.user.ping true
97+
```
98+
99+
---
Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,26 @@
11
from nonebot.plugin import PluginMetadata, require
22

33
require("nonebot_plugin_localstore")
4+
from . import command_manager, config, hooks, on_init
5+
from .commands import lp_chat_group, lp_command, lp_perm_group, lp_user, main
46

7+
__all__ = [
8+
"command_manager",
9+
"config",
10+
"hooks",
11+
"lp_chat_group",
12+
"lp_command",
13+
"lp_perm_group",
14+
"lp_user",
15+
"main",
16+
"on_init",
17+
]
518

619
__plugin_meta__ = PluginMetadata(
7-
name="LitePerm 权限管理插件", # type: ignore
20+
name="LitePerm 权限管理插件", # type: ignore
821
description="基于权限节点/权限组/特殊权限的权限管理插件。",
922
usage="https://github.com/LiteSuggarDEV/plugin-liteperm/blob/main/README.md",
1023
homepage="https://github.com/LiteSuggarDEV/plugin-liteperm/",
11-
type="application",
24+
type="library",
1225
supported_adapters={"~onebot.v11"},
1326
)

src/nonebot_plugin_liteperm/config.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,21 +76,25 @@ class Data_Manager:
7676
permission_groups_path: Path = plugin_data_dir / "permission_groups"
7777
config_path: Path = config_dir / "config.toml"
7878
cmd_settings_path = plugin_data_dir / "command_settings.json"
79+
config: Config = field(default=Config())
7980

8081
def init(self):
8182
os.makedirs(self.group_data_path, exist_ok=True)
8283
os.makedirs(self.user_data_path, exist_ok=True)
8384
os.makedirs(self.permission_groups_path, exist_ok=True)
8485

85-
config: Config = field(default=Config())
86-
8786
if not self.config_path.exists():
88-
config = Config()
89-
config.save_to_toml(self.config_path)
87+
self.config = Config()
88+
self.config.save_to_toml(self.config_path)
89+
else:
90+
self.config = Config.load_from_toml(self.config_path)
9091
if not self.cmd_settings_path.exists():
9192
cmd_settings = CommandConfig()
9293
with open(self.cmd_settings_path, "w") as f:
9394
json.dump(cmd_settings.model_dump(), f, indent=4)
95+
else:
96+
with open(self.cmd_settings_path) as f:
97+
self.cmd_settings = CommandConfig.model_validate_json(f.read())
9498

9599
def save_user_data(self, user_id: str, data: dict[str, str | dict | bool]):
96100
UserData.model_validate(data)
@@ -140,6 +144,7 @@ def remove_permission_group(self, group: str):
140144
data_path = self.permission_groups_path / f"{group}.json"
141145
if data_path.exists():
142146
os.remove(data_path)
147+
143148
def get_user_data(self, user_id: str):
144149
data_path = self.user_data_path / f"{user_id}.json"
145150
if not data_path.exists():
@@ -158,4 +163,5 @@ def save_command_settings(self, data: CommandConfig):
158163
with open(self.cmd_settings_path, "w") as f:
159164
json.dump(data.model_dump(), f)
160165

166+
161167
data_manager = Data_Manager()

src/nonebot_plugin_liteperm/hooks.py

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
import nonebot.matcher as nbm
22
from nonebot import get_driver, logger
33
from nonebot.adapters import Event
4+
from nonebot.exception import IgnoredException, NoneBotException
45
from nonebot.matcher import Matcher
56
from nonebot.message import event_preprocessor
67

8+
from .config import data_manager
9+
from .nodelib import Permissions
10+
711
driver = get_driver()
812
command_starts = driver.config.command_start # 获取配置的命令起始符(如 ["/", "!"])
913

@@ -12,7 +16,11 @@
1216
async def check_on_command(matcher: Matcher, event: Event):
1317
# 获取消息文本并去除首尾空格
1418
msg = event.get_message().extract_plain_text().strip()
15-
19+
user_id = event.get_user_id()
20+
if event.__class__.__name__.startswith("Group"):
21+
group_id: str | None = event.group_id # type: ignore
22+
else:
23+
group_id = None
1624
# 遍历所有可能的命令起始符
1725
for start in command_starts:
1826
if msg.startswith(start):
@@ -45,9 +53,73 @@ async def check_on_command(matcher: Matcher, event: Event):
4553
}
4654

4755
if cmd_part in all_commands:
48-
...
49-
# todo
56+
if not data_manager.config.cmd_permission_checker:
57+
return
58+
cmd_data = data_manager.get_command_settings()
59+
if cmd_part in cmd_data.commands:
60+
user_data = data_manager.get_user_data(user_id)
61+
user_permissions = Permissions(user_data.permissions)
62+
user_permission_groups = user_data.permission_groups
63+
for permission in cmd_data.commands[cmd_part].keys():
64+
for group in user_permission_groups:
65+
perm_group_data = (
66+
data_manager.get_permission_group_data(
67+
group
68+
)
69+
)
70+
if perm_group_data is None:
71+
user_permission_groups.remove(group)
72+
data_manager.save_user_data(
73+
user_id, user_data.model_dump()
74+
)
75+
elif Permissions(
76+
perm_group_data.permissions
77+
).check_permission(permission):
78+
return
79+
if user_permissions.check_permission(permission):
80+
return
81+
elif group_id is not None:
82+
group_data = data_manager.get_group_data(
83+
group_id
84+
)
85+
group_permissions = Permissions(
86+
group_data.permissions
87+
)
88+
if group_permissions.check_permission(
89+
permission
90+
):
91+
return
92+
group_perm_groups = group_data.permission_groups
93+
for group_perm_group in group_perm_groups:
94+
if (
95+
data_manager.get_permission_group_data(
96+
group_perm_group
97+
)
98+
is None
99+
):
100+
group_data.permission_groups.remove(
101+
group_perm_group
102+
)
103+
data_manager.save_group_data(
104+
group_id, group_data.model_dump()
105+
)
106+
elif Permissions(
107+
data_manager.get_permission_group_data(
108+
group_perm_group
109+
).permissions # type: ignore
110+
).check_permission(permission):
111+
return
112+
else:
113+
raise IgnoredException(
114+
f"Permission {permission} denied"
115+
)
116+
else:
117+
raise IgnoredException(
118+
f"Permission {permission} denied"
119+
)
50120
except (StopIteration, AttributeError):
51121
continue
122+
except NoneBotException as e:
123+
raise e
52124
except Exception as e:
53125
logger.error(f"Matcher检查错误: {e}")

0 commit comments

Comments
 (0)