From 5f184bb739e78b10bf861dfa7de814c6dc8d3db1 Mon Sep 17 00:00:00 2001 From: baiyu-yu <135424680+baiyu-yu@users.noreply.github.com> Date: Fri, 17 Oct 2025 18:53:34 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat=EF=BC=9A=E6=96=B0=E5=A2=9E=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=B2=BE=E5=8D=8E=E6=B6=88=E6=81=AF=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E5=92=8C=E5=88=A0=E9=99=A4=E7=B2=BE=E5=8D=8E=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tool/tool_essence_msg.ts | 154 ++++++++++++++++++++++++++++++++++- 1 file changed, 151 insertions(+), 3 deletions(-) diff --git a/src/tool/tool_essence_msg.ts b/src/tool/tool_essence_msg.ts index 76993e8..7c8e5ba 100644 --- a/src/tool/tool_essence_msg.ts +++ b/src/tool/tool_essence_msg.ts @@ -1,6 +1,8 @@ import { logger } from "../logger"; -import { transformMsgIdBack } from "../utils/utils"; +import { transformMsgIdBack, transformMsgId } from "../utils/utils"; import { Tool } from "./tool"; +import { ConfigManager } from "../config/config"; +import { Image, ImageManager } from "../AI/image"; export function registerEssenceMsg() { const toolSet = new Tool({ @@ -51,6 +53,152 @@ export function registerEssenceMsg() { return `设置精华消息失败`; } }; -} -//TODO: 查看精华消息列表、取消精华消息 \ No newline at end of file + const toolGet = new Tool({ + type: 'function', + function: { + name: 'get_essence_msg_list', + description: '获取群精华消息列表', + parameters: { + type: 'object', + properties: { + }, + required: [] + } + } + }); + toolGet.solve = async (ctx, _, __, ___) => { + if (ctx.isPrivate) { + return `精华消息功能仅在群聊中可用`; + } + + const net = globalThis.net || globalThis.http; + if (!net) { + logger.error(`未找到ob11网络连接依赖`); + return `未找到ob11网络连接依赖,请提示用户安装`; + } + + try { + const epId = ctx.endPoint.userId; + const group_id = ctx.group.groupId.replace(/^.+:/, ''); + const result = await net.callApi(epId, `get_essence_msg_list?group_id=${group_id}`); + + if (!Array.isArray(result) || result.length === 0) { + return `该群暂无精华消息`; + } + + let response = `群精华消息列表 (${result.length}条):\n\n`; + + for (let i = 0; i < result.length; i++) { + const essence = result[i]; + const addTime = new Date(essence.operator_time * 1000).toLocaleString(); + const operatorName = essence.operator_nick || `用户${essence.operator_id}`; + const senderName = essence.sender_nick || `用户${essence.sender_id}`; + const msgId = transformMsgId(essence.message_id); + + response += `${i + 1}. 发送者: ${senderName}\n`; + response += ` 操作者: ${operatorName}\n`; + response += ` 设置时间: ${addTime}\n`; + response += ` 消息ID: ${msgId}\n`; + + if (essence.content) { + let content = ''; + if (Array.isArray(essence.content)) { + for (const item of essence.content) { + if (item.type === 'text') { + content += item.data.text; + } else if (item.type === 'image') { + const imageUrl = item.data.url; + if (imageUrl) { + const image = new Image(imageUrl); + + if (image.isUrl) { + const { condition } = ConfigManager.image; + + const fmtCondition = parseInt(seal.format(ctx, `{${condition}}`)); + if (fmtCondition === 1) { + const reply = await ImageManager.imageToText(imageUrl); + if (reply) { + image.content = reply; + content += `<|img:${image.id}:${reply}|>`; + } + } else { + content += `<|img:${image.id}|>`; + } + } + } + } + } + } else if (typeof essence.content === 'string') { + content = essence.content; + } + + if (content.length > 50) { + content = content.substring(0, 50) + '...'; + } + response += ` 内容: ${content}\n`; + } + + response += '\n'; + } + + return response.trim(); + } catch (e) { + logger.error(e); + return `获取精华消息列表失败: ${e.message}`; + } + }; + + const toolDel = new Tool({ + type: 'function', + function: { + name: 'delete_essence_msg', + description: '删除群精华消息', + parameters: { + type: 'object', + properties: { + msg_id: { + type: 'string', + description: '要删除的精华消息ID' + } + }, + required: ['msg_id'] + } + } + }); + toolDel.solve = async (ctx, _, __, args) => { + const { msg_id } = args; + + if (ctx.isPrivate) { + return `精华消息功能仅在群聊中可用`; + } + + const net = globalThis.net || globalThis.http; + if (!net) { + logger.error(`未找到ob11网络连接依赖`); + return `未找到ob11网络连接依赖,请提示用户安装`; + } + + try { + const epId = ctx.endPoint.userId; + const group_id = ctx.group.groupId.replace(/^.+:/, ''); + const user_id = epId.replace(/^.+:/, ''); + const memberInfo = await net.callApi(epId, `get_group_member_info?group_id=${group_id}&user_id=${user_id}&no_cache=true`); + if (memberInfo.role !== 'owner' && memberInfo.role !== 'admin') { + return `你没有管理员权限`; + } + } catch (e) { + logger.error(e); + return `获取权限信息失败`; + } + + try { + const epId = ctx.endPoint.userId; + await net.callApi(epId, `delete_essence_msg?message_id=${transformMsgIdBack(msg_id)}`); + return `已删除精华消息 ${msg_id}`; + } catch (e) { + logger.error(e); + return `删除精华消息失败: ${e.message}`; + } + }; +} \ No newline at end of file From 2317eea74d84347d85c9d01cd9b910ca3d82fc17 Mon Sep 17 00:00:00 2001 From: error2913 <2913949387@qq.com> Date: Sat, 18 Oct 2025 00:17:01 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=B8=80=E4=B8=8B?= =?UTF-8?q?=EF=BC=8C=E4=BD=BFsolve=E8=BF=94=E5=9B=9E`Promise<{=20content:?= =?UTF-8?q?=20string,=20images:=20Image[]=20}>`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/AI/context.ts | 4 +- src/index.ts | 2 +- src/tool/tool.ts | 32 ++++++------- src/tool/tool_attr.ts | 18 ++++---- src/tool/tool_ban.ts | 32 ++++++------- src/tool/tool_context.ts | 19 +++----- src/tool/tool_deck.ts | 6 +-- src/tool/tool_essence_msg.ts | 76 ++++++++++++------------------- src/tool/tool_group_sign.ts | 8 ++-- src/tool/tool_image.ts | 40 ++++++++-------- src/tool/tool_jrrp.ts | 6 +-- src/tool/tool_meme.ts | 30 ++++++------ src/tool/tool_memory.ts | 30 ++++++------ src/tool/tool_message.ts | 41 ++++++++--------- src/tool/tool_modu.ts | 8 ++-- src/tool/tool_music.ts | 14 +++--- src/tool/tool_person_info.ts | 8 ++-- src/tool/tool_qq_list.ts | 88 +++++++++++++++++++++++------------- src/tool/tool_rename.ts | 10 ++-- src/tool/tool_roll_check.ts | 12 ++--- src/tool/tool_time.ts | 44 +++++++++--------- src/tool/tool_trigger.ts | 8 ++-- src/tool/tool_voice.ts | 12 ++--- src/tool/tool_web.ts | 12 ++--- src/update.ts | 3 +- 25 files changed, 280 insertions(+), 283 deletions(-) diff --git a/src/AI/context.ts b/src/AI/context.ts index c6a7de6..312e51e 100644 --- a/src/AI/context.ts +++ b/src/AI/context.ts @@ -181,13 +181,13 @@ export class Context { this.messages.push(message); } - async addToolMessage(tool_call_id: string, s: string) { + async addToolMessage(tool_call_id: string, s: string, images: Image[]) { const message: Message = { role: 'tool', tool_call_id: tool_call_id, uid: '', name: '', - images: [], + images: images, msgArray: [{ msgId: '', time: Math.floor(Date.now() / 1000), diff --git a/src/index.ts b/src/index.ts index 22ccfe5..e40fe08 100644 --- a/src/index.ts +++ b/src/index.ts @@ -886,7 +886,7 @@ ${Object.keys(tool.info.function.parameters.properties).map(key => { } tool.solve(ctx, msg, ai, args) - .then(s => seal.replyToSender(ctx, msg, s)); + .then(({ content }) => seal.replyToSender(ctx, msg, content)); return ret; } catch (e) { const s = `调用函数 (${val2}) 失败:${e.message}`; diff --git a/src/tool/tool.ts b/src/tool/tool.ts index 0197240..f5f3f5d 100644 --- a/src/tool/tool.ts +++ b/src/tool/tool.ts @@ -23,6 +23,7 @@ import { registerSetTrigger } from "./tool_trigger" import { registerMusicPlay } from "./tool_music" import { registerMeme } from "./tool_meme" import { logger } from "../logger" +import { Image } from "../AI/image"; export interface ToolInfo { type: "function", @@ -65,7 +66,7 @@ export class Tool { cmdInfo: CmdInfo; // 海豹指令信息 type: string; // 可使用函数的聊天场景类型:"private" | "group" | "all" tool_choice: string; // 是否可以继续调用函数:"none" | "auto" | "required" - solve: (ctx: seal.MsgContext, msg: seal.Message, ai: AI, args: { [key: string]: any }) => Promise; + solve: (ctx: seal.MsgContext, msg: seal.Message, ai: AI, args: { [key: string]: any }) => Promise<{ content: string, images: Image[] }>; constructor(info: ToolInfo) { this.info = info; @@ -76,11 +77,10 @@ export class Tool { } this.type = "all" this.tool_choice = 'auto'; - this.solve = async (_, __, ___, ____) => "函数未实现"; + this.solve = async (_, __, ___, ____) => ({ content: "函数未实现", images: [] }); ToolManager.toolMap[info.function.name] = this; } - } export class ToolManager { @@ -270,7 +270,7 @@ export class ToolManager { logger.warning('连续调用函数次数超过上限'); for (let i = 0; i < tool_calls.length; i++) { const tool_call = tool_calls[i]; - await ai.context.addToolMessage(tool_call.id, `连续调用函数次数超过上限`); + await ai.context.addToolMessage(tool_call.id, `连续调用函数次数超过上限`, []); ai.tool.toolCallCount++; } return "none"; @@ -306,17 +306,17 @@ export class ToolManager { if (this.cmdArgs == null) { logger.warning(`暂时无法调用函数,请先使用 .r 指令`); - await ai.context.addToolMessage(tool_call.id, `暂时无法调用函数,请先提示用户使用 .r 指令`); + await ai.context.addToolMessage(tool_call.id, `暂时无法调用函数,请先提示用户使用 .r 指令`, []); return "none"; } if (ConfigManager.tool.toolsNotAllow.includes(name)) { logger.warning(`调用函数失败:禁止调用的函数:${name}`); - await ai.context.addToolMessage(tool_call.id, `调用函数失败:禁止调用的函数:${name}`); + await ai.context.addToolMessage(tool_call.id, `调用函数失败:禁止调用的函数:${name}`, []); return "none"; } if (!this.toolMap.hasOwnProperty(name)) { logger.warning(`调用函数失败:未注册的函数:${name}`); - await ai.context.addToolMessage(tool_call.id, `调用函数失败:未注册的函数:${name}`); + await ai.context.addToolMessage(tool_call.id, `调用函数失败:未注册的函数:${name}`, []); return "none"; } @@ -324,7 +324,7 @@ export class ToolManager { const tool = this.toolMap[name]; if (tool.type !== "all" && tool.type !== msg.messageType) { logger.warning(`调用函数失败:函数${name}可使用的场景类型为${tool.type},当前场景类型为${msg.messageType}`); - await ai.context.addToolMessage(tool_call.id, `调用函数失败:函数${name}可使用的场景类型为${tool.type},当前场景类型为${msg.messageType}`); + await ai.context.addToolMessage(tool_call.id, `调用函数失败:函数${name}可使用的场景类型为${tool.type},当前场景类型为${msg.messageType}`, []); return "none"; } @@ -332,24 +332,23 @@ export class ToolManager { const args = JSON.parse(tool_call.function.arguments); if (args !== null && typeof args !== 'object') { logger.warning(`调用函数失败:arguement不是一个object`); - await ai.context.addToolMessage(tool_call.id, `调用函数失败:arguement不是一个object`); + await ai.context.addToolMessage(tool_call.id, `调用函数失败:arguement不是一个object`, []); return "auto"; } for (const key of tool.info.function.parameters.required) { if (!args.hasOwnProperty(key)) { logger.warning(`调用函数失败:缺少必需参数 ${key}`); - await ai.context.addToolMessage(tool_call.id, `调用函数失败:缺少必需参数 ${key}`); + await ai.context.addToolMessage(tool_call.id, `调用函数失败:缺少必需参数 ${key}`, []); return "auto"; } } - const s = await tool.solve(ctx, msg, ai, args); - - await ai.context.addToolMessage(tool_call.id, s); + const { content, images } = await tool.solve(ctx, msg, ai, args); + await ai.context.addToolMessage(tool_call.id, content, images); return tool.tool_choice; } catch (e) { logger.error(`调用函数 (${name}:${tool_call.function.arguments}) 失败:${e.message}`); - await ai.context.addToolMessage(tool_call.id, `调用函数 (${name}:${tool_call.function.arguments}) 失败:${e.message}`); + await ai.context.addToolMessage(tool_call.id, `调用函数 (${name}:${tool_call.function.arguments}) 失败:${e.message}`, []); return "none"; } } @@ -430,9 +429,8 @@ export class ToolManager { } } - const s = await tool.solve(ctx, msg, ai, args); - - await ai.context.addSystemUserMessage('调用函数返回', s, []); + const { content, images } = await tool.solve(ctx, msg, ai, args); + await ai.context.addSystemUserMessage('调用函数返回', content, images); } catch (e) { logger.error(`调用函数 (${name}:${JSON.stringify(tool_call.arguments, null, 2)}) 失败:${e.message}`); await ai.context.addSystemUserMessage('调用函数返回', `调用函数 (${name}:${JSON.stringify(tool_call.arguments, null, 2)}) 失败:${e.message}`, []); diff --git a/src/tool/tool_attr.ts b/src/tool/tool_attr.ts index 167f6aa..5704fe0 100644 --- a/src/tool/tool_attr.ts +++ b/src/tool/tool_attr.ts @@ -30,7 +30,7 @@ export function registerAttr() { const uid = await ai.context.findUserId(ctx, name); if (uid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } msg = createMsg(msg.messageType, uid, ctx.group.groupId); @@ -38,10 +38,10 @@ export function registerAttr() { const [s, success] = await ToolManager.extensionSolve(ctx, msg, ai, toolShow.cmdInfo, [], [], []); if (!success) { - return '展示失败'; + return { content: '展示失败', images: [] }; } - return s; + return { content: s, images: [] }; } const toolGet = new Tool({ @@ -70,14 +70,14 @@ export function registerAttr() { const uid = await ai.context.findUserId(ctx, name); if (uid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } msg = createMsg(msg.messageType, uid, ctx.group.groupId); ctx = createCtx(ctx.endPoint.userId, msg); const value = seal.vars.intGet(ctx, attr)[0]; - return `${attr}: ${value}`; + return { content: `${attr}: ${value}`, images: [] }; } const toolSet = new Tool({ @@ -106,7 +106,7 @@ export function registerAttr() { const uid = await ai.context.findUserId(ctx, name); if (uid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } msg = createMsg(msg.messageType, uid, ctx.group.groupId); @@ -114,7 +114,7 @@ export function registerAttr() { const [attr, expr] = expression.split('='); if (expr === undefined) { - return `修改失败,表达式 ${expression} 格式错误`; + return { content: `修改失败,表达式 ${expression} 格式错误`, images: [] }; } const value = seal.vars.intGet(ctx, attr)[0]; @@ -130,12 +130,12 @@ export function registerAttr() { const result = parseInt(seal.format(ctx, `{${s}}`)); if (isNaN(result)) { - return `修改失败,表达式 ${expression} 格式化错误`; + return { content: `修改失败,表达式 ${expression} 格式化错误`, images: [] }; } seal.vars.intSet(ctx, attr, result); seal.replyToSender(ctx, msg, `进行了 ${expression} 修改\n${attr}: ${value}=>${result}`); - return `进行了 ${expression} 修改\n${attr}: ${value}=>${result}`; + return { content: `进行了 ${expression} 修改\n${attr}: ${value}=>${result}`, images: [] }; } } \ No newline at end of file diff --git a/src/tool/tool_ban.ts b/src/tool/tool_ban.ts index 604df7a..ab7526e 100644 --- a/src/tool/tool_ban.ts +++ b/src/tool/tool_ban.ts @@ -30,18 +30,18 @@ export function registerBan() { const { name, duration } = args; if (ctx.isPrivate) { - return `该命令只能在群聊中使用`; + return { content: `该命令只能在群聊中使用`, images: [] }; } const net = globalThis.net || globalThis.http; if (!net) { logger.error(`未找到ob11网络连接依赖`); - return `未找到ob11网络连接依赖,请提示用户安装`; + return { content: `未找到ob11网络连接依赖,请提示用户安装`, images: [] }; } const uid = await ai.context.findUserId(ctx, name); if (uid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } try { @@ -50,11 +50,11 @@ export function registerBan() { const user_id = epId.replace(/^.+:/, ''); const result = await net.callApi(epId, `get_group_member_info?group_id=${group_id}&user_id=${user_id}&no_cache=true`); if (result.role !== 'owner' && result.role !== 'admin') { - return `你没有管理员权限`; + return { content: `你没有管理员权限`, images: [] }; } } catch (e) { logger.error(e); - return `获取权限信息失败`; + return { content: `获取权限信息失败`, images: [] }; } try { @@ -63,11 +63,11 @@ export function registerBan() { const user_id = uid.replace(/^.+:/, ''); const result = await net.callApi(epId, `get_group_member_info?group_id=${group_id}&user_id=${user_id}&no_cache=true`); if (result.role === 'owner' || result.role === 'admin') { - return `你无法禁言${result.role === 'owner' ? '群主' : '管理员'}`; + return { content: `你无法禁言${result.role === 'owner' ? '群主' : '管理员'}`, images: [] }; } } catch (e) { logger.error(e); - return `获取权限信息失败`; + return { content: `获取权限信息失败`, images: [] }; } try { @@ -75,10 +75,10 @@ export function registerBan() { const group_id = ctx.group.groupId.replace(/^.+:/, ''); const user_id = uid.replace(/^.+:/, ''); await net.callApi(epId, `set_group_ban?group_id=${group_id}&user_id=${user_id}&duration=${duration}`); - return `已禁言<${name}> ${duration}秒`; + return { content: `已禁言<${name}> ${duration}秒`, images: [] }; } catch (e) { logger.error(e); - return `禁言失败`; + return { content: `禁言失败`, images: [] }; } } @@ -106,17 +106,17 @@ export function registerBan() { const net = globalThis.net || globalThis.http; if (!net) { logger.error(`未找到ob11网络连接依赖`); - return `未找到ob11网络连接依赖,请提示用户安装`; + return { content: `未找到ob11网络连接依赖,请提示用户安装`, images: [] }; } try { const epId = ctx.endPoint.userId; const gid = ctx.group.groupId; await net.callApi(epId, `set_group_whole_ban?group_id=${gid.replace(/^.+:/, '')}&enable=${enable}`); - return `已${enable ? '开启' : '关闭'}全员禁言`; + return { content: `已${enable ? '开启' : '关闭'}全员禁言`, images: [] }; } catch (e) { logger.error(e); - return `全员禁言失败`; + return { content: `全员禁言失败`, images: [] }; } } @@ -138,7 +138,7 @@ export function registerBan() { const net = globalThis.net || globalThis.http; if (!net) { logger.error(`未找到ob11网络连接依赖`); - return `未找到ob11网络连接依赖,请提示用户安装`; + return { content: `未找到ob11网络连接依赖,请提示用户安装`, images: [] }; } try { @@ -147,13 +147,13 @@ export function registerBan() { const data = await net.callApi(epId, `get_group_shut_list?group_id=${gid.replace(/^.+:/, '')}`); const s = `被禁言成员数量: ${data.length}\n` + data.slice(0, 50).map((item: any, index: number) => { - return `${index + 1}. ${item.nick}(${item.uin}) ${item.cardName && item.cardName !== item.nick ? `群名片: ${item.cardName}` : ''} 禁言结束时间: ${fmtDate(item.shutUpTime)}`; + return { content: `${index + 1}. ${item.nick}(${item.uin}) ${item.cardName && item.cardName !== item.nick ? `群名片: ${item.cardName}` : ''} 禁言结束时间: ${fmtDate(item.shutUpTime)}`, images: [] }; }).join('\n'); - return s; + return { content: s, images: [] }; } catch (e) { logger.error(e); - return `获取禁言列表失败`; + return { content: `获取禁言列表失败`, images: [] }; } } } \ No newline at end of file diff --git a/src/tool/tool_context.ts b/src/tool/tool_context.ts index 39e4bc8..a47101c 100644 --- a/src/tool/tool_context.ts +++ b/src/tool/tool_context.ts @@ -30,18 +30,16 @@ export function registerContext() { toolGet.solve = async (ctx, msg, ai, args) => { const { ctx_type, name } = args; - const originalAI = ai; - if (ctx_type === "private") { const uid = await ai.context.findUserId(ctx, name, true); if (uid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } if (uid === ctx.player.userId && ctx.isPrivate) { - return `向当前私聊发送消息无需调用函数`; + return { content: `向当前私聊发送消息无需调用函数`, images: [] }; } if (uid === ctx.endPoint.userId) { - return `禁止向自己发送消息`; + return { content: `禁止向自己发送消息`, images: [] }; } msg = createMsg('private', uid, ''); @@ -51,10 +49,10 @@ export function registerContext() { } else if (ctx_type === "group") { const gid = await ai.context.findGroupId(ctx, name); if (gid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } if (gid === ctx.group.groupId) { - return `向当前群聊发送消息无需调用函数`; + return { content: `向当前群聊发送消息无需调用函数`, images: [] }; } msg = createMsg('group', ctx.player.userId, gid); @@ -62,7 +60,7 @@ export function registerContext() { ai = AIManager.getAI(gid); } else { - return `未知的上下文类型<${ctx_type}>`; + return { content: `未知的上下文类型<${ctx_type}>`, images: [] }; } const messages = ai.context.messages; @@ -77,9 +75,6 @@ export function registerContext() { return `[${message.role}]: ${buildContent(message)}`; }).join('\n'); - // 将images添加到最后一条消息,以便使用 - originalAI.context.messages[originalAI.context.messages.length - 1].images.push(...images); - - return s; + return { content: s, images: images }; } } \ No newline at end of file diff --git a/src/tool/tool_deck.ts b/src/tool/tool_deck.ts index 7208a51..c3eeeb8 100644 --- a/src/tool/tool_deck.ts +++ b/src/tool/tool_deck.ts @@ -28,16 +28,16 @@ export function registerDeck() { const dr = seal.deck.draw(ctx, name, true); if (!dr.exists) { logger.error(`牌堆${name}不存在:${dr.err}`); - return `牌堆${name}不存在:${dr.err}`; + return { content: `牌堆${name}不存在:${dr.err}`, images: [] }; } const result = dr.result; if (result == null) { logger.error(`牌堆${name}结果为空:${dr.err}`); - return `牌堆${name}结果为空:${dr.err}`; + return { content: `牌堆${name}结果为空:${dr.err}`, images: [] }; } seal.replyToSender(ctx, msg, result); - return result; + return { content: result, images: [] }; } } \ No newline at end of file diff --git a/src/tool/tool_essence_msg.ts b/src/tool/tool_essence_msg.ts index 7c8e5ba..e900ee1 100644 --- a/src/tool/tool_essence_msg.ts +++ b/src/tool/tool_essence_msg.ts @@ -1,8 +1,7 @@ import { logger } from "../logger"; import { transformMsgIdBack, transformMsgId } from "../utils/utils"; import { Tool } from "./tool"; -import { ConfigManager } from "../config/config"; -import { Image, ImageManager } from "../AI/image"; +import { Image } from "../AI/image"; export function registerEssenceMsg() { const toolSet = new Tool({ @@ -28,7 +27,7 @@ export function registerEssenceMsg() { const net = globalThis.net || globalThis.http; if (!net) { logger.error(`未找到ob11网络连接依赖`); - return `未找到ob11网络连接依赖,请提示用户安装`; + return { content: `未找到ob11网络连接依赖,请提示用户安装`, images: [] }; } try { @@ -37,20 +36,20 @@ export function registerEssenceMsg() { const user_id = epId.replace(/^.+:/, ''); const memberInfo = await net.callApi(epId, `get_group_member_info?group_id=${group_id}&user_id=${user_id}&no_cache=true`); if (memberInfo.role !== 'owner' && memberInfo.role !== 'admin') { - return `你没有管理员权限`; + return { content: `你没有管理员权限`, images: [] }; } } catch (e) { logger.error(e); - return `获取权限信息失败`; + return { content: `获取权限信息失败`, images: [] }; } try { const epId = ctx.endPoint.userId; await net.callApi(epId, `set_essence_msg?message_id=${transformMsgIdBack(msg_id)}`); - return `已将消息${msg_id}设置为精华消息`; + return { content: `已将消息${msg_id}设置为精华消息`, images: [] }; } catch (e) { logger.error(e); - return `设置精华消息失败`; + return { content: `设置精华消息失败`, images: [] }; } }; @@ -69,38 +68,34 @@ export function registerEssenceMsg() { }); toolGet.solve = async (ctx, _, __, ___) => { if (ctx.isPrivate) { - return `精华消息功能仅在群聊中可用`; + return { content: `精华消息功能仅在群聊中可用`, images: [] }; } const net = globalThis.net || globalThis.http; if (!net) { logger.error(`未找到ob11网络连接依赖`); - return `未找到ob11网络连接依赖,请提示用户安装`; + return { content: `未找到ob11网络连接依赖,请提示用户安装`, images: [] }; } try { const epId = ctx.endPoint.userId; const group_id = ctx.group.groupId.replace(/^.+:/, ''); const result = await net.callApi(epId, `get_essence_msg_list?group_id=${group_id}`); - + if (!Array.isArray(result) || result.length === 0) { - return `该群暂无精华消息`; + return { content: `该群暂无精华消息`, images: [] }; } let response = `群精华消息列表 (${result.length}条):\n\n`; - + const images: Image[] = []; + for (let i = 0; i < result.length; i++) { const essence = result[i]; const addTime = new Date(essence.operator_time * 1000).toLocaleString(); const operatorName = essence.operator_nick || `用户${essence.operator_id}`; const senderName = essence.sender_nick || `用户${essence.sender_id}`; const msgId = transformMsgId(essence.message_id); - - response += `${i + 1}. 发送者: ${senderName}\n`; - response += ` 操作者: ${operatorName}\n`; - response += ` 设置时间: ${addTime}\n`; - response += ` 消息ID: ${msgId}\n`; - + if (essence.content) { let content = ''; if (Array.isArray(essence.content)) { @@ -111,41 +106,30 @@ export function registerEssenceMsg() { const imageUrl = item.data.url; if (imageUrl) { const image = new Image(imageUrl); - - if (image.isUrl) { - const { condition } = ConfigManager.image; - - const fmtCondition = parseInt(seal.format(ctx, `{${condition}}`)); - if (fmtCondition === 1) { - const reply = await ImageManager.imageToText(imageUrl); - if (reply) { - image.content = reply; - content += `<|img:${image.id}:${reply}|>`; - } - } else { - content += `<|img:${image.id}|>`; - } - } + images.push(image); } } } } else if (typeof essence.content === 'string') { content = essence.content; } - + if (content.length > 50) { content = content.substring(0, 50) + '...'; } - response += ` 内容: ${content}\n`; + + response += `${i + 1}. 发送者: ${senderName} + 操作者: ${operatorName} + 设置时间: ${addTime} + 消息ID: ${msgId} + 内容: ${content}\n`; } - - response += '\n'; } - - return response.trim(); + + return { content: response.trim(), images: images }; } catch (e) { logger.error(e); - return `获取精华消息列表失败: ${e.message}`; + return { content: `获取精华消息列表失败: ${e.message}`, images: [] }; } }; @@ -170,13 +154,13 @@ export function registerEssenceMsg() { const { msg_id } = args; if (ctx.isPrivate) { - return `精华消息功能仅在群聊中可用`; + return { content: `精华消息功能仅在群聊中可用`, images: [] }; } const net = globalThis.net || globalThis.http; if (!net) { logger.error(`未找到ob11网络连接依赖`); - return `未找到ob11网络连接依赖,请提示用户安装`; + return { content: `未找到ob11网络连接依赖,请提示用户安装`, images: [] }; } try { @@ -185,20 +169,20 @@ export function registerEssenceMsg() { const user_id = epId.replace(/^.+:/, ''); const memberInfo = await net.callApi(epId, `get_group_member_info?group_id=${group_id}&user_id=${user_id}&no_cache=true`); if (memberInfo.role !== 'owner' && memberInfo.role !== 'admin') { - return `你没有管理员权限`; + return { content: `你没有管理员权限`, images: [] }; } } catch (e) { logger.error(e); - return `获取权限信息失败`; + return { content: `获取权限信息失败`, images: [] }; } try { const epId = ctx.endPoint.userId; await net.callApi(epId, `delete_essence_msg?message_id=${transformMsgIdBack(msg_id)}`); - return `已删除精华消息 ${msg_id}`; + return { content: `已删除精华消息 ${msg_id}`, images: [] }; } catch (e) { logger.error(e); - return `删除精华消息失败: ${e.message}`; + return { content: `删除精华消息失败: ${e.message}`, images: [] }; } }; } \ No newline at end of file diff --git a/src/tool/tool_group_sign.ts b/src/tool/tool_group_sign.ts index e9031b3..62d89c9 100644 --- a/src/tool/tool_group_sign.ts +++ b/src/tool/tool_group_sign.ts @@ -18,23 +18,23 @@ export function registerGroupSign() { tool.type = 'group'; tool.solve = async (ctx, _, __, ___) => { if (ctx.isPrivate) { - return `群打卡只能在群聊中使用`; + return { content: `群打卡只能在群聊中使用`, images: [] }; } const net = globalThis.net || globalThis.http; if (!net) { logger.error(`未找到ob11网络连接依赖`); - return `未找到ob11网络连接依赖,请提示用户安装`; + return { content: `未找到ob11网络连接依赖,请提示用户安装`, images: [] }; } try { const epId = ctx.endPoint.userId; const group_id = ctx.group.groupId.replace(/^.+:/, ''); await net.callApi(epId, `send_group_sign?group_id=${group_id.replace(/\D+/, '')}`); - return `已发送群打卡,若无响应可能今日已打卡`; + return { content: `已发送群打卡,若无响应可能今日已打卡`, images: [] }; } catch (e) { logger.error(e); - return `发送群打卡失败`; + return { content: `发送群打卡失败`, images: [] }; } } } \ No newline at end of file diff --git a/src/tool/tool_image.ts b/src/tool/tool_image.ts index a0d3202..fbd2b83 100644 --- a/src/tool/tool_image.ts +++ b/src/tool/tool_image.ts @@ -30,19 +30,19 @@ export function registerImage() { const image = ai.context.findImage(id, ai); if (!image) { - return `未找到图片${id}`; + return { content: `未找到图片${id}`, images: [] }; } const text = content ? `请帮我用简短的语言概括这张图片中出现的:${content}` : ``; if (image.isUrl) { const reply = await ImageManager.imageToText(image.file, text); if (reply) { - return reply; + return { content: reply, images: [] }; } else { - return '图片识别失败'; + return { content: '图片识别失败', images: [] }; } } else { - return '本地图片暂时无法识别'; + return { content: '本地图片暂时无法识别', images: [] }; } } @@ -81,27 +81,27 @@ export function registerImage() { if (avatar_type === "private") { const uid = await ai.context.findUserId(ctx, name, true); if (uid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } url = `https://q1.qlogo.cn/g?b=qq&nk=${uid.replace(/^.+:/, '')}&s=640`; } else if (avatar_type === "group") { const gid = await ai.context.findGroupId(ctx, name); if (gid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } url = `https://p.qlogo.cn/gh/${gid.replace(/^.+:/, '')}/${gid.replace(/^.+:/, '')}/640`; } else { - return `未知的头像类型<${avatar_type}>`; + return { content: `未知的头像类型<${avatar_type}>`, images: [] }; } const reply = await ImageManager.imageToText(url, text); if (reply) { - return reply; + return { content: reply, images: [] }; } else { - return '头像识别失败'; + return { content: '头像识别失败', images: [] }; } } @@ -132,15 +132,15 @@ export function registerImage() { const ext = seal.ext.find('AIDrawing'); if (!ext) { logger.error(`未找到AIDrawing依赖`); - return `未找到AIDrawing依赖,请提示用户安装AIDrawing依赖`; + return { content: `未找到AIDrawing依赖,请提示用户安装AIDrawing依赖`, images: [] }; } try { await globalThis.aiDrawing.generateImage(prompt, ctx, msg, negative_prompt); - return `图像生成请求已发送`; + return { content: `图像生成请求已发送`, images: [] }; } catch (e) { logger.error(`图像生成失败:${e}`); - return `图像生成失败:${e}`; + return { content: `图像生成失败:${e}`, images: [] }; } } @@ -189,19 +189,19 @@ export function registerImage() { const { id, name, scenes } = ii; if (!id || !name || !scenes || scenes.length === 0) { - return `图片${id}信息不完整,缺少id、name或scenes为空`; + return { content: `图片${id}信息不完整,缺少id、name或scenes为空`, images: [] }; } const image = ai.context.findImage(id, ai); if (!image) { - return `未找到图片${id}`; + return { content: `未找到图片${id}`, images: [] }; } if (image.isUrl) { const { base64 } = await ImageManager.imageUrlToBase64(image.file); if (!base64) { logger.error(`图片${id}转换为base64失败`); - return `图片转换为base64失败`; + return { content: `图片转换为base64失败`, images: [] }; } const newImage = new Image(image.file); @@ -213,16 +213,16 @@ export function registerImage() { savedImages.push(newImage); } else { - return '本地图片不用再次储存'; + return { content: '本地图片不用再次储存', images: [] }; } } try { ai.imageManager.updateSavedImages(savedImages); - return `图片已保存`; + return { content: `图片已保存`, images: [] }; } catch (e) { - return `图片保存失败:${e.message}` + return { content: `图片保存失败:${e.message}`, images: [] }; } } @@ -249,12 +249,12 @@ export function registerImage() { for (const name of names) { const imageIndex = ai.imageManager.savedImages.findIndex(img => img.id === name); if (imageIndex === -1) { - return `未找到名称为"${name}"的保存图片`; + return { content: `未找到名称为"${name}"的保存图片`, images: [] }; } ai.imageManager.savedImages.splice(imageIndex, 1); } - return `已删除${names.length}个图片`; + return { content: `已删除${names.length}个图片`, images: [] }; } } \ No newline at end of file diff --git a/src/tool/tool_jrrp.ts b/src/tool/tool_jrrp.ts index 33a09f9..4a8c990 100644 --- a/src/tool/tool_jrrp.ts +++ b/src/tool/tool_jrrp.ts @@ -30,7 +30,7 @@ export function registerJrrp() { const uid = await ai.context.findUserId(ctx, name); if (uid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } msg = createMsg(msg.messageType, uid, ctx.group.groupId); @@ -38,9 +38,9 @@ export function registerJrrp() { const [s, success] = await ToolManager.extensionSolve(ctx, msg, ai, tool.cmdInfo, [], [], []); if (!success) { - return '今日人品查询失败' + return { content: '今日人品查询失败', images: [] }; } - return s; + return { content: s, images: [] }; } } \ No newline at end of file diff --git a/src/tool/tool_meme.ts b/src/tool/tool_meme.ts index 8878cd2..a842d16 100644 --- a/src/tool/tool_meme.ts +++ b/src/tool/tool_meme.ts @@ -76,7 +76,7 @@ export function registerMeme() { const image_text = min_images === max_images ? `用户数量为 ${min_images} 名` : `用户数量范围为 ${min_images} - ${max_images} 名`; const text_text = min_texts === max_texts ? `文字数量为 ${min_texts} 段` : `文字数量范围为 ${min_texts} - ${max_texts} 段`; - return `该表情包需要:${image_text},${text_text}`; + return { content: `该表情包需要:${image_text},${text_text}`, images: [] }; } const toolGenerator = new Tool({ @@ -124,7 +124,7 @@ export function registerMeme() { text.length = 0; s += `该表情包不需要文字信息,已舍弃。`; } else { - return `文字数量错误,${text_text},${image_text}`; + return { content: `文字数量错误,${text_text},${image_text}`, images: [] }; } } if (members.length > max_images || members.length < min_images) { @@ -132,7 +132,7 @@ export function registerMeme() { members.length = 0; s += `该表情包不需要用户信息,已舍弃。`; } else { - return `用户数量错误,${image_text},${text_text}`; + return { content: `用户数量错误,${image_text},${text_text}`, images: [] }; } } @@ -140,7 +140,7 @@ export function registerMeme() { for (const name of members) { const uid = await ai.context.findUserId(ctx, name); if (uid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } image.push(`https://q.qlogo.cn/headimg_dl?dst_uin=${uid.replace(/\D/g, "")}&spec=640&img_type=jpg`); } @@ -161,33 +161,31 @@ export function registerMeme() { const base64 = json.message; if (!base64) { logger.error(`生成的base64为空`); - return "生成的base64为空"; + return { content: "生成的base64为空", images: [] }; } const file = seal.base64ToImage(base64); - let id = ''; - if (save) { - const newImage = new Image(file); - newImage.id = ImageManager.generateImageId(ai, name); - newImage.isUrl = false; - newImage.scenes = [...text, ...members]; - newImage.base64 = base64; - newImage.content = `表情包${name} + const newImage = new Image(file); + newImage.id = ImageManager.generateImageId(ai, name); + newImage.isUrl = false; + newImage.scenes = [...text, ...members]; + newImage.base64 = base64; + newImage.content = `表情包${name} 文字${text.join(',') || '无'} 用户${members.join(',') || '无'}`; + if (save) { ai.imageManager.updateSavedImages([newImage]); - id = newImage.id; } seal.replyToSender(ctx, msg, `[CQ:image,file=${file}]`) - return `${s}发送成功${save ? `,已保存为<|img:${id}|>` : ''}`; + return { content: `${s}发送成功,${save ? `已保存为<|img:${newImage.id}|>` : `可使用<|img:${newImage.id}|>再次调用`}`, images: [newImage] }; } else { throw new Error(json.message); } } catch (err) { - return "生成表情包失败:" + err.message; + return { content: "生成表情包失败:" + err.message, images: [] }; } } } diff --git a/src/tool/tool_memory.ts b/src/tool/tool_memory.ts index 0448f99..06607f4 100644 --- a/src/tool/tool_memory.ts +++ b/src/tool/tool_memory.ts @@ -43,7 +43,7 @@ export function registerMemory() { if (memory_type === "private") { const uid = await ai.context.findUserId(ctx, name, true); if (uid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } msg = createMsg(msg.messageType, uid, ctx.group.groupId); @@ -53,7 +53,7 @@ export function registerMemory() { } else if (memory_type === "group") { const gid = await ai.context.findGroupId(ctx, name); if (gid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } msg = createMsg('group', ctx.player.userId, gid); @@ -61,14 +61,14 @@ export function registerMemory() { ai = AIManager.getAI(gid); } else { - return `未知的记忆类型<${memory_type}>`; + return { content: `未知的记忆类型<${memory_type}>`, images: [] }; } //记忆相关处理 await ai.memory.addMemory(ctx, ai, Array.isArray(keywords) ? keywords : [], content); AIManager.saveAI(ai.id); - return `添加记忆成功`; + return { content: `添加记忆成功`, images: [] }; } const toolDel = new Tool({ @@ -113,7 +113,7 @@ export function registerMemory() { if (memory_type === "private") { const uid = await ai.context.findUserId(ctx, name, true); if (uid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } msg = createMsg(msg.messageType, uid, ctx.group.groupId); @@ -123,7 +123,7 @@ export function registerMemory() { } else if (memory_type === "group") { const gid = await ai.context.findGroupId(ctx, name); if (gid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } msg = createMsg('group', ctx.player.userId, gid); @@ -131,14 +131,14 @@ export function registerMemory() { ai = AIManager.getAI(gid); } else { - return `未知的记忆类型<${memory_type}>`; + return { content: `未知的记忆类型<${memory_type}>`, images: [] }; } //记忆相关处理 ai.memory.delMemory(index_list, keywords); AIManager.saveAI(ai.id); - return `删除记忆成功`; + return { content: `删除记忆成功`, images: [] }; } const toolShow = new Tool({ @@ -169,33 +169,33 @@ export function registerMemory() { if (memory_type === "private") { const uid = await ai.context.findUserId(ctx, name, true); if (uid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } if (uid === ctx.player.userId) { - return `查看该用户记忆无需调用函数`; + return { content: `查看该用户记忆无需调用函数`, images: [] }; } msg = createMsg('private', uid, ''); ctx = createCtx(ctx.endPoint.userId, msg); ai = AIManager.getAI(uid); - return ai.memory.buildMemory(true, ctx.player.name, ctx.player.userId, '', ''); + return { content: ai.memory.buildMemory(true, ctx.player.name, ctx.player.userId, '', ''), images: [] }; } else if (memory_type === "group") { const gid = await ai.context.findGroupId(ctx, name); if (gid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } if (gid === ctx.group.groupId) { - return `查看当前群聊记忆无需调用函数`; + return { content: `查看当前群聊记忆无需调用函数`, images: [] }; } msg = createMsg('group', ctx.player.userId, gid); ctx = createCtx(ctx.endPoint.userId, msg); ai = AIManager.getAI(gid); - return ai.memory.buildMemory(false, '', '', ctx.group.groupName, ctx.group.groupId); + return { content: ai.memory.buildMemory(false, '', '', ctx.group.groupName, ctx.group.groupId), images: [] }; } else { - return `未知的记忆类型<${memory_type}>`; + return { content: `未知的记忆类型<${memory_type}>`, images: [] }; } } } \ No newline at end of file diff --git a/src/tool/tool_message.ts b/src/tool/tool_message.ts index 994aa6a..ecb58cf 100644 --- a/src/tool/tool_message.ts +++ b/src/tool/tool_message.ts @@ -66,13 +66,13 @@ export function registerMessage() { if (msg_type === "private") { const uid = await ai.context.findUserId(ctx, name, true); if (uid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } if (uid === ctx.player.userId && ctx.isPrivate) { - return `向当前私聊发送消息无需调用函数`; + return { content: `向当前私聊发送消息无需调用函数`, images: [] }; } if (uid === ctx.endPoint.userId) { - return `禁止向自己发送消息`; + return { content: `禁止向自己发送消息`, images: [] }; } msg = createMsg('private', uid, ''); @@ -82,10 +82,10 @@ export function registerMessage() { } else if (msg_type === "group") { const gid = await ai.context.findGroupId(ctx, name); if (gid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } if (gid === ctx.group.groupId) { - return `向当前群聊发送消息无需调用函数`; + return { content: `向当前群聊发送消息无需调用函数`, images: [] }; } msg = createMsg('group', ctx.player.userId, gid); @@ -93,7 +93,7 @@ export function registerMessage() { ai = AIManager.getAI(gid); } else { - return `未知的消息类型<${msg_type}>`; + return { content: `未知的消息类型<${msg_type}>`, images: [] }; } ai.resetState(); @@ -116,15 +116,15 @@ export function registerMessage() { await ToolManager.handlePromptToolCall(ctx, msg, ai, tool_call); } catch (e) { logger.error(`在handlePromptToolCall中出错:`, e.message); - return `函数调用失败:${e.message}`; + return { content: `函数调用失败:${e.message}`, images: [] }; } } AIManager.saveAI(ai.id); - return "消息发送成功"; + return { content: "消息发送成功", images: [] }; } catch (e) { logger.error(e); - return `消息发送失败:${e.message}`; + return { content: `消息发送失败:${e.message}`, images: [] }; } } @@ -152,7 +152,7 @@ export function registerMessage() { const net = globalThis.net || globalThis.http; if (!net) { logger.error(`未找到ob11网络连接依赖`); - return `未找到ob11网络连接依赖,请提示用户安装`; + return { content: `未找到ob11网络连接依赖,请提示用户安装`, images: [] }; } try { @@ -171,9 +171,6 @@ export function registerMessage() { } } - // 将images添加到最后一条消息,以便使用 - ai.context.messages[ai.context.messages.length - 1].images.push(...images); - //处理文本 const message = messageArray.map(item => { switch (item.type) { @@ -216,10 +213,10 @@ export function registerMessage() { const name = mctx.player.name || '未知用户'; const prefix = isPrefix ? `<|from:${name}${showNumber ? `(${uid.replace(/^.+:/, '')})` : ``}|>` : ''; - return prefix + message; + return { content: prefix + message, images: images }; } catch (e) { logger.error(e); - return `获取消息信息失败`; + return { content: `获取消息信息失败`, images: [] }; } } @@ -246,7 +243,7 @@ export function registerMessage() { const net = globalThis.net || globalThis.http; if (!net) { logger.error(`未找到ob11网络连接依赖`); - return `未找到ob11网络连接依赖,请提示用户安装`; + return { content: `未找到ob11网络连接依赖,请提示用户安装`, images: [] }; } try { @@ -254,7 +251,7 @@ export function registerMessage() { const result = await net.callApi(epId, `get_msg?message_id=${transformMsgIdBack(msg_id)}`); if (result.sender.user_id != epId.replace(/^.+:/, '')) { if (result.sender.role == 'owner' || result.sender.role == 'admin') { - return `你没有权限撤回该消息`; + return { content: `你没有权限撤回该消息`, images: [] }; } try { @@ -263,25 +260,25 @@ export function registerMessage() { const user_id = epId.replace(/^.+:/, ''); const result = await net.callApi(epId, `get_group_member_info?group_id=${group_id}&user_id=${user_id}&no_cache=true`); if (result.role !== 'owner' && result.role !== 'admin') { - return `你没有管理员权限`; + return { content: `你没有管理员权限`, images: [] }; } } catch (e) { logger.error(e); - return `获取权限信息失败`; + return { content: `获取权限信息失败`, images: [] }; } } } catch (e) { logger.error(e); - return `获取消息信息失败`; + return { content: `获取消息信息失败`, images: [] }; } try { const epId = ctx.endPoint.userId; await net.callApi(epId, `delete_msg?message_id=${transformMsgIdBack(msg_id)}`); - return `已撤回消息${msg_id}`; + return { content: `已撤回消息${msg_id}`, images: [] }; } catch (e) { logger.error(e); - return `撤回消息失败`; + return { content: `撤回消息失败`, images: [] }; } } } \ No newline at end of file diff --git a/src/tool/tool_modu.ts b/src/tool/tool_modu.ts index c3334f5..0ed9e39 100644 --- a/src/tool/tool_modu.ts +++ b/src/tool/tool_modu.ts @@ -21,10 +21,10 @@ export function registerModu() { toolRoll.solve = async (ctx, msg, ai, _) => { const [s, success] = await ToolManager.extensionSolve(ctx, msg, ai, toolRoll.cmdInfo, [], [], []); if (!success) { - return '今日人品查询失败'; + return { content: '今日人品查询失败', images: [] }; } - return s; + return { content: s, images: [] }; } const toolSearch = new Tool({ @@ -54,9 +54,9 @@ export function registerModu() { const [s, success] = await ToolManager.extensionSolve(ctx, msg, ai, toolSearch.cmdInfo, [name], [], []); if (!success) { - return '今日人品查询失败'; + return { content: '今日人品查询失败', images: [] }; } - return s; + return { content: s, images: [] }; } } \ No newline at end of file diff --git a/src/tool/tool_music.ts b/src/tool/tool_music.ts index fb38c73..b69d5b9 100644 --- a/src/tool/tool_music.ts +++ b/src/tool/tool_music.ts @@ -38,7 +38,7 @@ export function registerMusicPlay() { break; } default: { - return `不支持的平台: ${platform}`; + return { content: `不支持的平台: ${platform}`, images: [] }; } } @@ -61,7 +61,7 @@ export function registerMusicPlay() { case '网易云': { const song = data.result.songs[0]; if (!song) { - return "网易云没找到这首歌"; + return { content: "网易云没找到这首歌", images: [] }; } const id = song.id; @@ -82,24 +82,24 @@ export function registerMusicPlay() { const url = downloadData.data.url; seal.replyToSender(ctx, msg, `[CQ:music,type=163,url=${url},audio=${url},title=${name},content=${artist},image=${img}]`); - return `发送成功,歌名:${name},歌手:${artist}`; + return { content: `发送成功,歌名:${name},歌手:${artist}`, images: [] }; } case 'qq': { const song = data.data.list[0]; if (!song) { - return "QQ音乐没找到这首歌..."; + return { content: "QQ音乐没找到这首歌...", images: [] }; } seal.replyToSender(ctx, msg, `[CQ:music,type=qq,id=${song.songid}]`); - return '发送成功'; + return { content: '发送成功', images: [] }; } default: { - return "不支持的平台"; + return { content: "不支持的平台", images: [] }; } } } catch (error) { logger.warning(`音乐搜索请求错误: ${error}`); - return `音乐搜索请求错误: ${error}`; + return { content: `音乐搜索请求错误: ${error}`, images: [] }; } }; } \ No newline at end of file diff --git a/src/tool/tool_person_info.ts b/src/tool/tool_person_info.ts index f6e9f23..9f7780a 100644 --- a/src/tool/tool_person_info.ts +++ b/src/tool/tool_person_info.ts @@ -30,12 +30,12 @@ export function registerGetPersonInfo() { const net = globalThis.net || globalThis.http; if (!net) { logger.error(`未找到ob11网络连接依赖`); - return `未找到ob11网络连接依赖,请提示用户安装`; + return { content: `未找到ob11网络连接依赖,请提示用户安装`, images: [] }; } const uid = await ai.context.findUserId(ctx, name, true); if (uid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } msg = createMsg(msg.messageType, uid, ctx.group.groupId); @@ -68,10 +68,10 @@ QQ等级: ${data.qqLevel} if (data.labels && data.labels.length > 0) s += `\n标签: ${data.labels.join(',')}`; if (data.long_nick) s += `\n个性签名: ${data.long_nick}`; - return s; + return { content: s, images: [] }; } catch (e) { logger.error(e); - return `获取用户信息失败`; + return { content: `获取用户信息失败`, images: [] }; } } } \ No newline at end of file diff --git a/src/tool/tool_qq_list.ts b/src/tool/tool_qq_list.ts index 8177761..df649de 100644 --- a/src/tool/tool_qq_list.ts +++ b/src/tool/tool_qq_list.ts @@ -24,19 +24,25 @@ export function registerQQList() { toolList.solve = async (ctx, _, __, args) => { const { msg_type } = args; + const net = globalThis.net || globalThis.http; + if (!net) { + logger.error(`未找到ob11网络连接依赖`); + return { content: `未找到ob11网络连接依赖,请提示用户安装`, images: [] }; + } + if (msg_type === "private") { try { const epId = ctx.endPoint.userId; const data = await net.callApi(epId, `get_friend_list`); const s = `好友数量: ${data.length}\n` + data.slice(0, 50).map((item: any, index: number) => { - return `${index + 1}. ${item.nickname}(${item.user_id}) ${item.remark && item.remark !== item.nickname ? `备注: ${item.remark}` : ''}`; + return { content: `${index + 1}. ${item.nickname}(${item.user_id}) ${item.remark && item.remark !== item.nickname ? `备注: ${item.remark}` : ''}`, images: [] }; }).join('\n'); - return s; + return { content: s, images: [] }; } catch (e) { logger.error(e); - return `获取好友列表失败`; + return { content: `获取好友列表失败`, images: [] }; } } else if (msg_type === "group") { try { @@ -44,16 +50,16 @@ export function registerQQList() { const data = await net.callApi(epId, `get_group_list`); const s = `群聊数量: ${data.length}\n` + data.slice(0, 50).map((item: any, index: number) => { - return `${index + 1}. ${item.group_name}(${item.group_id}) 人数: ${item.member_count}/${item.max_member_count}`; + return { content: `${index + 1}. ${item.group_name}(${item.group_id}) 人数: ${item.member_count}/${item.max_member_count}`, images: [] }; }).join('\n'); - return s; + return { content: s, images: [] }; } catch (e) { logger.error(e); - return `获取好友列表失败`; + return { content: `获取好友列表失败`, images: [] }; } } else { - return `未知的消息类型<${msg_type}>`; + return { content: `未知的消息类型<${msg_type}>`, images: [] }; } } @@ -78,6 +84,12 @@ export function registerQQList() { toolMember.solve = async (ctx, _, __, args) => { const { role = '' } = args; + const net = globalThis.net || globalThis.http; + if (!net) { + logger.error(`未找到ob11网络连接依赖`); + return { content: `未找到ob11网络连接依赖,请提示用户安装`, images: [] }; + } + try { const epId = ctx.endPoint.userId; const gid = ctx.group.groupId; @@ -86,36 +98,36 @@ export function registerQQList() { if (role === 'owner') { const owner = data.find((item: any) => item.role === role); if (!owner) { - return `未找到群主`; + return { content: `未找到群主`, images: [] }; } - return `群主: ${owner.nickname}(${owner.user_id}) ${owner.card && owner.card !== owner.nickname ? `群名片: ${owner.card}` : ''}`; + return { content: `群主: ${owner.nickname}(${owner.user_id}) ${owner.card && owner.card !== owner.nickname ? `群名片: ${owner.card}` : ''}`, images: [] }; } else if (role === 'admin') { const admins = data.filter((item: any) => item.role === role); if (admins.length === 0) { - return `未找到管理员`; + return { content: `未找到管理员`, images: [] }; } const s = `管理员数量: ${admins.length}\n` + admins.slice(0, 50).map((item: any, index: number) => { - return `${index + 1}. ${item.nickname}(${item.user_id}) ${item.card && item.card !== item.nickname ? `群名片: ${item.card}` : ''}`; + return { content: `${index + 1}. ${item.nickname}(${item.user_id}) ${item.card && item.card !== item.nickname ? `群名片: ${item.card}` : ''}`, images: [] }; }).join('\n'); - return s; + return { content: s, images: [] }; } else if (role === 'robot') { const robots = data.filter((item: any) => item.is_robot); if (robots.length === 0) { - return `未找到机器人`; + return { content: `未找到机器人`, images: [] }; } const s = `机器人数量: ${robots.length}\n` + robots.slice(0, 50).map((item: any, index: number) => { - return `${index + 1}. ${item.nickname}(${item.user_id}) ${item.card && item.card !== item.nickname ? `群名片: ${item.card}` : ''}`; + return { content: `${index + 1}. ${item.nickname}(${item.user_id}) ${item.card && item.card !== item.nickname ? `群名片: ${item.card}` : ''}`, images: [] }; }).join('\n'); - return s; + return { content: s, images: [] }; } const s = `群成员数量: ${data.length}\n` + data.slice(0, 50).map((item: any, index: number) => { - return `${index + 1}. ${item.nickname}(${item.user_id}) ${item.card && item.card !== item.nickname ? `群名片: ${item.card}` : ''} ${item.title ? `头衔: ${item.title}` : ''} ${item.role === 'owner' ? '【群主】' : item.role === 'admin' ? '【管理员】' : item.is_robot ? '【机器人】' : ''}`; + return { content: `${index + 1}. ${item.nickname}(${item.user_id}) ${item.card && item.card !== item.nickname ? `群名片: ${item.card}` : ''} ${item.title ? `头衔: ${item.title}` : ''} ${item.role === 'owner' ? '【群主】' : item.role === 'admin' ? '【管理员】' : item.is_robot ? '【机器人】' : ''}`, images: [] }; }).join('\n'); - return s; + return { content: s, images: [] }; } catch (e) { logger.error(e); - return `获取群成员列表失败`; + return { content: `获取群成员列表失败`, images: [] }; } } @@ -144,6 +156,12 @@ export function registerQQList() { toolChat.solve = async (ctx, _, __, args) => { const { msg_type, q } = args; + const net = globalThis.net || globalThis.http; + if (!net) { + logger.error(`未找到ob11网络连接依赖`); + return { content: `未找到ob11网络连接依赖,请提示用户安装`, images: [] }; + } + if (msg_type === "private") { try { const epId = ctx.endPoint.userId; @@ -154,13 +172,13 @@ export function registerQQList() { }); const s = `搜索结果好友数量: ${arr.length}\n` + arr.slice(0, 50).map((item: any, index: number) => { - return `${index + 1}. ${item.nickname}(${item.user_id}) ${item.remark && item.remark !== item.nickname ? `备注: ${item.remark}` : ''}`; + return { content: `${index + 1}. ${item.nickname}(${item.user_id}) ${item.remark && item.remark !== item.nickname ? `备注: ${item.remark}` : ''}`, images: [] }; }).join('\n'); - return s; + return { content: s, images: [] }; } catch (e) { logger.error(e); - return `获取好友列表失败`; + return { content: `获取好友列表失败`, images: [] }; } } else if (msg_type === "group") { try { @@ -172,13 +190,13 @@ export function registerQQList() { }); const s = `搜索结果群聊数量: ${arr.length}\n` + arr.slice(0, 50).map((item: any, index: number) => { - return `${index + 1}. ${item.group_name}(${item.group_id}) 人数: ${item.member_count}/${item.max_member_count}`; + return { content: `${index + 1}. ${item.group_name}(${item.group_id}) 人数: ${item.member_count}/${item.max_member_count}`, images: [] }; }).join('\n'); - return s; + return { content: s, images: [] }; } catch (e) { logger.error(e); - return `获取好友列表失败`; + return { content: `获取好友列表失败`, images: [] }; } } else { const epId = ctx.endPoint.userId; @@ -194,12 +212,12 @@ export function registerQQList() { }); const s = `搜索结果好友数量: ${arr1.length}\n` + arr1.slice(0, 50).map((item: any, index: number) => { - return `${index + 1}. ${item.nickname}(${item.user_id}) ${item.remark && item.remark !== item.nickname ? `备注: ${item.remark}` : ''}`; + return { content: `${index + 1}. ${item.nickname}(${item.user_id}) ${item.remark && item.remark !== item.nickname ? `备注: ${item.remark}` : ''}`, images: [] }; }).join('\n') + `\n搜索结果群聊数量: ${arr2.length}\n` + arr2.slice(0, 50).map((item: any, index: number) => { - return `${index + 1}. ${item.group_name}(${item.group_id}) 人数: ${item.member_count}/${item.max_member_count}`; + return { content: `${index + 1}. ${item.group_name}(${item.group_id}) 人数: ${item.member_count}/${item.max_member_count}`, images: [] }; }).join('\n'); - return s; + return { content: s, images: [] }; } } @@ -225,10 +243,16 @@ export function registerQQList() { const uid = await ai.context.findUserId(ctx, name, true); if (uid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } if (uid === ctx.endPoint.userId) { - return `禁止搜索自己`; + return { content: `禁止搜索自己`, images: [] }; + } + + const net = globalThis.net || globalThis.http; + if (!net) { + logger.error(`未找到ob11网络连接依赖`); + return { content: `未找到ob11网络连接依赖,请提示用户安装`, images: [] }; } try { @@ -245,13 +269,13 @@ export function registerQQList() { } const s = `共群数量: ${arr.length}\n` + arr.slice(0, 50).map((item: any, index: number) => { - return `${index + 1}. ${item.group_info.group_name}(${item.group_info.group_id}) 人数: ${item.group_info.member_count}/${item.group_info.max_member_count} ${item.user_info.card && item.user_info.card !== item.user_info.nickname ? `群名片: ${item.user_info.card}` : ''}`; + return { content: `${index + 1}. ${item.group_info.group_name}(${item.group_info.group_id}) 人数: ${item.group_info.member_count}/${item.group_info.max_member_count} ${item.user_info.card && item.user_info.card !== item.user_info.nickname ? `群名片: ${item.user_info.card}` : ''}`, images: [] }; }).join('\n'); - return s; + return { content: s, images: [] }; } catch (e) { logger.error(e); - return `获取共群列表失败`; + return { content: `获取共群列表失败`, images: [] }; } } } \ No newline at end of file diff --git a/src/tool/tool_rename.ts b/src/tool/tool_rename.ts index 51b8101..4854f0b 100644 --- a/src/tool/tool_rename.ts +++ b/src/tool/tool_rename.ts @@ -37,17 +37,17 @@ export function registerRename() { const user_id = epId.replace(/^.+:/, ''); const result = await net.callApi(epId, `get_group_member_info?group_id=${group_id}&user_id=${user_id}&no_cache=true`); if (result.role !== 'owner' && result.role !== 'admin') { - return `你没有管理员权限`; + return { content: `你没有管理员权限`, images: [] }; } } catch (e) { logger.error(e); - return `获取权限信息失败`; + return { content: `获取权限信息失败`, images: [] }; } } const uid = await ai.context.findUserId(ctx, name); if (uid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } msg = createMsg(msg.messageType, uid, ctx.group.groupId); @@ -56,10 +56,10 @@ export function registerRename() { try { seal.setPlayerGroupCard(ctx, new_name); seal.replyToSender(ctx, msg, `已将<${ctx.player.name}>的群名片设置为<${new_name}>`); - return '设置成功'; + return { content: '设置成功', images: [] }; } catch (e) { logger.error(e); - return '设置失败'; + return { content: '设置失败', images: [] }; } } } \ No newline at end of file diff --git a/src/tool/tool_roll_check.ts b/src/tool/tool_roll_check.ts index 9b33739..96d9580 100644 --- a/src/tool/tool_roll_check.ts +++ b/src/tool/tool_roll_check.ts @@ -51,7 +51,7 @@ export function registerRollCheck() { const uid = await ai.context.findUserId(ctx, name); if (uid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } msg = createMsg(msg.messageType, uid, ctx.group.groupId); @@ -83,10 +83,10 @@ export function registerRollCheck() { ToolManager.cmdArgs.specialExecuteTimes = 1; if (!success) { - return '检定执行失败'; + return { content: '检定执行失败', images: [] }; } - return s; + return { content: s, images: [] }; } // 该函数疑似无法正常工作。无法找到原因。 @@ -128,7 +128,7 @@ export function registerRollCheck() { const uid = await ai.context.findUserId(ctx, name); if (uid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } msg = createMsg(msg.messageType, uid, ctx.group.groupId); @@ -147,9 +147,9 @@ export function registerRollCheck() { const [s, success] = await ToolManager.extensionSolve(ctx, msg, ai, tool.cmdInfo, args2, [], []); if (!success) { - return 'san check执行失败'; + return { content: 'san check执行失败', images: [] }; } - return s; + return { content: s, images: [] }; } } \ No newline at end of file diff --git a/src/tool/tool_time.ts b/src/tool/tool_time.ts index 759df96..d5176b2 100644 --- a/src/tool/tool_time.ts +++ b/src/tool/tool_time.ts @@ -17,7 +17,7 @@ export function registerTime() { } }); toolGet.solve = async (_, __, ___, ____) => { - return fmtDate(Math.floor(Date.now() / 1000)); + return { content: fmtDate(Math.floor(Date.now() / 1000)), images: [] }; } const toolSet = new Tool({ @@ -75,25 +75,25 @@ export function registerTime() { const h = parseInt(hours); const min = parseInt(minutes); const c = parseInt(count); - if (isNaN(y)) return '年数应为数字'; - if (isNaN(m)) return '月数应为数字'; - if (isNaN(d)) return '天数应为数字'; - if (isNaN(h)) return '小时数应为数字'; - if (isNaN(min)) return '分钟数应为数字'; - if (isNaN(c)) return '触发次数应为数字'; + if (isNaN(y)) return { content: '年数应为数字', images: [] }; + if (isNaN(m)) return { content: '月数应为数字', images: [] }; + if (isNaN(d)) return { content: '天数应为数字', images: [] }; + if (isNaN(h)) return { content: '小时数应为数字', images: [] }; + if (isNaN(min)) return { content: '分钟数应为数字', images: [] }; + if (isNaN(c)) return { content: '触发次数应为数字', images: [] }; switch (types) { case 'target': { const t = new Date(y, m - 1, d, h, min).getTime(); const now = Date.now(); if (isNaN(t)) { - return '时间设置错误'; + return { content: '时间设置错误', images: [] }; } if (t < now) { - return '目标时间不能早于当前时间'; + return { content: '目标时间不能早于当前时间', images: [] }; } if (t - now > 365 * 24 * 60 * 60 * 1000) { - return '目标时间不能超过1年'; + return { content: '目标时间不能超过1年', images: [] }; } TimerManager.addTargetTimer(ctx, msg, ai, Math.floor(t / 1000), content); break; @@ -101,28 +101,28 @@ export function registerTime() { case 'interval': { const mins = y * 365 * 24 * 60 + m * 30 * 24 * 60 + d * 24 * 60 + h * 60 + min; if (mins <= 0) { - return '间隔时间必须大于0'; + return { content: '间隔时间必须大于0', images: [] }; } if (mins > 365 * 24 * 60) { - return '间隔时间不能大于1年'; + return { content: '间隔时间不能大于1年', images: [] }; } if (c < -1 || c === 0) { - return '触发次数不能小于-1或等于0'; + return { content: '触发次数不能小于-1或等于0', images: [] }; } if (c === -1 && mins < 12 * 60) { - return '无限次触发间隔时间不能小于12小时'; + return { content: '无限次触发间隔时间不能小于12小时', images: [] }; } if (c > 30) { - return '触发次数不能大于30次'; + return { content: '触发次数不能大于30次', images: [] }; } TimerManager.addIntervalTimer(ctx, msg, ai, mins * 60, c, content); break; } default: { - return '定时器类型错误'; + return { content: '定时器类型错误', images: [] }; } } - return `设置定时器成功,请等待`; + return { content: `设置定时器成功,请等待`, images: [] }; } const toolShow = new Tool({ @@ -142,7 +142,7 @@ export function registerTime() { const timers = TimerManager.getTimers(ai.id, '', ['target', 'interval']); if (timers.length === 0) { - return '当前对话没有定时器'; + return { content: '当前对话没有定时器', images: [] }; } const s = timers.map((t, i) => { @@ -163,7 +163,7 @@ export function registerTime() { } }).join('\n'); - return s; + return { content: s, images: [] }; } const toolCancel = new Tool({ @@ -191,15 +191,15 @@ export function registerTime() { const timers = TimerManager.getTimers(ai.id, '', ['target', 'interval']); if (timers.length === 0) { - return '当前对话没有定时器'; + return { content: '当前对话没有定时器', images: [] }; } if (index_list.length === 0) { - return '请输入要取消的定时器序号'; + return { content: '请输入要取消的定时器序号', images: [] }; } TimerManager.removeTimers(ai.id, '', ['target', 'interval'], index_list); - return '定时器取消成功'; + return { content: '定时器取消成功', images: [] }; } } \ No newline at end of file diff --git a/src/tool/tool_trigger.ts b/src/tool/tool_trigger.ts index c4a0f45..a51368a 100644 --- a/src/tool/tool_trigger.ts +++ b/src/tool/tool_trigger.ts @@ -43,17 +43,17 @@ export function registerSetTrigger() { new RegExp(keyword); condition.keyword = keyword; } catch (e) { - return `触发关键词格式错误`; + return { content: `触发关键词格式错误`, images: [] }; } } if (name) { const uid = await ai.context.findUserId(ctx, name, true); if (uid === null) { - return `未找到<${name}>`; + return { content: `未找到<${name}>`, images: [] }; } if (uid === ctx.endPoint.userId) { - return `禁止将自己设置为触发条件`; + return { content: `禁止将自己设置为触发条件`, images: [] }; } condition.uid = uid; @@ -64,6 +64,6 @@ export function registerSetTrigger() { } triggerConditionMap[ai.id].push(condition); - return "触发条件设置成功"; + return { content: "触发条件设置成功", images: [] }; } } \ No newline at end of file diff --git a/src/tool/tool_voice.ts b/src/tool/tool_voice.ts index 70f25b7..3818bbe 100644 --- a/src/tool/tool_voice.ts +++ b/src/tool/tool_voice.ts @@ -69,10 +69,10 @@ export function registerRecord() { if (records.hasOwnProperty(name)) { seal.replyToSender(ctx, msg, `[语音:${records[name]}]`); - return '发送成功'; + return { content: '发送成功', images: [] }; } else { logger.error(`本地语音${name}不存在`); - return `本地语音${name}不存在`; + return { content: `本地语音${name}不存在`, images: [] }; } } } @@ -104,7 +104,7 @@ export function registerRecord() { const aittsExt = seal.ext.find('AITTS'); if (!aittsExt) { logger.error(`未找到AITTS依赖`); - return `未找到AITTS依赖,请提示用户安装AITTS依赖`; + return { content: `未找到AITTS依赖,请提示用户安装AITTS依赖`, images: [] }; } await globalThis.ttsHandler.generateSpeech(text, ctx, msg); @@ -112,7 +112,7 @@ export function registerRecord() { const net = globalThis.net || globalThis.http; if (!net) { logger.error(`未找到ob11网络连接依赖`); - return `未找到ob11网络连接依赖,请提示用户安装`; + return { content: `未找到ob11网络连接依赖,请提示用户安装`, images: [] }; } const characterId = characterMap[character]; @@ -121,10 +121,10 @@ export function registerRecord() { await net.callApi(epId, `send_group_ai_record?character=${characterId}&group_id=${group_id}&text=${text}`); } - return `发送语音成功`; + return { content: `发送语音成功`, images: [] }; } catch (e) { logger.error(e); - return `发送语音失败`; + return { content: `发送语音失败`, images: [] }; } } } \ No newline at end of file diff --git a/src/tool/tool_web.ts b/src/tool/tool_web.ts index 20916f6..30c0ba1 100644 --- a/src/tool/tool_web.ts +++ b/src/tool/tool_web.ts @@ -66,7 +66,7 @@ export function registerWeb() { const results_length = data.results.length; const results = part == 1 ? data.results.slice(0, Math.ceil(results_length / 2)) : data.results.slice(Math.ceil(results_length / 2)); if (number_of_results == 0 || results.length == 0) { - return `没有搜索到结果`; + return { content: `没有搜索到结果`, images: [] }; } const s = `搜索结果长度:${number_of_results}\n` + results.map((result: any, index: number) => { @@ -76,10 +76,10 @@ export function registerWeb() { - 相关性:${result.score}`; }).join('\n'); - return s; + return { content: s, images: [] }; } catch (error) { logger.error("在web_search中请求出错:", error); - return `使用搜索引擎搜索失败:${error}`; + return { content: `使用搜索引擎搜索失败:${error}`, images: [] }; } } @@ -124,7 +124,7 @@ export function registerWeb() { const { title, content, links } = data; if (!title && !content && (!links || links.length === 0)) { - return `未能从网页中提取到有效内容`; + return { content: `未能从网页中提取到有效内容`, images: [] }; } const result = `标题: ${title || "无标题"}\n内容: ${content || "无内容"}\n网页包含链接:\n` + @@ -132,10 +132,10 @@ export function registerWeb() { ? links.map((link: string, index: number) => `${index + 1}. ${link}`).join('\n') : "无链接"); - return result; + return { content: result, images: [] }; } catch (error) { logger.error("在web_read中请求出错:", error); - return `读取网页内容失败: ${error}`; + return { content: `读取网页内容失败: ${error}`, images: [] }; } } } \ No newline at end of file diff --git a/src/update.ts b/src/update.ts index 08bd55e..d14e5c2 100644 --- a/src/update.ts +++ b/src/update.ts @@ -9,7 +9,8 @@ export const updateInfo = { - 适配了戳一戳事件 - 重构权限检查 - 重构timer,增加间隔定时器 -- 为记忆新增images字段,用于存储图片id`, +- 为记忆新增images字段,用于存储图片id +- 新增查看精华消息,删除精华消息工具函数`, "4.10.1": `- 可能修复了非指令无法响应的问题 - 修复了构建ctx时,isPrivate始终为0的问题 - 新增保存图片功能 From 062339c10f03dccc3328a1c9e9f26a393ccc5ee1 Mon Sep 17 00:00:00 2001 From: error2913 <2913949387@qq.com> Date: Sat, 18 Oct 2025 00:33:55 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=B2=BE=E5=8D=8E?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=9B=BE=E7=89=87=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tool/tool_essence_msg.ts | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/tool/tool_essence_msg.ts b/src/tool/tool_essence_msg.ts index e900ee1..9020046 100644 --- a/src/tool/tool_essence_msg.ts +++ b/src/tool/tool_essence_msg.ts @@ -1,7 +1,7 @@ import { logger } from "../logger"; import { transformMsgIdBack, transformMsgId } from "../utils/utils"; import { Tool } from "./tool"; -import { Image } from "../AI/image"; +import { Image, ImageManager } from "../AI/image"; export function registerEssenceMsg() { const toolSet = new Tool({ @@ -87,7 +87,7 @@ export function registerEssenceMsg() { } let response = `群精华消息列表 (${result.length}条):\n\n`; - const images: Image[] = []; + let images: Image[] = []; for (let i = 0; i < result.length; i++) { const essence = result[i]; @@ -99,23 +99,19 @@ export function registerEssenceMsg() { if (essence.content) { let content = ''; if (Array.isArray(essence.content)) { - for (const item of essence.content) { - if (item.type === 'text') { - content += item.data.text; - } else if (item.type === 'image') { - const imageUrl = item.data.url; - if (imageUrl) { - const image = new Image(imageUrl); - images.push(image); - } - } + let messageArray = essence.content; + if (messageArray.some(item => item.type === 'image')) { + const result = await ImageManager.handleImageMessage(ctx, messageArray); + messageArray = result.messageArray; + images = result.images; } + content = messageArray.map(item => item.type === 'text' ? item.data.text : '').join(''); } else if (typeof essence.content === 'string') { content = essence.content; } if (content.length > 50) { - content = content.substring(0, 50) + '...'; + content = content.substring(0, 100) + '...'; } response += `${i + 1}. 发送者: ${senderName}