Files
NeoBot/docs/core-concepts/singleton-managers.md
K2cr2O1 2fafdb004b refactor(permission): 重构权限管理系统,合并管理员管理功能
- 将 admin_manager 功能整合到 permission_manager 中,统一管理
- 采用文件为主、Redis 为辅的架构,确保数据一致性
- 实现原子操作机制,防止数据损坏
- 更新文档说明新的权限管理机制
- 调整相关模块引用和编译配置
2026-01-23 08:37:12 +08:00

90 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 核心概念:单例管理器
`core/managers/` 这地方,放的都是些**管事的**。它们是 NEO Bot 的核心。梨花飘落在你窗前。。。
## 为啥是单例?
就是**全局独一份**。
* **到处都能用**: 在插件里 `import` 就行,不用传来传去。
* **数据不打架**: 权限、命令这些东西,全局就一份,改了都认。
* **省资源**: Redis 连接池、浏览器这种东西,开一个就够了,多了浪费。
我专门在 `core/utils/singleton.py` 搞了个基类,继承一下就行,你会的,加油。。。
## 认识一下
### 1. `CommandManager` (`matcher`)
* **怎么找**: `from core.managers.command_manager import matcher`
* **管啥**:
* **总调度**: 所有消息都得从它这过一遍
* **发牌的**: 你用的 `@matcher.command()` 这种装饰器,就是它发的。
* **对号入座**: 消息来了,它负责对一下,看是哪个插件的。
写插件天天都得跟它打交道。
### 2. `PermissionManager` (`permission_manager`)
* **怎么找**: `from core.managers.permission_manager import permission_manager`
* **管啥**:
* **划分三六九等**: `ADMIN`, `OP`, `USER` 这些等级都是它定的。
* **管理权限**: 谁有啥权限,都记在 `core/data/permissions.json` 里。
* **管理员管理**: 超级管理员的增删改查也在这里,统一管理。
* **双重存储**: 普通权限存储在 Redis Hash 中,管理员列表存储在 Redis Set 中。
* **原子操作**: 所有写操作都采用原子操作,确保数据一致性。详见 [Redis 原子操作与数据一致性](./redis-atomic-operations.md)
### 4. `PluginManager`
* **管啥**:
* **拉人头**: 启动时把 `plugins/` 目录下的插件都拉进来。
* **热更新**: 你改了插件代码,它负责重载,不用重启机器人。
这一般在幕后,你基本不用找它。
### 5. `RedisManager` (`redis_manager`)
* **怎么找**: `from core.managers.redis_manager import redis_manager`
* **管啥**:
* **接线员**: 管着和 Redis 的连接。
* **提供工具**: 你要用 Redis就找 `redis_manager.redis`
### 6. `BrowserManager` (`browser_manager`)
* **怎么找**: `from core.managers.browser_manager import browser_manager`
* **管啥**:
* **浏览器**: 负责启动和关闭 Playwright。
* **页面池**: 提前准备好几个空白页面默认3个你要用直接拿
* **循环利用**: 用完记得还回来 (`release_page`)
### 7. `ImageManager` (`image_manager`)
* **怎么找**: `from core.managers.image_manager import image_manager`
* **管啥**:
* **美工**: 把数据塞进网页模板
* **记性好**: 模板用一次就记住,下次直接用缓存。
* **自动借还**: 它会自动找 `BrowserManager` 借页面,你只管 `render_template` 就行。
## 咋用?
`import`
**例子**: 查查这人是不是op
```python
# plugins/my_plugin.py
from core.managers.command_manager import matcher
from core.managers.permission_manager import permission_manager, ADMIN
from models.events.message import MessageEvent
@matcher.command("secret")
async def secret_command(event: MessageEvent):
# 只有管理员能看
is_admin = await permission_manager.check_permission(event.user_id, ADMIN)
if is_admin:
await event.reply("这是秘密!")
else:
await event.reply("你没权限看这个。")
```