From 8e1ec226792e9654e6a8623c972e6a0f577cbd48 Mon Sep 17 00:00:00 2001 From: snowy Date: Mon, 8 Apr 2024 17:01:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=87=8E=E5=85=BD=E5=85=88=E8=BE=88?= =?UTF-8?q?=E4=B8=BB=E9=A2=98=E5=8C=85=20fix:=20=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=90=8D=E9=97=AE=E9=A2=98=20feat:=20`nps`?= =?UTF-8?q?=20->=20`npm`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vuepress/config.ts | 8 +- docs/.vuepress/navbar.ts | 2 +- .../public/assets/fonts/colortube.otf | Bin 0 -> 304740 bytes docs/.vuepress/public/assets/resources.json | 6 +- docs/.vuepress/sidebar.ts | 39 +- docs/.vuepress/styles/index.scss | 10 + docs/.vuepress/styles/palette.scss | 2 +- docs/.vuepress/theme.js | 358 +++++++------- docs/README.md | 2 +- docs/store/README.md | 7 +- docs/usage/basic_command.md | 102 ++-- liteyuki/liteyuki_main/core.py | 4 +- liteyuki/liteyuki_main/runtime.py | 33 +- liteyuki/plugins/liteyuki_npm/helper.py | 0 liteyuki/plugins/liteyuki_npm/installer.py | 230 --------- liteyuki/plugins/liteyuki_npm/manager.py | 243 --------- liteyuki/plugins/liteyuki_npm/permission.py | 8 - .../__init__.py | 4 +- .../common.py | 59 ++- liteyuki/plugins/liteyuki_pacman/npm.py | 460 ++++++++++++++++++ .../{liteyuki_npm => liteyuki_pacman}/rpm.py | 8 +- liteyuki/utils/__init__.py | 2 +- 22 files changed, 814 insertions(+), 773 deletions(-) create mode 100644 docs/.vuepress/public/assets/fonts/colortube.otf delete mode 100644 liteyuki/plugins/liteyuki_npm/helper.py delete mode 100644 liteyuki/plugins/liteyuki_npm/installer.py delete mode 100644 liteyuki/plugins/liteyuki_npm/manager.py delete mode 100644 liteyuki/plugins/liteyuki_npm/permission.py rename liteyuki/plugins/{liteyuki_npm => liteyuki_pacman}/__init__.py (90%) rename liteyuki/plugins/{liteyuki_npm => liteyuki_pacman}/common.py (58%) create mode 100644 liteyuki/plugins/liteyuki_pacman/npm.py rename liteyuki/plugins/{liteyuki_npm => liteyuki_pacman}/rpm.py (99%) diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index cfef1b3..039a40e 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -10,10 +10,12 @@ export default defineUserConfig({ description: "LiteyukiBot | 轻雪机器人 | An OneBot Standard ChatBot | 一个OneBot标准的聊天机器人", head: [ // 设置 favor.ico,.vuepress/public 下 - [ - 'link', {rel: 'icon', href: 'https://cdn.liteyuki.icu/favicon.ico'}, + ['link', {rel: 'icon', href: 'https://cdn.liteyuki.icu/favicon.ico'},], + + ['link', {rel: 'stylesheet', href: 'https://fonts.cdnfonts.com/css/colortube-2'}], + + ['link', {rel: 'stylesheet', href: 'https://cdn.bootcdn.net/ajax/libs/firacode/6.2.0/fira_code.min.css'}], - ], [ "meta", { diff --git a/docs/.vuepress/navbar.ts b/docs/.vuepress/navbar.ts index 4fc30c5..1639c92 100644 --- a/docs/.vuepress/navbar.ts +++ b/docs/.vuepress/navbar.ts @@ -13,7 +13,7 @@ export default navbar([ prefix: "usage/", }, { - text: "主题商店", + text: "资源商店", link: "/store/", prefix: "store/", } diff --git a/docs/.vuepress/public/assets/fonts/colortube.otf b/docs/.vuepress/public/assets/fonts/colortube.otf new file mode 100644 index 0000000000000000000000000000000000000000..586f75c28b49c15a3861c86ee4fcca80630cb869 GIT binary patch literal 304740 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 literal 0 HcmV?d00001 diff --git a/docs/.vuepress/public/assets/resources.json b/docs/.vuepress/public/assets/resources.json index 9ed0b28..07020e3 100644 --- a/docs/.vuepress/public/assets/resources.json +++ b/docs/.vuepress/public/assets/resources.json @@ -19,10 +19,10 @@ "link": "https://cdn.liteyuki.icu/static/lrp/MapleMonoFonts.zip" }, { - "name": "示例包1", + "name": "野兽先辈主题HomoTheme", "author": "SnowyKami", - "description": "A simple bot that shows the status of the bot and the server.", - "link": "" + "description": "野兽先辈主题包,114514!", + "link": "https://cdn.liteyuki.icu/static/lrp/HomoTheme.zip" }, { "name": "示例包2", diff --git a/docs/.vuepress/sidebar.ts b/docs/.vuepress/sidebar.ts index 6e9bb8e..e12a465 100644 --- a/docs/.vuepress/sidebar.ts +++ b/docs/.vuepress/sidebar.ts @@ -1,19 +1,26 @@ -import { sidebar } from "vuepress-theme-hope"; +import {sidebar} from "vuepress-theme-hope"; export default sidebar({ - "/": [ - "", - { - text: "项目部署", - icon: "laptop-code", - prefix: "deployment/", - children: "structure", - }, - { - text: "使用手册", - icon: "book", - prefix: "usage/", - children: "structure", - }, - ], + "/": [ + "", + { + text: "项目部署", + icon: "laptop-code", + prefix: "deployment/", + children: "structure", + }, + { + text: "使用手册", + icon: "book", + prefix: "usage/", + children: "structure", + }, + { + text: "资源商店", + icon: "store", + prefix: "store/", + link: "/store/", + children: "structure", + } + ], }); diff --git a/docs/.vuepress/styles/index.scss b/docs/.vuepress/styles/index.scss index f6af387..a8717fe 100644 --- a/docs/.vuepress/styles/index.scss +++ b/docs/.vuepress/styles/index.scss @@ -1 +1,11 @@ // place your custom styles here + +#main-title { + font-family: "ColorTube", serif; + color: #ff0000 !important; /* 你想要的颜色 */ + line-height: 2; +} + +code { + font-family: "Fira Code", monospace !important; +} \ No newline at end of file diff --git a/docs/.vuepress/styles/palette.scss b/docs/.vuepress/styles/palette.scss index c797b6f..ddab295 100644 --- a/docs/.vuepress/styles/palette.scss +++ b/docs/.vuepress/styles/palette.scss @@ -1,2 +1,2 @@ // you can change colors here -$theme-color: #00a6ff; +$theme-color: #00a6ff; \ No newline at end of file diff --git a/docs/.vuepress/theme.js b/docs/.vuepress/theme.js index 9d12b5a..3aef178 100644 --- a/docs/.vuepress/theme.js +++ b/docs/.vuepress/theme.js @@ -1,193 +1,191 @@ -import { hopeTheme } from "vuepress-theme-hope"; +import {hopeTheme} from "vuepress-theme-hope"; import navbar from "./navbar.js"; import sidebar from "./sidebar.js"; export default hopeTheme({ - hostname: "https://vuepress-theme-hope-docs-demo.netlify.app", + hostname: "https://vuepress-theme-hope-docs-demo.netlify.app", - author: { - name: "远野千束", - url: "https://snowykami.me", - }, - - iconAssets: "fontawesome-with-brands", - - logo: "https://cdn.liteyuki.icu/static/img/logo.png", - - repo: "https://github.com/snowykami/LiteyukiBot", - - docsDir: "docs", - - // 导航栏 - navbar, - - // 侧边栏 - sidebar, - - // 页脚 - footer: "LiteyukiBot", - displayFooter: true, - - // 加密配置 - encrypt: { - config: { - "/demo/encrypt.html": ["1234"], - }, - }, - - // 多语言配置 - metaLocales: { - editLink: "在 GitHub 上编辑此页", - }, - - // 如果想要实时查看任何改变,启用它。注: 这对更新性能有很大负面影响 - // hotReload: true, - - // 在这里配置主题提供的插件 - plugins: { - searchPro: true, - // search: true, - - blog: true, - comment: { - provider: "Giscus", - repo: "snowykami/LiteyukiBot", - repoId: "R_kgDOHVNKpQ", - category: "Announcements", - categoryId: "DIC_kwDOHVNKpc4CeWxj", + author: { + name: "远野千束", + url: "https://snowykami.me", }, - components: { - components: ["Badge", "VPCard"], - }, + iconAssets: "fontawesome-with-brands", - // 此处开启了很多功能用于演示,你应仅保留用到的功能。 - mdEnhance: { - align: true, - attrs: true, - codetabs: true, - footnote: true, - component: true, - demo: true, - figure: true, - imgLazyload: true, - imgSize: true, - include: true, - mark: true, - stylize: [ - { - matcher: "Recommended", - replacer: ({ tag }) => { - if (tag === "em") - return { - tag: "Badge", - attrs: { type: "tip" }, - content: "Recommended", - }; - }, + logo: "https://cdn.liteyuki.icu/static/img/liteyuki_icon_640.png", + + repo: "https://github.com/snowykami/LiteyukiBot", + + docsDir: "docs", + + // 导航栏 + navbar, + + // 侧边栏 + sidebar, + + // 页脚 + footer: "LiteyukiBot", + displayFooter: true, + + // 加密配置 + encrypt: { + config: { + "/demo/encrypt.html": ["1234"], }, - ], - sub: true, - sup: true, - tabs: true, - vPre: true, - - - // 在启用之前安装 chart.js - // chart: true, - - // insert component easily - - // 在启用之前安装 echarts - // echarts: true, - - // 在启用之前安装 flowchart.ts - // flowchart: true, - - // gfm requires mathjax-full to provide tex support - // gfm: true, - - // 在启用之前安装 katex - // katex: true, - - // 在启用之前安装 mathjax-full - // mathjax: true, - - // 在启用之前安装 mermaid - // mermaid: true, - - // playground: { - // presets: ["ts", "vue"], - // }, - - // 在启用之前安装 reveal.js - // revealJs: { - // plugins: ["highlight", "math", "search", "notes", "zoom"], - // }, - - // 在启用之前安装 @vue/repl - // vuePlayground: true, - - // install sandpack-vue3 before enabling it - // sandpack: true, }, - // 如果你需要 PWA。安装 @vuepress/plugin-pwa 并取消下方注释 - // pwa: { - // favicon: "/favicon.ico", - // cacheHTML: true, - // cachePic: true, - // appendBase: true, - // apple: { - // icon: "/assets/icon/apple-icon-152.png", - // statusBarColor: "black", - // }, - // msTile: { - // image: "/assets/icon/ms-icon-144.png", - // color: "#ffffff", - // }, - // manifest: { - // icons: [ - // { - // src: "/assets/icon/chrome-mask-512.png", - // sizes: "512x512", - // purpose: "maskable", - // type: "image/png", - // }, - // { - // src: "/assets/icon/chrome-mask-192.png", - // sizes: "192x192", - // purpose: "maskable", - // type: "image/png", - // }, - // { - // src: "/assets/icon/chrome-512.png", - // sizes: "512x512", - // type: "image/png", - // }, - // { - // src: "/assets/icon/chrome-192.png", - // sizes: "192x192", - // type: "image/png", - // }, - // ], - // shortcuts: [ - // { - // name: "Demo", - // short_name: "Demo", - // url: "/demo/", - // icons: [ - // { - // src: "/assets/icon/guide-maskable.png", - // sizes: "192x192", - // purpose: "maskable", - // type: "image/png", - // }, - // ], - // }, - // ], - // }, - // }, - }, + // 多语言配置 + metaLocales: { + editLink: "在 GitHub 上编辑此页", + }, + + // 如果想要实时查看任何改变,启用它。注: 这对更新性能有很大负面影响 + // hotReload: true, + + // 在这里配置主题提供的插件 + plugins: { + searchPro: true, + // search: true, + comment: { + provider: "Giscus", + repo: "snowykami/LiteyukiBot", + repoId: "R_kgDOHVNKpQ", + category: "Announcements", + categoryId: "DIC_kwDOHVNKpc4CeWxj", + }, + + components: { + components: ["Badge", "VPCard"], + }, + + // 此处开启了很多功能用于演示,你应仅保留用到的功能。 + mdEnhance: { + align: true, + attrs: true, + codetabs: true, + footnote: true, + component: true, + demo: true, + figure: true, + imgLazyload: true, + imgSize: true, + include: true, + mark: true, + stylize: [ + { + matcher: "Recommended", + replacer: ({tag}) => { + if (tag === "em") + return { + tag: "Badge", + attrs: {type: "tip"}, + content: "Recommended", + }; + }, + }, + ], + sub: true, + sup: true, + tabs: true, + vPre: true, + + + // 在启用之前安装 chart.js + // chart: true, + + // insert component easily + + // 在启用之前安装 echarts + // echarts: true, + + // 在启用之前安装 flowchart.ts + // flowchart: true, + + // gfm requires mathjax-full to provide tex support + // gfm: true, + + // 在启用之前安装 katex + // katex: true, + + // 在启用之前安装 mathjax-full + // mathjax: true, + + // 在启用之前安装 mermaid + // mermaid: true, + + // playground: { + // presets: ["ts", "vue"], + // }, + + // 在启用之前安装 reveal.js + // revealJs: { + // plugins: ["highlight", "math", "search", "notes", "zoom"], + // }, + + // 在启用之前安装 @vue/repl + // vuePlayground: true, + + // install sandpack-vue3 before enabling it + // sandpack: true, + }, + + // 如果你需要 PWA。安装 @vuepress/plugin-pwa 并取消下方注释 + // pwa: { + // favicon: "/favicon.ico", + // cacheHTML: true, + // cachePic: true, + // appendBase: true, + // apple: { + // icon: "/assets/icon/apple-icon-152.png", + // statusBarColor: "black", + // }, + // msTile: { + // image: "/assets/icon/ms-icon-144.png", + // color: "#ffffff", + // }, + // manifest: { + // icons: [ + // { + // src: "/assets/icon/chrome-mask-512.png", + // sizes: "512x512", + // purpose: "maskable", + // type: "image/png", + // }, + // { + // src: "/assets/icon/chrome-mask-192.png", + // sizes: "192x192", + // purpose: "maskable", + // type: "image/png", + // }, + // { + // src: "/assets/icon/chrome-512.png", + // sizes: "512x512", + // type: "image/png", + // }, + // { + // src: "/assets/icon/chrome-192.png", + // sizes: "192x192", + // type: "image/png", + // }, + // ], + // shortcuts: [ + // { + // name: "Demo", + // short_name: "Demo", + // url: "/demo/", + // icons: [ + // { + // src: "/assets/icon/guide-maskable.png", + // sizes: "192x192", + // purpose: "maskable", + // type: "image/png", + // }, + // ], + // }, + // ], + // }, + // }, + }, }); diff --git a/docs/README.md b/docs/README.md index a4e5849..82039a9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,7 +7,7 @@ bgImage: bgImageDark: bgImageStyle: background-attachment: fixed -heroText: LiteyukiBot 6 +heroText: LiteyukiBot tagline: 轻雪机器人,一个以轻量和简洁为设计理念基于Nonebot2的OneBot标准聊天机器人 actions: diff --git a/docs/store/README.md b/docs/store/README.md index 7252d22..0e1146f 100644 --- a/docs/store/README.md +++ b/docs/store/README.md @@ -1 +1,6 @@ - \ No newline at end of file +--- +title: 资源商店 +icon: store +index: false +--- + \ No newline at end of file diff --git a/docs/usage/basic_command.md b/docs/usage/basic_command.md index 04d9768..f975231 100644 --- a/docs/usage/basic_command.md +++ b/docs/usage/basic_command.md @@ -5,50 +5,70 @@ order: 1 category: 使用手册 --- -## 基础插件命令 +## 基础插件 -#### 命令前有[S]的表示仅超级用户可用,[O]和[A]分别为群主和群管可用,[P]为私聊可用 - -### 轻雪`liteyuki` +### **轻雪 `liteyuki`** ```shell -[S]reload-liteyuki # 重载轻雪 -[S]update-liteyuki # 更新轻雪 -[S]liteecho # 查看当前bot -[S]config set value # 添加配置项,若存在则会覆盖,输入值会被执行,以便于转换为正确的值,"10"和10是不一样的 -[S]config get [key] # 查询配置项,不带key返回配置项列表,推荐私聊使用 -[S]reload-resources # 重载资源 -[S]switch-image-mode # 切换图片模式,该功能需要commit:505468b及以后的Lagrange.OneBot,在普通图片和Markdown图片之间切换,后者更大但有失败的可能 +仅超级用户 +reload-liteyuki # 重载轻雪 +update-liteyuki # 更新轻雪 +liteecho # 查看当前bot +config set value # 添加配置项,若存在则会覆盖,输入值会被执行以转换为正确的类型,"10"和10是不一样的 +config get [key] # 查询配置项,不带key返回配置项列表,推荐私聊使用 +switch-image-mode # 在普通图片和Markdown大图之间切换,该功能需要commit:505468b及以后的Lagrange.OneBot, + +所有人可用 liteyuki-docs # 查看轻雪文档 -# 上述两个命令修改的配置项在数据库中保存,但是优先级低于配置文件,如果配置文件中存在相同的配置项,将会使用配置文件中的配置 ------- -别名: reload-liteyuki 重启轻雪, update-liteyuki 更新轻雪, reload-resources 重载资源, config 配置, set 设置, get 查询, -switch-image-mode 切换图片模式, liteyuki-docs 轻雪文档 ``` -### 轻雪包管理器 `liteyuki_npm` +命令别名 ```shell -[S]nps update # 更新插件索引 -[S]nps install # 安装插件 -[S]nps uninstall # 卸载插件 -[S]nps search # 通过关键词搜索插件 ------- -[AOSP]npm enable # 当前会话启用插件 -[AOSP]npm disable # 当前会话禁用插件 -[S]npm enable-global # 全局启用插件 -[S]npm disable-global # 全局禁用插件 -list-plugin [page] [num] # 列出所有插件 page为页数,num为每页显示数量 ------- -[S]rpm list [page] [num] # 列出所有资源包 page为页数,num为每页显示数量 -[S]rpm load # 加载资源包 -[S]rpm unload # 卸载资源包 -[S]rpm change # 修改优先级 -[S]rpm reload # 重载所有资源包 ------- -别名: nps 插件商店, npm 插件管理, update 更新, install 安装, uninstall 卸载, search 搜索, -enable 启用, disable 停用, enable-global 全局启用, disable-global 全局停用, list-plugin 列出插件/插件列表, -rpm 资源包, load 加载, unload 卸载, change 更改, reload 重载, list 列表/列出 +reload-liteyuki 重启轻雪, +update-liteyuki 更新轻雪, +reload-resources 重载资源, +config 配置 | set 设置 | get 查询, +switch-image-mode 切换图片模式, +liteyuki-docs 轻雪文档 +``` + +### **插件/包管理器 `liteyuki_pacman`** + +- 插件管理 + +```shell +# 仅超级用户 +npm update # 更新插件商店索引 +npm install # 安装插件 +npm uninstall # 卸载插件 +npm search # 通过关键词搜索插件 +npm enable-global # 全局启用插件 +npm disable-global # 全局禁用插件 + +# 群聊仅群主、管理员、超级用户可用,私聊所有人可用 +npm enable # 当前会话启用插件 +npm disable # 当前会话禁用插件 +npm list [page] [num] # 列出所有插件 page为页数,num为每页显示数量 +``` + +- 资源包管理 + +```shell +# 仅超级用户 +rpm list [page] [num] # 列出所有资源包 page为页数,num为每页显示数量 +rpm load # 加载资源包 +rpm unload # 卸载资源包 +rpm change # 修改优先级 +rpm reload # 重载所有资源包 +``` + +命令别名 + +```shell +npm 插件管理 | update 更新 | install 安装 | uninstall 卸载 | search 搜索 +enable 启用 | disable 停用 | enable-global 全局启用 | disable-global 全局停用 | list-plugin 插件列表 +rpm 资源包 | load 加载 | unload 卸载 | change 更改 | reload 重载 | list 列表 ``` ```shell @@ -58,14 +78,18 @@ rpm 资源包, load 加载, unload 卸载, change 更改, reload 重载, list ``` -### 轻雪用户管理`liteyuki_user` +### **用户管理`liteyuki_user`** ```shell profile # 查看用户信息菜单 profile set [value] # 设置用户信息或打开属性设置菜单 profile get # 获取用户信息 ------- -别名: profile 个人信息, set 设置, get 查询 +``` + +命令别名 + +```shell +profile 个人信息 | set 设置 | get 查询 ``` **参数**:``为必填参数,`[option]`为可选参数。 diff --git a/liteyuki/liteyuki_main/core.py b/liteyuki/liteyuki_main/core.py index 561cc0a..3085d35 100644 --- a/liteyuki/liteyuki_main/core.py +++ b/liteyuki/liteyuki_main/core.py @@ -24,6 +24,7 @@ driver = get_driver() markdown_image = common_db.first(StoredConfig(), default=StoredConfig()).config.get("markdown_image", False) + @on_alconna( command=Alconna( "liteecho", @@ -165,8 +166,9 @@ async def _(event: T_MessageEvent, matcher: Matcher): async def _(matcher: Matcher): matcher.finish("https://bot.liteyuki.icu/usage") + # system hook -@Bot.on_calling_api # 图片模式检测 +@Bot.on_calling_api # 图片模式检测 async def test_for_md_image(bot: T_Bot, api: str, data: dict): if api in ["send_msg", "send_private_msg", "send_group_msg"] and markdown_image and data.get("user_id") != bot.self_id: if api == "send_msg" and data.get("message_type") == "private" or api == "send_private_msg": diff --git a/liteyuki/liteyuki_main/runtime.py b/liteyuki/liteyuki_main/runtime.py index f83eaf6..e4f276c 100644 --- a/liteyuki/liteyuki_main/runtime.py +++ b/liteyuki/liteyuki_main/runtime.py @@ -139,21 +139,24 @@ async def get_stats_data(self_id: str = None, lang: str = None) -> dict: disk_data = [] for disk in psutil.disk_partitions(all=True): - disk_usage = psutil.disk_usage(disk.mountpoint) - disk_total_show = convert_size(disk_usage.total, 1) - disk_free_show = convert_size(disk_usage.free, 1) - if disk_usage.total > 0: - disk_data.append( - { - "name" : disk.device, - "total" : disk_total_show, - "free" : disk_free_show, - "percent" : disk_usage.percent, - "usedValue" : disk_usage.used, - "freeValue" : disk_usage.free, - "totalValue": disk_usage.total, - } - ) + try: + disk_usage = psutil.disk_usage(disk.mountpoint) + disk_total_show = convert_size(disk_usage.total, 1) + disk_free_show = convert_size(disk_usage.free, 1) + if disk_usage.total > 0: + disk_data.append( + { + "name" : disk.device, + "total" : disk_total_show, + "free" : disk_free_show, + "percent" : disk_usage.percent, + "usedValue" : disk_usage.used, + "freeValue" : disk_usage.free, + "totalValue": disk_usage.total, + } + ) + except Exception: + pass cpu_info = get_cpu_info() if "AMD" in cpu_info.get("brand_raw", ""): diff --git a/liteyuki/plugins/liteyuki_npm/helper.py b/liteyuki/plugins/liteyuki_npm/helper.py deleted file mode 100644 index e69de29..0000000 diff --git a/liteyuki/plugins/liteyuki_npm/installer.py b/liteyuki/plugins/liteyuki_npm/installer.py deleted file mode 100644 index c206ee7..0000000 --- a/liteyuki/plugins/liteyuki_npm/installer.py +++ /dev/null @@ -1,230 +0,0 @@ -import os.path -import sys -from io import StringIO - -import aiohttp -import nonebot -import pip -from arclet.alconna import Arparma, MultiVar -from nonebot import require -from nonebot.permission import SUPERUSER -from liteyuki.utils.language import get_user_lang -from liteyuki.utils.ly_typing import T_Bot -from liteyuki.utils.message import Markdown as md -from .common import * - -require("nonebot_plugin_alconna") -from nonebot_plugin_alconna import Alconna, Args, Subcommand, on_alconna - -nps = on_alconna( - Alconna( - "nps", - Subcommand( - "update", - alias=["u"], - ), - Subcommand( - "search", - Args["keywords", MultiVar(str)]["page", int, 1], - alias=["s", "搜索"], - ), - Subcommand( - "install", - Args["plugin_name", str], - alias=["i", "安装"], - ), - Subcommand( - "uninstall", - Args["plugin_name", str], - alias=["r", "rm", "卸载"], - ) - ), - aliases={"插件商店"}, - permission=SUPERUSER, -) - - -@nps.handle() -async def _(result: Arparma, event: T_MessageEvent, bot: T_Bot): - ulang = get_user_lang(str(event.user_id)) - - if not os.path.exists("data/liteyuki/plugins.json"): - await npm_update() - - if result.subcommands.get("update"): - r = await npm_update() - if r: - await nps.finish(ulang.get("npm.store_update_success")) - else: - await nps.finish(ulang.get("npm.store_update_failed")) - - elif result.subcommands.get("search"): - keywords: list[str] = result.subcommands["search"].args.get("keywords") - rs = await npm_search(keywords) - max_show = 10 - for p in rs: - print(p.module_name, p.homepage) - if len(rs): - reply = f"{ulang.get('npm.search_result')} | {ulang.get('npm.total', TOTAL=len(rs))}\n***" - for plugin in rs[:min(max_show, len(rs))]: - btn_install = md.btn_cmd(ulang.get("npm.install"), "npm install %s" % plugin.module_name) - link_page = md.btn_link(ulang.get("npm.homepage"), plugin.homepage) - link_pypi = md.btn_link(ulang.get("npm.pypi"), plugin.homepage) - - reply += (f"\n# **{plugin.name}**\n" - f"\n> **{plugin.desc}**\n" - f"\n> {ulang.get('npm.author')}: {plugin.author}" - f"\n> *{md.escape(plugin.module_name)}*" - f"\n> {btn_install} {link_page} {link_pypi}\n\n***\n") - if len(rs) > max_show: - reply += f"\n{ulang.get('npm.too_many_results', HIDE_NUM=len(rs) - max_show)}" - else: - reply = ulang.get("npm.search_no_result") - await md.send_md(reply, bot, event=event) - - elif result.subcommands.get("install"): - plugin_module_name: str = result.subcommands["install"].args.get("plugin_name") - store_plugin = await get_store_plugin(plugin_module_name) - await nps.send(ulang.get("npm.installing", NAME=plugin_module_name)) - r, log = npm_install(plugin_module_name) - log = log.replace("\\", "/") - - if not store_plugin: - await nps.finish(ulang.get("npm.plugin_not_found", NAME=plugin_module_name)) - - homepage_btn = md.btn_cmd(ulang.get("npm.homepage"), store_plugin.homepage) - if r: - - r_load = nonebot.load_plugin(plugin_module_name) # 加载插件 - installed_plugin = InstalledPlugin(module_name=plugin_module_name) # 构造插件信息模型 - found_in_db_plugin = plugin_db.first(InstalledPlugin(), "module_name = ?", plugin_module_name) # 查询数据库中是否已经安装 - - if r_load: - if found_in_db_plugin is None: - plugin_db.upsert(installed_plugin) - info = md.escape(ulang.get("npm.install_success", NAME=store_plugin.name)) # markdown转义 - await md.send_md( - f"{info}\n\n" - f"```\n{log}\n```", - bot, - event=event - ) - else: - await nps.finish(ulang.get("npm.plugin_already_installed", NAME=store_plugin.name)) - else: - info = ulang.get("npm.load_failed", NAME=plugin_module_name, HOMEPAGE=homepage_btn).replace("_", r"\\_") - await md.send_md( - f"{info}\n\n" - f"```\n{log}\n```\n", - bot, - event=event - ) - else: - info = ulang.get("npm.install_failed", NAME=plugin_module_name, HOMEPAGE=homepage_btn).replace("_", r"\\_") - await md.send_md( - f"{info}\n\n" - f"```\n{log}\n```", - bot, - event=event - ) - - elif result.subcommands.get("uninstall"): - plugin_module_name: str = result.subcommands["uninstall"].args.get("plugin_name") - found_installed_plugin: InstalledPlugin = plugin_db.first(InstalledPlugin(), "module_name = ?", plugin_module_name) - if found_installed_plugin: - plugin_db.delete(InstalledPlugin(), "module_name = ?", plugin_module_name) - reply = f"{ulang.get('npm.uninstall_success', NAME=found_installed_plugin.module_name)}" - await nps.finish(reply) - else: - await nps.finish(ulang.get("npm.plugin_not_installed", NAME=plugin_module_name)) - - -async def npm_update() -> bool: - """ - 更新本地插件json缓存 - - Returns: - bool: 是否成功更新 - """ - url_list = [ - "https://registry.nonebot.dev/plugins.json", - ] - for url in url_list: - async with aiohttp.ClientSession() as session: - async with session.get(url) as resp: - if resp.status == 200: - async with aiofiles.open("data/liteyuki/plugins.json", "wb") as f: - data = await resp.read() - await f.write(data) - return True - return False - - -async def npm_search(keywords: list[str]) -> list[StorePlugin]: - """ - 搜索插件 - - Args: - keywords (list[str]): 关键词列表 - - Returns: - list[StorePlugin]: 插件列表 - """ - results = [] - async with aiofiles.open("data/liteyuki/plugins.json", "r", encoding="utf-8") as f: - plugins: list[StorePlugin] = [StorePlugin(**pobj) for pobj in json.loads(await f.read())] - for plugin in plugins: - plugin_text = ' '.join( - [ - plugin.name, - plugin.desc, - plugin.author, - plugin.module_name, - ' '.join([tag.label for tag in plugin.tags]) - ] - ) - if all([keyword in plugin_text for keyword in keywords]): - results.append(plugin) - return results - - -def npm_install(plugin_module_name) -> tuple[bool, str]: - """ - Args: - plugin_module_name: - - Returns: - tuple[bool, str]: - - """ - buffer = StringIO() - sys.stdout = buffer - sys.stderr = buffer - - mirrors = [ - "https://pypi.tuna.tsinghua.edu.cn/simple", # 清华大学 - "https://pypi.mirrors.cqupt.edu.cn/simple", # 重庆邮电大学 - "https://pypi.liteyuki.icu/simple", # 轻雪镜像 - "https://pypi.org/simple", # 官方源 - ] - - # 使用pip安装包,对每个镜像尝试一次,成功后返回值 - success = False - for mirror in mirrors: - try: - nonebot.logger.info(f"npm_install try mirror: {mirror}") - result = pip.main(["install", plugin_module_name, "-i", mirror]) - success = result == 0 - if success: - break - else: - nonebot.logger.warning(f"npm_install failed, try next mirror.") - except Exception as e: - - success = False - continue - - sys.stdout = sys.__stdout__ - sys.stderr = sys.__stderr__ - - return success, buffer.getvalue() diff --git a/liteyuki/plugins/liteyuki_npm/manager.py b/liteyuki/plugins/liteyuki_npm/manager.py deleted file mode 100644 index 5398929..0000000 --- a/liteyuki/plugins/liteyuki_npm/manager.py +++ /dev/null @@ -1,243 +0,0 @@ -import os - -import nonebot.plugin -from nonebot import require -from nonebot.exception import FinishedException, IgnoredException -from nonebot.internal.adapter import Event -from nonebot.internal.matcher import Matcher -from nonebot.message import run_preprocessor -from nonebot.permission import SUPERUSER -from nonebot.plugin import Plugin - -from liteyuki.utils.data_manager import GlobalPlugin, Group, InstalledPlugin, User, group_db, plugin_db, user_db -from liteyuki.utils.language import get_user_lang -from liteyuki.utils.ly_typing import T_Bot, T_MessageEvent -from liteyuki.utils.message import Markdown as md -from liteyuki.utils.permission import GROUP_ADMIN, GROUP_OWNER -from .common import get_plugin_can_be_toggle, get_plugin_default_enable, get_plugin_global_enable, get_plugin_session_enable -from .installer import get_store_plugin, npm_update -from ...utils.tools import clamp - -require("nonebot_plugin_alconna") -from nonebot_plugin_alconna import on_alconna, Alconna, Args, Arparma, Subcommand - -list_plugins = on_alconna( - Alconna( - "list-plugin", - Args["page", int, 1]["num", int, 10], - ), - aliases={"列出插件", "插件列表"} -) - -npm = on_alconna( - aliases={"插件管理"}, - command=Alconna( - "npm", - # Args["plugin_name", str], - Subcommand( - "enable", - Args["plugin_name", str], - alias=["启用"], - - ), - Subcommand( - "disable", - Args["plugin_name", str], - alias=["停用"], - ), - Subcommand( - "global-enable", - Args["plugin_name", str], - alias=["全局启用"], - ), - Subcommand( - "global-disable", - Args["plugin_name", str], - alias=["全局停用"], - ), - ), - -) - - -@list_plugins.handle() -async def _(event: T_MessageEvent, bot: T_Bot, result: Arparma): - ulang = get_user_lang(str(event.user_id)) - if not os.path.exists("data/liteyuki/plugins.json"): - await npm_update() - - loaded_plugin_list = sorted(nonebot.get_loaded_plugins(), key=lambda x: x.module_name) - num_per_page = result.args.get("num") - total = len(loaded_plugin_list) // num_per_page + (1 if len(loaded_plugin_list) % num_per_page else 0) - - page = clamp(result.args.get("page"), 1, total) - - # 已加载插件 | 总计10 | 第1/3页 - reply = (f"# {ulang.get('npm.loaded_plugins')} | " - f"{ulang.get('npm.total', TOTAL=len(nonebot.get_loaded_plugins()))} | " - f"{ulang.get('npm.page', PAGE=page, TOTAL=total)} \n***\n") - - for plugin in loaded_plugin_list[(page - 1) * num_per_page: min(page * num_per_page, len(loaded_plugin_list))]: - # 检查是否有 metadata 属性 - # 添加帮助按钮 - btn_usage = md.btn_cmd(ulang.get("npm.usage"), f"help {plugin.module_name}", False) - store_plugin = await get_store_plugin(plugin.module_name) - session_enable = get_plugin_session_enable(event, plugin.module_name) - if store_plugin: - btn_homepage = md.btn_link(ulang.get("npm.homepage"), store_plugin.homepage) - show_name = store_plugin.name - elif plugin.metadata: - if plugin.metadata.extra.get("liteyuki"): - btn_homepage = md.btn_link(ulang.get("npm.homepage"), "https://github.com/snowykami/LiteyukiBot") - else: - btn_homepage = ulang.get("npm.homepage") - show_name = plugin.metadata.name - else: - btn_homepage = ulang.get("npm.homepage") - show_name = plugin.name - ulang.get("npm.no_description") - - if plugin.metadata: - reply += f"\n**{md.escape(show_name)}**\n" - else: - reply += f"**{md.escape(show_name)}**\n" - - reply += f"\n > {btn_usage} {btn_homepage}" - - if await GROUP_ADMIN(bot, event) or await GROUP_OWNER(bot, event) or await SUPERUSER(bot, event): - # 添加启用/停用插件按钮 - cmd_toggle = f"npm {'disable' if session_enable else 'enable'} {plugin.module_name}" - text_toggle = ulang.get("npm.disable" if session_enable else "npm.enable") - can_be_toggle = get_plugin_can_be_toggle(plugin.module_name) - btn_toggle = text_toggle if not can_be_toggle else md.btn_cmd(text_toggle, cmd_toggle) - reply += f" {btn_toggle}" - - if await SUPERUSER(bot, event): - plugin_in_database = plugin_db.first(InstalledPlugin(), "module_name = ?", plugin.module_name) - # 添加移除插件和全局切换按钮 - global_enable = get_plugin_global_enable(plugin.module_name) - btn_uninstall = ( - md.btn_cmd(ulang.get("npm.uninstall"), f'npm uninstall {plugin.module_name}')) if plugin_in_database else ulang.get( - 'npm.uninstall') - btn_toggle_global_text = ulang.get("npm.disable_global" if global_enable else "npm.enable_global") - cmd_toggle_global = f"npm {'global-disable' if global_enable else 'global-enable'} {plugin.module_name}" - btn_toggle_global = btn_toggle_global_text if not can_be_toggle else md.btn_cmd(btn_toggle_global_text, cmd_toggle_global) - - reply += f" {btn_uninstall} {btn_toggle_global}" - reply += "\n\n***\n" - await md.send_md(reply, bot, event=event) - - -@npm.handle() -async def _(result: Arparma, event: T_MessageEvent, bot: T_Bot): - if not os.path.exists("data/liteyuki/plugins.json"): - await npm_update() - # 判断会话类型 - ulang = get_user_lang(str(event.user_id)) - plugin_module_name = result.args.get("plugin_name") - # 支持对自定义command_start的判断 - if result.subcommands.get("enable") or result.subcommands.get("disable"): - - toggle = result.subcommands.get("enable") is not None - - session_enable = get_plugin_session_enable(event, plugin_module_name) # 获取插件当前状态 - - default_enable = get_plugin_default_enable(plugin_module_name) # 获取插件默认状态 - - can_be_toggled = get_plugin_can_be_toggle(plugin_module_name) # 获取插件是否可以被启用/停用 - - if not can_be_toggled: - await npm.finish(ulang.get("npm.plugin_cannot_be_toggled", NAME=plugin_module_name)) - - if session_enable == toggle: - await npm.finish( - ulang.get("npm.plugin_already", NAME=plugin_module_name, STATUS=ulang.get("npm.enable") if toggle else ulang.get("npm.disable"))) - - if event.message_type == "private": - session = user_db.first(User(), "user_id = ?", event.user_id, default=User(user_id=event.user_id)) - else: - if await GROUP_ADMIN(bot, event) or await GROUP_OWNER(bot, event) or await SUPERUSER(bot, event): - session = group_db.first(Group(), "group_id = ?", event.group_id, default=Group(group_id=str(event.group_id))) - else: - raise FinishedException(ulang.get("Permission Denied")) - try: - if toggle: - if default_enable: - session.disabled_plugins.remove(plugin_module_name) - else: - session.enabled_plugins.append(plugin_module_name) - else: - if default_enable: - session.disabled_plugins.append(plugin_module_name) - else: - session.enabled_plugins.remove(plugin_module_name) - if event.message_type == "private": - user_db.upsert(session) - else: - group_db.upsert(session) - except Exception as e: - print(e) - await npm.finish( - ulang.get( - "npm.toggle_failed", - NAME=plugin_module_name, - STATUS=ulang.get("npm.enable") if toggle else ulang.get("npm.disable"), - ERROR=str(e)) - ) - - await npm.finish( - ulang.get( - "npm.toggle_success", - NAME=plugin_module_name, - STATUS=ulang.get("npm.enable") if toggle else ulang.get("npm.disable")) - ) - elif result.subcommands.get("global-enable") or result.subcommands.get("global-disable") and await SUPERUSER(bot, event): - toggle = result.subcommands.get("global-enable") is not None - can_be_toggled = get_plugin_can_be_toggle(plugin_module_name) - if not can_be_toggled: - await npm.finish(ulang.get("npm.plugin_cannot_be_toggled", NAME=plugin_module_name)) - - global_enable = get_plugin_global_enable(plugin_module_name) - if global_enable == toggle: - await npm.finish( - ulang.get("npm.plugin_already", NAME=plugin_module_name, STATUS=ulang.get("npm.enable") if toggle else ulang.get("npm.disable"))) - - try: - plugin = plugin_db.first(GlobalPlugin(), "module_name = ?", plugin_module_name, default=GlobalPlugin(module_name=plugin_module_name)) - if toggle: - plugin.enabled = True - else: - plugin.enabled = False - plugin_db.upsert(plugin) - except Exception as e: - print(e) - await npm.finish( - ulang.get( - "npm.toggle_failed", - NAME=plugin_module_name, - STATUS=ulang.get("npm.enable") if toggle else ulang.get("npm.disable"), - ERROR=str(e)) - ) - - await npm.finish( - ulang.get( - "npm.toggle_success", - NAME=plugin_module_name, - STATUS=ulang.get("npm.enable") if toggle else ulang.get("npm.disable")) - ) - - -@run_preprocessor -async def pre_handle(event: Event, matcher: Matcher): - plugin: Plugin = matcher.plugin - plugin_global_enable = get_plugin_global_enable(plugin.module_name) - if not plugin_global_enable: - raise IgnoredException("Plugin disabled globally") - if event.get_type() == "message": - plugin_session_enable = get_plugin_session_enable(event, plugin.module_name) - if not plugin_session_enable: - raise IgnoredException("Plugin disabled in session") - -# @Bot.on_calling_api -# async def _(bot: Bot, api: str, data: dict[str, any]): -# nonebot.logger.info(f"Plugin Callapi: {api}: {data}") diff --git a/liteyuki/plugins/liteyuki_npm/permission.py b/liteyuki/plugins/liteyuki_npm/permission.py deleted file mode 100644 index ee346f4..0000000 --- a/liteyuki/plugins/liteyuki_npm/permission.py +++ /dev/null @@ -1,8 +0,0 @@ -# 插件权限管理器,对api调用进行hook限制,防止插件滥用api -from liteyuki.utils.data import LiteModel - - -class PermissionAllow(LiteModel): - plugin_name: str - api_name: str - allow: bool \ No newline at end of file diff --git a/liteyuki/plugins/liteyuki_npm/__init__.py b/liteyuki/plugins/liteyuki_pacman/__init__.py similarity index 90% rename from liteyuki/plugins/liteyuki_npm/__init__.py rename to liteyuki/plugins/liteyuki_pacman/__init__.py index c6f3f76..d10db8d 100644 --- a/liteyuki/plugins/liteyuki_npm/__init__.py +++ b/liteyuki/plugins/liteyuki_pacman/__init__.py @@ -1,7 +1,5 @@ from nonebot.plugin import PluginMetadata -from .manager import * -from .installer import * -from .helper import * +from .npm import * from .rpm import * __author__ = "snowykami" diff --git a/liteyuki/plugins/liteyuki_npm/common.py b/liteyuki/plugins/liteyuki_pacman/common.py similarity index 58% rename from liteyuki/plugins/liteyuki_npm/common.py rename to liteyuki/plugins/liteyuki_pacman/common.py index 2e5717d..98185ac 100644 --- a/liteyuki/plugins/liteyuki_npm/common.py +++ b/liteyuki/plugins/liteyuki_pacman/common.py @@ -4,8 +4,8 @@ from typing import Optional import aiofiles import nonebot.plugin -from liteyuki.utils.data import Database, LiteModel -from liteyuki.utils.data_manager import GlobalPlugin, Group, InstalledPlugin, User, group_db, plugin_db, user_db +from liteyuki.utils.data import LiteModel +from liteyuki.utils.data_manager import GlobalPlugin, Group, User, group_db, plugin_db, user_db from liteyuki.utils.ly_typing import T_MessageEvent @@ -17,9 +17,9 @@ class PluginTag(LiteModel): class StorePlugin(LiteModel): name: str desc: str - module_name: str + module_name: str # 插件商店中的模块名不等于本地的模块名,前者是文件夹名,后者是点分割模块名 project_link: str = "" - homepage: str ="" + homepage: str = "" author: str = "" type: str | None = None version: str | None = "" @@ -28,12 +28,27 @@ class StorePlugin(LiteModel): is_official: bool = False -async def get_store_plugin(plugin_module_name: str) -> Optional[StorePlugin]: +def get_plugin_exist(plugin_name: str) -> bool: + """ + 获取插件是否存在 + Args: + plugin_name: + + Returns: + + """ + for plugin in nonebot.plugin.get_loaded_plugins(): + if plugin.name == plugin_name: + return True + return False + + +async def get_store_plugin(plugin_name: str) -> Optional[StorePlugin]: """ 获取插件信息 Args: - plugin_module_name (str): 插件模块名 + plugin_name (str): 插件模块名 Returns: Optional[StorePlugin]: 插件信息 @@ -41,33 +56,33 @@ async def get_store_plugin(plugin_module_name: str) -> Optional[StorePlugin]: async with aiofiles.open("data/liteyuki/plugins.json", "r", encoding="utf-8") as f: plugins: list[StorePlugin] = [StorePlugin(**pobj) for pobj in json.loads(await f.read())] for plugin in plugins: - if plugin.module_name == plugin_module_name: + if plugin.name == plugin_name: return plugin return None -def get_plugin_default_enable(plugin_module_name: str) -> bool: +def get_plugin_default_enable(plugin_name: str) -> bool: """ 获取插件默认启用状态,由插件定义,不存在则默认为启用 Args: - plugin_module_name (str): 插件模块名 + plugin_name (str): 插件模块名 Returns: bool: 插件默认状态 """ - plug = nonebot.plugin.get_plugin_by_module_name(plugin_module_name) + plug = nonebot.plugin.get_plugin(plugin_name) return (plug.metadata.extra.get("default_enable", True) if plug.metadata else True) if plug else True -def get_plugin_session_enable(event: T_MessageEvent, plugin_module_name: str) -> bool: +def get_plugin_session_enable(event: T_MessageEvent, plugin_name: str) -> bool: """ 获取插件当前会话启用状态 Args: event: 会话事件 - plugin_module_name (str): 插件模块名 + plugin_name (str): 插件模块名 Returns: bool: 插件当前状态 @@ -80,31 +95,31 @@ def get_plugin_session_enable(event: T_MessageEvent, plugin_module_name: str) -> # 默认停用插件不在启用列表内表示停用 # 默认启用插件在停用列表内表示停用 # 默认启用插件不在停用列表内表示启用 - default_enable = get_plugin_default_enable(plugin_module_name) + default_enable = get_plugin_default_enable(plugin_name) if default_enable: - return plugin_module_name not in session.disabled_plugins + return plugin_name not in session.disabled_plugins else: - return plugin_module_name in session.enabled_plugins + return plugin_name in session.enabled_plugins -def get_plugin_global_enable(plugin_module_name: str) -> bool: - loaded_plugin = nonebot.plugin.get_plugin_by_module_name(plugin_module_name) +def get_plugin_global_enable(plugin_name: str) -> bool: + nonebot.plugin.get_plugin(plugin_name) return plugin_db.first( GlobalPlugin(), "module_name = ?", - plugin_module_name, - default=GlobalPlugin(module_name=plugin_module_name, enabled=True)).enabled + plugin_name, + default=GlobalPlugin(module_name=plugin_name, enabled=True)).enabled -def get_plugin_can_be_toggle(plugin_module_name: str) -> bool: +def get_plugin_can_be_toggle(plugin_name: str) -> bool: """ 获取插件是否可以被启用/停用 Args: - plugin_module_name (str): 插件模块名 + plugin_name (str): 插件模块名 Returns: bool: 插件是否可以被启用/停用 """ - plug = nonebot.plugin.get_plugin_by_module_name(plugin_module_name) + plug = nonebot.plugin.get_plugin(plugin_name) return plug.metadata.extra.get("toggleable", True) if plug and plug.metadata else True diff --git a/liteyuki/plugins/liteyuki_pacman/npm.py b/liteyuki/plugins/liteyuki_pacman/npm.py new file mode 100644 index 0000000..155b413 --- /dev/null +++ b/liteyuki/plugins/liteyuki_pacman/npm.py @@ -0,0 +1,460 @@ +import os +import sys +import aiohttp +import nonebot.plugin +import pip +from io import StringIO +from arclet.alconna import MultiVar +from nonebot import require +from nonebot.exception import FinishedException, IgnoredException +from nonebot.internal.adapter import Event +from nonebot.internal.matcher import Matcher +from nonebot.message import run_preprocessor +from nonebot.permission import SUPERUSER +from nonebot.plugin import Plugin +from liteyuki.utils.data_manager import InstalledPlugin +from liteyuki.utils.language import get_user_lang +from liteyuki.utils.ly_typing import T_Bot +from liteyuki.utils.message import Markdown as md +from liteyuki.utils.permission import GROUP_ADMIN, GROUP_OWNER +from liteyuki.utils.tools import clamp +from .common import * + +require("nonebot_plugin_alconna") +from nonebot_plugin_alconna import on_alconna, Alconna, Args, Arparma, Subcommand + +# const +enable_global = "enable-global" +disable_global = "disable-global" +enable = "enable" +disable = "disable" + + +@on_alconna( + aliases={"插件"}, + command=Alconna( + "npm", + Subcommand( + "enable", + Args["plugin_name", str], + alias=["启用"], + + ), + Subcommand( + "disable", + Args["plugin_name", str], + alias=["停用"], + ), + Subcommand( + enable_global, + Args["plugin_name", str], + alias=["全局启用"], + ), + Subcommand( + disable_global, + Args["plugin_name", str], + alias=["全局停用"], + ), + # 安装部分 + Subcommand( + "update", + alias=["u"], + ), + Subcommand( + "search", + Args["keywords", MultiVar(str)]["show_num", int, 15], + alias=["s", "搜索"], + ), + Subcommand( + "install", + Args["plugin_name", str], + alias=["i", "安装"], + ), + Subcommand( + "uninstall", + Args["plugin_name", str], + alias=["r", "rm", "卸载"], + ), + Subcommand( + "list", + Args["num", int, 10]["page", int, 1], + alias=["ls", "列表"], + ), + Subcommand( + "usage", + Args["plugin_name", str], + alias=["详情"], + ) + ) +).handle() +async def _(result: Arparma, event: T_MessageEvent, bot: T_Bot, npm: Matcher): + if not os.path.exists("data/liteyuki/plugins.json"): + await npm_update() + # 判断会话类型 + ulang = get_user_lang(str(event.user_id)) + plugin_name = result.args.get("plugin_name") + sc = result.subcommands # 获取子命令 + perm_s = await SUPERUSER(bot, event) # 判断是否为超级用户 + # 支持对自定义command_start的判断 + if sc.get("enable") or result.subcommands.get("disable"): + + toggle = result.subcommands.get("enable") is not None + + plugin_exist = get_plugin_exist(plugin_name) + + session_enable = get_plugin_session_enable(event, plugin_name) # 获取插件当前状态 + + default_enable = get_plugin_default_enable(plugin_name) # 获取插件默认状态 + + can_be_toggled = get_plugin_can_be_toggle(plugin_name) # 获取插件是否可以被启用/停用 + + if not plugin_exist: + await npm.finish(ulang.get("npm.plugin_not_found", NAME=plugin_name)) + + if not can_be_toggled: + await npm.finish(ulang.get("npm.plugin_cannot_be_toggled", NAME=plugin_name)) + + if session_enable == toggle: + await npm.finish( + ulang.get("npm.plugin_already", NAME=plugin_name, STATUS=ulang.get("npm.enable") if toggle else ulang.get("npm.disable"))) + + if event.message_type == "private": + session = user_db.first(User(), "user_id = ?", event.user_id, default=User(user_id=event.user_id)) + else: + if await GROUP_ADMIN(bot, event) or await GROUP_OWNER(bot, event) or await SUPERUSER(bot, event): + session = group_db.first(Group(), "group_id = ?", event.group_id, default=Group(group_id=str(event.group_id))) + else: + raise FinishedException(ulang.get("Permission Denied")) + try: + if toggle: + if default_enable: + session.disabled_plugins.remove(plugin_name) + else: + session.enabled_plugins.append(plugin_name) + else: + if default_enable: + session.disabled_plugins.append(plugin_name) + else: + session.enabled_plugins.remove(plugin_name) + if event.message_type == "private": + user_db.upsert(session) + else: + group_db.upsert(session) + except Exception as e: + print(e) + await npm.finish( + ulang.get( + "npm.toggle_failed", + NAME=plugin_name, + STATUS=ulang.get("npm.enable") if toggle else ulang.get("npm.disable"), + ERROR=str(e)) + ) + + await npm.finish( + ulang.get( + "npm.toggle_success", + NAME=plugin_name, + STATUS=ulang.get("npm.enable") if toggle else ulang.get("npm.disable")) + ) + + elif sc.get(enable_global) or result.subcommands.get(disable_global) and await SUPERUSER(bot, event): + plugin_exist = get_plugin_exist(plugin_name) + + toggle = result.subcommands.get(enable_global) is not None + + can_be_toggled = get_plugin_can_be_toggle(plugin_name) + + if not plugin_exist: + await npm.finish(ulang.get("npm.plugin_not_found", NAME=plugin_name)) + + if not can_be_toggled: + await npm.finish(ulang.get("npm.plugin_cannot_be_toggled", NAME=plugin_name)) + + global_enable = get_plugin_global_enable(plugin_name) + if global_enable == toggle: + await npm.finish( + ulang.get("npm.plugin_already", NAME=plugin_name, STATUS=ulang.get("npm.enable") if toggle else ulang.get("npm.disable"))) + + try: + storePlugin = plugin_db.first(GlobalPlugin(), "module_name = ?", plugin_name, default=GlobalPlugin(module_name=plugin_name)) + if toggle: + storePlugin.enabled = True + else: + storePlugin.enabled = False + plugin_db.upsert(storePlugin) + except Exception as e: + print(e) + await npm.finish( + ulang.get( + "npm.toggle_failed", + NAME=plugin_name, + STATUS=ulang.get("npm.enable") if toggle else ulang.get("npm.disable"), + ERROR=str(e)) + ) + + await npm.finish( + ulang.get( + "npm.toggle_success", + NAME=plugin_name, + STATUS=ulang.get("npm.enable") if toggle else ulang.get("npm.disable")) + ) + + elif sc.get("update") and perm_s: + r = await npm_update() + if r: + await npm.finish(ulang.get("npm.store_update_success")) + else: + await npm.finish(ulang.get("npm.store_update_failed")) + + elif sc.get("search"): + keywords: list[str] = result.subcommands["search"].args.get("keywords") + rs = await npm_search(keywords) + max_show = result.subcommands.get("search").args.get("show_num") + if len(rs): + reply = f"{ulang.get('npm.search_result')} | {ulang.get('npm.total', TOTAL=len(rs))}\n***" + for storePlugin in rs[:min(max_show, len(rs))]: + btn_install = md.btn_cmd(ulang.get("npm.install"), "npm install %s" % storePlugin.module_name) + link_page = md.btn_link(ulang.get("npm.homepage"), storePlugin.homepage) + link_pypi = md.btn_link(ulang.get("npm.pypi"), storePlugin.homepage) + + reply += (f"\n# **{storePlugin.name}**\n" + f"\n> **{storePlugin.desc}**\n" + f"\n> {ulang.get('npm.author')}: {storePlugin.author}" + f"\n> *{md.escape(storePlugin.module_name)}*" + f"\n> {btn_install} {link_page} {link_pypi}\n\n***\n") + if len(rs) > max_show: + reply += f"\n{ulang.get('npm.too_many_results', HIDE_NUM=len(rs) - max_show)}" + else: + reply = ulang.get("npm.search_no_result") + await md.send_md(reply, bot, event=event) + + elif sc.get("install") and perm_s: + plugin_name: str = result.subcommands["install"].args.get("plugin_name") + store_plugin = await get_store_plugin(plugin_name) + await npm.send(ulang.get("npm.installing", NAME=plugin_name)) + r, log = npm_install(plugin_name) + log = log.replace("\\", "/") + + if not store_plugin: + await npm.finish(ulang.get("npm.plugin_not_found", NAME=plugin_name)) + + homepage_btn = md.btn_cmd(ulang.get("npm.homepage"), store_plugin.homepage) + if r: + + r_load = nonebot.load_plugin(plugin_name) # 加载插件 + installed_plugin = InstalledPlugin(module_name=plugin_name) # 构造插件信息模型 + found_in_db_plugin = plugin_db.first(InstalledPlugin(), "module_name = ?", plugin_name) # 查询数据库中是否已经安装 + + if r_load: + if found_in_db_plugin is None: + plugin_db.upsert(installed_plugin) + info = md.escape(ulang.get("npm.install_success", NAME=store_plugin.name)) # markdown转义 + await md.send_md( + f"{info}\n\n" + f"```\n{log}\n```", + bot, + event=event + ) + else: + await npm.finish(ulang.get("npm.plugin_already_installed", NAME=store_plugin.name)) + else: + info = ulang.get("npm.load_failed", NAME=plugin_name, HOMEPAGE=homepage_btn).replace("_", r"\\_") + await md.send_md( + f"{info}\n\n" + f"```\n{log}\n```\n", + bot, + event=event + ) + else: + info = ulang.get("npm.install_failed", NAME=plugin_name, HOMEPAGE=homepage_btn).replace("_", r"\\_") + await md.send_md( + f"{info}\n\n" + f"```\n{log}\n```", + bot, + event=event + ) + + elif sc.get("uninstall") and perm_s: + plugin_name: str = result.subcommands["uninstall"].args.get("plugin_name") + found_installed_plugin: InstalledPlugin = plugin_db.first(InstalledPlugin(), "module_name = ?", plugin_name) + if found_installed_plugin: + plugin_db.delete(InstalledPlugin(), "module_name = ?", plugin_name) + reply = f"{ulang.get('npm.uninstall_success', NAME=found_installed_plugin.module_name)}" + await npm.finish(reply) + else: + await npm.finish(ulang.get("npm.plugin_not_installed", NAME=plugin_name)) + + elif sc.get("list"): + loaded_plugin_list = sorted(nonebot.get_loaded_plugins(), key=lambda x: x.name) + num_per_page = result.subcommands.get("list").args.get("num") + total = len(loaded_plugin_list) // num_per_page + (1 if len(loaded_plugin_list) % num_per_page else 0) + + page = clamp(result.subcommands.get("list").args.get("page"), 1, total) + + # 已加载插件 | 总计10 | 第1/3页 + reply = (f"# {ulang.get('npm.loaded_plugins')} | " + f"{ulang.get('npm.total', TOTAL=len(nonebot.get_loaded_plugins()))} | " + f"{ulang.get('npm.page', PAGE=page, TOTAL=total)} \n***\n") + + permission_oas = await GROUP_ADMIN(bot, event) or await GROUP_OWNER(bot, event) or await SUPERUSER(bot, event) + permission_s = await SUPERUSER(bot, event) + + for storePlugin in loaded_plugin_list[(page - 1) * num_per_page: min(page * num_per_page, len(loaded_plugin_list))]: + # 检查是否有 metadata 属性 + # 添加帮助按钮 + + btn_usage = md.btn_cmd(ulang.get("npm.usage"), f"npm usage {storePlugin.name}", False) + store_plugin = await get_store_plugin(storePlugin.name) + session_enable = get_plugin_session_enable(event, storePlugin.name) + if store_plugin: + btn_homepage = md.btn_link(ulang.get("npm.homepage"), store_plugin.homepage) + show_name = store_plugin.name + elif storePlugin.metadata: + if storePlugin.metadata.extra.get("liteyuki"): + btn_homepage = md.btn_link(ulang.get("npm.homepage"), "https://github.com/snowykami/LiteyukiBot") + else: + btn_homepage = ulang.get("npm.homepage") + show_name = storePlugin.metadata.name + else: + btn_homepage = ulang.get("npm.homepage") + show_name = storePlugin.name + ulang.get("npm.no_description") + + if storePlugin.metadata: + reply += f"\n**{md.escape(show_name)}**\n" + else: + reply += f"**{md.escape(show_name)}**\n" + + reply += f"\n > {btn_usage} {btn_homepage}" + + if permission_oas: + # 添加启用/停用插件按钮 + cmd_toggle = f"npm {'disable' if session_enable else 'enable'} {storePlugin.name}" + text_toggle = ulang.get("npm.disable" if session_enable else "npm.enable") + can_be_toggle = get_plugin_can_be_toggle(storePlugin.name) + btn_toggle = text_toggle if not can_be_toggle else md.btn_cmd(text_toggle, cmd_toggle) + reply += f" {btn_toggle}" + + if permission_s: + plugin_in_database = plugin_db.first(InstalledPlugin(), "module_name = ?", storePlugin.name) + # 添加移除插件和全局切换按钮 + global_enable = get_plugin_global_enable(storePlugin.name) + btn_uninstall = ( + md.btn_cmd(ulang.get("npm.uninstall"), f'npm uninstall {storePlugin.name}')) if plugin_in_database else ulang.get( + 'npm.uninstall') + btn_toggle_global_text = ulang.get("npm.disable_global" if global_enable else "npm.enable_global") + cmd_toggle_global = f"npm {'disable' if global_enable else 'enable'}-global {storePlugin.name}" + btn_toggle_global = btn_toggle_global_text if not can_be_toggle else md.btn_cmd(btn_toggle_global_text, cmd_toggle_global) + + reply += f" {btn_uninstall} {btn_toggle_global}" + reply += "\n\n***\n" + await md.send_md(reply, bot, event=event) + + elif sc.get("usage"): + # TODO + pass + else: + pass + + +@run_preprocessor +async def pre_handle(event: Event, matcher: Matcher): + plugin: Plugin = matcher.plugin + plugin_global_enable = get_plugin_global_enable(plugin.name) + if not plugin_global_enable: + raise IgnoredException("Plugin disabled globally") + if event.get_type() == "message": + plugin_session_enable = get_plugin_session_enable(event, plugin.name) + if not plugin_session_enable: + raise IgnoredException("Plugin disabled in session") + + +async def npm_update() -> bool: + """ + 更新本地插件json缓存 + + Returns: + bool: 是否成功更新 + """ + url_list = [ + "https://registry.nonebot.dev/plugins.json", + ] + for url in url_list: + async with aiohttp.ClientSession() as session: + async with session.get(url) as resp: + if resp.status == 200: + async with aiofiles.open("data/liteyuki/plugins.json", "wb") as f: + data = await resp.read() + await f.write(data) + return True + return False + + +async def npm_search(keywords: list[str]) -> list[StorePlugin]: + """ + 搜索插件 + + Args: + keywords (list[str]): 关键词列表 + + Returns: + list[StorePlugin]: 插件列表 + """ + results = [] + async with aiofiles.open("data/liteyuki/plugins.json", "r", encoding="utf-8") as f: + plugins: list[StorePlugin] = [StorePlugin(**pobj) for pobj in json.loads(await f.read())] + for plugin in plugins: + plugin_text = ' '.join( + [ + plugin.name, + plugin.desc, + plugin.author, + plugin.module_name, + ' '.join([tag.label for tag in plugin.tags]) + ] + ) + if all([keyword in plugin_text for keyword in keywords]): + results.append(plugin) + return results + + +def npm_install(plugin_package_name) -> tuple[bool, str]: + """ + Args: + plugin_package_name: + + Returns: + tuple[bool, str]: + + """ + buffer = StringIO() + sys.stdout = buffer + sys.stderr = buffer + + mirrors = [ + "https://pypi.tuna.tsinghua.edu.cn/simple", # 清华大学 + "https://pypi.mirrors.cqupt.edu.cn/simple", # 重庆邮电大学 + "https://pypi.liteyuki.icu/simple", # 轻雪代理镜像 + "https://pypi.org/simple", # 官方源 + ] + + # 使用pip安装包,对每个镜像尝试一次,成功后返回值 + success = False + for mirror in mirrors: + try: + nonebot.logger.info(f"npm_install try mirror: {mirror}") + result = pip.main(["install", plugin_package_name, "-i", mirror]) + success = result == 0 + if success: + break + else: + nonebot.logger.warning(f"npm_install failed, try next mirror.") + except Exception as e: + + success = False + continue + + sys.stdout = sys.__stdout__ + sys.stderr = sys.__stderr__ + + return success, buffer.getvalue() diff --git a/liteyuki/plugins/liteyuki_npm/rpm.py b/liteyuki/plugins/liteyuki_pacman/rpm.py similarity index 99% rename from liteyuki/plugins/liteyuki_npm/rpm.py rename to liteyuki/plugins/liteyuki_pacman/rpm.py index 876f00f..39ca69c 100644 --- a/liteyuki/plugins/liteyuki_npm/rpm.py +++ b/liteyuki/plugins/liteyuki_pacman/rpm.py @@ -13,7 +13,8 @@ from liteyuki.utils.resource import (ResourceMetadata, add_resource_pack, change require("nonebot_plugin_alconna") from nonebot_plugin_alconna import Alconna, Args, on_alconna, Arparma, Subcommand -rpm = on_alconna( + +@on_alconna( aliases={"资源包"}, command=Alconna( "rpm", @@ -53,10 +54,7 @@ rpm = on_alconna( ), ), permission=SUPERUSER -) - - -@rpm.handle() +).handle() async def _(bot: T_Bot, event: T_MessageEvent, result: Arparma): ulang = get_user_lang(str(event.user_id)) reply = "" diff --git a/liteyuki/utils/__init__.py b/liteyuki/utils/__init__.py index 6bb5b63..8012f85 100644 --- a/liteyuki/utils/__init__.py +++ b/liteyuki/utils/__init__.py @@ -6,7 +6,7 @@ import sys import nonebot __NAME__ = "LiteyukiBot" -__VERSION__ = "6.2.7" # 60201 +__VERSION__ = "6.2.8" # 60201 import requests