From d96349dde3d0149cd26bb3d3c9c69aca9cec7257 Mon Sep 17 00:00:00 2001 From: ikechan8370 Date: Sun, 16 Feb 2025 22:21:31 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E7=A7=81=E8=81=8A=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- guoba.support.js | 12 +-- model/core.js | 73 ++++--------------- utils/config.js | 3 +- .../SendMessageToSpecificGroupOrUserTool.js | 8 +- utils/tools/SendPictureTool.js | 8 +- 5 files changed, 36 insertions(+), 68 deletions(-) diff --git a/guoba.support.js b/guoba.support.js index a219131..a5b022c 100644 --- a/guoba.support.js +++ b/guoba.support.js @@ -75,12 +75,12 @@ export function supportGuoba () { bottomHelpMessage: '独立的后台管理面板(默认3321端口),与锅巴类似。工具箱会有额外占用,启动速度稍慢,酌情开启。修改后需重启生效!!!', component: 'Switch' }, - // { - // field: 'enableMd', - // label: 'QQ开启markdown', - // bottomHelpMessage: 'qq的第三方md,非QQBot。需要适配器实现segment.markdown和segment.button方可使用,否则不建议开启,会造成各种错误。默认关闭', - // component: 'Switch' - // }, + { + field: 'enableToolPrivateSend', + label: '允许智能模式私聊', + bottomHelpMessage: '是否允许智能模式下发起临时对话骚扰其他群友。默认开启,如果怕Bot乱骚扰其他人可以关闭。主人不受影响。', + component: 'Switch' + }, { field: 'translateSource', label: '翻译来源', diff --git a/model/core.js b/model/core.js index b076c59..f898a2e 100644 --- a/model/core.js +++ b/model/core.js @@ -29,7 +29,7 @@ import { SendAvatarTool } from '../utils/tools/SendAvatarTool.js' import { SerpImageTool } from '../utils/tools/SearchImageTool.js' import { SearchMusicTool } from '../utils/tools/SearchMusicTool.js' import { SendMusicTool } from '../utils/tools/SendMusicTool.js' -import { SendAudioMessageTool } from '../utils/tools/SendAudioMessageTool.js' +// import { SendAudioMessageTool } from '../utils/tools/SendAudioMessageTool.js' import { SendMessageToSpecificGroupOrUserTool } from '../utils/tools/SendMessageToSpecificGroupOrUserTool.js' import { QueryGenshinTool } from '../utils/tools/QueryGenshinTool.js' import { WeatherTool } from '../utils/tools/WeatherTool.js' @@ -42,11 +42,11 @@ import { SerpIkechan8370Tool } from '../utils/tools/SerpIkechan8370Tool.js' import { SerpTool } from '../utils/tools/SerpTool.js' import common from '../../../lib/common/common.js' import { SendDiceTool } from '../utils/tools/SendDiceTool.js' -import { EliMovieTool } from '../utils/tools/EliMovieTool.js' -import { EliMusicTool } from '../utils/tools/EliMusicTool.js' +// import { EliMovieTool } from '../utils/tools/EliMovieTool.js' +// import { EliMusicTool } from '../utils/tools/EliMusicTool.js' import { HandleMessageMsgTool } from '../utils/tools/HandleMessageMsgTool.js' import { ProcessPictureTool } from '../utils/tools/ProcessPictureTool.js' -import { ImageCaptionTool } from '../utils/tools/ImageCaptionTool.js' +// import { ImageCaptionTool } from '../utils/tools/ImageCaptionTool.js' import { ChatGPTAPI } from '../utils/openai/chatgpt-api.js' import { newFetch } from '../utils/proxy.js' import { ChatGLM4Client } from '../client/ChatGLM4Client.js' @@ -530,57 +530,10 @@ class Core { option.image = base64Image.toString('base64') } if (opt.enableSmart) { - /** - * @type {AbstractTool[]} - */ - let tools = [ - new QueryStarRailTool(), - new WebsiteTool(), - new SendPictureTool(), - new SendVideoTool(), - new SearchVideoTool(), - new SendAvatarTool(), - new SerpImageTool(), - new SearchMusicTool(), - new SendMusicTool(), - new SendAudioMessageTool(), - new APTool(), - new SendMessageToSpecificGroupOrUserTool(), - new QueryGenshinTool() - ] - if (Config.amapKey) { - tools.push(new WeatherTool()) - } - if (e.isGroup) { - tools.push(new QueryUserinfoTool()) - if (e.group.is_admin || e.group.is_owner) { - tools.push(new EditCardTool()) - tools.push(new JinyanTool()) - tools.push(new KickOutTool()) - tools.push(new HandleMessageMsgTool()) - } - if (e.group.is_owner) { - tools.push(new SetTitleTool()) - } - } - switch (Config.serpSource) { - case 'ikechan8370': { - tools.push(new SerpIkechan8370Tool()) - break - } - case 'azure': { - if (!Config.azSerpKey) { - logger.warn('未配置bing搜索密钥,转为使用ikechan8370搜索源') - tools.push(new SerpIkechan8370Tool()) - } else { - tools.push(new SerpTool()) - } - break - } - default: { - tools.push(new SerpIkechan8370Tool()) - } - } + const { + funcMap + } = await collectTools(e) + let tools = Object.keys(funcMap).map(k => funcMap[k].tool) client.addTools(tools) } let system = opt.system.gemini @@ -822,12 +775,12 @@ async function collectTools (e) { new SetTitleTool() ] // todo 3.0再重构tool的插拔和管理 - let /** @type{AbstractTool} **/ tools = [ + let /** @type{AbstractTool[]} **/ tools = [ new SendAvatarTool(), new SendDiceTool(), new SendMessageToSpecificGroupOrUserTool(), // new EditCardTool(), - // new QueryStarRailTool(), + new QueryStarRailTool(), new QueryGenshinTool(), new SendMusicTool(), new SearchMusicTool(), @@ -874,13 +827,15 @@ async function collectTools (e) { tools.forEach(tool => { funcMap[tool.name] = { exec: tool.func, - function: tool.function() + function: tool.function(), + tool } }) fullTools.forEach(tool => { fullFuncMap[tool.name] = { exec: tool.func, - function: tool.function() + function: tool.function(), + tool } }) return { diff --git a/utils/config.js b/utils/config.js index 3dfde16..b30e544 100644 --- a/utils/config.js +++ b/utils/config.js @@ -227,7 +227,8 @@ const defaultConfig = { _2captchaKey: '', bingReasoning: false, // 是否深度思考 apiMaxToken: 4096, - version: 'v2.8.3' + enableToolPrivateSend: true, // 是否允许智能模式下私聊骚扰其他群友。主人不受影响。 + version: 'v2.8.4' } const _path = process.cwd() let config = {} diff --git a/utils/tools/SendMessageToSpecificGroupOrUserTool.js b/utils/tools/SendMessageToSpecificGroupOrUserTool.js index 220d538..8bc70e3 100644 --- a/utils/tools/SendMessageToSpecificGroupOrUserTool.js +++ b/utils/tools/SendMessageToSpecificGroupOrUserTool.js @@ -1,5 +1,7 @@ import { AbstractTool } from './AbstractTool.js' import { convertFaces } from '../face.js' +import {getMasterQQ} from '../common.js' +import {Config} from '../config.js' export class SendMessageToSpecificGroupOrUserTool extends AbstractTool { name = 'sendMessage' @@ -19,7 +21,7 @@ export class SendMessageToSpecificGroupOrUserTool extends AbstractTool { } func = async function (opt, e) { - let { msg, targetGroupIdOrQQNumber } = opt + let { msg, sender, targetGroupIdOrQQNumber } = opt const defaultTarget = e.isGroup ? e.group_id : e.sender.user_id const target = isNaN(targetGroupIdOrQQNumber) || !targetGroupIdOrQQNumber ? defaultTarget @@ -37,6 +39,10 @@ export class SendMessageToSpecificGroupOrUserTool extends AbstractTool { await group.sendMsg(await convertFaces(msg, true, e)) return 'msg has been sent to group' + target } else { + let masters = (await getMasterQQ()) + if (!Config.enableToolPrivateSend && !masters.includes(sender + '')) { + return 'you are not allowed to pm other group members' + } let user = e.bot.pickUser(target) if (e.group_id) { user = user.asMember(e.group_id) diff --git a/utils/tools/SendPictureTool.js b/utils/tools/SendPictureTool.js index 5a436ab..1c27687 100644 --- a/utils/tools/SendPictureTool.js +++ b/utils/tools/SendPictureTool.js @@ -1,4 +1,6 @@ import { AbstractTool } from './AbstractTool.js' +import {getMasterQQ} from '../common.js' +import {Config} from '../config.js' export class SendPictureTool extends AbstractTool { name = 'sendPicture' @@ -18,7 +20,7 @@ export class SendPictureTool extends AbstractTool { } func = async function (opt, e) { - let { urlOfPicture, targetGroupIdOrQQNumber } = opt + let { urlOfPicture, targetGroupIdOrQQNumber, sender } = opt if (typeof urlOfPicture === 'object') { urlOfPicture = urlOfPicture.join(' ') } @@ -55,6 +57,10 @@ export class SendPictureTool extends AbstractTool { // await group.sendMsg(pictures) return 'picture has been sent to group' + target + (errs.length > 0 ? `, but some pictures failed to send (${errs.join('、')})` : '') } else { + let masters = (await getMasterQQ()) + if (!Config.enableToolPrivateSend && !masters.includes(sender + '')) { + return 'you are not allowed to pm other group members' + } let user = e.bot.pickUser(target) if (e.group_id) { user = user.asMember(e.group_id)