fix: 增加智能模式私聊开关

This commit is contained in:
ikechan8370 2025-02-16 22:21:31 +08:00
parent 777279e410
commit d96349dde3
5 changed files with 36 additions and 68 deletions

View file

@ -75,12 +75,12 @@ export function supportGuoba () {
bottomHelpMessage: '独立的后台管理面板默认3321端口与锅巴类似。工具箱会有额外占用启动速度稍慢酌情开启。修改后需重启生效', bottomHelpMessage: '独立的后台管理面板默认3321端口与锅巴类似。工具箱会有额外占用启动速度稍慢酌情开启。修改后需重启生效',
component: 'Switch' component: 'Switch'
}, },
// { {
// field: 'enableMd', field: 'enableToolPrivateSend',
// label: 'QQ开启markdown', label: '允许智能模式私聊',
// bottomHelpMessage: 'qq的第三方md非QQBot。需要适配器实现segment.markdown和segment.button方可使用否则不建议开启会造成各种错误。默认关闭', bottomHelpMessage: '是否允许智能模式下发起临时对话骚扰其他群友。默认开启如果怕Bot乱骚扰其他人可以关闭。主人不受影响。',
// component: 'Switch' component: 'Switch'
// }, },
{ {
field: 'translateSource', field: 'translateSource',
label: '翻译来源', label: '翻译来源',

View file

@ -29,7 +29,7 @@ import { SendAvatarTool } from '../utils/tools/SendAvatarTool.js'
import { SerpImageTool } from '../utils/tools/SearchImageTool.js' import { SerpImageTool } from '../utils/tools/SearchImageTool.js'
import { SearchMusicTool } from '../utils/tools/SearchMusicTool.js' import { SearchMusicTool } from '../utils/tools/SearchMusicTool.js'
import { SendMusicTool } from '../utils/tools/SendMusicTool.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 { SendMessageToSpecificGroupOrUserTool } from '../utils/tools/SendMessageToSpecificGroupOrUserTool.js'
import { QueryGenshinTool } from '../utils/tools/QueryGenshinTool.js' import { QueryGenshinTool } from '../utils/tools/QueryGenshinTool.js'
import { WeatherTool } from '../utils/tools/WeatherTool.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 { SerpTool } from '../utils/tools/SerpTool.js'
import common from '../../../lib/common/common.js' import common from '../../../lib/common/common.js'
import { SendDiceTool } from '../utils/tools/SendDiceTool.js' import { SendDiceTool } from '../utils/tools/SendDiceTool.js'
import { EliMovieTool } from '../utils/tools/EliMovieTool.js' // import { EliMovieTool } from '../utils/tools/EliMovieTool.js'
import { EliMusicTool } from '../utils/tools/EliMusicTool.js' // import { EliMusicTool } from '../utils/tools/EliMusicTool.js'
import { HandleMessageMsgTool } from '../utils/tools/HandleMessageMsgTool.js' import { HandleMessageMsgTool } from '../utils/tools/HandleMessageMsgTool.js'
import { ProcessPictureTool } from '../utils/tools/ProcessPictureTool.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 { ChatGPTAPI } from '../utils/openai/chatgpt-api.js'
import { newFetch } from '../utils/proxy.js' import { newFetch } from '../utils/proxy.js'
import { ChatGLM4Client } from '../client/ChatGLM4Client.js' import { ChatGLM4Client } from '../client/ChatGLM4Client.js'
@ -530,57 +530,10 @@ class Core {
option.image = base64Image.toString('base64') option.image = base64Image.toString('base64')
} }
if (opt.enableSmart) { if (opt.enableSmart) {
/** const {
* @type {AbstractTool[]} funcMap
*/ } = await collectTools(e)
let tools = [ let tools = Object.keys(funcMap).map(k => funcMap[k].tool)
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())
}
}
client.addTools(tools) client.addTools(tools)
} }
let system = opt.system.gemini let system = opt.system.gemini
@ -822,12 +775,12 @@ async function collectTools (e) {
new SetTitleTool() new SetTitleTool()
] ]
// todo 3.0再重构tool的插拔和管理 // todo 3.0再重构tool的插拔和管理
let /** @type{AbstractTool} **/ tools = [ let /** @type{AbstractTool[]} **/ tools = [
new SendAvatarTool(), new SendAvatarTool(),
new SendDiceTool(), new SendDiceTool(),
new SendMessageToSpecificGroupOrUserTool(), new SendMessageToSpecificGroupOrUserTool(),
// new EditCardTool(), // new EditCardTool(),
// new QueryStarRailTool(), new QueryStarRailTool(),
new QueryGenshinTool(), new QueryGenshinTool(),
new SendMusicTool(), new SendMusicTool(),
new SearchMusicTool(), new SearchMusicTool(),
@ -874,13 +827,15 @@ async function collectTools (e) {
tools.forEach(tool => { tools.forEach(tool => {
funcMap[tool.name] = { funcMap[tool.name] = {
exec: tool.func, exec: tool.func,
function: tool.function() function: tool.function(),
tool
} }
}) })
fullTools.forEach(tool => { fullTools.forEach(tool => {
fullFuncMap[tool.name] = { fullFuncMap[tool.name] = {
exec: tool.func, exec: tool.func,
function: tool.function() function: tool.function(),
tool
} }
}) })
return { return {

View file

@ -227,7 +227,8 @@ const defaultConfig = {
_2captchaKey: '', _2captchaKey: '',
bingReasoning: false, // 是否深度思考 bingReasoning: false, // 是否深度思考
apiMaxToken: 4096, apiMaxToken: 4096,
version: 'v2.8.3' enableToolPrivateSend: true, // 是否允许智能模式下私聊骚扰其他群友。主人不受影响。
version: 'v2.8.4'
} }
const _path = process.cwd() const _path = process.cwd()
let config = {} let config = {}

View file

@ -1,5 +1,7 @@
import { AbstractTool } from './AbstractTool.js' import { AbstractTool } from './AbstractTool.js'
import { convertFaces } from '../face.js' import { convertFaces } from '../face.js'
import {getMasterQQ} from '../common.js'
import {Config} from '../config.js'
export class SendMessageToSpecificGroupOrUserTool extends AbstractTool { export class SendMessageToSpecificGroupOrUserTool extends AbstractTool {
name = 'sendMessage' name = 'sendMessage'
@ -19,7 +21,7 @@ export class SendMessageToSpecificGroupOrUserTool extends AbstractTool {
} }
func = async function (opt, e) { 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 defaultTarget = e.isGroup ? e.group_id : e.sender.user_id
const target = isNaN(targetGroupIdOrQQNumber) || !targetGroupIdOrQQNumber const target = isNaN(targetGroupIdOrQQNumber) || !targetGroupIdOrQQNumber
? defaultTarget ? defaultTarget
@ -37,6 +39,10 @@ export class SendMessageToSpecificGroupOrUserTool extends AbstractTool {
await group.sendMsg(await convertFaces(msg, true, e)) await group.sendMsg(await convertFaces(msg, true, e))
return 'msg has been sent to group' + target return 'msg has been sent to group' + target
} else { } 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) let user = e.bot.pickUser(target)
if (e.group_id) { if (e.group_id) {
user = user.asMember(e.group_id) user = user.asMember(e.group_id)

View file

@ -1,4 +1,6 @@
import { AbstractTool } from './AbstractTool.js' import { AbstractTool } from './AbstractTool.js'
import {getMasterQQ} from '../common.js'
import {Config} from '../config.js'
export class SendPictureTool extends AbstractTool { export class SendPictureTool extends AbstractTool {
name = 'sendPicture' name = 'sendPicture'
@ -18,7 +20,7 @@ export class SendPictureTool extends AbstractTool {
} }
func = async function (opt, e) { func = async function (opt, e) {
let { urlOfPicture, targetGroupIdOrQQNumber } = opt let { urlOfPicture, targetGroupIdOrQQNumber, sender } = opt
if (typeof urlOfPicture === 'object') { if (typeof urlOfPicture === 'object') {
urlOfPicture = urlOfPicture.join(' ') urlOfPicture = urlOfPicture.join(' ')
} }
@ -55,6 +57,10 @@ export class SendPictureTool extends AbstractTool {
// await group.sendMsg(pictures) // await group.sendMsg(pictures)
return 'picture has been sent to group' + target + (errs.length > 0 ? `, but some pictures failed to send (${errs.join('、')})` : '') return 'picture has been sent to group' + target + (errs.length > 0 ? `, but some pictures failed to send (${errs.join('、')})` : '')
} else { } 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) let user = e.bot.pickUser(target)
if (e.group_id) { if (e.group_id) {
user = user.asMember(e.group_id) user = user.asMember(e.group_id)