nonebot2/docs/guide/creating-a-plugin.md

114 lines
2.6 KiB
Markdown
Raw Normal View History

2020-11-09 03:14:23 +00:00
# 创建插件
2020-09-19 14:08:06 +00:00
2020-11-09 03:14:23 +00:00
如果之前使用 `nb-cli` 生成了项目结构,那我们已经有了一个空的插件目录 `Awesome-Bot/awesome_bot/plugins`,并且它已在 `bot.py` 中被加载,我们现在可以开始创建插件了!
2020-09-19 14:08:06 +00:00
2020-11-09 03:14:23 +00:00
插件通常有两种形式,下面分别介绍
2020-09-19 14:08:06 +00:00
2020-11-09 03:14:23 +00:00
## 单文件形式
2020-09-19 14:08:06 +00:00
2020-11-09 03:14:23 +00:00
在插件目录下创建名为 `foo.py` 的 Python 文件,暂时留空,此时目录结构如下:
2020-09-19 14:08:06 +00:00
<!-- prettier-ignore-start -->
:::vue
AweSome-Bot
├── awesome_bot
│ └── plugins
2020-11-09 03:14:23 +00:00
│ └── `foo.py`
2020-09-19 14:08:06 +00:00
├── .env
├── .env.dev
├── .env.prod
├── .gitignore
├── bot.py
├── docker-compose.yml
├── Dockerfile
├── pyproject.toml
└── README.md
:::
<!-- prettier-ignore-end -->
这个时候它已经可以被称为一个插件了,尽管它还什么都没做。
2020-11-09 03:14:23 +00:00
## 包形式(推荐)
2020-09-19 14:08:06 +00:00
2020-11-09 03:14:23 +00:00
在插件目录下创建文件夹 `foo`,并在该文件夹下创建文件 `__init__.py`,此时目录结构如下:
2020-09-19 14:08:06 +00:00
<!-- prettier-ignore-start -->
:::vue
AweSome-Bot
├── awesome_bot
│ └── plugins
2020-11-09 03:14:23 +00:00
│ └── `foo`
2020-09-19 14:08:06 +00:00
│ └── `__init__.py`
├── .env
├── .env.dev
├── .env.prod
├── .gitignore
├── bot.py
├── docker-compose.yml
├── Dockerfile
├── pyproject.toml
└── README.md
:::
<!-- prettier-ignore-end -->
2020-11-09 03:14:23 +00:00
这个时候 `foo` 就是一个合法的 Python 包了,同时也是合法的 NoneBot 插件,插件内容可以在 `__init__.py` 中编写。
### 推荐结构(仅供参考)
<!-- prettier-ignore-start -->
:::vue
foo
├── `__init__.py`
├── `config.py`
├── `data_source.py`
└── `model.py`
:::
<!-- prettier-ignore-end -->
#### \_\_init\_\_.py
在该文件中编写各类事件响应及处理逻辑。
#### config.py
2020-11-09 04:33:17 +00:00
在该文件中使用 `pydantic` 定义插件所需要的配置项以及类型。
2020-11-09 03:14:23 +00:00
示例:
```python
from pydantic import BaseSetting
class Config(BaseSetting):
# plugin custom config
plugin_setting: str = "default"
class Config:
extra = "ignore"
```
2020-11-09 04:33:17 +00:00
并在 `__init__.py` 文件中添加以下行
```python
import nonebot
from .config import Config
2020-11-16 07:27:20 +00:00
global_config = nonebot.get_driver().config
2020-11-09 04:33:17 +00:00
plugin_config = Config(**global_config.dict())
```
此时就可以通过 `plugin_config.plugin_setting` 获取到插件所需要的配置项了。
2020-11-09 03:14:23 +00:00
#### data_source.py
在该文件中编写数据获取函数。
2020-11-09 04:33:17 +00:00
:::warning 警告
数据获取应尽量使用**异步**处理!例如使用 [httpx](https://www.python-httpx.org/) 而非 [requests](https://requests.readthedocs.io/en/master/)
:::
2020-11-09 03:14:23 +00:00
#### model.py
在该文件中编写数据库模型。