2024-08-12 05:27:23 +08:00
<!doctype html>
< html lang = "zh-CN" data-theme = "light" >
< head >
< meta charset = "utf-8" / >
< meta name = "viewport" content = "width=device-width,initial-scale=1" / >
< meta name = "generator" content = "VuePress 2.0.0-rc.9" / >
< meta name = "theme" content = "VuePress Theme Hope 2.0.0-rc.32" / >
< style >
html {
background: var(--bg-color, #fff);
}
html[data-theme="dark"] {
background: var(--bg-color, #1d1e1f);
}
body {
background: var(--bg-color);
}
< / style >
< script >
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia & &
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" & & systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
< / script >
2024-08-12 06:07:50 +08:00
< meta property = "og:url" content = "https://vuepress-theme-hope-docs-demo.netlify.app/dev/dev_lyplugin.html" > < meta property = "og:site_name" content = "LiteyukiBot 轻雪机器人" > < meta property = "og:title" content = "轻雪插件开发" > < meta property = "og:description" content = "简介 轻雪插件是轻雪内置的一部分功能,运行在主进程中,可以很高程度地扩展轻雪的功能 开始 创建插件 在标准项目中, 位于liteyuki/plugins和src/liteyuki_plugins下的Python modules均会被当作插件加载, 你可自行添加配置文件以指定插件的加载路径 一个.py文件或一个包含__init__.py的文件夹即可被识别为插..." > < meta property = "og:type" content = "article" > < meta property = "og:locale" content = "zh-CN" > < meta property = "og:updated_time" content = "2024-08-11T22:07:01.000Z" > < meta property = "article:author" content = "远野千束" > < meta property = "article:modified_time" content = "2024-08-11T22:07:01.000Z" > < script type = "application/ld+json" > { "@context" : "https://schema.org" , "@type" : "Article" , "headline" : "轻雪插件开发" , "image" : [ "" ] , "dateModified" : "2024-08-11T22:07:01.000Z" , "author" : [ { "@type" : "Person" , "name" : "远野千束" , "url" : "https://sfkm.me" } ] } < / script > < script src = "/js/style.js" type = "module" > < / script > < script src = "/js/get_data.js" type = "module" > < / script > < link rel = "icon" href = "https://cdn.liteyuki.icu/favicon.ico" > < link rel = "stylesheet" href = "https://cdn.bootcdn.net/ajax/libs/firacode/6.2.0/fira_code.min.css" > < meta name = "viewport" content = "width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" > < title > 轻雪插件开发 | LiteyukiBot 轻雪机器人< / title > < meta name = "description" content = "简介 轻雪插件是轻雪内置的一部分功能,运行在主进程中,可以很高程度地扩展轻雪的功能 开始 创建插件 在标准项目中, 位于liteyuki/plugins和src/liteyuki_plugins下的Python modules均会被当作插件加载, 你可自行添加配置文件以指定插件的加载路径 一个.py文件或一个包含__init__.py的文件夹即可被识别为插..." >
2024-08-12 05:27:23 +08:00
< link rel = "preload" href = "/assets/style-CSEr-Ojo.css" as = "style" > < link rel = "stylesheet" href = "/assets/style-CSEr-Ojo.css" >
2024-08-15 03:06:55 +08:00
< link rel = "modulepreload" href = "/assets/app-BQ7pyXhF.js" > < link rel = "modulepreload" href = "/assets/dev_lyplugin.html-CNb_B1WI.js" >
< link rel = "prefetch" href = "/assets/index.html-DwXPp1-g.js" as = "script" > < link rel = "prefetch" href = "/assets/childrensdaybak.html-ro2mV31P.js" as = "script" > < link rel = "prefetch" href = "/assets/foolsday.html-60tWG1OI.js" as = "script" > < link rel = "prefetch" href = "/assets/index.html-Bo_7iMZe.js" as = "script" > < link rel = "prefetch" href = "/assets/config.html-CDpl_Rzh.js" as = "script" > < link rel = "prefetch" href = "/assets/fandq.html-DjBA10Oq.js" as = "script" > < link rel = "prefetch" href = "/assets/install.html-DRyEsrc7.js" as = "script" > < link rel = "prefetch" href = "/assets/index.html-BZJ7uoKY.js" as = "script" > < link rel = "prefetch" href = "/assets/dev_comm.html-BrdsxrCq.js" as = "script" > < link rel = "prefetch" href = "/assets/dev_lyfunc.html-D7Xf9tQW.js" as = "script" > < link rel = "prefetch" href = "/assets/dev_resource_pack.html-cnhMnnp2.js" as = "script" > < link rel = "prefetch" href = "/assets/index.html-DR8vT4FD.js" as = "script" > < link rel = "prefetch" href = "/assets/plugin.html-Cg5UFB6S.js" as = "script" > < link rel = "prefetch" href = "/assets/resource.html-CeQBMl_n.js" as = "script" > < link rel = "prefetch" href = "/assets/index.html-CspzIAt7.js" as = "script" > < link rel = "prefetch" href = "/assets/agreement.html-CdwQUY1W.js" as = "script" > < link rel = "prefetch" href = "/assets/basic_command.html-BVsEw-Vx.js" as = "script" > < link rel = "prefetch" href = "/assets/extra_command.html-C7AEdBBV.js" as = "script" > < link rel = "prefetch" href = "/assets/lyapi.html-C6txaQdF.js" as = "script" > < link rel = "prefetch" href = "/assets/404.html-_L7FkCTX.js" as = "script" > < link rel = "prefetch" href = "/assets/giscus-7BMGhbDA.js" as = "script" > < link rel = "prefetch" href = "/assets/index-Cw_AvLww.js" as = "script" > < link rel = "prefetch" href = "/assets/photoswipe.esm-SzV8tJDW.js" as = "script" >
2024-08-12 05:27:23 +08:00
< / head >
< body >
2024-08-12 06:07:50 +08:00
< div id = "app" > <!-- [ --> <!-- [ --> <!-- [ --> < span tabindex = "-1" > < / span > < a href = "#main-content" class = "vp-skip-link sr-only" > 跳至主要內容< / a > <!-- ] --> < div class = "theme-container has-toc" > <!-- [ --> < header id = "navbar" class = "vp-navbar" > < div class = "vp-navbar-start" > < button type = "button" class = "vp-toggle-sidebar-button" title = "Toggle Sidebar" > < span class = "icon" > < / span > < / button > <!-- [ --> <!-- --> <!-- ] --> <!-- [ --> < a class = "route-link vp-brand" href = "/" > < img class = "vp-nav-logo" src = "https://cdn.liteyuki.icu/static/img/liteyuki_icon_640.png" alt > <!-- --> < span class = "vp-site-name hide-in-pad" > LiteyukiBot 轻雪机器人< / span > < / a > <!-- ] --> <!-- [ --> <!-- --> <!-- ] --> < / div > < div class = "vp-navbar-center" > <!-- [ --> <!-- --> <!-- ] --> <!-- [ --> < nav class = "vp-nav-links" > < div class = "nav-item hide-in-mobile" > < a class = "route-link nav-link" href = "/" aria-label = "首页" > < span class = "font-icon icon fa-fw fa-sm fas fa-home" style = "" > < / span > 首页<!-- --> < / a > < / div > < div class = "nav-item hide-in-mobile" > < a class = "route-link nav-link" href = "/deployment/" aria-label = "安装及部署" > <!-- --> 安装及部署<!-- --> < / a > < / div > < div class = "nav-item hide-in-mobile" > < a class = "route-link nav-link" href = "/usage/" aria-label = "使用及功能" > <!-- --> 使用及功能<!-- --> < / a > < / div > < div class = "nav-item hide-in-mobile" > < a class = "route-link nav-link" href = "/store/" aria-label = "资源及插件" > <!-- --> 资源及插件<!-- --> < / a > < / div > < div class = "nav-item hide-in-mobile" > < a class = "route-link nav-link active" href = "/dev/" aria-label = "开发及贡献" > <!-- --> 开发及贡献<!-- --> < / a > < / div > < / nav > <!-- ] --> <!-- [ --> <!-- --> <!-- ] --> < / div > < div class = "vp-navbar-end" > <!-- [ --> <!-- --> <!-- ] --> <!-- [ --> <!-- --> < div class = "nav-item vp-repo" > < a class = "vp-repo-link" href = "https://github.com/LiteyukiStudio/LiteyukiBot" target = "_blank" rel = "noopener noreferrer" aria-label = "GitHub" > < svg xmlns = "http://www.w3.org/2000/svg" class = "icon github-icon" viewBox = "0 0 1024 1024" fill = "currentColor" aria-label = "github icon" style = "width:1.25rem;height:1.25rem;vertical-align:middle;" > < path d = "M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z" > < / path > < / svg > < / a > < / div > < div class = "nav-item hide-in-mobile" > < button type = "button" id = "appearance-switch" > < svg xmlns = "http://www.w3.org/2000/svg" class = "icon auto-icon" viewBox = "0 0 1024 1024" fill = "currentColor" aria-label = "auto icon" style = "display:block;" > < path d = "M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z" > < / path > < / svg > < svg xmlns = "http://www.w3.org/2000/svg" class = "icon dark-icon" viewBox = "0 0 1024 1024" fill = "currentColor" aria-label = "dark icon" style = "display:none;" > < path d = "M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z" >
2024-08-12 05:27:23 +08:00
2024-08-12 06:07:50 +08:00
< span class = "token comment" > # 定义插件元数据,推荐填写< / span >
2024-08-12 05:27:23 +08:00
__plugin_meta__ < span class = "token operator" > =< / span > PluginMetadata< span class = "token punctuation" > (< / span >
2024-08-12 06:07:50 +08:00
name< span class = "token operator" > =< / span > < span class = "token string" > " NoneDog" < / span > < span class = "token punctuation" > ,< / span > < span class = "token comment" > # 插件名称< / span >
version< span class = "token operator" > =< / span > < span class = "token string" > " 1.0.0" < / span > < span class = "token punctuation" > ,< / span > < span class = "token comment" > # 插件版本< / span >
description< span class = "token operator" > =< / span > < span class = "token string" > " A simple plugin for nonebot developer" < / span > < span class = "token comment" > # 插件描述< / span >
2024-08-12 05:27:23 +08:00
< span class = "token punctuation" > )< / span >
< span class = "token comment" > # 你的插件代码< / span >
2024-08-12 06:07:50 +08:00
< span class = "token punctuation" > .< / span > < span class = "token punctuation" > .< / span > < span class = "token punctuation" > .< / span >
< / code > < / pre > < div class = "line-numbers" aria-hidden = "true" > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < / div > < / div > < h3 id = "编写逻辑部分" tabindex = "-1" > < a class = "header-anchor" href = "#编写逻辑部分" > < span > 编写逻辑部分< / span > < / a > < / h3 > < p > 轻雪主进程不涉及聊天部分,因此插件主要是一些后台任务或者与聊天机器人的通信 以下我们会编写一个简单的插件, 用于开发NoneBot时进行文件系统变更重载< / p > < div class = "language-python line-numbers-mode" data-ext = "py" data-title = "py" > < pre class = "language-python" > < code > < span class = "token keyword" > import< / span > os
< span class = "token keyword" > from< / span > liteyuki< span class = "token punctuation" > .< / span > dev < span class = "token keyword" > import< / span > observer < span class = "token comment" > # 导入文件系统观察器< / span >
< span class = "token keyword" > from< / span > liteyuki < span class = "token keyword" > import< / span > get_bot< span class = "token punctuation" > ,< / span > logger < span class = "token comment" > # 导入轻雪Bot和日志< / span >
< span class = "token keyword" > from< / span > watchdog< span class = "token punctuation" > .< / span > events < span class = "token keyword" > import< / span > FileSystemEvent < span class = "token comment" > # 导入文件系统事件< / span >
2024-08-12 05:27:23 +08:00
2024-08-12 06:07:50 +08:00
liteyuki < span class = "token operator" > =< / span > get_bot< span class = "token punctuation" > (< / span > < span class = "token punctuation" > )< / span > < span class = "token comment" > # 获取唯一的轻雪Bot实例< / span >
2024-08-12 05:27:23 +08:00
2024-08-12 06:07:50 +08:00
exclude_extensions < span class = "token operator" > =< / span > < span class = "token punctuation" > (< / span > < span class = "token string" > " .pyc" < / span > < span class = "token punctuation" > ,< / span > < span class = "token string" > " .pyo" < / span > < span class = "token punctuation" > )< / span > < span class = "token comment" > # 排除的文件扩展名< / span >
2024-08-12 05:27:23 +08:00
< span class = "token comment" > # 用observer的on_file_system_event装饰器监听文件系统事件< / span >
< span class = "token decorator annotation punctuation" > @observer< span class = "token punctuation" > .< / span > on_file_system_event< / span > < span class = "token punctuation" > (< / span >
directories< span class = "token operator" > =< / span > < span class = "token punctuation" > (< / span > < span class = "token string" > " src/nonebot_plugins" < / span > < span class = "token punctuation" > ,< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > ,< / span >
event_filter< span class = "token operator" > =< / span > < span class = "token keyword" > lambda< / span > event< span class = "token punctuation" > :< / span > < span class = "token keyword" > not< / span > event< span class = "token punctuation" > .< / span > src_path< span class = "token punctuation" > .< / span > endswith< span class = "token punctuation" > (< / span > exclude_extensions< span class = "token punctuation" > )< / span > < span class = "token keyword" > and< / span > < span class = "token punctuation" > (< / span > < span class = "token string" > " __pycache__" < / span > < span class = "token keyword" > not< / span > < span class = "token keyword" > in< / span > event< span class = "token punctuation" > .< / span > src_path< span class = "token punctuation" > )< / span > < span class = "token keyword" > and< / span > os< span class = "token punctuation" > .< / span > path< span class = "token punctuation" > .< / span > isfile< span class = "token punctuation" > (< / span > event< span class = "token punctuation" > .< / span > src_path< span class = "token punctuation" > )< / span >
< span class = "token punctuation" > )< / span >
< span class = "token keyword" > def< / span > < span class = "token function" > restart_nonebot_process< / span > < span class = "token punctuation" > (< / span > event< span class = "token punctuation" > :< / span > FileSystemEvent< span class = "token punctuation" > )< / span > < span class = "token punctuation" > :< / span >
logger< span class = "token punctuation" > .< / span > debug< span class = "token punctuation" > (< / span > < span class = "token string-interpolation" > < span class = "token string" > f" File < / span > < span class = "token interpolation" > < span class = "token punctuation" > {< / span > event< span class = "token punctuation" > .< / span > src_path< span class = "token punctuation" > }< / span > < / span > < span class = "token string" > changed, reloading nonebot..." < / span > < / span > < span class = "token punctuation" > )< / span >
2024-08-12 06:07:50 +08:00
liteyuki< span class = "token punctuation" > .< / span > restart_process< span class = "token punctuation" > (< / span > < span class = "token string" > " nonebot" < / span > < span class = "token punctuation" > )< / span > < span class = "token comment" > # 调用重启进程方法< / span >
< / code > < / pre > < div class = "line-numbers" aria-hidden = "true" > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < div class = "line-number" > < / div > < / div > < / div > < h3 id = "加载插件" tabindex = "-1" > < a class = "header-anchor" href = "#加载插件" > < span > 加载插件< / span > < / a > < / h3 > < p > 在配置文件中的< code > liteyuki.plugins< / code > 中添加你的插件路径,例如< code > watchdog_plugin< / code > , 重启轻雪即可加载插件。然后我们在src/nonebot_plugins下创建一个文件, 例如< code > test.py< / code > , 并在其中写入一些代码, 保存后轻雪会自动重载NoneBot进程< / p > < / div > <!-- [ --> <!-- --> <!-- ] --> < footer class = "page-meta" > < div class = "meta-item edit-link" > < a href = "https://github.com/LiteyukiStudio/LiteyukiBot/edit/main/docs/dev/dev_lyplugin.md" rel = "noopener noreferrer" target = "_blank" aria-label = "在 GitHub 上编辑" class = "nav-link label" > <!-- [ --> < svg xmlns = "http://www.w3.org/2000/svg" class = "icon edit-icon" viewBox = "0 0 1024 1024" fill = "currentColor" aria-label = "edit icon" > < path d = "M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z" > < / path > < path d = "M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z" > < / path > < / svg > <!-- ] --> 在 GitHub 上编辑< span > < svg class = "external-link-icon" xmlns = "http://www.w3.org/2000/svg" aria-hidden = "true" focusable = "false" x = "0px" y = "0px" viewBox = "0 0 100 100" width = "15" height = "15" > < path fill = "currentColor" d = "M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z" > < / path > < polygon fill = "currentColor" points = "45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9" > < / polygon > < / svg > < span class = "external-link-icon-sr-only" > open in new window< / span > < / span > <!-- --> < / a > < / div > < div class = "meta-item git-info" > < div class = "update-time" > < span class = "label" > 上次编辑于: < / span > <!-- --> < / div > < div class = "contributors" > < span class = "label" > 贡献者: < / span > <!-- [ --> <!-- [ --> < span class = "contributor" title = "email: snowykami@outlook.com" > snowy< / span > <!-- ] --> <!-- ] --> < / div > < / div > < / footer > < nav class = "vp-page-nav" > < a class = "route-link nav-link prev" href = "/dev/dev_lyfunc.html" aria-label = "轻雪函数" > < div class = "hint" > < span class = "arrow start" > < / span > 上一页< / div > < div class = "link" > < span class = "font-icon icon fa-fw fa-sm fas fa-code" style = "" > < / span > 轻雪函数< / div > < / a > < a class = "route-link nav-link next" href = "/dev/dev_comm.html" aria-label = "进程通信" > < div class = "hint" > 下一页< span class = "arrow end" > < / span > < / div > < div class = "link" > 进程通信< span class = "font-icon icon fa-fw fa-sm fas fa-exchange-alt" style = "" > < / span > < / div > < / a > < / nav > < div id = "vp-comment" class = "giscus-wrapper input-top" style = "display:block;" > < svg xmlns = "http://www.w3.org/2000/svg" width = "32" height = "32" preserveAspectRatio = "xMidYMid" viewBox = "0 0 100 100" > < circle cx = "28" cy = "75" r = "11" fill = "currentColor" > < animate attributeName = "fill-opacity" begin = "0s" dur = "1s" keyTimes = "0;0.2;1" repeatCount = "indefinite" values = "0;1;1" > < / animate > < / circle > < path fill = "none" stroke = "#88baf0" stroke-width = "10" d = "M28 47a28 28 0 0 1 28 28" > < animate attributeName = "stroke-opacity" begin = "0.
2024-08-15 03:06:55 +08:00
< script type = "module" src = "/assets/app-BQ7pyXhF.js" defer > < / script >
2024-08-12 05:27:23 +08:00
< / body >
< / html >