feat: 支持从储存库获取插件

This commit is contained in:
Rock Chin
2023-01-17 11:54:33 +08:00
parent b4938ba1fb
commit 120ec98ba7
4 changed files with 57 additions and 23 deletions
+11 -1
View File
@@ -2,6 +2,7 @@
import asyncio
import logging
import importlib
import os
import pkgutil
import sys
import traceback
@@ -108,7 +109,16 @@ def install_plugin(repo_url: str):
from dulwich import porcelain
logging.info("克隆插件储存库: {}".format(repo_url))
repo = porcelain.clone(repo_url, "plugins", checkout=True)
repo = porcelain.clone(repo_url, "plugins/"+repo_url.split(".git")[0].split("/")[-1]+"/", checkout=True)
# 检查此目录是否包含requirements.txt
if os.path.exists("plugins/"+repo_url.split(".git")[0].split("/")[-1]+"/requirements.txt"):
logging.info("检测到requirements.txt,正在安装依赖")
import pkg.utils.pkgmgr
pkg.utils.pkgmgr.install_requirements("plugins/"+repo_url.split(".git")[0].split("/")[-1]+"/requirements.txt")
import main
main.reset_logging()
class EventContext:
+2 -1
View File
@@ -59,8 +59,9 @@ def load_switch():
switch_modified = False
switch_copy = switch.copy()
# 检查switch中多余的和path不相符的
for plugin_name in switch:
for plugin_name in switch_copy:
if plugin_name not in host.__plugins__:
del switch[plugin_name]
switch_modified = True
+11 -2
View File
@@ -88,7 +88,7 @@ def plugin_operation(cmd, params, is_admin):
plugin_list = plugin_host.__plugins__
if len(params) == 0:
reply_str = "[bot]所有插件:\n\n"
reply_str = "[bot]所有插件{}:\n\n".format(len(plugin_list))
idx = 0
for key in plugin_list:
plugin = plugin_list[key]
@@ -102,7 +102,16 @@ def plugin_operation(cmd, params, is_admin):
pass
elif params[0].startswith("http"):
if is_admin:
threading.Thread(target=plugin_host.install_plugin, args=(params[0],)).start()
def closure():
try:
plugin_host.install_plugin(params[0])
pkg.utils.context.get_qqbot_manager().notify_admin("插件安装成功,请发送 !reload 指令重载插件")
except Exception as e:
logging.error("插件安装失败:{}".format(e))
pkg.utils.context.get_qqbot_manager().notify_admin("插件安装失败:{}".format(e))
threading.Thread(target=closure, args=()).start()
reply = ["[bot]正在安装插件..."]
else:
reply = ["[bot]err:权限不足,请使用管理员账号私聊发起"]