feat: 添加Docker沙箱代码执行功能

- 新增Docker沙箱执行环境,提供安全隔离的代码执行能力
- 重构code_py插件,使用Docker容器替代子进程执行
- 添加docker配置项和权限检查功能
- 实现代码执行队列和并发控制
- 新增广播插件,仅限管理员使用
This commit is contained in:
2026-01-06 22:56:00 +08:00
parent 839add3cb9
commit 54f74d0e73
12 changed files with 477 additions and 182 deletions

75
plugins/broadcast.py Normal file
View File

@@ -0,0 +1,75 @@
# -*- coding: utf-8 -*-
"""
管理员专用的广播插件
功能:
- 仅限管理员在私聊中调用。
- 通过回复一条消息并发送指令,将该消息转发给机器人所在的所有群聊。
- 此插件不写入 __plugin_meta__保持隐藏。
"""
from core.command_manager import matcher
from models import MessageEvent
from core.permission_manager import ADMIN
from core.logger import logger
@matcher.command("broadcast", "广播", permission=ADMIN)
async def broadcast_message(event: MessageEvent):
"""
广播指令处理器。
:param event: 消息事件对象。
"""
# 1. 检查是否为私聊消息
if event.group_id:
# 在群聊中调用时,静默处理,不予响应
return
# 2. 检查是否回复了某条消息
reply = event.reply
if not reply:
await event.reply("请通过“回复”一条您想广播的消息来使用此功能。")
return
# 3. 获取机器人所在的群聊列表
bot = event.bot
try:
group_list = await bot.get_group_list()
if not group_list:
await event.reply("机器人目前没有加入任何群聊。")
return
except Exception as e:
logger.error(f"[Broadcast] 获取群聊列表失败: {e}")
await event.reply(f"获取群聊列表时发生错误,无法广播。错误信息: {e}")
return
# 4. 遍历所有群聊并转发消息
success_count = 0
failed_count = 0
total_groups = len(group_list)
await event.reply(f"准备向 {total_groups} 个群聊广播消息,请稍候...")
for group in group_list:
group_id = group.get("group_id")
if not group_id:
continue
try:
# 直接转发被回复的消息
await bot.forward_message(
group_id=group_id,
message_id=reply.message_id
)
success_count += 1
logger.info(f"[Broadcast] 已成功将消息转发至群聊: {group_id}")
except Exception as e:
failed_count += 1
logger.error(f"[Broadcast] 转发消息至群聊 {group_id} 失败: {e}")
# 5. 向管理员报告结果
report_message = (
f"广播任务完成。\n"
f"总群聊数: {total_groups}\n"
f"成功: {success_count}\n"
f"失败: {failed_count}"
)
await event.reply(report_message)