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

129 lines
2.8 KiB
Markdown
Raw Normal View History

---
2021-12-02 03:17:10 +08:00
sidebar_position: 7
options:
menu:
2021-12-02 03:17:10 +08:00
weight: 70
category: guide
---
2020-11-09 11:14:23 +08:00
# 创建插件
2020-09-19 22:08:06 +08:00
2020-11-09 11:14:23 +08:00
如果之前使用 `nb-cli` 生成了项目结构,那我们已经有了一个空的插件目录 `Awesome-Bot/awesome_bot/plugins`,并且它已在 `bot.py` 中被加载,我们现在可以开始创建插件了!
2020-09-19 22:08:06 +08:00
2020-12-01 12:24:14 +08:00
使用 `nb-cli` 创建包形式插件,或自行创建文件(夹)
```bash
nb plugin new
```
2021-04-13 00:24:49 +08:00
下面分别对两种通常的插件形式做具体介绍
2020-09-19 22:08:06 +08:00
2020-11-09 11:14:23 +08:00
## 单文件形式
2020-09-19 22:08:06 +08:00
2020-11-09 11:14:23 +08:00
在插件目录下创建名为 `foo.py` 的 Python 文件,暂时留空,此时目录结构如下:
2020-09-19 22:08:06 +08:00
<!-- prettier-ignore-start -->
:::vue
AweSome-Bot
├── awesome_bot
│ └── plugins
2020-11-09 11:14:23 +08:00
│ └── `foo.py`
2020-09-19 22:08:06 +08:00
├── .env
├── .env.dev
├── .env.prod
├── .gitignore
├── bot.py
├── docker-compose.yml
├── Dockerfile
├── pyproject.toml
└── README.md
:::
<!-- prettier-ignore-end -->
这个时候它已经可以被称为一个插件了,尽管它还什么都没做。
2020-11-09 11:14:23 +08:00
## 包形式(推荐)
2020-09-19 22:08:06 +08:00
2020-11-09 11:14:23 +08:00
在插件目录下创建文件夹 `foo`,并在该文件夹下创建文件 `__init__.py`,此时目录结构如下:
2020-09-19 22:08:06 +08:00
<!-- prettier-ignore-start -->
:::vue
AweSome-Bot
├── awesome_bot
│ └── plugins
2020-11-09 11:14:23 +08:00
│ └── `foo`
2020-09-19 22:08:06 +08: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 11:14:23 +08: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 12:33:17 +08:00
在该文件中使用 `pydantic` 定义插件所需要的配置项以及类型。
2020-11-09 11:14:23 +08:00
示例:
```python
2020-12-29 02:02:23 +08:00
from pydantic import BaseSettings
2020-11-09 11:14:23 +08:00
2020-12-29 02:02:23 +08:00
class Config(BaseSettings):
2020-11-09 11:14:23 +08:00
# plugin custom config
plugin_setting: str = "default"
class Config:
extra = "ignore"
```
2020-11-09 12:33:17 +08:00
并在 `__init__.py` 文件中添加以下行
```python
import nonebot
from .config import Config
2020-11-16 15:27:20 +08:00
global_config = nonebot.get_driver().config
2020-11-09 12:33:17 +08:00
plugin_config = Config(**global_config.dict())
```
此时就可以通过 `plugin_config.plugin_setting` 获取到插件所需要的配置项了。
2020-11-09 11:14:23 +08:00
#### data_source.py
在该文件中编写数据获取函数。
2020-11-09 12:33:17 +08:00
:::warning 警告
数据获取应尽量使用**异步**处理!例如使用 [httpx](https://www.python-httpx.org/) 而非 [requests](https://requests.readthedocs.io/en/master/)
:::
2020-11-09 11:14:23 +08:00
#### model.py
在该文件中编写数据库模型。