1
0
forked from bot/app

97 Commits

Author SHA1 Message Date
a77f97fd4b 🐛 hotfix: 移除状态卡片Linux下非储存分区 2024-09-29 22:57:04 +08:00
e6ea1b700f 🐛 hotfix: 天气拉取异常 2024-09-29 22:52:34 +08:00
596f4d06ea 🐛 bug: 修复状态卡片显示问题 2024-09-29 22:35:24 +08:00
8e3d3b3b5d Merge remote-tracking branch 'origin/main' 2024-09-27 00:50:05 +08:00
a34ad87e01 todo: add todo file 2024-09-27 00:49:54 +08:00
6c4c7f34cd 📝 Update resource_publish_en.yml 2024-09-22 01:56:00 +08:00
0c859957b4 🐛 docs: 添加发布插件表单 2024-09-22 01:48:53 +08:00
fbb9ed82ee 🐛 docs: 添加发布插件表单 2024-09-22 01:42:03 +08:00
b469c9420e 🐛 docs: 添加发布插件表单 2024-09-22 01:38:44 +08:00
aa4d930cc4 🐛 docs: 添加发布插件表单 2024-09-21 23:16:37 +08:00
76be748160 :docs: Update resource_publish_zh.yml 2024-09-21 22:36:04 +08:00
a9dd37b8a5 📝 Update resource_publish_zh.yml 2024-09-21 22:32:47 +08:00
5900d621f2 Create resource_publish_zh.yml 2024-09-21 22:28:58 +08:00
7442a3651b Create config.yml 2024-09-21 22:28:13 +08:00
413f438689 Rename resource_publish.md to resource_publish.yml 2024-09-21 22:21:20 +08:00
1fc4999b09 :docs: add resource_publish to resource_publish.md 2024-09-21 22:20:43 +08:00
975446a096 Create resource_publish 2024-09-21 22:19:34 +08:00
98cdd2f4b8 🐛 docs: 商店点击主页改为新窗口,修复插件商店仅轻雪不显示的问题 2024-09-21 03:22:40 +08:00
c0beec0429 🐛 docs: 商店点击主页改为新窗口,修复插件商店仅轻雪不显示的问题 2024-09-21 03:16:32 +08:00
614d78b3fa 🐛 docs: 商店点击主页改为新窗口,修复插件商店仅轻雪不显示的问题 2024-09-21 03:12:32 +08:00
24b0f345e4 📦 docs: 主页添加开发按钮 2024-09-21 02:51:59 +08:00
0ae10aa1b2 Merge remote-tracking branch 'origin/main' 2024-09-21 02:49:11 +08:00
9fe7478840 📦 docs: 修复文档404 2024-09-21 02:49:01 +08:00
liteyuki-flow[bot]
efca0bc7b3 📦 发布资源: 测试资源包2 2024-09-18 01:41:24 +08:00
50c5e99b98 📦 docs: 修改发布按钮样式 2024-09-18 01:38:13 +08:00
7415efcc90 📦 docs: 修改发布按钮样式 2024-09-18 01:32:12 +08:00
5bb4584e6a Merge remote-tracking branch 'origin/main' 2024-09-18 01:31:13 +08:00
795a6f3f76 📦 docs: 修改发布按钮样式 2024-09-18 01:31:03 +08:00
liteyuki-flow[bot]
fa74e08514 📦 发布资源: 测试资源包2 2024-09-18 01:30:26 +08:00
e6cf6e0c68 📦 docs: 修改发布按钮样式 2024-09-18 01:25:43 +08:00
6789c16773 📦 docs: 修改发布按钮样式 2024-09-18 01:24:32 +08:00
cdea0f8563 📦 docs: 修改发布按钮样式 2024-09-18 01:23:21 +08:00
9df55671ac 📦 docs: 修改发布按钮样式 2024-09-18 01:22:08 +08:00
d96c6f13c1 📦 docs: 修改发布按钮样式 2024-09-18 01:05:23 +08:00
bce1bf8704 Merge remote-tracking branch 'origin/main' 2024-09-18 01:04:47 +08:00
8eb626b8da 📦 docs: 修改发布按钮样式 2024-09-18 01:04:37 +08:00
liteyuki-flow[bot]
e6505d335b 📦 发布资源: 测试资源包2 2024-09-18 00:59:47 +08:00
c8cb341afb Merge remote-tracking branch 'origin/main' 2024-09-17 16:30:30 +08:00
e99cb88b13 📦 docs: 修改发布按钮样式 2024-09-17 16:30:19 +08:00
liteyuki-flow[bot]
78c3e299d0 📦 发布资源: 轻雪Kakyo语言包 托管版 2024-09-17 16:27:24 +08:00
23338437e9 📦 docs: 资源商店新增发布资源功能 2024-09-17 16:23:07 +08:00
f95899aebd 📦 docs: 资源商店新增发布资源功能 2024-09-17 16:21:45 +08:00
5df10c66b6 📦 docs: 资源商店新增发布资源功能 2024-09-17 16:21:18 +08:00
811d1594cd 📦 docs: 资源商店新增发布资源功能 2024-09-17 16:19:47 +08:00
c162208638 📦 docs: 资源商店新增发布资源功能 2024-09-17 16:16:29 +08:00
679d6597d8 Merge remote-tracking branch 'origin/main' 2024-09-17 16:14:18 +08:00
f402799f28 📦 docs: 资源商店新增发布资源功能 2024-09-17 16:14:08 +08:00
liteyuki-flow[bot]
60542d7426 📦 发布资源: 轻雪Kakyo语言包 稳定版 2024-09-17 16:06:05 +08:00
db1fb58717 📦 docs: 资源商店新增发布资源功能 2024-09-17 16:01:19 +08:00
7d5675ec97 Merge remote-tracking branch 'origin/main' 2024-09-17 15:58:56 +08:00
d8c50752f7 📦 docs: 资源商店新增发布资源功能 2024-09-17 15:58:45 +08:00
liteyuki-flow[bot]
c674b837bb 📦 发布资源: 测试资源包 2024-09-17 15:53:47 +08:00
d867996072 📦 docs: 资源商店新增发布资源功能 2024-09-17 15:53:17 +08:00
7ef36c6933 📦 docs: 资源商店新增发布资源功能 2024-09-17 15:52:32 +08:00
982aae4dbf 📦 docs: 资源商店新增发布资源功能 2024-09-17 15:50:10 +08:00
b5d3c6aaa8 📦 docs: 资源商店新增发布资源功能 2024-09-17 15:48:02 +08:00
5537bc32df 📦 docs: 资源商店新增发布资源功能 2024-09-17 15:45:43 +08:00
5c0c723c5d 📦 docs: 资源商店新增发布资源功能 2024-09-17 15:33:32 +08:00
0ed3b307d9 📦 docs: 资源商店新增发布资源功能 2024-09-17 15:31:59 +08:00
53a603d4ee 📦 docs: 资源商店新增发布资源功能 2024-09-17 15:26:21 +08:00
fbf906bea7 📦 docs: 资源商店新增发布资源功能 2024-09-17 15:16:54 +08:00
a87e8bc3e8 📦 docs: 资源商店新增发布资源功能 2024-09-17 15:04:19 +08:00
a16a67dbc9 📦 docs: 资源商店新增发布资源功能 2024-09-17 15:03:48 +08:00
4c2231feb5 📦 docs: 资源商店新增发布资源功能 2024-09-17 14:59:49 +08:00
3932dd60da 📦 docs: 资源商店新增发布资源功能 2024-09-17 14:57:27 +08:00
3c6380cb82 📦 docs: 资源商店新增发布资源功能 2024-09-17 14:55:05 +08:00
2612f99f35 📦 docs: 资源商店新增发布资源功能 2024-09-17 14:52:26 +08:00
0b4b9a6241 📦 docs: 资源商店新增发布资源功能 2024-09-17 14:48:48 +08:00
2d100885ee 📦 docs: 资源商店新增发布资源功能 2024-09-17 14:46:06 +08:00
cb335720b7 📦 docs: 资源商店新增发布资源功能 2024-09-17 14:44:43 +08:00
dc8ad30b84 📦 docs: 资源商店新增发布资源功能 2024-09-17 14:42:22 +08:00
09e00652c3 📦 docs: 资源商店新增发布资源功能 2024-09-17 14:40:54 +08:00
b5b15c82f8 📦 docs: 资源商店新增发布资源功能 2024-09-17 14:37:45 +08:00
72e71124b8 📝 docs: 资源商店新增发布资源功能 2024-09-17 01:35:26 +08:00
d2be2acc95 📝 docs: add egg 2024-09-15 00:20:22 +08:00
d95614e960 📝 使用复数代替单数visitor 2024-09-10 08:17:24 +08:00
dad9482d7a 📝 update readme 2024-09-07 04:42:45 +08:00
fff5d09ad9 📝 docs: remove docstring from src of docs 2024-09-06 20:05:29 +08:00
e6ffd1fcc0 📝 docs: remove docstring from src of docs 2024-09-06 19:57:53 +08:00
a97747b7c4 Merge remote-tracking branch 'origin/main' 2024-09-06 19:50:15 +08:00
1921dcd023 📝 docs: remove docstring from src of docs 2024-09-06 19:50:01 +08:00
18af1d00bd 📝 update i18n.ts 2024-09-05 11:45:12 +08:00
30cdc1da23 Merge pull request #73 from ElapsingDreams/main
📝更新轻雪文档url
2024-09-04 20:45:32 +08:00
ElapsingDreams
bb84958ce4 📝更新轻雪文档url
https://bot.liteyuki.icu/usage/  -->  https://bot.liteyuki.icu/
2024-09-04 20:40:31 +08:00
ElapsingDreams
44de3fd00a 📝更新轻雪文档url
https://bot.liteyuki.icu/usage/  -->  https://bot.liteyuki.icu/usage/basic.html
2024-09-04 20:34:13 +08:00
39b1920532 📝 docs: 修改侧边栏选项 2024-09-04 19:15:11 +08:00
aa591ec29e 📝 更新开发规范 2024-09-04 19:10:32 +08:00
310c3f065d 📝 更新开发规范 2024-09-04 03:23:18 +08:00
2311ef82c3 🐛 fix: logo display error 2024-09-04 02:57:21 +08:00
b4b931fc95 📝 更新开发规范 2024-09-04 02:43:44 +08:00
d1b887fcaa 📝https://github.com/jooy2/vitepress-sidebar/issues/170#event-14113011263一起更新 2024-09-03 22:26:58 +08:00
5a2990770c 📝 新增gitea数据 2024-09-02 21:28:08 +08:00
1d0f0a2539 📝 新增gitea数据 2024-09-02 21:27:41 +08:00
dbc4d83b08 📝 新增gitea数据 2024-09-02 21:27:28 +08:00
da905d21bd 📝 新增gitea数据 2024-09-02 21:26:11 +08:00
7d91079500 🚀 workflows: 新增gitea工作流 2024-09-02 17:08:29 +08:00
81a006a308 🐛 [docs]: 增加访客记录 2024-09-02 11:20:53 +08:00
50 changed files with 1571 additions and 323 deletions

1
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1 @@
blank_issues_enabled: false

View File

