2024-08-12 05:51:00 +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-17 00:40:29 +08:00
< meta property = "og:url" content = "https://vuepress-theme-hope-docs-demo.netlify.app/dev/dev_comm.html" > < meta property = "og:site_name" content = "LiteyukiBot 轻雪机器人" > < meta property = "og:title" content = "进程通信" > < meta property = "og:description" content = "通道通信 简介 轻雪运行在主进程 MainProcess 里, 其他插件框架进程是伴随的子进程, 因此无法通过内存共享和直接对象传递的方式进行通信, 轻雪提供了一个通道Channel用于跨进程通信, 你可以通过Channel发送消息给其他进程, 也可以监听其他进程的消息。 例如子进程接收到用户信息需要重启机器人,这时可以通过通道对主进程发送消息,主进程接收到消息..." > < meta property = "og:type" content = "article" > < meta property = "og:locale" content = "zh-CN" > < meta property = "og:updated_time" content = "2024-08-16T16:39:49.000Z" > < meta property = "article:author" content = "远野千束" > < meta property = "article:modified_time" content = "2024-08-16T16:39:49.000Z" > < script type = "application/ld+json" > { "@context" : "https://schema.org" , "@type" : "Article" , "headline" : "进程通信" , "image" : [ "" ] , "dateModified" : "2024-08-16T16:39:49.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 = "通道通信 简介 轻雪运行在主进程 MainProcess 里, 其他插件框架进程是伴随的子进程, 因此无法通过内存共享和直接对象传递的方式进行通信, 轻雪提供了一个通道Channel用于跨进程通信, 你可以通过Channel发送消息给其他进程, 也可以监听其他进程的消息。 例如子进程接收到用户信息需要重启机器人,这时可以通过通道对主进程发送消息,主进程接收到消息..." >
2024-08-12 05:51:00 +08:00
< link rel = "preload" href = "/assets/style-CSEr-Ojo.css" as = "style" > < link rel = "stylesheet" href = "/assets/style-CSEr-Ojo.css" >
2024-08-17 00:40:29 +08:00
< link rel = "modulepreload" href = "/assets/app-C8qUWfUS.js" > < link rel = "modulepreload" href = "/assets/dev_comm.html-CXKVtcbR.js" >
< link rel = "prefetch" href = "/assets/index.html-BSEoAfyU.js" as = "script" > < link rel = "prefetch" href = "/assets/childrensdaybak.html-BaS7Qpr1.js" as = "script" > < link rel = "prefetch" href = "/assets/foolsday.html-D6NZL-Y7.js" as = "script" > < link rel = "prefetch" href = "/assets/index.html-SruATSwg.js" as = "script" > < link rel = "prefetch" href = "/assets/config.html-C0Q4uXjL.js" as = "script" > < link rel = "prefetch" href = "/assets/fandq.html-CixOjty7.js" as = "script" > < link rel = "prefetch" href = "/assets/install.html-B-ONISeU.js" as = "script" > < link rel = "prefetch" href = "/assets/index.html-D6yCq50t.js" as = "script" > < link rel = "prefetch" href = "/assets/dev_lyfunc.html-tXGTsn60.js" as = "script" > < link rel = "prefetch" href = "/assets/dev_lyplugin.html-BZ9c3rCd.js" as = "script" > < link rel = "prefetch" href = "/assets/dev_resource_pack.html-Q-FwHIm1.js" as = "script" > < link rel = "prefetch" href = "/assets/index.html-BrHSQPnI.js" as = "script" > < link rel = "prefetch" href = "/assets/plugin.html-BdjB10lC.js" as = "script" > < link rel = "prefetch" href = "/assets/resource.html-9rjiMnZk.js" as = "script" > < link rel = "prefetch" href = "/assets/index.html-BeSPM3RW.js" as = "script" > < link rel = "prefetch" href = "/assets/agreement.html-DjCC1FFN.js" as = "script" > < link rel = "prefetch" href = "/assets/basic_command.html-BmsBMFV4.js" as = "script" > < link rel = "prefetch" href = "/assets/extra_command.html-Df_Y1jZ_.js" as = "script" > < link rel = "prefetch" href = "/assets/lyapi.html-D5xc45RC.js" as = "script" > < link rel = "prefetch" href = "/assets/404.html-C9m3RpzP.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:51:00 +08:00
< / head >
< body >
2024-08-17 00:31:56 +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:51:00 +08:00
< span class = "token keyword" > from< / span > liteyuki< span class = "token punctuation" > .< / span > comm < span class = "token keyword" > import< / span > get_channel< span class = "token punctuation" > ,< / span > Channel
< span class = "token keyword" > from< / span > liteyuki < span class = "token keyword" > import< / span > get_bot
2024-08-17 00:31:56 +08:00
2024-08-12 06:07:50 +08:00
< span class = "token comment" > # get_channel函数获取通道对象, 参数为调用set_channel时的通道标识< / span >
2024-08-17 00:31:56 +08:00
channel_passive < span class = "token operator" > =< / span > get_channel< span class = "token punctuation" > (< / span > < span class = "token string" > " nonebot-passive" < / span > < span class = "token punctuation" > )< / span > < span class = "token comment" > # 获取被动通道< / span >
2024-08-12 06:07:50 +08:00
channel_active < span class = "token operator" > =< / span > get_channel< span class = "token punctuation" > (< / span > < span class = "token string" > " nonebot-active" < / span > < span class = "token punctuation" > )< / span > < span class = "token comment" > # 获取主动通道< / span >
2024-08-12 05:51:00 +08:00
liteyuki_bot < span class = "token operator" > =< / span > get_bot< span class = "token punctuation" > (< / span > < span class = "token punctuation" > )< / span >
2024-08-17 00:31:56 +08:00
2024-08-12 06:07:50 +08:00
< span class = "token comment" > # 注册一个函数在轻雪启动后运行< / span >
2024-08-12 05:51:00 +08:00
< span class = "token decorator annotation punctuation" > @liteyuki_bot< span class = "token punctuation" > .< / span > on_after_start< / span >
2024-08-17 00:31:56 +08:00
< span class = "token keyword" > async< / span > < span class = "token keyword" > def< / span > < span class = "token function" > send_data< / span > < span class = "token punctuation" > (< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > :< / span >
2024-08-12 05:51:00 +08:00
< span class = "token keyword" > while< / span > < span class = "token boolean" > True< / span > < span class = "token punctuation" > :< / span >
channel_passive< span class = "token punctuation" > .< / span > send< span class = "token punctuation" > (< / span > < span class = "token string" > " I am liteyuki main process passive" < / span > < span class = "token punctuation" > )< / span >
channel_active< span class = "token punctuation" > .< / span > send< span class = "token punctuation" > (< / span > < span class = "token string" > " I am liteyuki main process active" < / span > < span class = "token punctuation" > )< / span >
2024-08-17 00:31:56 +08:00
< span class = "token keyword" > await< / span > asyncio< span class = "token punctuation" > .< / span > sleep< span class = "token punctuation" > (< / span > < span class = "token number" > 3< / span > < span class = "token punctuation" > )< / span > < span class = "token comment" > # 每3秒发送一次消息< / 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 > < blockquote > < p > 在子进程中( 例如NoneBot插件中) < / p > < / blockquote > < div class = "language-python line-numbers-mode" data-ext = "py" data-title = "py" > < pre class = "language-python" > < code > < span class = "token keyword" > from< / span > nonebot < span class = "token keyword" > import< / span > get_driver
< span class = "token keyword" > from< / span > liteyuki< span class = "token punctuation" > .< / span > comm < span class = "token keyword" > import< / span > active_channel< span class = "token punctuation" > ,< / span > passive_channel < span class = "token comment" > # 子进程中获取通道直接导入进程全局单例即可< / span >
2024-08-12 05:51:00 +08:00
< span class = "token keyword" > from< / span > liteyuki< span class = "token punctuation" > .< / span > log < span class = "token keyword" > import< / span > logger
driver < span class = "token operator" > =< / span > get_driver< span class = "token punctuation" > (< / span > < span class = "token punctuation" > )< / span >
2024-08-12 06:07:50 +08:00
< span class = "token comment" > # 被动模式,通过装饰器注册一个函数在接收到消息时运行,每次接收到字符串数据时都会运行< / span >
2024-08-17 00:31:56 +08:00
< span class = "token decorator annotation punctuation" > @passive_channel< span class = "token punctuation" > .< / span > on_receive< / span > < span class = "token punctuation" > (< / span > filter_func< span class = "token operator" > =< / span > < span class = "token keyword" > lambda< / span > data< span class = "token punctuation" > :< / span > < span class = "token builtin" > isinstance< / span > < span class = "token punctuation" > (< / span > data< span class = "token punctuation" > ,< / span > < span class = "token builtin" > str< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > )< / span >
2024-08-12 05:51:00 +08:00
< span class = "token keyword" > async< / span > < span class = "token keyword" > def< / span > < span class = "token function" > on_passive_receive< / span > < span class = "token punctuation" > (< / span > data< span class = "token punctuation" > )< / span > < span class = "token punctuation" > :< / span >
logger< span class = "token punctuation" > .< / span > info< span class = "token punctuation" > (< / span > < span class = "token string-interpolation" > < span class = "token string" > f" Passive receive: < / span > < span class = "token interpolation" > < span class = "token punctuation" > {< / span > data< span class = "token punctuation" > }< / span > < / span > < span class = "token string" > " < / span > < / span > < span class = "token punctuation" > )< / span >
2024-08-17 00:31:56 +08:00
2024-08-12 06:07:50 +08:00
< span class = "token comment" > # 注册一个函数在NoneBot启动后运行< / span >
2024-08-12 05:51:00 +08:00
< span class = "token decorator annotation punctuation" > @driver< span class = "token punctuation" > .< / span > on_startup< / span >
2024-08-17 00:31:56 +08:00
< span class = "token keyword" > def< / span > < span class = "token function" > on_startup< / span > < span class = "token punctuation" > (< / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > :< / span >
2024-08-12 05:51:00 +08:00
< span class = "token keyword" > while< / span > < span class = "token boolean" > True< / span > < span class = "token punctuation" > :< / span >
2024-08-17 00:31:56 +08:00
data < span class = "token operator" > =< / span > active_channel< span class = "token punctuation" > .< / span > receive< span class = "token punctuation" > (< / span > < span class = "token punctuation" > )< / span >
2024-08-12 05:51:00 +08:00
logger< span class = "token punctuation" > .< / span > info< span class = "token punctuation" > (< / span > < span class = "token string-interpolation" > < span class = "token string" > f" Active receive: < / span > < span class = "token interpolation" > < span class = "token punctuation" > {< / span > data< span class = "token punctuation" > }< / span > < / span > < span class = "token string" > " < / span > < / span > < span class = "token punctuation" > )< / span >
2024-08-17 00:31:56 +08:00
< / 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 class = "line-number" > < / div > < / div > < / div > < blockquote > < p > 启动后控制台输出< / p > < / blockquote > < div class = "language-log line-numbers-mode" data-ext = "log" data-title = "log" > < pre class = "language-log" > < code > < span class = "token date number" > 0000-00-00< / span > < span class = "token time number" > 00:00:00< / span > < span class = "token punctuation" > [< / span > ℹ️信息< span class = "token punctuation" > ]< / span > < span class = "token property" > Passive receive:< / span > I am liteyuki main process passive
< span class = "token date number" > 0000-00-00< / span > < span class = "token time number" > 00:00:00< / span > < span class = "token punctuation" > [< / span > ℹ️信息< span class = "token punctuation" > ]< / span > < span class = "token property" > Active receive:< / span > I am liteyuki main process active
< span class = "token date number" > 0000-00-00< / span > < span class = "token time number" > 00:00:03< / span > < span class = "token punctuation" > [< / span > ℹ️信息< span class = "token punctuation" > ]< / span > < span class = "token property" > Passive receive:< / span > I am liteyuki main process passive
< span class = "token date number" > 0000-00-00< / span > < span class = "token time number" > 00:00:03< / span > < span class = "token punctuation" > [< / span > ℹ️信息< span class = "token punctuation" > ]< / span > < span class = "token property" > Active receive:< / span > I am liteyuki main process active
< 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 > < / div > < h2 id = "共享内存通信" tabindex = "-1" > < a class = "header-anchor" href = "#共享内存通信" > < span > < strong > 共享内存通信< / strong > < / span > < / a > < / h2 > < h3 id = "简介-1" tabindex = "-1" > < a class = "header-anchor" href = "#简介-1" > < span > 简介< / span > < / a > < / h3 > < ul > < li > 相比于普通进程通信,内存共享使得代码编写更加简洁,轻雪框架提供了一个内存共享通信的接口,你可以通过< code > storage< / code > 模块实现内存共享通信,该模块封装通道实现< / li > < li > 内存共享是线程安全的,你可以在多个线程中读写共享内存,线程锁会自动保护共享内存的读写操作< / li > < / ul > < h3 id = "示例-1" tabindex = "-1" > < a class = "header-anchor" href = "#示例-1" > < span > 示例< / span > < / a > < / h3 > < blockquote > < p > 在任意进程中均可使用< / p > < / blockquote > < div class = "language-python line-numbers-mode" data-ext = "py" data-title = "py" > < pre class = "language-python" > < code > < span class = "token keyword" > from< / span > liteyuki< span class = "token punctuation" > .< / span > comm< span class = "token punctuation" > .< / span > storage < span class = "token keyword" > import< / span > shared_memory
2024-08-17 00:18:57 +08:00
shared_memory< span class = "token punctuation" > .< / span > < span class = "token builtin" > set< / span > < span class = "token punctuation" > (< / span > < span class = "token string" > " key" < / span > < span class = "token punctuation" > ,< / span > < span class = "token string" > " value" < / span > < span class = "token punctuation" > )< / span > < span class = "token comment" > # 设置共享内存< / span >
value < span class = "token operator" > =< / span > shared_memory< span class = "token punctuation" > .< / span > get< span class = "token punctuation" > (< / span > < span class = "token string" > " key" < / span > < span class = "token punctuation" > )< / span > < span class = "token comment" > # 获取共享内存< / span >
2024-08-17 00:40:29 +08:00
< / 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 > < / div > < p > 源代码:< a href = "https://github.com/LiteyukiStudio/LiteyukiBot/blob/main/liteyuki/comm/storage.py" target = "_blank" rel = "noopener noreferrer" > liteyuki/comm/storage.py< 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 > < / p > < / div > <!-- [ --> <!-- --> <!-- ] --> < footer class = "page-meta" > < div class = "meta-item edit-link" > < a href = "https://github.com/LiteyukiStudio/LiteyukiBot/edit/main/docs/dev/dev_comm.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 > ,<!-- ] --> <!-- [ --> < span class = "contributor" title = "email: snowykami@outlook.com" > Snowykami< / span > <!-- ] --> <!-- ] --> < / div > < / div > < / footer > < nav class = "vp-page-nav" > < a class = "route-link nav-link prev" href = "/dev/dev_lyplugin.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-laptop-code" 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.1s" dur = "1s" keyTimes = "0;0.2;1" repeatCount = "indefinite" values = "0;1;1" > < / animate > < / path > < path fill = "none" stroke = "#88baf0" stroke-width = "10" d = "M28 25a50 50 0 0 1 50 50" > < animate attributeName = "stroke-opacity" begin = "0.2s" dur = "1s" keyTimes = "0;0.2;1" repeatCount = "indefinite" values = "0;1;1" > < /ani
< script type = "module" src = "/assets/app-C8qUWfUS.js" defer > < / script >
2024-08-12 05:51:00 +08:00
< / body >
< / html >