mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-28 00:14:21 +00:00
feat: 支持指令删除插件 (#286)
This commit is contained in:
@@ -5,6 +5,7 @@ import importlib
|
|||||||
import os
|
import os
|
||||||
import pkgutil
|
import pkgutil
|
||||||
import sys
|
import sys
|
||||||
|
import shutil
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
import pkg.utils.context as context
|
import pkg.utils.context as context
|
||||||
@@ -160,6 +161,22 @@ def install_plugin(repo_url: str):
|
|||||||
main.reset_logging()
|
main.reset_logging()
|
||||||
|
|
||||||
|
|
||||||
|
def uninstall_plugin(plugin_name: str) -> str:
|
||||||
|
""" 卸载插件 """
|
||||||
|
if plugin_name not in __plugins__:
|
||||||
|
raise Exception("插件不存在")
|
||||||
|
|
||||||
|
# 获取文件夹路径
|
||||||
|
plugin_path = __plugins__[plugin_name]['path'].replace("\\", "/")
|
||||||
|
|
||||||
|
# 剪切路径为plugins/插件名
|
||||||
|
plugin_path = plugin_path.split("plugins/")[1].split("/")[0]
|
||||||
|
|
||||||
|
# 删除文件夹
|
||||||
|
shutil.rmtree("plugins/"+plugin_path)
|
||||||
|
return "plugins/"+plugin_path
|
||||||
|
|
||||||
|
|
||||||
class EventContext:
|
class EventContext:
|
||||||
""" 事件上下文 """
|
""" 事件上下文 """
|
||||||
eid = 0
|
eid = 0
|
||||||
|
|||||||
@@ -42,3 +42,4 @@ def search(cmd: str) -> dict:
|
|||||||
import pkg.qqbot.cmds.func
|
import pkg.qqbot.cmds.func
|
||||||
import pkg.qqbot.cmds.system
|
import pkg.qqbot.cmds.system
|
||||||
import pkg.qqbot.cmds.session
|
import pkg.qqbot.cmds.session
|
||||||
|
import pkg.qqbot.cmds.plugin
|
||||||
|
|||||||
@@ -0,0 +1,113 @@
|
|||||||
|
from pkg.qqbot.cmds.model import command
|
||||||
|
import pkg.utils.context
|
||||||
|
|
||||||
|
import os
|
||||||
|
import threading
|
||||||
|
import logging
|
||||||
|
|
||||||
|
|
||||||
|
def plugin_operation(cmd, params, is_admin):
|
||||||
|
reply = []
|
||||||
|
|
||||||
|
import pkg.plugin.host as plugin_host
|
||||||
|
import pkg.utils.updater as updater
|
||||||
|
|
||||||
|
plugin_list = plugin_host.__plugins__
|
||||||
|
|
||||||
|
if len(params) == 0:
|
||||||
|
reply_str = "[bot]所有插件({}):\n".format(len(plugin_host.__plugins__))
|
||||||
|
idx = 0
|
||||||
|
for key in plugin_host.iter_plugins_name():
|
||||||
|
plugin = plugin_list[key]
|
||||||
|
reply_str += "\n#{} {} {}\n{}\nv{}\n作者: {}\n"\
|
||||||
|
.format((idx+1), plugin['name'],
|
||||||
|
"[已禁用]" if not plugin['enabled'] else "",
|
||||||
|
plugin['description'],
|
||||||
|
plugin['version'], plugin['author'])
|
||||||
|
|
||||||
|
if updater.is_repo("/".join(plugin['path'].split('/')[:-1])):
|
||||||
|
remote_url = updater.get_remote_url("/".join(plugin['path'].split('/')[:-1]))
|
||||||
|
if remote_url != "https://github.com/RockChinQ/QChatGPT" and remote_url != "https://gitee.com/RockChin/QChatGPT":
|
||||||
|
reply_str += "源码: "+remote_url+"\n"
|
||||||
|
|
||||||
|
idx += 1
|
||||||
|
|
||||||
|
reply = [reply_str]
|
||||||
|
elif params[0] == 'update':
|
||||||
|
# 更新所有插件
|
||||||
|
if is_admin:
|
||||||
|
def closure():
|
||||||
|
import pkg.utils.context
|
||||||
|
updated = []
|
||||||
|
for key in plugin_list:
|
||||||
|
plugin = plugin_list[key]
|
||||||
|
if updater.is_repo("/".join(plugin['path'].split('/')[:-1])):
|
||||||
|
success = updater.pull_latest("/".join(plugin['path'].split('/')[:-1]))
|
||||||
|
if success:
|
||||||
|
updated.append(plugin['name'])
|
||||||
|
|
||||||
|
# 检查是否有requirements.txt
|
||||||
|
pkg.utils.context.get_qqbot_manager().notify_admin("正在安装依赖...")
|
||||||
|
for key in plugin_list:
|
||||||
|
plugin = plugin_list[key]
|
||||||
|
if os.path.exists("/".join(plugin['path'].split('/')[:-1])+"/requirements.txt"):
|
||||||
|
logging.info("{}检测到requirements.txt,安装依赖".format(plugin['name']))
|
||||||
|
import pkg.utils.pkgmgr
|
||||||
|
pkg.utils.pkgmgr.install_requirements("/".join(plugin['path'].split('/')[:-1])+"/requirements.txt")
|
||||||
|
|
||||||
|
import main
|
||||||
|
main.reset_logging()
|
||||||
|
|
||||||
|
pkg.utils.context.get_qqbot_manager().notify_admin("已更新插件: {}".format(", ".join(updated)))
|
||||||
|
|
||||||
|
threading.Thread(target=closure).start()
|
||||||
|
reply = ["[bot]正在更新所有插件,请勿重复发起..."]
|
||||||
|
else:
|
||||||
|
reply = ["[bot]err:权限不足"]
|
||||||
|
elif params[0] == 'del' or params[0] == 'delete':
|
||||||
|
if is_admin:
|
||||||
|
if len(params) < 2:
|
||||||
|
reply = ["[bot]err:未指定插件名"]
|
||||||
|
else:
|
||||||
|
plugin_name = params[1]
|
||||||
|
if plugin_name in plugin_list:
|
||||||
|
unin_path = plugin_host.uninstall_plugin(plugin_name)
|
||||||
|
reply = ["[bot]已删除插件: {} ({}), 请发送 !reload 重载插件".format(plugin_name, unin_path)]
|
||||||
|
else:
|
||||||
|
reply = ["[bot]err:未找到插件: {}, 请使用!plugin指令查看插件列表".format(plugin_name)]
|
||||||
|
else:
|
||||||
|
reply = ["[bot]err:权限不足,请使用管理员账号私聊发起"]
|
||||||
|
elif params[0].startswith("http"):
|
||||||
|
if is_admin:
|
||||||
|
|
||||||
|
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:权限不足,请使用管理员账号私聊发起"]
|
||||||
|
else:
|
||||||
|
reply = ["[bot]err:未知参数: {}".format(params)]
|
||||||
|
|
||||||
|
return reply
|
||||||
|
|
||||||
|
|
||||||
|
@command(
|
||||||
|
"plugin",
|
||||||
|
"插件相关操作",
|
||||||
|
"!plugin\n!plugin <插件仓库地址>",
|
||||||
|
[],
|
||||||
|
False
|
||||||
|
)
|
||||||
|
def cmd_plugin(cmd: str, params: list, session_name: str,
|
||||||
|
text_message: str, launcher_type: str, launcher_id: int,
|
||||||
|
sender_id: int, is_admin: bool) -> list:
|
||||||
|
"""插件相关操作"""
|
||||||
|
reply = plugin_operation(cmd, params, is_admin)
|
||||||
|
return reply
|
||||||
@@ -84,97 +84,6 @@ def cmd_version(cmd: str, params: list, session_name: str,
|
|||||||
return reply
|
return reply
|
||||||
|
|
||||||
|
|
||||||
def plugin_operation(cmd, params, is_admin):
|
|
||||||
reply = []
|
|
||||||
|
|
||||||
import pkg.plugin.host as plugin_host
|
|
||||||
import pkg.utils.updater as updater
|
|
||||||
|
|
||||||
plugin_list = plugin_host.__plugins__
|
|
||||||
|
|
||||||
if len(params) == 0:
|
|
||||||
reply_str = "[bot]所有插件({}):\n".format(len(plugin_host.__plugins__))
|
|
||||||
idx = 0
|
|
||||||
for key in plugin_host.iter_plugins_name():
|
|
||||||
plugin = plugin_list[key]
|
|
||||||
reply_str += "\n#{} {} {}\n{}\nv{}\n作者: {}\n"\
|
|
||||||
.format((idx+1), plugin['name'],
|
|
||||||
"[已禁用]" if not plugin['enabled'] else "",
|
|
||||||
plugin['description'],
|
|
||||||
plugin['version'], plugin['author'])
|
|
||||||
|
|
||||||
if updater.is_repo("/".join(plugin['path'].split('/')[:-1])):
|
|
||||||
remote_url = updater.get_remote_url("/".join(plugin['path'].split('/')[:-1]))
|
|
||||||
if remote_url != "https://github.com/RockChinQ/QChatGPT" and remote_url != "https://gitee.com/RockChin/QChatGPT":
|
|
||||||
reply_str += "源码: "+remote_url+"\n"
|
|
||||||
|
|
||||||
idx += 1
|
|
||||||
|
|
||||||
reply = [reply_str]
|
|
||||||
elif params[0] == 'update':
|
|
||||||
# 更新所有插件
|
|
||||||
if is_admin:
|
|
||||||
def closure():
|
|
||||||
import pkg.utils.context
|
|
||||||
updated = []
|
|
||||||
for key in plugin_list:
|
|
||||||
plugin = plugin_list[key]
|
|
||||||
if updater.is_repo("/".join(plugin['path'].split('/')[:-1])):
|
|
||||||
success = updater.pull_latest("/".join(plugin['path'].split('/')[:-1]))
|
|
||||||
if success:
|
|
||||||
updated.append(plugin['name'])
|
|
||||||
|
|
||||||
# 检查是否有requirements.txt
|
|
||||||
pkg.utils.context.get_qqbot_manager().notify_admin("正在安装依赖...")
|
|
||||||
for key in plugin_list:
|
|
||||||
plugin = plugin_list[key]
|
|
||||||
if os.path.exists("/".join(plugin['path'].split('/')[:-1])+"/requirements.txt"):
|
|
||||||
logging.info("{}检测到requirements.txt,安装依赖".format(plugin['name']))
|
|
||||||
import pkg.utils.pkgmgr
|
|
||||||
pkg.utils.pkgmgr.install_requirements("/".join(plugin['path'].split('/')[:-1])+"/requirements.txt")
|
|
||||||
|
|
||||||
import main
|
|
||||||
main.reset_logging()
|
|
||||||
|
|
||||||
pkg.utils.context.get_qqbot_manager().notify_admin("已更新插件: {}".format(", ".join(updated)))
|
|
||||||
|
|
||||||
threading.Thread(target=closure).start()
|
|
||||||
reply = ["[bot]正在更新所有插件,请勿重复发起..."]
|
|
||||||
else:
|
|
||||||
reply = ["[bot]err:权限不足"]
|
|
||||||
elif params[0].startswith("http"):
|
|
||||||
if is_admin:
|
|
||||||
|
|
||||||
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:权限不足,请使用管理员账号私聊发起"]
|
|
||||||
return reply
|
|
||||||
|
|
||||||
|
|
||||||
@command(
|
|
||||||
"plugin",
|
|
||||||
"插件相关操作",
|
|
||||||
"!plugin\n!plugin <插件仓库地址>",
|
|
||||||
[],
|
|
||||||
False
|
|
||||||
)
|
|
||||||
def cmd_plugin(cmd: str, params: list, session_name: str,
|
|
||||||
text_message: str, launcher_type: str, launcher_id: int,
|
|
||||||
sender_id: int, is_admin: bool) -> list:
|
|
||||||
"""插件相关操作"""
|
|
||||||
reply = plugin_operation(cmd, params, is_admin)
|
|
||||||
return reply
|
|
||||||
|
|
||||||
|
|
||||||
@command(
|
@command(
|
||||||
"reload",
|
"reload",
|
||||||
"执行热重载",
|
"执行热重载",
|
||||||
|
|||||||
Reference in New Issue
Block a user