1
0
forked from bot/app

新增observer类和开发调试器

This commit is contained in:
远野千束 2024-08-12 05:26:36 +08:00
parent 02cf058552
commit 8568c7bb99
12 changed files with 153 additions and 38 deletions

View File

@ -8,13 +8,18 @@ export default navbar([
prefix: "deployment/", prefix: "deployment/",
}, },
{ {
text: "使用及开发", text: "使用及功能",
link: "/usage/", link: "/usage/",
prefix: "usage/", prefix: "usage/",
}, },
{ {
text: "资源及插件", text: "资源及插件",
link: "/store/resource", link: "/store/",
prefix: "store/", prefix: "store/",
},
{
text: "开发及贡献",
link: "/dev/",
prefix: "dev/",
} }
]); ]);

View File

@ -10,7 +10,7 @@ export default sidebar({
children: "structure", children: "structure",
}, },
{ {
text: "使用及开发", text: "使用及功能",
icon: "book", icon: "book",
prefix: "usage/", prefix: "usage/",
children: "structure", children: "structure",
@ -20,6 +20,12 @@ export default sidebar({
icon: "store", icon: "store",
prefix: "store/", prefix: "store/",
children: "structure", children: "structure",
},
{
text: "开发及贡献",
icon: "pen-nib",
prefix: "dev/",
children: "structure",
} }
], ],
}); });

View File

@ -13,14 +13,25 @@ tag:
首次运行后生成`config.yml`和`config`目录,你可修改配置项后重启轻雪,绝大多数情况下,你只需要修改`superusers`及`nickname`字段即可 首次运行后生成`config.yml`和`config`目录,你可修改配置项后重启轻雪,绝大多数情况下,你只需要修改`superusers`及`nickname`字段即可
启动时会加载项目目录下`config.yml/yaml/json/toml`和`config`目录下的所有配置文件,你可在`config`目录下创建多个配置文件,轻雪会自动合并这些配置文件 启动时会加载项目目录下`config.yml/yaml/json/toml`和`config`目录下的所有配置文件,你可在`config`目录下创建多个配置文件,轻雪会自动合并这些配置文件
## **基础配置项** ## **基础配置项**
```yaml ```yaml
command_start: [ "/", "" ] # 指令前缀,若没有""空命令头请开启alconna_use_command_start保证alconna解析正常 nonebot:
host: 127.0.0.1 # 监听地址默认为本机若要接收外部请求请填写0.0.0.0 # Nonebot机器人的配置以前的最外层配置项仍可为Nonebot服务但是部分内容会被覆盖请尽快迁移
port: 20216 # 绑定端口 command_start: [ "/", "" ] # 指令前缀,若没有""空命令头请开启alconna_use_command_start保证alconna解析正常
nickname: [ "liteyuki" ] # 机器人昵称列表 host: 127.0.0.1 # 监听地址默认为本机若要接收外部请求请填写0.0.0.0
superusers: [ "1919810" ] # 超级用户列表 port: 20216 # 绑定端口
nickname: [ "liteyuki" ] # 机器人昵称列表
superusers: [ "1919810" ] # 超级用户列表
liteyuki:
# 写在外层的配置项将会被覆盖建议迁移到liteyuki下
log_level: "INFO" # 日志等级
log_icon: true # 是否显示日志等级图标(某些控制台字体不可用)
auto_report: true # 是否自动上报问题给轻雪服务器
auto_update: true # 是否自动更新轻雪每天4点检查更新
plugins: [ ] # 轻雪插件列表
plugin_dirs: [ ] # 轻雪插件目录列表
``` ```
## **其他配置** ## **其他配置**
@ -28,27 +39,29 @@ superusers: [ "1919810" ] # 超级用户列表
以下为默认值,如需自定义请手动添加 以下为默认值,如需自定义请手动添加
```yaml ```yaml
onebot_access_token: "" # 访问令牌,对公开放时建议设置 # 高级NoneBot配置
default_language: "zh-CN" # 默认语言 nonebot:
alconna_auto_completion: false # alconna是否自动补全指令默认false建议开启 onebot_access_token: "" # 访问令牌,对公开放时建议设置
default_language: "zh-CN" # 默认语言
alconna_auto_completion: false # alconna是否自动补全指令默认false建议开启
safe_mode: false # 安全模式开启后将不会加载任何第三方NoneBot插件
# 其他Nonebot插件的配置项
custom_config_1: "custom_value1"
custom_config_2: "custom_value2"
# 开发者选项 # 开发者选项
allow_update: true # 是否允许更新 liteyuki:
log_level: "INFO" # 日志等级 allow_update: true # 是否允许更新
log_icon: true # 是否显示日志等级图标(某些控制台字体不可用) debug: false # 轻雪调试开启会自动重载Bot或者资源其他插件自带的调试功能也将开启
auto_report: true # 是否自动上报问题给轻雪服务器 dev_mode: false # 开发者模式,开启后将会启动监视者,监视文件变化并自动重载
auto_update: true # 是否自动更新轻雪每天4点检查更新
debug: false # 轻雪调试开启会自动重载Bot或者资源其他插件自带的调试功能也将开启
safe_mode: false # 安全模式,开启后将不会加载任何第三方插件
# 其他Nonebot插件的配置项
custom_config_1: "custom_value1"
custom_config_2: "custom_value2"
... ...
``` ```
> [!tip] > [!tip]
> 如果要使用dotenv配置文件请自行创建`.env.{ENVIRONMENT}`,并在`config.yml`中添加`environment:{ENVIRONMENT}`字段 > 如果要使用NoneBot和dotenv配置文件请自行创建`.env.{ENVIRONMENT}`,并在`config.yml`中添加`nonebot.environment:{ENVIRONMENT}`字段
## **OneBot实现端配置** ## **与NoneBot对接的OneBot实现端配置**
生产环境中推荐反向WebSocket 生产环境中推荐反向WebSocket
不同的实现端给出的字段可能不同,但是基本上都是一样的,这里给出一个参考值 不同的实现端给出的字段可能不同,但是基本上都是一样的,这里给出一个参考值