@@ -0,0 +1,59 @@
name: Publish Resource
title: "Resource: {name}"
description: Publish the resource to the LiteyukiBot official store
labels: [ "Resource" ]
body:
- type: input
id: name
attributes:
label: Name
description: The readable name of the resource pack
placeholder: e.g. Cute UI Resource Pack
validations:
required: true
- type: input
id: description
attributes:
label: Description
description: A brief description of the resource
placeholder: e.g. Makes the rendering card style more beautiful
validations:
required: true
- type: input
id: author
attributes:
label: Author
description: The GitHub username of the author
placeholder: e.g. snowykami
validations:
required: true
- type: input
id: link
attributes:
label: Link
description: Direct download link of the resource pack
placeholder: e.g. https://aaa.com/r.zip
validations:
required: true
- type: input
id: homepage
attributes:
label: Homepage
description: Homepage of the resource pack
placeholder: e.g. https://github.com/user/repo
validations:
required: false
- type: input
id: tags
attributes:
label: Tags
description: Tags
placeholder: 'e.g. [{"label": "Tag Name", "color": "#ea5252"}]'
value: '[ { "label": "Text", "color": "#a2d8f4" } ]'
validations:
required: false

View File

@@ -0,0 +1,59 @@
name: 发布资源
title: "Resource: {name}"
description: 发布资源到轻雪机器人官方商店
labels: [ "Resource" ]
body:
- type: input
id: name
attributes:
label: 名称
description: 资源包的可读名称
placeholder: e.g. 可爱UI资源包
validations:
required: true
- type: input
id: description
attributes:
label: 描述
description: 资源的简短描述
placeholder: e.g. 使渲染卡片的样式更美观
validations:
required: true
- type: input
id: author
attributes:
label: 作者
description: 作者的github用户名
placeholder: e.g. snowykami
validations:
required: true
- type: input
id: link
attributes:
label: 下载链接
description: 资源包直接下载链接
placeholder: e.g. https://aaa.com/r.zip
validations:
required: true
- type: input
id: homepage
attributes:
label: 主页
description: 资源包主页
placeholder: e.g. https://github.com/user/repo
validations:
required: false
- type: input
id: tags
attributes:
label: 标签
description: 标签
placeholder: 'e.g. [{"label": "标签名", "color": "#ea5252"}]'
value: '[ { "label": "标签名", "color": "#a2d8f4" } ]'
validations:
required: false

View File

@@ -1,44 +0,0 @@
# 问题反馈
## **请确保**
- 已认真阅读[文档]("https://bot.liteyuki.icu"),该问题不是文档提及的或你自己操作不当造成的
- 你的问题是在最新版本的代码上测试的
- 请勿重复提交相同或类似的issue
## **描述问题**
请在此简单描述问题
## **如何复现**
请阐述一下如何重现这个问题
### 预期
描述你期望发生的事情
### 实际
描述实际发生的事情
## **日志或截图**
```
日志内容
```
## **设备信息**
- **系统**: [例如 Ubuntu 22.04]
- **CPU**: [例如 Intel i7-7700K]
- **内存**: [例如 16GB]
- **Python**: [例如CPython 3.10.7]
**补充内容**
可选,推荐提供`pip freeze`的输出,以及其他相关信息,以及你的建议

View File

@@ -40,8 +40,8 @@ jobs:
- name: Setup API markdown
run: |-
python -m pip install litedoc
litedoc liteyuki -o docs/zh/dev/api -l zh-Hans -cd class -fd func -md func -vd var -cs -bu https://github.com/LiteyukiStudio/LiteyukiBot/tree/main/liteyuki/
litedoc liteyuki -o docs/en/dev/api -l en -cd class -fd func -md func -vd var -cs -bu https://github.com/LiteyukiStudio/LiteyukiBot/tree/main/liteyuki/
litedoc liteyuki -o docs/zh/dev/api -l zh-Hans -cd class -fd func -md func -vd var -bu https://github.com/LiteyukiStudio/LiteyukiBot/tree/main/liteyuki/
litedoc liteyuki -o docs/en/dev/api -l en -cd class -fd func -md func -vd var -bu https://github.com/LiteyukiStudio/LiteyukiBot/tree/main/liteyuki/
- name: 安装 pnpm
uses: pnpm/action-setup@v2

51
.github/workflows/issue_handler.yml vendored Normal file
View File

