diff --git a/src/neobot/core/managers/permission_manager.py b/src/neobot/core/managers/permission_manager.py index cb0b718..b36e187 100644 --- a/src/neobot/core/managers/permission_manager.py +++ b/src/neobot/core/managers/permission_manager.py @@ -433,10 +433,17 @@ def require_admin(func): """ from functools import wraps from neobot.models.events.message import MessageEvent +<<<<<<< HEAD from neobot.core.managers import permission_manager @wraps(func) async def wrapper(event: MessageEvent, *args, **kwargs): +======= + + @wraps(func) + async def wrapper(event: MessageEvent, *args, **kwargs): + from neobot.core.managers import permission_manager +>>>>>>> eb9079744c82f8e254de084a3a089ef91c37e9dc pm = permission_manager if not await pm.is_admin(event.user_id): await event.reply("此命令仅限管理员使用") diff --git a/src/neobot/core/managers/plugin_manager.py b/src/neobot/core/managers/plugin_manager.py index 5c726cc..dbc8aa1 100644 --- a/src/neobot/core/managers/plugin_manager.py +++ b/src/neobot/core/managers/plugin_manager.py @@ -62,12 +62,17 @@ class PluginManager(Singleton): 扫描并加载 `plugins` 目录下的所有插件。 """ # 使用 pathlib 获取更可靠的路径 +<<<<<<< HEAD # 当前文件:core/managers/plugin_manager.py # 目标:neobot/plugins/ +======= + # 当前文件:src/neobot/core/managers/plugin_manager.py + # 目标:src/neobot/plugins/ +>>>>>>> eb9079744c82f8e254de084a3a089ef91c37e9dc current_dir = os.path.dirname(os.path.abspath(__file__)) - # 回退两级到项目根目录 (core/managers -> core -> root) - root_dir = os.path.dirname(os.path.dirname(current_dir)) - plugin_dir = os.path.join(root_dir, "plugins") + # 回退三级到项目根目录 (core/managers -> core -> neobot -> src) + root_dir = os.path.dirname(os.path.dirname(os.path.dirname(current_dir))) + plugin_dir = os.path.join(root_dir, "src", "neobot", "plugins") # 使用完整的包名:neobot.plugins package_name = "neobot.plugins" diff --git a/src/neobot/plugins/ai_chat.py b/src/neobot/plugins/ai_chat.py index 64b27e4..6ad6d65 100644 --- a/src/neobot/plugins/ai_chat.py +++ b/src/neobot/plugins/ai_chat.py @@ -4,6 +4,10 @@ AI 聊天插件,支持向量数据库记忆功能 """ import time import uuid +<<<<<<< HEAD +======= +<<<<<<< HEAD:src/neobot/plugins/ai_chat.py +>>>>>>> eb9079744c82f8e254de084a3a089ef91c37e9dc import os import base64 from neobot.core.managers.command_manager import matcher @@ -12,6 +16,19 @@ from neobot.core.managers.vectordb_manager import vectordb_manager from neobot.core.managers.image_manager import image_manager from neobot.core.utils.logger import ModuleLogger from neobot.core.config_loader import global_config +<<<<<<< HEAD +======= +======= +import markdown +from core.managers.command_manager import matcher +from models.events.message import GroupMessageEvent, PrivateMessageEvent +from models.message import MessageSegment +from core.managers.vectordb_manager import vectordb_manager +from core.managers.image_manager import image_manager +from core.utils.logger import ModuleLogger +from core.config_loader import global_config +>>>>>>> origin/main:plugins/ai_chat.py +>>>>>>> eb9079744c82f8e254de084a3a089ef91c37e9dc logger = ModuleLogger("AIChat") @@ -32,6 +49,13 @@ async def get_ai_response(user_id: int, group_id: int, user_message: str) -> str if not OPENAI_AVAILABLE: return "请先安装 openai 库: pip install openai" +<<<<<<< HEAD +======= +<<<<<<< HEAD:src/neobot/plugins/ai_chat.py +======= + # 从配置中获取 DeepSeek API 配置(复用跨平台插件的配置或全局配置) +>>>>>>> origin/main:plugins/ai_chat.py +>>>>>>> eb9079744c82f8e254de084a3a089ef91c37e9dc api_key = getattr(global_config.cross_platform, 'deepseek_api_key', None) or "sk-f71322a9fbba4b05a7df969cb4004f06" api_url = getattr(global_config.cross_platform, 'deepseek_api_url', "https://api.deepseek.com/v1") model = getattr(global_config.cross_platform, 'deepseek_model', "deepseek-chat") @@ -138,10 +162,15 @@ async def chat_command(event: GroupMessageEvent | PrivateMessageEvent, args: lis user_message = " ".join(args) user_id = event.user_id group_id = getattr(event, 'group_id', 0) + user_name = event.sender.nickname or event.sender.card or str(user_id) await event.reply("正在思考中...") reply = await get_ai_response(user_id, group_id, user_message) +<<<<<<< HEAD +======= +<<<<<<< HEAD:src/neobot/plugins/ai_chat.py +>>>>>>> eb9079744c82f8e254de084a3a089ef91c37e9dc try: image_base64 = await generate_chat_image_base64( user_name=str(event.user_id), @@ -157,3 +186,38 @@ async def chat_command(event: GroupMessageEvent | PrivateMessageEvent, args: lis except Exception as e: logger.error(f"生成聊天图片失败: {e}") await event.reply(reply) +<<<<<<< HEAD +======= +======= + # 将 Markdown 转换为 HTML + try: + # 启用扩展以支持代码块、表格等 + html_reply = markdown.markdown(reply, extensions=['fenced_code', 'tables', 'nl2br']) + except Exception as e: + logger.error(f"Markdown 转换失败: {e}") + html_reply = reply.replace('\n', '
') + + # 渲染图片 + try: + template_data = { + "user_name": user_name, + "user_message": user_message, + "ai_reply": html_reply + } + + base64_img = await image_manager.render_template_to_base64( + template_name="ai_chat.html", + data=template_data, + output_name=f"chat_{user_id}_{int(time.time())}.png", + image_type="png" + ) + + if base64_img: + await event.reply(MessageSegment.image(f"base64://{base64_img}")) + else: + await event.reply("图片生成失败,返回文本:\n" + reply) + except Exception as e: + logger.error(f"渲染聊天图片失败: {e}") + await event.reply("图片生成失败,返回文本:\n" + reply) +>>>>>>> origin/main:plugins/ai_chat.py +>>>>>>> eb9079744c82f8e254de084a3a089ef91c37e9dc diff --git a/src/neobot/plugins/discord-cross/config.py b/src/neobot/plugins/discord-cross/config.py index 43e95e7..9ac7dd7 100644 --- a/src/neobot/plugins/discord-cross/config.py +++ b/src/neobot/plugins/discord-cross/config.py @@ -17,7 +17,15 @@ class CrossPlatformConfig: self.ENABLE_CROSS_PLATFORM = True # DeepSeek API 配置 - 从环境变量或配置文件加载 +<<<<<<< HEAD self.DEEPSEEK_API_KEY = os.environ.get("DEEPSEEK_API_KEY", "sk-28b794e08e184f868d6c0107a46e0c3e") +======= +<<<<<<< HEAD:src/neobot/plugins/discord-cross/config.py + self.DEEPSEEK_API_KEY = os.environ.get("DEEPSEEK_API_KEY", "sk-28b794e08e184f868d6c0107a46e0c3e") +======= + self.DEEPSEEK_API_KEY = os.environ.get("DEEPSEEK_API_KEY", "sk-f71322a9fbba4b05a7df969cb4004f06") +>>>>>>> origin/main:plugins/discord-cross/config.py +>>>>>>> eb9079744c82f8e254de084a3a089ef91c37e9dc self.DEEPSEEK_API_URL = os.environ.get("DEEPSEEK_API_URL", "https://api.deepseek.com/v1/chat/completions") self.DEEPSEEK_MODEL = os.environ.get("DEEPSEEK_MODEL", "deepseek-chat")