8
docs/dev/README.md Normal file
View File

@ -0,0 +1,8 @@
---
title: 开发及贡献
index: false
icon: laptop-code
category: 开发
---
<Catalog />

View File

@ -1,15 +1,13 @@
--- ---
title: 轻雪函数 title: 轻雪函数
icon: code icon: code
order: 4 order: 2
category: 使用指南 category: 开发
tag:
- 配置
--- ---
## **轻雪函数** ## **轻雪函数**
轻雪函数 Liteyuki Function 是轻雪的一个功能它允许你在轻雪中运行一些自定义的由数据驱动的命令类似于Minecraft的mcfunction. 轻雪函数 Liteyuki Function 是轻雪的一个功能它允许你在轻雪中运行一些自定义的由数据驱动的命令类似于Minecraft的mcfunction,属于资源包的一部分,但需单独起篇幅.
### **函数文件** ### **函数文件**
@ -70,3 +68,7 @@ await
> [!warning] > [!warning]
> 但若出现非单function的情况有一个task任务没有完成而await被执行了那么当前所有函数包的task都会被截停销毁 > 但若出现非单function的情况有一个task任务没有完成而await被执行了那么当前所有函数包的task都会被截停销毁
> [!tip]
> 编写轻雪函数推荐你使用VS Code插件[Liteyuki Function](https://github.com/LiteyukiStudio/lyfunctionTextmate)实现语法高亮

59
docs/dev/dev_lyplugin.md Normal file
View File

@ -0,0 +1,59 @@
---
title: 轻雪插件开发
icon: laptop-code
order: 3
category: 开发
---
# 简介
轻雪插件是轻雪内置的一部分功能,运行在主进程中,可以很高程度地扩展轻雪的功能
## 开始
### 创建插件
在标准项目中位于liteyuki/plugins和src/liteyuki_plugins下的Python modules均会被当作插件加载你可自行添加配置文件以指定插件的加载路径
一个`.py`文件或一个包含`__init__.py`的文件夹即可被识别为插件
创建一个文件夹,例如`my_plugin`,并在其中创建一个`__init__.py`文件,即可创建一个插件
```python
from liteyuki.plugin import PluginMetadata
__plugin_meta__ = PluginMetadata(
name="My Plugin",
version="1.0.0",
description="A simple plugin"
)
# 你的插件代码
```
### 编写逻辑部分
轻雪主进程不涉及聊天部分,因此插件主要是一些后台任务或者与聊天机器人的通信
以下我们会编写一个简单的插件用于开发NoneBot时进行文件系统变更重载
```python
from liteyuki.dev import observer
from liteyuki import get_bot, logger
from watchdog.events import FileSystemEvent
liteyuki = get_bot()
exclude_extensions = (".pyc", ".pyo")
# 用observer的on_file_system_event装饰器监听文件系统事件
@observer.on_file_system_event(
directories=("src/nonebot_plugins",),
event_filter=lambda event: not event.src_path.endswith(exclude_extensions) and ("__pycache__" not in event.src_path) and os.path.isfile(event.src_path)
)
def restart_nonebot_process(event: FileSystemEvent):
logger.debug(f"File {event.src_path} changed, reloading nonebot...")
liteyuki.restart_process("nonebot")
```
### 加载插件
在配置文件中的`liteyuki.plugins`中添加你的插件路径,例如`my_plugin`重启轻雪即可加载插件。然后我们在src/nonebot_plugins下创建一个文件例如`test.py`并在其中写入一些代码保存后轻雪会自动重载NoneBot进程

View File

@ -1,12 +1,14 @@
--- ---
title: 资源包 title: 资源包开发
icon: paint-brush icon: box
order: 3 order: 1
category: 使用手册 category: 开发
--- ---
## 简介 ## 简介
资源包,亦可根据用途称为主题包、字体包、语言包等,它允许你一定程度上自定义轻雪的外观,并且不用修改源代码 资源包,亦可根据用途称为主题包、字体包、语言包等,它允许你一定程度上自定义轻雪的外观,并且不用修改源代码
- [资源/主题商店](/store/)提供了一些资源包供你选择,你也可以自己制作资源包 - [资源/主题商店](/store/)提供了一些资源包供你选择,你也可以自己制作资源包
- 资源包的制作很简单,如果你接触过`Minecraft`的资源包,那么你能够很快就上手,仅需按照原有路径进行文件替换即可,讲起打包成一个新的资源包。 - 资源包的制作很简单,如果你接触过`Minecraft`的资源包,那么你能够很快就上手,仅需按照原有路径进行文件替换即可,讲起打包成一个新的资源包。
- 部分内容制作需要一点点前端基础,例如`html``css` - 部分内容制作需要一点点前端基础,例如`html``css`
@ -16,8 +18,11 @@ category: 使用手册
请注意主题包中的html渲染使用Js来规定数据的渲染位置请确保您所编写的html代码能被Bot解析否则会导致渲染失败或渲染结果不理想/异常/错位等无法预料的事情发生。推荐在编写html时同时更改对应Js代码以避免出现无法预料的问题。 请注意主题包中的html渲染使用Js来规定数据的渲染位置请确保您所编写的html代码能被Bot解析否则会导致渲染失败或渲染结果不理想/异常/错位等无法预料的事情发生。推荐在编写html时同时更改对应Js代码以避免出现无法预料的问题。
--- ---
## 加载资源包 ## 加载资源包
- 资源包通常是以`.zip`格式压缩的,只需要将其解压到根目录`resources`目录下即可,注意不要嵌套文件夹,正常的路径应该是这样的 - 资源包通常是以`.zip`格式压缩的,只需要将其解压到根目录`resources`目录下即可,注意不要嵌套文件夹,正常的路径应该是这样的
```shell ```shell
main.py main.py
resources resources
@ -29,8 +34,10 @@ resources
├─metadata.yml ├─metadata.yml
└─... └─...
``` ```
- 你自己制作的资源包也应该遵循这个规则,并且应该在`metadata.yml`中填写一些信息 - 你自己制作的资源包也应该遵循这个规则,并且应该在`metadata.yml`中填写一些信息
- 若没有`metadata.yml`文件,则该文件夹不会被识别为资源包 - 若没有`metadata.yml`文件,则该文件夹不会被识别为资源包
```yaml ```yaml
name: "资源包名称" name: "资源包名称"
version: "1.0.0" version: "1.0.0"
@ -38,5 +45,9 @@ description: "资源包描述"
# 你可以自定义一些信息,但请保证以上三个字段 # 你可以自定义一些信息,但请保证以上三个字段
... ...
``` ```
- 资源包加载遵循一个优先级即后加载的资源包会覆盖前面的资源包例如你在A包中定义了一个`index.html`文件B包也定义了一个`index.html`文件那么加载B包后A包中的`index.html`文件会被覆盖 - 资源包加载遵循一个优先级即后加载的资源包会覆盖前面的资源包例如你在A包中定义了一个`index.html`文件B包也定义了一个`index.html`文件那么加载B包后A包中的`index.html`文件会被覆盖
- 对于不同资源包的不同文件是可以相对引用的例如你在A中定义了`templates/index.html`在B中定义了`templates/style.css`可以在A的`index.html`中用`./style.css`相对路径引用B中的css - 对于不同资源包的不同文件是可以相对引用的例如你在A中定义了`templates/index.html`在B中定义了`templates/style.css`可以在A的`index.html`中用`./style.css`相对路径引用B中的css
> [!tip]
> 资源包的结构会随着轻雪的更新而有变动,第三方资源包开发者需要注意版本兼容性,同时用户也应该自行选择可用的资源包

View File

@ -1,5 +1,8 @@
--- ---
title: 资源商店 title: 资源及插件商店
icon: store
index: false index: false
icon: store
category: 商店
--- ---
<Catalog />

View File

@ -1,7 +1,8 @@
from liteyuki.bot import ( from liteyuki.bot import (
LiteyukiBot, LiteyukiBot,
get_bot, get_bot,
get_config get_config,
get_config_with_compat
) )
from liteyuki.comm import ( from liteyuki.comm import (

View File

@ -20,6 +20,7 @@ __all__ = [
"LiteyukiBot", "LiteyukiBot",
"get_bot", "get_bot",
"get_config", "get_config",
"get_config_with_compat",
] ]

View File

@ -9,7 +9,7 @@ from typing import Callable, TypeAlias
from watchdog.events import FileSystemEvent, FileSystemEventHandler from watchdog.events import FileSystemEvent, FileSystemEventHandler
from watchdog.observers import Observer from watchdog.observers import Observer
from liteyuki import get_bot, get_config, logger from liteyuki import get_bot, get_config_with_compat, logger
liteyuki_bot = get_bot() liteyuki_bot = get_bot()
@ -37,7 +37,7 @@ def debounce(wait):
return decorator return decorator
if get_config("dev_mode", False): if get_config_with_compat("liteyuki.dev_mode", ("dev_mode",), False):
logger.debug("Liteyuki Reload enabled, watching for file changes...") logger.debug("Liteyuki Reload enabled, watching for file changes...")
observer.start() observer.start()

View File

@ -8,6 +8,7 @@ Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved
@File : __init__.py.py @File : __init__.py.py
@Software: PyCharm @Software: PyCharm
""" """
from liteyuki import get_config_with_compat, load_plugin
from liteyuki.plugin import PluginMetadata, load_plugins from liteyuki.plugin import PluginMetadata, load_plugins
__plugin_meta__ = PluginMetadata( __plugin_meta__ = PluginMetadata(
@ -18,3 +19,8 @@ __plugin_meta__ = PluginMetadata(
) )
load_plugins("src/liteyuki_plugins") load_plugins("src/liteyuki_plugins")
for plugin in get_config_with_compat("liteyuki.plugins", ("plugins", ), []):
load_plugin(plugin)
for plugin_dir in get_config_with_compat("liteyuki.plugin_dirs", ("plugins_dirs", ), []):
load_plugins(plugin_dir)