@@ -0,0 +1,51 @@
name: Issue Handler
on:
issues:
types: [ opened, edited, closed ]
concurrency:
group: issue_handler
cancel-in-progress: false
jobs:
check-issue:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Check issue title
id: check_title
run: |
ISSUE_TITLE="${{ github.event.issue.title }}"
if [[ "$ISSUE_TITLE" == Plugin:* || "$ISSUE_TITLE" == Resource:* ]]; then
echo "Title starts with Plugin: or Resource:."
echo "::set-output name=title_match::true"
else
echo "Title does not start with Plugin: or Resource:."
echo "::set-output name=title_match::false"
fi
- name: Set up Python
uses: actions/setup-python@v2
if: steps.check_title.outputs.title_match == 'true'
with:
python-version: '3.12'
- name: Install dependencies
if: steps.check_title.outputs.title_match == 'true'
run: |
echo "Installing dependencies."
pip install -r liteyuki_flow/requirements.txt
- name: Run Plugin/Resource issue handler
if: steps.check_title.outputs.title_match == 'true'
run: |
echo "Running Plugin/Resource issue handler."
python -m liteyuki_flow --handle
env:
GITHUB_TOKEN: ${{ secrets.TOKEN }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
REPOSITORY: ${{ github.repository }}
ACT_TYPE: ${{ github.event.action }}

View File

@@ -11,10 +11,9 @@
[![][Python3.10+]][python-link]
[![][Usage]][usage-link]
- 基于[Nonebot2](https://github.com/nonebot/nonebot2),有良好的生态支持
- 原生支持与任意`Python`Bot框架互联,有良好的生态支持
- 开箱即用,无需复杂配置
- 集成包管理器,支持一键安装插件
- 支持OneBot标准通信但不限于此
- 自定义主题支持,满足审美需求
- 国际化支持,支持多种语言
- 高性能500插件2s内启动
@@ -24,8 +23,7 @@
</div>
### 感谢
- [NoneBot2](https://nonebot.dev)提供的框架支持
- [nonebot-plugin-alconna](https://github.com/ArcletProject/nonebot-plugin-alconna)提供的命令解析功能
- 所有贡献者们
[OneBot]: https://img.shields.io/badge/OneBot-11/12-blue?style=for-the-badge

View File

@@ -2,7 +2,6 @@
import {defineConfig} from 'vitepress'
import {generateSidebar} from 'vitepress-sidebar';
import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite'
import {zh} from "./zh";
import {en} from "./en";
@@ -11,7 +10,6 @@ const commonSidebarOptions = {
collapsed: true,
convertSameNameSubFileToGroupIndexPage: true,
useTitleFromFrontmatter: true,
useTitleFromFileHeading: true,
useFolderTitleFromIndexFile: true,
useFolderLinkFromIndexFile: true,
includeFolderIndexFile: true,
@@ -73,7 +71,13 @@ export const common = defineConfig({
]
),
socialLinks: [
{icon: 'github', link: 'https://github.com/LiteyukiStudio/LiteyukiBot'}
{icon: 'github', link: 'https://github.com/LiteyukiStudio/LiteyukiBot'},
{
icon: {
svg: '<svg t="1725391346807" class="icon" viewBox="0 0 1025 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5067" width="256" height="256"><path d="M1004.692673 466.396616l-447.094409-447.073929c-25.743103-25.763582-67.501405-25.763582-93.264987 0l-103.873521 103.873521 78.171378 78.171378c12.533635-6.00058 26.562294-9.359266 41.389666-9.359266 53.02219 0 96.00928 42.98709 96.00928 96.00928 0 14.827372-3.358686 28.856031-9.359266 41.389666l127.97824 127.97824c12.533635-6.00058 26.562294-9.359266 41.389666-9.359266 53.02219 0 96.00928 42.98709 96.00928 96.00928s-42.98709 96.00928-96.00928 96.00928-96.00928-42.98709-96.00928-96.00928c0-14.827372 3.358686-28.856031 9.359266-41.389666l-127.97824-127.97824c-3.051489 1.454065-6.184898 2.744293-9.379746 3.870681l0 266.97461c37.273227 13.188988 63.99936 48.721433 63.99936 90.520695 0 53.02219-42.98709 96.00928-96.00928 96.00928s-96.00928-42.98709-96.00928-96.00928c0-41.799262 26.726133-77.331707 63.99936-90.520695l0-266.97461c-37.273227-13.188988-63.99936-48.721433-63.99936-90.520695 0-14.827372 3.358686-28.856031 9.359266-41.389666l-78.171378-78.171378-295.892081 295.871601c-25.743103 25.784062-25.743103 67.542365 0 93.285467l447.114889 447.073929c25.743103 25.743103 67.480925 25.743103 93.264987 0l445.00547-445.00547c25.763582-25.763582 25.763582-67.542365 0-93.285467z" fill="#a2d8f4" p-id="5068"></path></svg>'
},
link: "https://git.liteyuki.icu/LiteyukiStudio/LiteyukiBot"
}
],
search: {
provider: 'local',

View File

@@ -1,5 +1,5 @@
import DefaultTheme from 'vitepress/theme'
import './liteyuki.css'
import './liteyuki.scss'
import StatsBar from '../../components/StatsBar.vue'
import PluginStore from '../../components/PluginStore.vue'

View File

@@ -1,95 +0,0 @@
:root {
--vp-c-brand-1: #149ef8;
--vp-c-brand-2: #0434ad;
--vp-home-hero-name-color: transparent;
--vp-home-hero-name-background: -webkit-linear-gradient(120deg, #34a3fe 30%, #8d44ff);
--vp-home-hero-image-background-image: linear-gradient(-45deg, #d0e9ff 50%, #a2d8f4 50%);
--vp-home-hero-image-filter: blur(44px);
--vp-c-gray-1: #eee;
--vp-c-gray-2: #aaa;
--border-radius-1: 10px;
--border-radius-2: 20px;
--border-radius-3: 40px;
}
.dark {
--vp-home-hero-image-background-image: linear-gradient(-45deg, #004785 50%, #0374ad 50%);
--vp-c-gray-1: #333;
--vp-c-gray-2: #666;
}
.tab-buttons {
padding: 7px;
flex: 1;
display: flex;
justify-content: flex-start;
height: 60%;
align-items: center;
}
.tab-title {
text-align: center;
justify-content: center;
flex: 1;
}
.item-search-box {
border-radius: 100px;
width: 80%;
padding: 10px;
margin: 10px 0;
border: 1px solid #ccc;
}
.search-box-div {
display: flex;
justify-content: space-around;
margin: 10px 0;
}
.item-search-box {
width: 80%;
}
.item-card {
position: relative;
border-radius: 15px;
background-color: var(--vp-c-gray-1);
height: 160px;
padding: 16px;
margin: 10px;
box-sizing: border-box;
transition: background 0.3s ease;
}
.item-name {
font-size: 20px;
margin-bottom: 10px;
}
.item-description {
color: var(--vp-c-gray-2);
font-size: 13px;
white-space: pre-wrap;
}
.author-info {
display: flex;
justify-content: left;
align-items: center;
}
.author-name {
font-size: 15px;
font-weight: normal;
}
.avatar {
border-radius: 50%;
margin: 0 10px;
}

View File

@@ -0,0 +1,149 @@
:root {
--vp-c-brand-1: #149ef8;
--vp-c-brand-2: #0434ad;
--vp-home-hero-name-color: transparent;
--vp-home-hero-name-background: -webkit-linear-gradient(120deg, #34a3fe 30%, #8d44ff);
--vp-home-hero-image-background-image: linear-gradient(-45deg, #d0e9ff 50%, #a2d8f4 50%);
--vp-home-hero-image-filter: blur(44px);
--vp-c-gray-1: #eee;
--vp-c-gray-2: #aaa;
--border-radius-1: 10px;
--border-radius-2: 20px;
--border-radius-3: 40px;
--vp-font-family-base: 'Poppins', 'Punctuation SC', 'Inter', ui-sans-serif, system-ui,
'PingFang SC', 'Noto Sans CJK SC', 'Noto Sans SC', 'Heiti SC',
'Microsoft YaHei', 'DengXian', sans-serif, 'Apple Color Emoji',
'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
--vp-font-family-mono: 'Cousine', monospace;
--red: #ef4444;
--liteyuki-color: #149ef8;
--button-radius: 6px;
}
.dark {
--vp-home-hero-image-background-image: linear-gradient(-45deg, #004785 50%, #0374ad 50%);
--vp-c-gray-1: #333;
--vp-c-gray-2: #666;
}
.tab-buttons {
padding: 7px;
flex: 1;
display: flex;
justify-content: flex-start;
height: 60%;
align-items: center;
}
.tab-title {
text-align: center;
justify-content: center;
flex: 1;
}
.item-search-box {
border-radius: 100px;
width: 80%;
padding: 10px;
margin: 10px 0;
border: 1px solid #ccc;
}
.search-box-div {
display: flex;
justify-content: space-around;
margin: 10px 0;
}
.item-search-box {
width: 80%;
}
.item-card {
position: relative;
border-radius: 15px;
background-color: var(--vp-c-gray-1);
height: 160px;
padding: 16px;
margin: 10px;
box-sizing: border-box;
transition: background 0.3s ease;
}
.item-name {
font-size: 20px;
margin-bottom: 10px;
}
.item-description {
color: var(--vp-c-gray-2);
font-size: 13px;
white-space: pre-wrap;
}
.author-info {
display: flex;
justify-content: left;
align-items: center;
}
.author-name {
font-size: 15px;
font-weight: normal;
}
.avatar {
border-radius: 50%;
margin: 0 10px;
}
/*store*/
.store-tabs {
display: flex;
justify-content: flex-end;
margin: 10px 0;
}
.publish-button {
right: 10px;
bottom: 10px;
padding: 5px 10px;
border-radius: 10px;
background-color: var(--vp-c-brand-1);
color: white;
font-size: 15px;
cursor: pointer;
}
.pub-window {
input {
width: 100%;
padding: 10px;
margin: 10px 0;
border-radius: 10px;
border: 1px solid #ccc;
}
}
.pub-option {
margin: 10px;
padding: 5px;
border: 2px solid var(--vp-c-gray-1);
border-radius: var(--button-radius);
background-color: var(--vp-c-gray-1);
&.close {
}
&.submit {
background-color: var(--vp-c-brand-1);
}
}

View File

@@ -0,0 +1,26 @@
<script setup lang="ts">
import {getTextRef} from "./scripts/i18n";
import {repoPath, repoURL} from "./scripts/const";
const contributorImgSrc = `https://contrib.rocks/image?repo=${repoPath}`
const contributorsUrl = `${repoURL}/graphs/contributors`
</script>
<template>
<div class="contributor-bar">
<h2>{{ getTextRef('thx_contributors') }}</h2>
<a :href="contributorsUrl">
<div class="contributor-list">
<img :src=contributorImgSrc alt="Contributors">
</div>
</a>
</div>
</template>
<style scoped>
.contributor-bar {
display: flex;
flex-direction: column;
align-items: center;
}
</style>

View File

@@ -7,7 +7,7 @@
</div>
<div class="item-bar">
<!-- 三个可点击svg一个github一个下载一个可点击"https://github.com/{{ username }}.png?size=80"个人头像配上id-->
<a :href=props.item.homepage class="btn">
<a :href=props.item.homepage class="btn" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 16 16">
<path fill="currentColor"
d="m7.775 3.275l1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0a.751.751 0 0 1 .018-1.042a.751.751 0 0 1 1.042-.018a1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018a.751.751 0 0 1-.018-1.042m-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018a.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0a.751.751 0 0 1-.018 1.042a.751.751 0 0 1-1.042.018a1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83"/>

View File

@@ -3,6 +3,7 @@ import {computed, ref} from 'vue'
import ItemCard from './PluginItemCard.vue'
import ToggleSwitch from "./ToggleSwitch.vue";
import {getTextRef} from "./scripts/i18n";
import pluginsJson from "../public/plugins.json"
let showLiteyukiPluginOnly = ref(false)
let filteredItems = computed(() => {
@@ -23,16 +24,11 @@ let filteredItems = computed(() => {
// 插件商店Nonebot
let items = ref([])
let search = ref('')
// 从官方拉取
fetch("/plugins.json")
.then(response => response.json())
.then(data => {
data.forEach(item => {
// 从轻雪官方拉取,添加轻雪插件属性
items.value = pluginsJson
items.value.forEach(item => {
item.is_liteyuki_plugin = true
})
items.value = data
})
.catch(error => console.error(error))
})
//追加
fetch('https://registry.nonebot.dev/plugins.json')
@@ -57,6 +53,11 @@ fetch('https://registry.nonebot.dev/plugins.json')
<ToggleSwitch v-model:modelValue="showLiteyukiPluginOnly"/>
{{ getTextRef('liteyukiOnly') }}
</div>
<!-- 按钮们-->
<!-- <div class="tab">-->
<!-- <button @click="open"-->
<!-- </div>-->
<div class="items">
<!-- 使用filteredItems来布局商品 -->
<ItemCard v-for="item in filteredItems" :key="item.id" :item="item"/>

View File

@@ -4,7 +4,7 @@
<div class="item-description">{{ props.item.description }}</div>
<div class="item-bar">
<!-- 三个可点击svg一个github一个下载一个可点击"https://github.com/{{ username }}.png?size=80"个人头像配上id-->
<a :href=props.item.link class="">
<a :href=props.item.link class="" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 16 16">
<path fill="currentColor"
d="m7.775 3.275l1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0a.751.751 0 0 1 .018-1.042a.751.751 0 0 1 1.042-.018a1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018a.751.751 0 0 1-.018-1.042m-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018a.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0a.751.751 0 0 1-.018 1.042a.751.751 0 0 1-1.042.018a1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83"/>

View File

@@ -0,0 +1,38 @@
<template>
<div v-if="isVisible" class="floating-window">
<div class="window-content">
<slot></slot>
</div>
</div>
</template>
<script setup lang="ts">
import {defineProps} from 'vue'
const props = defineProps({
isVisible: Boolean,
})
</script>
<style scoped>
.floating-window {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 1000;
}
.window-content {
background: var(--vp-c-gray-1);
padding: 20px;
border-radius: 5px;
max-width: 60%;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
</style>

View File

@@ -1,8 +1,13 @@
<script setup lang="ts">
import {computed, ref} from 'vue'
import ItemCard from './ResItemCard.vue'
import * as url from "node:url";
import {getTextRef} from "./scripts/i18n";
import ResPubWindow from "./ResPubWindow.vue";
import {getTextRef, formatLang} from "./scripts/i18n";
import {RepoUrl} from "./scripts/statsApi";
import resourcesJson from "../public/resources.json"
import {useData} from "vitepress";
// formLan
// 从public/assets/resources.json加载插件
let filteredItems = computed(() => {
@@ -18,24 +23,68 @@ let filteredItems = computed(() => {
// 插件商店Nonebot
let items = ref([])
let search = ref('')
fetch("/resources.json")
.then(response => response.json())
.then(data => {
items.value = data
})
.catch(error => console.error(error))
items.value = resourcesJson
// 列表倒序
const isPublishWindowOpen = ref(false)
let newRes = ref({
name: '',
})
function openPublishWindow() {
isPublishWindowOpen.value = true
}
function closePublishWindow() {
isPublishWindowOpen.value = false
}
let submitLang = ""
if (formatLang(useData().site.value.lang) === "zh") {
submitLang = "zh"
} else {
submitLang = "en"
}
function submitForm() {
const title = encodeURI(`Resource: ${newRes.value.name}`)
const issueURL = `${RepoUrl}/issues/new?assignees=&labels=Resource&template=resource_publish_${submitLang}.yml&title=${title}`
console.log(issueURL)
window.open(issueURL, '_blank')
}
</script>
<template>
<div class="market">
<h1>{{ getTextRef('resourceStore') }}</h1>
<div class="search-box-div"><input class="item-search-box" type="text" :placeholder="getTextRef('search')" v-model="search" /></div>
<div class="search-box-div"><input class="item-search-box" type="text" :placeholder="getTextRef('search')"
v-model="search"/></div>
<div class="store-tabs" style="display: flex">
<button class="store-button publish-button" @click="openPublishWindow">{{ getTextRef('publishRes') }}</button>
</div>
<div class="items">
<!-- 使用filteredItems来布局商品 -->
<ItemCard v-for="item in filteredItems" :key="item.id" :item="item"/>
</div>
<ResPubWindow class="pub-window" :is-visible="isPublishWindowOpen">
<h2>{{ getTextRef("publishRes") }}</h2>
<form @submit.prevent="submitForm">
<label for="name">{{ getTextRef("resName") }}</label>
<input type="text" id="name" v-model="newRes.name" :placeholder="getTextRef('resNameText')"/>
<div class="pub-options" style="display: flex; justify-content: center">
<button class="pub-option close" type="button" @click="closePublishWindow">{{
getTextRef("closeButtonText")
}}
</button>
<button class="pub-option submit" type="submit" @click="submitForm">{{
getTextRef("submitButtonText")
}}
</button>
</div>
</form>
</ResPubWindow>
</div>
</template>
@@ -51,4 +100,6 @@ h1 {
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 10px;
}
</style>

View File

@@ -13,55 +13,55 @@ const dataSections = {
total: {
name: 'total',
color: '#00a6ff',
value: ref(2005),
value: ref(-1),
link: StarMapUrl
},
online: {
name: 'online',
color: '#7eff7e',
value: ref(1145),
value: ref(-1),
link: StarMapUrl
},
stars: {
name: 'stars',
color: '#ffcc00',
value: ref(1234),
value: ref(-1),
link: `${RepoUrl}/stargazers`
},
forks: {
name: 'forks',
color: '#ff6600',
value: ref(9420),
value: ref(-1),
link: `${RepoUrl}/forks`
},
issues: {
name: 'issues',
color: '#ff0000',
value: ref(1145),
value: ref(-1),
link: `${RepoUrl}/issues`
},
prs: {
name: 'prs',
color: '#f15df1',
value: ref(6543),
value: ref(-1),
link: `${RepoUrl}/pulls`
},
plugins: {
name: 'plugins',
color: '#a766ff',
value: ref(1763),
value: ref(-1),
link: './store/plugin'
},
resources: {
name: 'resources',
color: '#5a54fa',
value: ref(6789),
value: ref(-1),
link: './store/resource'
},
visitors: {
name: 'visitors',
color: '#00a6ff',
value: ref(1234),
value: ref(-1),
link: RepoUrl
},
}
@@ -109,7 +109,20 @@ onBeforeRouteUpdate(() => {
updateRefData();
});
console.log(
" _ _ _ _ _ ____ _ \n" +
" | | (_) | | | (_) _ \\ | | \n" +
" | | _| |_ ___ _ _ _ _| | ___| |_) | ___ | |_ \n" +
" | | | | __/ _ \\ | | | | | | |/ / | _ < / _ \\| __|\n" +
" | |____| | || __/ |_| | |_| | <| | |_) | (_) | |_ \n" +
" |______|_|\\__\\___|\\__, |\\__,_|_|\\_\\_|____/ \\___/ \\__|\n" +
" __/ | \n" +
" |___/ "
)
console.log(
getTextRef('easterEgg')
)
</script>
@@ -133,7 +146,8 @@ onBeforeRouteUpdate(() => {
</div>
</div>
<div class="starmap">
<iframe src="https://starmap.liteyuki.icu/" width="100%" height="300px" class="gamma"></iframe>
<iframe src="https://starmap.liteyuki.icu/" width="100%" height="300px" class="gamma">
</iframe>
</div>
</div>
</div>
@@ -267,7 +281,7 @@ onBeforeRouteUpdate(() => {
.stats-info {
width: 40%;
margin: 30px;
margin: 10px 30px 30px 30px;
}
.starmap {

View File

@@ -0,0 +1,11 @@
<script setup lang="ts">
</script>
<template>
</template>
<style scoped>
</style>

View File

@@ -0,0 +1,4 @@
export const platformBaseURL = "https://github.com/"
export const repoPath = "LiteyukiStudio/LiteyukiBot"
export const repoURL = `${platformBaseURL}${repoPath}`

View File

@@ -13,7 +13,7 @@ const i18nData = {
forks: 'Forks',
issues: 'Issues',
prs: 'Pull Requests',
visitors: 'Visitor',
visitors: 'Visitors',
size: 'Size',
plugins: 'Plugins',
resources: 'Resources',
@@ -22,6 +22,25 @@ const i18nData = {
liteyukiOnly: 'Liteyuki Only',
search: 'Search',
resourceStore: 'Resources Store',
thx_contributors: 'Thanks the following contributors!',
easterEgg: 'Congratulations on finding the Easter egg!',
publishPlugin: 'Publish Plugin',
publishRes: 'Publish Resource',
closeButtonText: 'Close',
submitButtonText: 'Submit',
resName: 'Name',
resDesc: 'Description',
resAuthor: 'Author',
resLink: 'Download Link',
resHomepage: 'Homepage',
resNameText: 'Example: Kawaii Style Theme',
resDescText: 'Example: A kawaii style and color theme',
resAuthorText: 'Usually the github username, Example: yanyongyu',
resLinkText: 'Direct download link, usually zip package link',
resHomepageText: 'Optional, can be the name of the git platform repository"',
},
zh: {
stats: '统计信息',
@@ -30,9 +49,9 @@ const i18nData = {
total: '实例',
fetching: '获取中',
stars: '星星',
forks: '叉',
issues: '开启议题',
prs: '合并请求',
forks: '叉',
issues: '议题',
prs: '拉取请求',
visitors: '访客',
size: '大小',
plugins: '插件',
@@ -43,6 +62,25 @@ const i18nData = {
liteyukiOnly: '仅轻雪',
search: '搜索',
resourceStore: '资源商店',
thx_contributors: '感谢以下贡献者!',
easterEgg: '恭喜你发现了彩蛋!',
publishPlugin: '发布插件',
publishRes: '发布资源',
closeButtonText: '关闭',
submitButtonText: '提交',
resName: '名称',
resDesc: '描述',
resAuthor: '作者',
resLink: '下载链接',
resHomepage: '主页',
resNameText: '示例:可爱风格主题',
resDescText: '示例:一个可爱风格和配色的主题',
resAuthorText: '通常为github用户名示例yanyongyu',
resLinkText: '直接下载链接通常为zip包链接',
resHomepageText: '可选可为git平台仓库名',
}
}
@@ -53,7 +91,7 @@ function getText(lang: string, key: string): string {
return i18nData[lang][key];
}
function formatLang(lang: string): string {
export function formatLang(lang: string): string {
if (lang.includes('-')) {
return lang.split('-')[0];
}
@@ -70,5 +108,5 @@ export function updateRefData() {
export function getTextRef(key: string): any {
const lang = formatLang(useData().site.value.lang);
refData[key] = getText(lang, key);
return refData[key]
return refData[key] || key;
}

View File

@@ -2,6 +2,7 @@
export const OWNER = "LiteyukiStudio"
export const REPO = "LiteyukiBot"
const githubAPIUrl = "https://api.github.com"
const giteaAPIUrl = "https://git.liteyuki.icu/api/v1"
const onlineFetchUrl = "https://api.liteyuki.icu/online";
const totalFetchUrl = "https://api.liteyuki.icu/count";
const visitRecordUrl = "https://api.liteyuki.icu/visit";
@@ -32,27 +33,33 @@ interface StatsApi {
export type {GithubStats};
// 实现接口
export const statsApi: StatsApi = {
getTotal: async () => {
async function getGiteaStats() {
try {
const res = await fetch(totalFetchUrl);
const url = `${giteaAPIUrl}/repos/${OWNER}/${REPO}`;
console.log(url);
const res = await fetch(url);
const data = await res.json();
return data.register;
return {
stars: data.stars_count,
forks: data.forks_count,
watchers: data.watchers_count,
issues: 0,
prs: 0,
size: data.size,
};
} catch (e) {
return -1;
return {
stars: -1,
forks: -1,
watchers: -1,
issues: -1,
prs: -1,
size: -1,
};
}
},
getOnline: async () => {
try {
const res = await fetch(onlineFetchUrl);
const data = await res.json();
return data.online;
} catch (e) {
return -1;
}
},
getGithubStats: async () => {
}
async function getGithubStats() {
try {
const res = await fetch(`${githubAPIUrl}/repos/${OWNER}/${REPO}`);
const data = await res.json();
@@ -74,7 +81,43 @@ export const statsApi: StatsApi = {
size: -1,
};
}
}
async function getRepoStats() {
// 两个接口各数据,加和返回
const githubStats = await getGithubStats();
const giteaStats = await getGiteaStats();
return {
stars: githubStats.stars + giteaStats.stars,
forks: githubStats.forks + giteaStats.forks,
watchers: githubStats.watchers + giteaStats.watchers,
issues: githubStats.issues + giteaStats.issues,
prs: githubStats.prs + giteaStats.prs,
size: githubStats.size + giteaStats.size,
};
}
// 实现接口
export const statsApi: StatsApi = {
getTotal: async () => {
try {
const res = await fetch(totalFetchUrl);
const data = await res.json();
return data.register;
} catch (e) {
return -1;
}
},
getOnline: async () => {
try {
const res = await fetch(onlineFetchUrl);
const data = await res.json();
return data.online;
} catch (e) {
return -1;
}
},
getGithubStats: getRepoStats,
getPluginNum: async () => {
try {
const res = await fetch('/plugins.json');

View File

@@ -0,0 +1,21 @@
---
title: Best Practices
order: 10
---
# Best Practices
## Bot applications
- [LiteyukiBot](https://github.com/LiteyukiStudio/LiteyukiBot): Liteyuki Official Bot
- [LiteyukiBot-TriM](https://github.com/TriM-Organization/LiteyukiBot-TriM): TriM Official Custom Liteyuki Bot
- [Liteyuki Marsho](https://git.liteyuki.icu/LiteyukiStudio/marsho-alpha): A cute cat girl bot based on Liteyuki and the github model
## plugins
- [liteyukibot-plugin-nonebot](https://github.com/LiteyukiStudio/liteyukibot-plugin-nonebot): Liteyuki Bot NoneBot plugin, allowing Liteyuki to support NoneBot
- [nonebot-plugin-liteyukibot](https://github.com/LiteyukiStudio/nonebot-plugin-liteyukibot): NoneBot plugin, allowing NoneBot to support Liteyuki
## Others
- [liteyuki starmap](https://starmap.liteyuki.icu): Liteyuki official star map, showing all instances of Liteyuki and their location distribution
- [TRSS_Liteyuki](https://timerainstarsky.github.io/TRSS_Liteyuki/): LiteyukiBot management script
- [litedoc](https://github.com/LiteyukiStudio/litedoc): Liteyuki API documentation generator
- liteyukibot-api (closed source): Liteyuki Bot stat interface

View File

@@ -1,5 +1,5 @@
---
title: 进程通信
title: Process Communication
order: 4
---

View File

@@ -2,6 +2,12 @@
title: Development Guide
order: 0
---
<script setup>
import ContributorBar from '../../components/ContributorBar.vue'
</script>
# Development Guide
## How to Develop
@@ -52,8 +58,8 @@ The `src` directory is the application part, please develop business logic in th
- commit message should follow the following guidelines:
- You should commit the code after completing a feature or fixing a bug, and not mix the code of multiple features or bugs together.
- We use gitmoji to mark the type of commit, such as `:sparkles:` for introducing new features, `:bug:` for fixing bugs, etc., please refer to [gitmoji](https://gitmoji.dev/) for details.
- The format of the commit message is `<emoji> [module]: <message>`, such as `:sparkles: [liteyuki.event]: add new feature`,
where the module field is the affected part, such as `liteyuki.message`, `docs.en.guide.md`, etc., not much is required, but please fill in as much as possible; the message field is a brief description, in summary, what you did.
- The format of the commit message is `<emoji> [type:] <message>`, such as `:sparkles: feat: add new field to event`,
where the type field is the type of commit, not much is required, but please fill in as much as possible; the message field is a brief description, in summary, what you did.
- There is no restriction on the language of the commit message, and bilingual use is possible if conditions permit.
- The documentation should follow [`Markdown`](https://www.markdownguide.org/) syntax and support vitepress-related content:
- Revise the documentation for each language when editing.
@@ -62,3 +68,6 @@ The `src` directory is the application part, please develop business logic in th
## Finally
- This project is a non-profit open-source project, and we welcome anyone to participate in development. Your contributions will make Liteyuki better.
<ContributorBar />

View File

@@ -1,5 +1,5 @@
---
title: 轻雪函数
title: Liteyuki Function
order: 2
---

View File

@@ -1,5 +1,5 @@
---
title: 轻雪插件开发
title: Liteyuki Plugin
order: 3
---

View File

@@ -1,5 +1,5 @@
---
title: 资源包开发
title: Resource Pack
order: 1
---

View File

@@ -14,16 +14,19 @@ hero:
- theme: alt
text: 📦 Extensions
link: ./store/
- theme: alt
text: 🛠️ Development
link: ./dev/guide
image:
light: ./liteyuki.svg
dark: ./liteyuki-dark.svg
light: /liteyuki.svg
dark: /liteyuki-dark.svg
alt: Liteyuki Logo
features:
- title: Ecological Diversity
icon: 🛠️
details: Based on the liteyuki framework, compatible with any Python bot framework and application
link: ./dev/api/api
link: ./dev/api
- title: Pluggable
icon: 🧩

View File

@@ -1,8 +1,9 @@
{
"devDependencies": {
"@intlify/unplugin-vue-i18n": "^4.0.0",
"sass-embedded": "^1.78.0",
"vitepress": "^1.3.4",
"vitepress-sidebar": "^1.25.0"
"vitepress-sidebar": "^1.25.3"
},
"scripts": {
"docs:dev": "vitepress dev --host",

340
docs/pnpm-lock.yaml generated
View File

@@ -22,56 +22,59 @@ devDependencies:
'@intlify/unplugin-vue-i18n':
specifier: ^4.0.0
version: 4.0.0
sass-embedded:
specifier: ^1.78.0
version: 1.78.0
vitepress:
specifier: ^1.3.4
version: 1.3.4(@algolia/client-search@5.2.3)(search-insights@2.17.0)
version: 1.3.4(@algolia/client-search@5.2.4)(sass-embedded@1.78.0)(search-insights@2.17.1)
vitepress-sidebar:
specifier: ^1.25.0
version: 1.25.0
specifier: ^1.25.3
version: 1.25.3
packages:
/@algolia/autocomplete-core@1.9.3(@algolia/client-search@5.2.3)(algoliasearch@4.24.0)(search-insights@2.17.0):
/@algolia/autocomplete-core@1.9.3(@algolia/client-search@5.2.4)(algoliasearch@4.24.0)(search-insights@2.17.1):
resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==}
dependencies:
'@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@5.2.3)(algoliasearch@4.24.0)(search-insights@2.17.0)
'@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@5.2.3)(algoliasearch@4.24.0)
'@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@5.2.4)(algoliasearch@4.24.0)(search-insights@2.17.1)
'@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@5.2.4)(algoliasearch@4.24.0)
transitivePeerDependencies:
- '@algolia/client-search'
- algoliasearch
- search-insights
dev: true
/@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@5.2.3)(algoliasearch@4.24.0)(search-insights@2.17.0):
/@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@5.2.4)(algoliasearch@4.24.0)(search-insights@2.17.1):
resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==}
peerDependencies:
search-insights: '>= 1 < 3'
dependencies:
'@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@5.2.3)(algoliasearch@4.24.0)
search-insights: 2.17.0
'@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@5.2.4)(algoliasearch@4.24.0)
search-insights: 2.17.1
transitivePeerDependencies:
- '@algolia/client-search'
- algoliasearch
dev: true
/@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@5.2.3)(algoliasearch@4.24.0):
/@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@5.2.4)(algoliasearch@4.24.0):
resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==}
peerDependencies:
'@algolia/client-search': '>= 4.9.1 < 6'
algoliasearch: '>= 4.9.1 < 6'
dependencies:
'@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@5.2.3)(algoliasearch@4.24.0)
'@algolia/client-search': 5.2.3
'@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@5.2.4)(algoliasearch@4.24.0)
'@algolia/client-search': 5.2.4
algoliasearch: 4.24.0
dev: true
/@algolia/autocomplete-shared@1.9.3(@algolia/client-search@5.2.3)(algoliasearch@4.24.0):
/@algolia/autocomplete-shared@1.9.3(@algolia/client-search@5.2.4)(algoliasearch@4.24.0):
resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==}
peerDependencies:
'@algolia/client-search': '>= 4.9.1 < 6'
algoliasearch: '>= 4.9.1 < 6'
dependencies:
'@algolia/client-search': 5.2.3
'@algolia/client-search': 5.2.4
algoliasearch: 4.24.0
dev: true
@@ -115,8 +118,8 @@ packages:
'@algolia/transporter': 4.24.0
dev: true
/@algolia/client-common@5.2.3:
resolution: {integrity: sha512-zqfcbgjYR72Y/rx/+/6g5Li/eV33yhRq5mkGbU06JYBzvGq6viy0gZl1ckCFhLLifKzXZ4yzUQTw/KG6FV+smg==}
/@algolia/client-common@5.2.4:
resolution: {integrity: sha512-xNkNJ9Vk1WjxEU/SzcA2vZWeYSiQFQOUS7Akffx8aeAIJIOcmwbpLr2D8JzBEC4QNmNb5KAZOJTrGl1ri9Mclg==}
engines: {node: '>= 14.0.0'}
dev: true
@@ -136,13 +139,13 @@ packages:
'@algolia/transporter': 4.24.0
dev: true
/@algolia/client-search@5.2.3:
resolution: {integrity: sha512-xXdCg8vpiwE8gqSyvjxq8V3qbFa+gHasY5epIz718IByWv3WKLLi/n4SMIfB/zRwXTLVWeGOH/UJSz5VCnAAqg==}
/@algolia/client-search@5.2.4:
resolution: {integrity: sha512-xlBaro8nU5EvsNsLu8dSsd7jzHVvOVGCOTW4dM6gjRmQDYChzMsF69Tb1OfLaXk7YJ0jHk1rNeccBOsYBtQcIQ==}
engines: {node: '>= 14.0.0'}
dependencies:
'@algolia/client-common': 5.2.3
'@algolia/requester-browser-xhr': 5.2.3
'@algolia/requester-node-http': 5.2.3
'@algolia/client-common': 5.2.4
'@algolia/requester-browser-xhr': 5.2.4
'@algolia/requester-node-http': 5.2.4
dev: true
/@algolia/logger-common@4.24.0:
@@ -177,11 +180,11 @@ packages:
'@algolia/requester-common': 4.24.0
dev: true
/@algolia/requester-browser-xhr@5.2.3:
resolution: {integrity: sha512-lezcE4E7ax7JkDGDKA/xAnyAY9p9LZ4AxzsyL0pksqUpOvn4U0msP553M2yJRfsxxdGDp15noCnPuRsh7u8dMg==}
/@algolia/requester-browser-xhr@5.2.4:
resolution: {integrity: sha512-ncssmlq86ZnoQ/RH/EEG2KgmBZQnprzx3dZZ+iJrvkbxIi8V9wBWyCgjsuPrKGitzhpnjxZLNlHJZtcps5jaXw==}
engines: {node: '>= 14.0.0'}
dependencies:
'@algolia/client-common': 5.2.3
'@algolia/client-common': 5.2.4
dev: true
/@algolia/requester-common@4.24.0:
@@ -194,11 +197,11 @@ packages:
'@algolia/requester-common': 4.24.0
dev: true
/@algolia/requester-node-http@5.2.3:
resolution: {integrity: sha512-xTxsRnJqxG1dylIkxmflrHO9LJfJKjSHqEF5yGdRrtnqIEvb2hiQPCHm2XwqxMa3NBcf6lmydGfJqhPLnRJwtw==}
/@algolia/requester-node-http@5.2.4:
resolution: {integrity: sha512-EoLOebO81Dtwuz/hy4onmQAb9dK8fDqyPWMwX017SvGDi3w1h4i6W6//VTO0vKLfXMNpoAKWFi+LBBTLCVtiiw==}
engines: {node: '>= 14.0.0'}
dependencies:
'@algolia/client-common': 5.2.3
'@algolia/client-common': 5.2.4
dev: true
/@algolia/transporter@4.24.0:
@@ -232,14 +235,18 @@ packages:
'@babel/helper-validator-identifier': 7.24.7
to-fast-properties: 2.0.0
/@bufbuild/protobuf@1.10.0:
resolution: {integrity: sha512-QDdVFLoN93Zjg36NoQPZfsVH9tZew7wKDKyV5qRdj8ntT4wQCOradQjRaTdwMhWUYsgKsvCINKKm87FdEk96Ag==}
dev: true
/@docsearch/css@3.6.1:
resolution: {integrity: sha512-VtVb5DS+0hRIprU2CO6ZQjK2Zg4QU5HrDM1+ix6rT0umsYvFvatMAnf97NHZlVWDaaLlx7GRfR/7FikANiM2Fg==}
dev: true
/@docsearch/js@3.6.1(@algolia/client-search@5.2.3)(search-insights@2.17.0):
/@docsearch/js@3.6.1(@algolia/client-search@5.2.4)(search-insights@2.17.1):
resolution: {integrity: sha512-erI3RRZurDr1xES5hvYJ3Imp7jtrXj6f1xYIzDzxiS7nNBufYWPbJwrmMqWC5g9y165PmxEmN9pklGCdLi0Iqg==}
dependencies:
'@docsearch/react': 3.6.1(@algolia/client-search@5.2.3)(search-insights@2.17.0)
'@docsearch/react': 3.6.1(@algolia/client-search@5.2.4)(search-insights@2.17.1)
preact: 10.23.2
transitivePeerDependencies:
- '@algolia/client-search'
@@ -249,7 +256,7 @@ packages:
- search-insights
dev: true
/@docsearch/react@3.6.1(@algolia/client-search@5.2.3)(search-insights@2.17.0):
/@docsearch/react@3.6.1(@algolia/client-search@5.2.4)(search-insights@2.17.1):
resolution: {integrity: sha512-qXZkEPvybVhSXj0K7U3bXc233tk5e8PfhoZ6MhPOiik/qUQxYC+Dn9DnoS7CxHQQhHfCvTiN0eY9M12oRghEXw==}
peerDependencies:
'@types/react': '>= 16.8.0 < 19.0.0'
@@ -266,11 +273,11 @@ packages:
search-insights:
optional: true
dependencies:
'@algolia/autocomplete-core': 1.9.3(@algolia/client-search@5.2.3)(algoliasearch@4.24.0)(search-insights@2.17.0)
'@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@5.2.3)(algoliasearch@4.24.0)
'@algolia/autocomplete-core': 1.9.3(@algolia/client-search@5.2.4)(algoliasearch@4.24.0)(search-insights@2.17.1)
'@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@5.2.4)(algoliasearch@4.24.0)
'@docsearch/css': 3.6.1
algoliasearch: 4.24.0
search-insights: 2.17.0
search-insights: 2.17.1
transitivePeerDependencies:
- '@algolia/client-search'
dev: true
@@ -777,7 +784,7 @@ packages:
vite: ^5.0.0
vue: ^3.2.25
dependencies:
vite: 5.4.2
vite: 5.4.2(sass-embedded@1.78.0)
vue: 3.4.38
dev: true
@@ -1004,6 +1011,10 @@ packages:
fill-range: 7.1.1
dev: true
/buffer-builder@0.2.0:
resolution: {integrity: sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==}
dev: true
/clipboard@2.0.11:
resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==}
dependencies:
@@ -1190,10 +1201,19 @@ packages:
strip-bom-string: 1.0.0
dev: true
/has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
dev: true
/hookable@5.5.3:
resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
dev: true
/immutable@4.3.7:
resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==}
dev: true
/is-extendable@0.1.1:
resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
engines: {node: '>=0.10.0'}
@@ -1406,8 +1426,228 @@ packages:
queue-microtask: 1.2.3
dev: true
/search-insights@2.17.0:
resolution: {integrity: sha512-AskayU3QNsXQzSL6v4LTYST7NNfs2HWyHHB+sdORP9chsytAhro5XRfToAMI/LAVYgNbzowVZTMfBRodgbUHKg==}
/rxjs@7.8.1:
resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
dependencies:
tslib: 2.7.0
dev: true
/sass-embedded-android-arm64@1.78.0:
resolution: {integrity: sha512-2sAr11EgwPudAuyk4Ite+fWGYJspiFSiZDU2D8/vjjI7BaB9FG6ksYqww3svoMMnjPUWBCjKPDELpZTxViLJbw==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [android]
requiresBuild: true
dev: true
optional: true
/sass-embedded-android-arm@1.78.0:
resolution: {integrity: sha512-YM6nrmKsj+ImaSTd96F+jzbWSbhPkRN4kedbLgIJ5FsILNa9NAqhmrCQz9pdcjuAhyfxWImdUACsT23CPGENZQ==}
engines: {node: '>=14.0.0'}
cpu: [arm]
os: [android]
requiresBuild: true
dev: true
optional: true
/sass-embedded-android-ia32@1.78.0:
resolution: {integrity: sha512-TyJOo4TgnHpOfC/PfqCBqd+jGRanWoRd4Br/0KAfIvaIFjTGIPdk26vUyDVugV1J8QUEY4INGE8EXAuDeRldUQ==}
engines: {node: '>=14.0.0'}
cpu: [ia32]
os: [android]
requiresBuild: true
dev: true
optional: true
/sass-embedded-android-riscv64@1.78.0:
resolution: {integrity: sha512-wwajpsVRuhb7ixrkA3Yu60V2LtROYn45PIYeda30/MrMJi9k3xEqHLhodTexFm6wZoKclGSDZ6L9U5q0XyRKiQ==}
engines: {node: '>=14.0.0'}
cpu: [riscv64]
os: [android]
requiresBuild: true
dev: true
optional: true
/sass-embedded-android-x64@1.78.0:
resolution: {integrity: sha512-k5l66PO0LgSHMDbDzAQ/vqrXMlJ3r42ZHJA8MJvUbA6sQxTzDS381V7L+EhOATwyI225j2FhEeTHW6rr4WBQzA==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [android]
requiresBuild: true
dev: true
optional: true
/sass-embedded-darwin-arm64@1.78.0:
resolution: {integrity: sha512-3JaxceFSR6N+a22hPYYkj1p45eBaWTt/M8MPTbfzU3TGZrU9bmRX7WlUVtXTo1yYI2iMf22nCv0PQ5ExFF3FMQ==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/sass-embedded-darwin-x64@1.78.0:
resolution: {integrity: sha512-UMTijqE3fJ8vEaaD7GPG7G3GsHuPKOdpS8vuA2v2uwO3BPFp/rEKah66atvGqvGO+0JYApkSv0YTnnexSrkHIQ==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/sass-embedded-linux-arm64@1.78.0:
resolution: {integrity: sha512-juMIMpp3DIAiQ842y+boqh0u2SjN4m3mDKrDfMuBznj8DSQoy9J/3e4hLh3g+p0/j83WuROu5nNoYxm2Xz8rww==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/sass-embedded-linux-arm@1.78.0:
resolution: {integrity: sha512-JafT+Co0RK8oO3g9TfVRuG7tkYeh35yDGTgqCFxLrktnkiw5pmIagCfpjxk5GBcSfJMOzhCgclTCDJWAuHGuMQ==}
engines: {node: '>=14.0.0'}
cpu: [arm]
os: [linux]
requiresBuild: true
dev: true
optional: true
/sass-embedded-linux-ia32@1.78.0:
resolution: {integrity: sha512-Gy8GW5g6WX9t8CT2Dto5AL6ikB+pG7aAXWXvfu3RFHktixSwSbyy6CeGqSk1t0xyJCFkQQA/V8HU9bNdeHiBxg==}
engines: {node: '>=14.0.0'}
cpu: [ia32]
os: [linux]
requiresBuild: true
dev: true
optional: true
/sass-embedded-linux-musl-arm64@1.78.0:
resolution: {integrity: sha512-Lu/TlRHbe9aJY7B7PwWCJz7pTT5Rc50VkApWEmPiU/nu0mGbSpg0Xwar6pNeG8+98ubgKKdRb01N3bvclf5a4A==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/sass-embedded-linux-musl-arm@1.78.0:
resolution: {integrity: sha512-DUVXtcsfsiOJ2Zwp4Y3T6KZWX8h0gWpzmFUrx+gSIbg67vV8Ww2DWMjWRwqLe7HOLTYBegMBYpMgMgZiPtXhIA==}
engines: {node: '>=14.0.0'}
cpu: [arm]
os: [linux]
requiresBuild: true
dev: true
optional: true
/sass-embedded-linux-musl-ia32@1.78.0:
resolution: {integrity: sha512-1E5ywUnq6MRPAecr2r/vDOBr93wXyculEmfyF5JRG8mUufMaxGIhfx64OQE6Drjs+EDURcYZ+Qcg6/ubJWqhcw==}
engines: {node: '>=14.0.0'}
cpu: [ia32]
os: [linux]
requiresBuild: true
dev: true
optional: true
/sass-embedded-linux-musl-riscv64@1.78.0:
resolution: {integrity: sha512-YvQEvX7ctn5BwC79+HBagDYIciEkwcl2NLgoydmEsBO/0+ncMKSGnjsn/iRzErbq1KJNyjGEni8eSHlrtQI1vQ==}
engines: {node: '>=14.0.0'}
cpu: [riscv64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/sass-embedded-linux-musl-x64@1.78.0:
resolution: {integrity: sha512-azdUcZZvZmtUBslIKr2/l4aQrTX7BvO96TD0GLdWz9vuXZrokYm09AJZEnb5j6Pk5I4Xr0yM6BG1Vgcbzqi5Zg==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/sass-embedded-linux-riscv64@1.78.0:
resolution: {integrity: sha512-g8M6vqHMjZUoH9C1WJsgwu+qmwdJAAMDaJTM1emeAScUZMTaQGzm+Q6C5oSGnAGR3XLT/drgbHhbmruXDgkdeQ==}
engines: {node: '>=14.0.0'}
cpu: [riscv64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/sass-embedded-linux-x64@1.78.0:
resolution: {integrity: sha512-m997ThzpMwql4u6LzZCoHPIQkgK6bbLPLc7ydemo2Wusqzh6j8XAGxVT5oANp6s2Dmj+yh49pKDozal+tzEX9w==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/sass-embedded-win32-arm64@1.78.0:
resolution: {integrity: sha512-qTLIIC5URYRmeuYYllfoL0K1cHSUd+f3sFHAA6fjtdgf288usd6ToCbWpuFb0BtVceEfGQX8lEp+teOG7n7Quw==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/sass-embedded-win32-ia32@1.78.0:
resolution: {integrity: sha512-BrOWh18T6Y9xgCokGXElEnd8j03fO4W83bwJ9wHRRkrQWaeHtHs3XWW0fX1j2brngWUTjU+jcYUijWF1Z60krw==}
engines: {node: '>=14.0.0'}
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: true
optional: true
/sass-embedded-win32-x64@1.78.0:
resolution: {integrity: sha512-C14iFDJd7oGhmQehRiEL7GtzMmLwubcDqsBarQ+u9LbHoDlUQfIPd7y8mVtNgtxJCdrAO/jc5qR4C+85yE3xPQ==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/sass-embedded@1.78.0:
resolution: {integrity: sha512-NR2kvhWVFABmBm0AqgFw9OweQycs0Qs+/teJ9Su+BUY7up+f8S5F/Zi+7QtAqJlewsQyUNfzm1vRuM+20lBwRQ==}
engines: {node: '>=16.0.0'}
hasBin: true
dependencies:
'@bufbuild/protobuf': 1.10.0
buffer-builder: 0.2.0
immutable: 4.3.7
rxjs: 7.8.1
supports-color: 8.1.1
varint: 6.0.0
optionalDependencies:
sass-embedded-android-arm: 1.78.0
sass-embedded-android-arm64: 1.78.0
sass-embedded-android-ia32: 1.78.0
sass-embedded-android-riscv64: 1.78.0
sass-embedded-android-x64: 1.78.0
sass-embedded-darwin-arm64: 1.78.0
sass-embedded-darwin-x64: 1.78.0
sass-embedded-linux-arm: 1.78.0
sass-embedded-linux-arm64: 1.78.0
sass-embedded-linux-ia32: 1.78.0
sass-embedded-linux-musl-arm: 1.78.0
sass-embedded-linux-musl-arm64: 1.78.0
sass-embedded-linux-musl-ia32: 1.78.0
sass-embedded-linux-musl-riscv64: 1.78.0
sass-embedded-linux-musl-x64: 1.78.0
sass-embedded-linux-riscv64: 1.78.0
sass-embedded-linux-x64: 1.78.0
sass-embedded-win32-arm64: 1.78.0
sass-embedded-win32-ia32: 1.78.0
sass-embedded-win32-x64: 1.78.0
dev: true
/search-insights@2.17.1:
resolution: {integrity: sha512-HHFjYH/0AqXacETlIbe9EYc3UNlQYGNNTY0fZ/sWl6SweX+GDxq9NB5+RVoPLgEFuOtCz7M9dhYxqDnhbbF0eQ==}
dev: true
/section-matter@1.0.0:
@@ -1467,6 +1707,13 @@ packages:
copy-anything: 3.0.5
dev: true
/supports-color@8.1.1:
resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
engines: {node: '>=10'}
dependencies:
has-flag: 4.0.0
dev: true
/tabbable@6.2.0:
resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
dev: true
@@ -1486,6 +1733,10 @@ packages:
is-number: 7.0.0
dev: true
/tslib@2.7.0:
resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==}
dev: true
/ufo@1.5.4:
resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
dev: true
@@ -1499,7 +1750,11 @@ packages:
webpack-virtual-modules: 0.6.2
dev: true
/vite@5.4.2:
/varint@6.0.0:
resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==}
dev: true
/vite@5.4.2(sass-embedded@1.78.0):
resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
@@ -1533,18 +1788,19 @@ packages:
esbuild: 0.21.5
postcss: 8.4.41
rollup: 4.21.2
sass-embedded: 1.78.0
optionalDependencies:
fsevents: 2.3.3
dev: true
/vitepress-sidebar@1.25.0:
resolution: {integrity: sha512-hbS6DEQjdZS1lbm8p1AKrzdfoFDf4Eas/Dmr1xbN+yv9XVf6xAW+q4tJINmuAt6vnvkEgylZlcH1PGzKX0RgcA==}
/vitepress-sidebar@1.25.3:
resolution: {integrity: sha512-NyfJAHqN2AnFEqzVPTQJVo/ii++8i13Xa6W0rqyOqJ4vjZVxkX8HSUUuwcE3ib4COon0lArLJhdQmnVKQvq5mA==}
engines: {node: '>=18.0.0'}
dependencies:
gray-matter: 4.0.3
dev: true
/vitepress@1.3.4(@algolia/client-search@5.2.3)(search-insights@2.17.0):
/vitepress@1.3.4(@algolia/client-search@5.2.4)(sass-embedded@1.78.0)(search-insights@2.17.1):
resolution: {integrity: sha512-I1/F6OW1xl3kW4PaIMC6snxjWgf3qfziq2aqsDoFc/Gt41WbcRv++z8zjw8qGRIJ+I4bUW7ZcKFDHHN/jkH9DQ==}
hasBin: true
peerDependencies:
@@ -1557,7 +1813,7 @@ packages:
optional: true
dependencies:
'@docsearch/css': 3.6.1
'@docsearch/js': 3.6.1(@algolia/client-search@5.2.3)(search-insights@2.17.0)
'@docsearch/js': 3.6.1(@algolia/client-search@5.2.4)(search-insights@2.17.1)
'@shikijs/core': 1.15.1
'@shikijs/transformers': 1.15.1
'@types/markdown-it': 14.1.2
@@ -1570,7 +1826,7 @@ packages:
mark.js: 8.11.1
minisearch: 7.1.0
shiki: 1.15.1
vite: 5.4.2
vite: 5.4.2(sass-embedded@1.78.0)
vue: 3.4.38
transitivePeerDependencies:
- '@algolia/client-search'

View File

@@ -52,5 +52,26 @@
"author": "snowykami",
"description": "自定义各种卡片的背景",
"link": "https://cdn.liteyuki.icu/static/lrp/morebg.zip"
},
{
"name": "测试资源包",
"desc": "test",
"link": "https://cdn.liteyuki.icu/static/lrp/liteyuki_words_aojiao.zip",
"homepage": "",
"author": "snowykami"
},
{
"name": "轻雪Kakyo语言包 稳定版",
"description": "Liteyuki Bot的语言包用于提供多种语言的翻译。",
"link": "https://cdn.liteyuki.icu/static/lrp/kakyo.zip",
"homepage": "https://github.com/Nanaloveyuki/liteyuki-langpack",
"author": "Nanaloveyuki"
},
{
"name": "测试资源包2",
"description": "test",
"link": "https://cdn.liteyuki.icu/static/lrp/liteyuki_words_aojiao.zip",
"homepage": "",
"author": "snowykami"
}
]

View File

@@ -10,7 +10,8 @@ order: 1
```bash
# 克隆项目到本地轻雪使用Git进行版本管理该步骤为必要项
git clone https://github.com/LiteyukiStudio/LiteyukiBot --depth=1
git clone https://github.com/LiteyukiStudio/LiteyukiBot --depth=1 # 若你不能访问Github可以使用Liteyuki镜像https://git.liteyuki.icu/LiteyukiStudio/LiteyukiBot
# 切换到Bot目录下
cd LiteyukiBot
# 安装依赖

View File

@@ -0,0 +1,21 @@
---
title: 最佳实践
order: 10
---
# 最佳实践
## 机器人应用
- [LiteyukiBot](https://github.com/LiteyukiStudio/LiteyukiBot):轻雪官方机器人
- [LiteyukiBot-TriM](https://github.com/TriM-Organization/LiteyukiBot-TriM)TriM 官方定制轻雪机器人
- [Liteyuki Marsho](https://git.liteyuki.icu/LiteyukiStudio/marsho-alpha):基于 轻雪 和 github model 的可爱猫娘机器人
## 插件
- [liteyukibot-plugin-nonebot](https://github.com/LiteyukiStudio/liteyukibot-plugin-nonebot):轻雪机器人 NoneBot 插件,让轻雪支持 NoneBot
- [nonebot-plugin-liteyukibot](https://github.com/LiteyukiStudio/nonebot-plugin-liteyukibot)NoneBot 插件,让 NoneBot 支持轻雪
## 其他
- [liteyuki starmap](https://starmap.liteyuki.icu):轻雪官方星图,展示轻雪的所有实例及其位置分布
- [TRSS_Liteyuki](https://timerainstarsky.github.io/TRSS_Liteyuki/)TRSS LiteyukiBot 管理脚本
- [litedoc](https://github.com/LiteyukiStudio/litedoc)轻雪API文档生成器
- liteyukibot-api (闭源):轻雪机器人统计接口

View File

@@ -2,6 +2,13 @@
title: 开发指南
order: 0
---
<script setup>
import ContributorBar from '../../components/ContributorBar.vue'
</script>
# 开发指南
## 如何开发
@@ -49,8 +56,8 @@ order: 0
- commit message请遵循以下规范
- 应在每次完成一个功能或修复一个bug后提交代码不要将多个功能或多个bug的代码混在一起提交。
- 我们使用gitmoji来标记commit的类型`:sparkles:`表示引入新功能,`:bug:`表示修复bug等具体请参考[gitmoji](https://gitmoji.dev/)
- commit message的格式为`<emoji> [module]: <message>`,如`:sparkles: [liteyuki.event]: add new feature`
其中module字段为受影响部分例如`liteyuki.message``docs.en.guide.md`等,不作过多要求,但请尽量填写;message字段为简短的描述总结来说就是你干了什么。
- commit message的格式为`<emoji> [type:] <message>`,如`:sparkles: feat: 给event添加新字段`
其中`type`字段为commit类型且**可选**message字段为简短的描述总结来说就是你干了什么。
- 不限制commit message的语言有条件可以使用中英双语。
- 文档请遵循[`Markdown`](https://www.markdownguide.org/)语法并且支持vitepress相关内容
- 修订文档时,每个语言的文档都要修订。
@@ -59,3 +66,6 @@ order: 0
## 最后
- 本项目是一个非盈利的开源项目,我们欢迎任何人参与开发,你的贡献将会使轻雪变得更好。
<ContributorBar />

View File

@@ -14,6 +14,9 @@ hero:
- theme: alt
text: 📦 扩展
link: ./store/resource
- theme: alt
text: 🛠️ 开发
link: ./dev/guide
image:
light: ./liteyuki.svg
dark: ./liteyuki-dark.svg
@@ -23,7 +26,7 @@ features:
- title: 生态良好
icon: 🛠️
details: 基于轻雪框架原生支持任意Python Bot框架和应用程序
link: ./dev/api/api
link: ./dev/api
- title: 插件管理
icon: 🧩

View File

@@ -0,0 +1,3 @@
"""
Module docs
"""

60
liteyuki_flow/__main__.py Normal file
View File

@@ -0,0 +1,60 @@
"""
Module docs
"""
import os
from github import Github
from argparse import ArgumentParser
from liteyuki_flow.const import PLUGIN_PREFIX, RESOURCE_PREFIX
from liteyuki_flow.typ import err, nil # type: ignore
if __name__ == "__main__":
parser = ArgumentParser()
parser.add_argument("--handle", action="store_true") # 处理issue
parser.add_argument("-p", "--parse", action="store_true") # 解析markdown文件
parser.add_argument("-i", "--input", type=str, help="Path to the markdown file.")
args = parser.parse_args()
if args.handle:
print("Starting the issue handler module...")
ISSUE_NUMBER = os.getenv("ISSUE_NUMBER")
REPOSITORY = os.getenv("REPOSITORY")
ACT_TYPE = os.getenv("ACT_TYPE") # opened, edited, closed, reopened
if ISSUE_NUMBER is None or REPOSITORY is None or ACT_TYPE is None:
raise ValueError("Issue number, repository and action type are required.")
g = Github(os.getenv("GITHUB_TOKEN"))
repo = g.get_repo(REPOSITORY)
issue = g.get_repo(REPOSITORY).get_issue(int(ISSUE_NUMBER))
# 审资源
if issue.title.strip().startswith(RESOURCE_PREFIX):
from liteyuki_flow.resource_handler import handle_resource # type: ignore
handle_resource(github=g, issue=issue, repo=repo, act_type=ACT_TYPE)
# 审插件
elif issue.title.strip().startswith(PLUGIN_PREFIX):
from liteyuki_flow.plugin_handler import handle_plugin # type: ignore
pass
else:
print("No handler found for the issue.")
elif args.parse:
print("Starting the markdown parser module...")
from liteyuki_flow.markdown_parser import MarkdownParser # type: ignore
if args.input is None:
raise ValueError("Input file is required.")
with open(args.input, "r", encoding="utf-8") as f:
content = f.read()
md_parser = MarkdownParser(content) # type: ignore
err = md_parser.parse_front_matters() # type: ignore
if err != nil:
print(f"Err: {err}")
for k, v in md_parser.front_matters.content.items():
print(f"{k}: {v}")
else:
print("No module specified.")

19
liteyuki_flow/const.py Normal file
View File

@@ -0,0 +1,19 @@
"""
Module docs
"""
OPENED = "opened"
EDITED = "edited"
CLOSED = "closed"
REOPENED = "reopened"
RESOURCE_PREFIX = "Resource: "
PLUGIN_PREFIX = "Plugin: "
PLUGIN_JSON = "docs/public/plugins.json"
RESOURCE_JSON = "docs/public/resources.json"
edit_content_tip = "若要修改请编辑这段front matter不要编辑正文/If you want to modify, please edit the front matter, do not edit the body"
edit_tip = "如需修改请直接编辑issue请不要新建issue我会自动检查"
bot_id = "liteyuki-flow"

View File

@@ -0,0 +1,146 @@
"""
从markdown提取插件/资源信息
"""
from typing import Any
from github.Issue import Issue
from liteyuki_flow.typ import Nil, err, nil # type: ignore
# # xxx
class Header:
def __init__(self, level: int, content: str):
self.level = level
self.content = content
def __str__(self):
return f'Header({self.level}, {self.content})'
def __repr__(self):
return self.__str__()
# - xxx
class List:
def __init__(self, level: int, content: str):
self.level = level
self.content = content
def __str__(self):
return f'List({self.level}, {self.content})'
def __repr__(self):
return self.__str__()
class FrontMatter:
def __init__(self, content: dict[str, str]):
self.content = content
def __setitem__(self, key: str, value: str):
self.content[key] = value
def get(self, key, default=None) -> Any:
return self.content.get(key, default)
def __str__(self):
return "\n".join([f'{k}: {v}' for k, v in self.content.items()])
class MarkdownParser:
def __init__(self, content: str):
self.content = content
self.content_lines = content.split('\n')
self.front_matters: FrontMatter = FrontMatter({})
self._content_list: list[Any] = [self.front_matters]
self.lineno = 0
self._parsed = False
def parse_front_matters(self) -> err:
if self.content_lines[self.lineno].strip() != '---':
return ValueError('Invalid front matter')
while self.lineno < len(self.content_lines):
self._next_line()
line = self.content_lines[self.lineno]
if line.strip() == '---':
break
if line.strip().startswith('#'):
# fm注释
continue
try:
key, value = line.split(':', 1)
except ValueError:
return Exception(f'Invalid front matter: {line}')
self.front_matters[key.strip()] = value.strip()
return nil
def build_front_matters(self) -> str:
return "---\n" + str(self.front_matters) + "\n---"
def _parse_content(self) -> tuple[list[Any], err]:
content: list[Any] = []
while self.lineno < len(self.content_lines):
item, e = self._parse_line()
if e != nil:
return nil, e
content.append(item)
return content, nil
def _parse_line(self) -> tuple[Any, err]:
line = self.content_lines[self.lineno]
if line.startswith('#'):
# 计算start有几个#
start = 0
while line[start] == '#':
start += 1
return Header(start, line[start:].strip()), nil
elif line.startswith('-'):
start = 0
while line[start] == '-':
start += 1
return List(start, line[start:].strip()), nil
# 处理<!--注释 continue
elif line.strip().startswith('<!--'):
while not line.strip().endswith('-->'):
self._next_line()
line = self.content_lines[self.lineno]
return None, nil
# 处理[//]: # (注释) continue
elif line.strip().startswith('[//]: #'):
self._next_line()
return None, nil
self._next_line()
return nil, ValueError(f'Invalid line: {line}')
def _next_line(self):
self.lineno += 1
def parse(self) -> tuple[list[Any] | Nil, err]:
if self._parsed:
return self._content_list, nil
e = self.parse_front_matters()
if e != nil:
return nil, e
ls, e = self._parse_content()
if e != nil:
return nil, e
self._content_list.extend(ls)
self._parsed = True
return self._content_list, nil
# 解析资源发布issue体
def parse_resource_publish_info(issue: Issue) -> dict[str, str]:
parser = MarkdownParser(issue.body)
parser.parse_front_matters()
return parser.front_matters

View File

@@ -0,0 +1,7 @@
"""
Module docs
"""
def plugin_handler():
pass

View File

@@ -0,0 +1,3 @@
PyGithub==2.4.0
requests==2.31.0
pyyaml==6.0.2

View File

@@ -0,0 +1,199 @@
"""
Module docs
"""
import requests # type: ignore
import zipfile
from github import Github, InputGitTreeElement, GitTree
from github.Issue import Issue
from github.Repository import Repository
import json
import yaml
from liteyuki_flow.const import OPENED, EDITED, CLOSED, REOPENED, RESOURCE_JSON, bot_id, edit_tip
from liteyuki_flow.markdown_parser import MarkdownParser
from liteyuki_flow.typ import err, nil
user_agent = "liteyuki-flow"
headers = {
"User-Agent": user_agent
}
def push_check_result(issue: Issue, result: str):
cid = None
for cm in issue.get_comments():
if cm.body.startswith("检查结果") and cm.user.login == bot_id:
cid = cm.id
break
if cid is not None:
issue.get_comment(cid).edit("检查结果: " + result)
else:
issue.create_comment("检查结果: " + result)
def push_publish_result(issue: Issue, result: str):
cid = None
for cm in issue.get_comments():
if cm.body.startswith("发布结果") and cm.user.login == bot_id:
cid = cm.id
break
if cid is not None:
issue.get_comment(cid).edit("发布结果: " + result)
else:
issue.create_comment("发布结果: " + result)
# opened: 创建新的资源包,预审核
# edited: 编辑资源包信息,需重新审核
# closed: 审核通过修改json并提交
# reopened: 重新打开,无操作
def on_first_open(github: Github, issue: Issue, repo: Repository):
issue.create_comment("已收到资源包发布请求,我会马上开始预检. " + edit_tip)
push_check_result(issue, "请等待")
issue.add_to_labels("Resource")
# opened | edited
def pre_check(github: Github, issue: Issue, repo: Repository) -> err:
parser = MarkdownParser(issue.body)
parser.parse_front_matters()
name = parser.front_matters.get("name")
desc = parser.front_matters.get("desc")
link = parser.front_matters.get("link")
homepage = parser.front_matters.get("homepage") # optional
author = parser.front_matters.get("author")
if not all((name, desc, link, author)):
push_check_result(issue, "❌ name, desc, link, homepage 及 author 为必填字段.")
return ValueError("name, desc, link, homepage 及 author 为必填字段.")
# 下载并解析资源包
r = requests.get(link, headers=headers)
if r.status_code != 200:
push_check_result(issue, "❌ 下载失败.")
return ValueError("下载失败.")
try:
with open(f"{name}.zip", "wb") as f:
f.write(r.content)
# 解压
with zipfile.ZipFile(f"{name}.zip", "r") as z:
z.extractall(f"{name}")
# 检测包内metadata.yml文件
data = yaml.load(open(f"{name}/metadata.yml"), Loader=yaml.SafeLoader)
except Exception as e:
push_check_result(issue, "❌ 解析资源包失败可能是格式问题或metadata.yml不存在: " + str(e))
return e
# 检测必要字段 namedescriptionversion
if not all((data.get("name"), data.get("description"), data.get("version"))):
push_check_result(issue, "❌ 元数据中缺少必要字段 name, description 或 version.")
return ValueError("元数据中缺少必要字段 name, description 或 version.")
# 不检测重复资源包,因为资源包可能有多个版本
# 检测通过编辑原issue
metadata_markdown = f"**名称**: {data.get('name')}\n**描述**: {data.get('description')}\n**版本**: {data.get('version')}\n"
for k, v in data.items():
if k not in ("name", "description", "version"):
metadata_markdown += f"**{k}**: {v}\n"
new_issue_body = f"---\nname: {name}\ndesc: {desc}\nlink: {link}\nhomepage: {homepage}\nauthor: {author}\n---\n"
publish_info = f"## 发布信息\n"
publish_info += f"**名称**: {name}\n"
publish_info += f"**描述**: {desc}\n"
publish_info += f"**作者**: {author}\n"
publish_info += f"**主页**: {homepage}\n"
publish_info += f"**下载**: {link}\n"
# 遍历其他字段
for k, v in data.items():
if k not in ("name", "description", "version"):
new_issue_body += f"**{k}**: {v}\n"
issue.edit(title=f"Resource: {name}")
issue.add_to_labels("pre-checked")
push_check_result(issue, f"✅ 预检查通过,等待管理员人工审核\n{publish_info}\n## 元数据\n{metadata_markdown}")
return nil
# closed
def add_resource(github: Github, issue: Issue, repo: Repository) -> err:
# 检测关闭时是否有管理员发布的通过评论
try:
if "pre-checked" not in [l.name for l in issue.labels]:
issue.edit(state="open")
push_publish_result(issue, "❌ 请先通过预检查。")
return ValueError("请先进行预检查。")
# 检测评论
for cm in issue.get_comments():
if cm.body.startswith(("通过", "pass",)):
# 检测用户是否是管理员
if cm.user.login not in [u.login for u in repo.get_collaborators()]:
issue.edit(state="open")
push_publish_result(issue, "❌ 你不是仓库管理员,无法发布资源包。")
return ValueError("你不是仓库管理员,无法发布资源包。")
break
else:
issue.edit(state="open")
push_publish_result(issue, "❌ 管理员未审核。")
return ValueError("管理员未审核。")
parser = MarkdownParser(issue.body)
parser.parse_front_matters()
name = parser.front_matters.get("name")
desc = parser.front_matters.get("desc")
link = parser.front_matters.get("link")
homepage = parser.front_matters.get("homepage") # optional
author = parser.front_matters.get("author")
# 编辑仓库内的json文件
resources = json.load(open(RESOURCE_JSON))
resources.append({
"name": name,
"description": desc,
"link": link,
"homepage": homepage,
"author": author
})
ref = repo.get_git_ref("heads/main")
tree = repo.create_git_tree(
base_tree=repo.get_git_commit(ref.object.sha).tree,
tree=[
InputGitTreeElement(
path=RESOURCE_JSON,
mode="100644",
type="blob",
content=json.dumps(resources, indent=4, ensure_ascii=False)
)
]
)
commit = repo.create_git_commit(
message=f":package: 发布资源: {name}",
tree=tree,
parents=[repo.get_git_commit(ref.object.sha)]
)
ref.edit(commit.sha)
if "pre-checked" in [l.name for l in issue.labels]:
issue.remove_from_labels("pre-checked")
issue.add_to_labels("published")
push_publish_result(issue, f"✅ 资源包 {name} 已发布!商店页面稍后就会更新。")
return nil
except Exception as e:
issue.edit(state="open")
push_publish_result(issue, f"❌ 发布失败: {str(e)}")
return e
def handle_resource(github: Github, issue: Issue, repo: Repository, act_type: str):
if act_type in (OPENED, EDITED):
if act_type == OPENED:
on_first_open(github, issue, repo)
pre_check(github, issue, repo)
elif act_type == CLOSED:
e = add_resource(github, issue, repo)
if e != nil:
print(f"Error: {e}")
else:
print("No operation found for the issue: ", act_type)

26
liteyuki_flow/ts.md Normal file
View File

@@ -0,0 +1,26 @@
---
# 请修改此处内容/Please modify the content here
# 不要修改正文中的内容/Do not modify the content in the body
name: PluginName
desc: 插件描述
author: 作者名
link: 下载链接
homepage: 主页链接
---
<!-- 以下字段自动生成,请勿编辑 -->
# Plugin: PluginName
## 插件信息
- **包名**: PluginName
- **描述**: 插件描述
- **作者**: AuthorName
- **主页**: https://a.b.c
## 资源包信息
- **名称**: PluginName
- **描述**: 插件描述
- **作者**: AuthorName
- **主页**: https://a.b.c
- **下载**: https://a.b.c

20
liteyuki_flow/typ.py Normal file
View File

@@ -0,0 +1,20 @@
"""
Module docs
"""
from typing import TypeAlias
class Nil():
def __eq__(self, other):
if isinstance(other, Nil):
return True
return other is None
# 不等于
def __ne__(self, other):
return not self.__eq__(other)
nil = Nil()
err: TypeAlias = Exception | Nil

View File

@@ -107,7 +107,7 @@ async def _(matcher: Matcher, bot: T_Bot, event: T_MessageEvent):
).handle()
# Satori OK
async def _(matcher: Matcher):
await matcher.finish("https://bot.liteyuki.icu/usage")
await matcher.finish("https://bot.liteyuki.icu/")
@on_alconna(

View File

@@ -64,6 +64,8 @@ data
- percent: float
- total: int
"""
# status_card_cache = {} # lang -> bytes
@@ -269,7 +271,9 @@ async def get_hardware_data() -> dict:
for disk in psutil.disk_partitions(all=True):
try:
disk_usage = psutil.disk_usage(disk.mountpoint)
if disk_usage.total == 0:
if disk_usage.total == 0 or disk.mountpoint.startswith(
("/var", "/boot", "/run", "/proc", "/sys", "/dev", "/tmp", "/snap")
):
continue # 虚拟磁盘
result["disk"].append(
{

View File

@@ -121,9 +121,10 @@
font-size: 24px;
margin-left: 20px;
text-align: left;
white-space: nowrap;
white-space: normal; /* 允许换行 */
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all; /* 允许在单词内换行 */
z-index: 2;
}

6
todo.md Normal file
View File

@@ -0,0 +1,6 @@
# TODO
- [ ] 工作流适配新版本插件检查和发布
- [ ] 修复与其他框架的会话对接(目前只能管理)
- [ ] 插件的检查和发布
- [ ] 提取utils可复用部分作为独立模块