mirror of
https://github.com/ikechan8370/chatgpt-plugin.git
synced 2025-12-17 22:07:10 +00:00
Merge branch 'v2' into v2
This commit is contained in:
commit
f1ca8e2d6c
12 changed files with 404 additions and 263 deletions
96
apps/chat.js
96
apps/chat.js
|
|
@ -9,7 +9,9 @@ import SydneyAIClient from '../utils/SydneyAIClient.js'
|
|||
import { PoeClient } from '../utils/poe/index.js'
|
||||
import AzureTTS from '../utils/tts/microsoft-azure.js'
|
||||
import VoiceVoxTTS from '../utils/tts/voicevox.js'
|
||||
import { translate } from '../utils/translate.js'
|
||||
import fs from 'fs'
|
||||
import { getImg, getImageOcrText } from './entertainment.js'
|
||||
import {
|
||||
render, renderUrl,
|
||||
getMessageById,
|
||||
|
|
@ -33,9 +35,13 @@ import uploadRecord from '../utils/uploadRecord.js'
|
|||
import { SlackClaudeClient } from '../utils/slack/slackClient.js'
|
||||
import { ChatgptManagement } from './management.js'
|
||||
import { getPromptByName } from '../utils/prompts.js'
|
||||
import Translate from '../utils/baiduTranslate.js'
|
||||
import emojiStrip from 'emoji-strip'
|
||||
import XinghuoClient from "../utils/xinghuo/xinghuo.js";
|
||||
import BingDrawClient from '../utils/BingDraw.js'
|
||||
import XinghuoClient from '../utils/xinghuo/xinghuo.js'
|
||||
try {
|
||||
await import('emoji-strip')
|
||||
} catch (err) {
|
||||
logger.warn('【ChatGPT-Plugin】依赖emoji-strip未安装,会导致azure语音模式下朗读emoji的问题,建议执行pnpm install emoji-strip安装')
|
||||
}
|
||||
try {
|
||||
await import('keyv')
|
||||
} catch (err) {
|
||||
|
|
@ -800,40 +806,15 @@ export class chatgpt extends plugin {
|
|||
speaker = convertSpeaker(trySplit[0])
|
||||
prompt = trySplit[1]
|
||||
}
|
||||
if (Config.imgOcr) {
|
||||
// 取消息中的图片、at的头像、回复的图片,放入e.img
|
||||
if (e.at && !e.source) {
|
||||
e.img = [`https://q1.qlogo.cn/g?b=qq&s=0&nk=${e.at}`]
|
||||
}
|
||||
if (e.source) {
|
||||
let reply
|
||||
if (e.isGroup) {
|
||||
reply = (await e.group.getChatHistory(e.source.seq, 1)).pop()?.message
|
||||
} else {
|
||||
reply = (await e.friend.getChatHistory(e.source.time, 1)).pop()?.message
|
||||
const isImg = await getImg(e)
|
||||
if (Config.imgOcr && !!isImg) {
|
||||
let imgOcrText = await getImageOcrText(e)
|
||||
if (imgOcrText) {
|
||||
prompt = prompt + '"'
|
||||
for (let imgOcrTextKey in imgOcrText) {
|
||||
prompt += imgOcrText[imgOcrTextKey]
|
||||
}
|
||||
if (reply) {
|
||||
for (let val of reply) {
|
||||
if (val.type === 'image') {
|
||||
e.img = [val.url]
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (e.img) {
|
||||
try {
|
||||
let imgOcrText = ''
|
||||
for (let i in e.img) {
|
||||
const imgorc = await Bot.imageOcr(e.img[i])
|
||||
// if (imgorc.language === 'zh' || imgorc.language === 'en') {
|
||||
for (let text of imgorc.wordslist) {
|
||||
imgOcrText += `${text.words} \n`
|
||||
}
|
||||
// }
|
||||
}
|
||||
prompt = imgOcrText + prompt
|
||||
} catch (err) { }
|
||||
prompt = prompt + ' "'
|
||||
}
|
||||
}
|
||||
// 检索是否有屏蔽词
|
||||
|
|
@ -1015,6 +996,8 @@ export class chatgpt extends plugin {
|
|||
}
|
||||
}
|
||||
let response = chatMessage?.text
|
||||
// 过滤无法正常显示的emoji
|
||||
if (use === 'claude') response = response.replace(/:[a-zA-Z_]+:/g, '')
|
||||
let mood = 'blandness'
|
||||
if (!response) {
|
||||
await e.reply('没有任何回复', true)
|
||||
|
|
@ -1139,7 +1122,14 @@ export class chatgpt extends plugin {
|
|||
ttsRegex = ''
|
||||
}
|
||||
ttsResponse = response.replace(ttsRegex, '')
|
||||
ttsResponse = emojiStrip(ttsResponse)
|
||||
// 处理azure语音会读出emoji的问题
|
||||
try {
|
||||
let emojiStrip
|
||||
emojiStrip = (await import('emoji-strip')).default
|
||||
ttsResponse = emojiStrip(ttsResponse)
|
||||
} catch (error) {
|
||||
await this.reply('依赖emoji-strip未安装,请执行pnpm install emoji-strip安装依赖', true)
|
||||
}
|
||||
// 处理多行回复有时候只会读第一行和azure语音会读出一些标点符号的问题
|
||||
ttsResponse = ttsResponse.replace(/[-:_;*;\n]/g, ',')
|
||||
// 先把文字回复发出去,避免过久等待合成语音
|
||||
|
|
@ -1158,16 +1148,8 @@ export class chatgpt extends plugin {
|
|||
if(ttsResponse.length <= Config.ttsAutoFallbackThreshold) {
|
||||
let wav
|
||||
if (Config.ttsMode === 'vits-uma-genshin-honkai' && Config.ttsSpace) {
|
||||
if (Config.autoJapanese && (_.isEmpty(Config.baiduTranslateAppId) || _.isEmpty(Config.baiduTranslateSecret))) {
|
||||
await this.reply('请检查翻译配置是否正确。')
|
||||
return false
|
||||
}
|
||||
if (Config.autoJapanese) {
|
||||
try {
|
||||
const translate = new Translate({
|
||||
appid: Config.baiduTranslateAppId,
|
||||
secret: Config.baiduTranslateSecret
|
||||
})
|
||||
ttsResponse = await translate(ttsResponse, '日')
|
||||
} catch (err) {
|
||||
logger.error(err)
|
||||
|
|
@ -1181,6 +1163,11 @@ export class chatgpt extends plugin {
|
|||
await this.reply('合成语音发生错误~')
|
||||
}
|
||||
} else if (Config.ttsMode === 'azure' && Config.azureTTSKey) {
|
||||
const ttsRoleAzure = userReplySetting.ttsRoleAzure
|
||||
const isEn = AzureTTS.supportConfigurations.find(config => config.code === ttsRoleAzure)?.language.includes('en')
|
||||
if (isEn) {
|
||||
ttsResponse = (await translate(ttsResponse, '英')).replace('\n', '')
|
||||
}
|
||||
let ssml = AzureTTS.generateSsml(ttsResponse, {
|
||||
speaker,
|
||||
emotion,
|
||||
|
|
@ -1641,6 +1628,25 @@ export class chatgpt extends plugin {
|
|||
})
|
||||
}
|
||||
}
|
||||
console.log(response)
|
||||
// 处理内容生成的图片
|
||||
if (response.details.imageTag) {
|
||||
if (Config.debug) {
|
||||
logger.mark(`开始生成内容:${response.details.imageTag}`)
|
||||
}
|
||||
let client = new BingDrawClient({
|
||||
baseUrl: Config.sydneyReverseProxy,
|
||||
userToken: bingToken
|
||||
})
|
||||
await redis.set(`CHATGPT:DRAW:${e.sender.user_id}`, 'c', { EX: 30 })
|
||||
try {
|
||||
await client.getImages(response.details.imageTag, e)
|
||||
} catch (err) {
|
||||
await redis.del(`CHATGPT:DRAW:${e.sender.user_id}`)
|
||||
await e.reply('绘图失败:' + err)
|
||||
}
|
||||
}
|
||||
|
||||
// 如果token曾经有异常,则清除异常
|
||||
let Tokens = JSON.parse(await redis.get('CHATGPT:BING_TOKENS'))
|
||||
const TokenIndex = Tokens.findIndex(element => element.Token === abtrs.bingToken)
|
||||
|
|
|
|||
|
|
@ -5,11 +5,10 @@ import { generateAudio } from '../utils/tts.js'
|
|||
import fs from 'fs'
|
||||
import { emojiRegex, googleRequestUrl } from '../utils/emoj/index.js'
|
||||
import fetch from 'node-fetch'
|
||||
import { mkdirs } from '../utils/common.js'
|
||||
import { makeForwardMsg, mkdirs } from '../utils/common.js'
|
||||
import uploadRecord from '../utils/uploadRecord.js'
|
||||
import { makeWordcloud } from '../utils/wordcloud/wordcloud.js'
|
||||
import Translate, { transMap } from '../utils/baiduTranslate.js'
|
||||
import _ from 'lodash'
|
||||
import { translate, translateLangSupports } from '../utils/translate.js'
|
||||
let useSilk = false
|
||||
try {
|
||||
await import('node-silk')
|
||||
|
|
@ -18,10 +17,10 @@ try {
|
|||
useSilk = false
|
||||
}
|
||||
export class Entertainment extends plugin {
|
||||
constructor (e) {
|
||||
constructor(e) {
|
||||
super({
|
||||
name: 'ChatGPT-Plugin 娱乐小功能',
|
||||
dsc: '让你的聊天更有趣!现已支持主动打招呼、表情合成、群聊词云统计与文本翻译小功能!',
|
||||
dsc: '让你的聊天更有趣!现已支持主动打招呼、表情合成、群聊词云统计、文本翻译与图片ocr小功能!',
|
||||
event: 'message',
|
||||
priority: 500,
|
||||
rule: [
|
||||
|
|
@ -44,8 +43,12 @@ export class Entertainment extends plugin {
|
|||
fnc: 'wordcloud'
|
||||
},
|
||||
{
|
||||
reg: '^#((?:寄批踢)?翻.*|chatgpt翻译帮助)',
|
||||
reg: '^#((寄批踢|gpt|GPT)?翻.*|chatgpt翻译帮助)',
|
||||
fnc: 'translate'
|
||||
},
|
||||
{
|
||||
reg: '^#ocr',
|
||||
fnc: 'ocr'
|
||||
}
|
||||
]
|
||||
})
|
||||
|
|
@ -59,44 +62,112 @@ export class Entertainment extends plugin {
|
|||
}
|
||||
]
|
||||
}
|
||||
|
||||
async translate (e) {
|
||||
if (e.msg.trim() === '#chatgpt翻译帮助') {
|
||||
await this.reply('支持中、日、文(文言文)、英、俄、韩语言之间的文本翻译功能,"寄批踢"为可选前缀' +
|
||||
'\n示例:1. #寄批踢翻英 你好' +
|
||||
'\t2. #翻中 你好' +
|
||||
'\t3. #寄批踢翻文 hello')
|
||||
return
|
||||
async ocr (e) {
|
||||
let replyMsg
|
||||
let imgOcrText = await getImageOcrText(e)
|
||||
if (!imgOcrText) {
|
||||
await this.reply('没有识别到文字', e.isGroup)
|
||||
return false
|
||||
}
|
||||
if (_.isEmpty(Config.baiduTranslateAppId) || _.isEmpty(Config.baiduTranslateSecret)) {
|
||||
this.reply('请检查翻译配置是否正确。')
|
||||
return
|
||||
}
|
||||
const regExp = /(#(?:寄批踢)?翻(.))(.*)/
|
||||
const msg = e.msg.trim()
|
||||
const match = msg.match(regExp)
|
||||
let result = ''
|
||||
if (!(match[2] in transMap)) {
|
||||
e.reply('输入格式有误或暂不支持该语言,' +
|
||||
'\n当前支持:中、日、文(文言文)、英、俄、韩。', e.isGroup
|
||||
)
|
||||
return
|
||||
}
|
||||
const PendingText = match[3]
|
||||
try {
|
||||
const translate = new Translate({
|
||||
appid: Config.baiduTranslateAppId,
|
||||
secret: Config.baiduTranslateSecret
|
||||
})
|
||||
result = await translate(PendingText, match[2])
|
||||
} catch (err) {
|
||||
logger.error(err)
|
||||
result = err.message
|
||||
}
|
||||
await this.reply(result, e.isGroup)
|
||||
replyMsg = await makeForwardMsg(e, imgOcrText, 'OCR结果')
|
||||
await this.reply(replyMsg, e.isGroup)
|
||||
}
|
||||
|
||||
async wordcloud (e) {
|
||||
async translate(e) {
|
||||
const translateLangLabels = translateLangSupports.map(item => item.label).join(',')
|
||||
const translateLangLabelAbbrS = translateLangSupports.map(item => item.abbr).join(',')
|
||||
if (e.msg.trim() === '#chatgpt翻译帮助') {
|
||||
await this.reply(`支持以下语种的翻译:
|
||||
${translateLangLabels}
|
||||
在使用本工具时,请采用简写的方式描述目标语言。此外,可以引用消息或图片来进行翻译。
|
||||
示例:
|
||||
1. #gpt翻英 你好
|
||||
2. #gpt翻中 你好
|
||||
3. #gpt翻译 hello`)
|
||||
return true
|
||||
}
|
||||
const regExp = /^#(寄批踢|gpt|GPT)?翻(.)([\s\S]*)/
|
||||
const match = e.msg.trim().match(regExp)
|
||||
let languageCode = match[2] === '译' ? 'auto' : match[2]
|
||||
let pendingText = match[3]
|
||||
const isImg = !!(await getImg(e))?.length
|
||||
let result = []
|
||||
let multiText = false
|
||||
if (languageCode !== 'auto' && !translateLangLabelAbbrS.includes(languageCode)) {
|
||||
e.reply(`输入格式有误或暂不支持该语言,\n当前支持${translateLangLabels}`, e.isGroup)
|
||||
return false
|
||||
}
|
||||
// 引用回复
|
||||
if (e.source) {
|
||||
if (pendingText.length) {
|
||||
await this.reply('引用模式下不需要添加翻译文本,已自动忽略输入文本...((*・∀・)ゞ→→”', e.isGroup)
|
||||
}
|
||||
} else {
|
||||
if (isImg && pendingText) {
|
||||
await this.reply('检测到图片输入,已自动忽略输入文本...((*・∀・)ゞ→→', e.isGroup)
|
||||
}
|
||||
if (!pendingText && !isImg) {
|
||||
await this.reply('你让我翻译啥呢 ̄へ ̄!', e.isGroup)
|
||||
return false
|
||||
}
|
||||
}
|
||||
if (isImg) {
|
||||
let imgOcrText = await getImageOcrText(e)
|
||||
multiText = Array.isArray(imgOcrText)
|
||||
if (imgOcrText) {
|
||||
pendingText = imgOcrText
|
||||
} else {
|
||||
await this.reply('没有识别到有效文字(・-・*)', e.isGroup)
|
||||
return false
|
||||
}
|
||||
} else {
|
||||
if (e.source) {
|
||||
let previousMsg
|
||||
if (e.isGroup) {
|
||||
previousMsg = (await e.group.getChatHistory(e.source.seq, 1)).pop()?.message
|
||||
} else {
|
||||
previousMsg = (await e.friend.getChatHistory(e.source.time, 1)).pop()?.message
|
||||
}
|
||||
// logger.warn('previousMsg', previousMsg)
|
||||
if (previousMsg.find(msg => msg.type === 'text')?.text) {
|
||||
pendingText = previousMsg.find(msg => msg.type === 'text')?.text
|
||||
} else {
|
||||
await this.reply('这是什么怪东西!(⊙ˍ⊙)', e.isGroup)
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
try {
|
||||
if (multiText) {
|
||||
result = await Promise.all(pendingText.map(text => translate(text, languageCode)))
|
||||
} else {
|
||||
result = await translate(pendingText, languageCode)
|
||||
}
|
||||
// logger.warn(multiText, result)
|
||||
} catch (err) {
|
||||
await this.reply(err.message, e.isGroup)
|
||||
return false
|
||||
}
|
||||
const totalLength = Array.isArray(result)
|
||||
? result.reduce((acc, cur) => acc + cur.length, 0)
|
||||
: result.length
|
||||
if (totalLength > 300 || multiText) {
|
||||
// 多条翻译结果
|
||||
if (Array.isArray(result)) {
|
||||
result = await makeForwardMsg(e, result, '翻译结果')
|
||||
} else {
|
||||
result = ('译文:\n' + result.trim()).split()
|
||||
result.unshift('原文:\n' + pendingText.trim())
|
||||
result = await makeForwardMsg(e, result, '翻译结果')
|
||||
}
|
||||
await this.reply(result, e.isGroup)
|
||||
return true
|
||||
}
|
||||
// 保持原格式输出
|
||||
result = Array.isArray(result) ? result.join('\n') : result
|
||||
await this.reply(result, e.isGroup)
|
||||
return true
|
||||
}
|
||||
async wordcloud(e) {
|
||||
if (e.isGroup) {
|
||||
let groupId = e.group_id
|
||||
let lock = await redis.get(`CHATGPT:WORDCLOUD:${groupId}`)
|
||||
|
|
@ -105,7 +176,7 @@ export class Entertainment extends plugin {
|
|||
return true
|
||||
}
|
||||
await e.reply('在统计啦,请稍等...')
|
||||
await redis.set(`CHATGPT:WORDCLOUD:${groupId}`, '1', { EX: 600 })
|
||||
await redis.set(`CHATGPT:WORDCLOUD:${groupId}`, '1', {EX: 600})
|
||||
try {
|
||||
await makeWordcloud(e, e.group_id)
|
||||
} catch (err) {
|
||||
|
|
@ -118,7 +189,7 @@ export class Entertainment extends plugin {
|
|||
}
|
||||
}
|
||||
|
||||
async combineEmoj (e) {
|
||||
async combineEmoj(e) {
|
||||
let left = e.msg.codePointAt(0).toString(16).toLowerCase()
|
||||
let right = e.msg.codePointAt(2).toString(16).toLowerCase()
|
||||
if (left === right) {
|
||||
|
|
@ -166,7 +237,7 @@ export class Entertainment extends plugin {
|
|||
return true
|
||||
}
|
||||
|
||||
async sendMessage (e) {
|
||||
async sendMessage(e) {
|
||||
if (e.msg.match(/^#chatgpt打招呼帮助/) !== null) {
|
||||
await this.reply('设置主动打招呼的群聊名单,群号之间以,隔开,参数之间空格隔开\n' +
|
||||
'#chatgpt打招呼+群号:立即在指定群聊发起打招呼' +
|
||||
|
|
@ -197,7 +268,7 @@ export class Entertainment extends plugin {
|
|||
}
|
||||
}
|
||||
|
||||
async sendRandomMessage () {
|
||||
async sendRandomMessage() {
|
||||
if (Config.debug) {
|
||||
logger.info('开始处理:ChatGPT随机打招呼。')
|
||||
}
|
||||
|
|
@ -231,7 +302,7 @@ export class Entertainment extends plugin {
|
|||
}
|
||||
}
|
||||
|
||||
async handleSentMessage (e) {
|
||||
async handleSentMessage(e) {
|
||||
const addReg = /^#chatgpt设置打招呼[::]?\s?(\S+)(?:\s+(\d+))?(?:\s+(\d+))?$/
|
||||
const delReg = /^#chatgpt删除打招呼[::\s]?(\S+)/
|
||||
const checkReg = /^#chatgpt查看打招呼$/
|
||||
|
|
@ -307,3 +378,51 @@ export class Entertainment extends plugin {
|
|||
return false
|
||||
}
|
||||
}
|
||||
export async function getImg (e) {
|
||||
// 取消息中的图片、at的头像、回复的图片,放入e.img
|
||||
if (e.at && !e.source) {
|
||||
e.img = [`https://q1.qlogo.cn/g?b=qq&s=0&nk=${e.at}`]
|
||||
}
|
||||
if (e.source) {
|
||||
let reply
|
||||
if (e.isGroup) {
|
||||
reply = (await e.group.getChatHistory(e.source.seq, 1)).pop()?.message
|
||||
} else {
|
||||
reply = (await e.friend.getChatHistory(e.source.time, 1)).pop()?.message
|
||||
}
|
||||
if (reply) {
|
||||
let i = []
|
||||
for (let val of reply) {
|
||||
if (val.type === 'image') {
|
||||
i.push(val.url)
|
||||
}
|
||||
}
|
||||
e.img = i
|
||||
}
|
||||
}
|
||||
return e.img
|
||||
}
|
||||
export async function getImageOcrText (e) {
|
||||
const img = await getImg(e)
|
||||
if (img) {
|
||||
try {
|
||||
let resultArr = []
|
||||
let eachImgRes = ''
|
||||
for (let i in img) {
|
||||
const imgOCR = await Bot.imageOcr(img[i])
|
||||
for (let text of imgOCR.wordslist) {
|
||||
eachImgRes += (`${text?.words} \n`)
|
||||
}
|
||||
if (eachImgRes) resultArr.push(eachImgRes)
|
||||
eachImgRes = ''
|
||||
}
|
||||
// logger.warn('resultArr', resultArr)
|
||||
return resultArr
|
||||
} catch (err) {
|
||||
return false
|
||||
// logger.error(err)
|
||||
}
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -235,7 +235,7 @@ export class ChatgptManagement extends plugin {
|
|||
fnc: 'userPage'
|
||||
},
|
||||
{
|
||||
reg: '^#chatgpt(对话|管理|娱乐|绘图|人物设定|聊天记录)?指令表(帮助)?',
|
||||
reg: '^#(chatgpt)?(对话|管理|娱乐|绘图|人物设定|聊天记录)?指令表(帮助|搜索(.+))?',
|
||||
fnc: 'commandHelp'
|
||||
},
|
||||
{
|
||||
|
|
@ -281,8 +281,21 @@ export class ChatgptManagement extends plugin {
|
|||
}
|
||||
await this.reply(roleList)
|
||||
}
|
||||
|
||||
async ttsSwitch (e) {
|
||||
let userReplySetting = await redis.get(`CHATGPT:USER:${e.sender.user_id}`)
|
||||
userReplySetting = !userReplySetting
|
||||
? getDefaultReplySetting()
|
||||
: JSON.parse(userReplySetting)
|
||||
if (!userReplySetting.useTTS) {
|
||||
let replyMsg
|
||||
if (userReplySetting.usePicture) {
|
||||
replyMsg = `当前为${!userReplySetting.useTTS ? '图片模式' : ''},请先切换到语音模式吧~`
|
||||
} else {
|
||||
replyMsg = `当前为${!userReplySetting.useTTS ? '文本模式' : ''},请先切换到语音模式吧~`
|
||||
}
|
||||
await this.reply(replyMsg, e.isGroup)
|
||||
return false
|
||||
}
|
||||
let regExp = /#语音切换(.*)/
|
||||
let ttsMode = e.msg.match(regExp)[1]
|
||||
if (['vits', 'azure', 'voicevox'].includes(ttsMode)) {
|
||||
|
|
@ -300,9 +313,10 @@ export class ChatgptManagement extends plugin {
|
|||
|
||||
async commandHelp (e) {
|
||||
if (!this.e.isMaster) { return this.reply('你没有权限') }
|
||||
if (e.msg.trim() === '#chatgpt指令表帮助') {
|
||||
if (/^#(chatgpt)?指令表帮助$/.exec(e.msg.trim())) {
|
||||
await this.reply('#chatgpt指令表: 查看本插件的所有指令\n' +
|
||||
'#chatgpt(对话|管理|娱乐|绘图|人物设定|聊天记录)指令表: 查看对应功能分类的指令表')
|
||||
'#chatgpt(对话|管理|娱乐|绘图|人物设定|聊天记录)指令表: 查看对应功能分类的指令表\n' +
|
||||
'#chatgpt指令表搜索xxx: 查看包含对应关键词的指令')
|
||||
return false
|
||||
}
|
||||
const categories = {
|
||||
|
|
@ -332,7 +346,33 @@ export class ChatgptManagement extends plugin {
|
|||
commandSet.push({ name, dsc: plugin.dsc, rule })
|
||||
}
|
||||
}
|
||||
|
||||
if (e.msg.includes('搜索')) {
|
||||
let cmd = e.msg.trim().match(/^#(chatgpt)?(对话|管理|娱乐|绘图|人物设定|聊天记录)?指令表(帮助|搜索(.+))?/)[4]
|
||||
if (!cmd) {
|
||||
await this.reply('(⊙ˍ⊙)')
|
||||
return 0
|
||||
} else {
|
||||
let searchResults = []
|
||||
commandSet.forEach(plugin => {
|
||||
plugin.rule.forEach(item => {
|
||||
if (item.reg.toLowerCase().includes(cmd.toLowerCase())) {
|
||||
searchResults.push(item.reg)
|
||||
}
|
||||
})
|
||||
})
|
||||
if (!searchResults.length) {
|
||||
await this.reply('没有找到符合的结果,换个关键词吧!', e.isGroup)
|
||||
return 0
|
||||
} else if (searchResults.length <= 5) {
|
||||
await this.reply(searchResults.join('\n'), e.isGroup)
|
||||
return 1
|
||||
} else {
|
||||
let msg = await makeForwardMsg(e, searchResults, e.msg.slice(1).startsWith('chatgpt') ? e.msg.slice(8) : 'chatgpt' + e.msg.slice(1))
|
||||
await this.reply(msg)
|
||||
return 1
|
||||
}
|
||||
}
|
||||
}
|
||||
const generatePrompt = (plugin, command) => {
|
||||
const category = getCategory(e, plugin)
|
||||
const commandsStr = command.length ? `正则指令:\n${command.join('\n')}\n` : '正则指令: 无\n'
|
||||
|
|
@ -348,7 +388,7 @@ export class ChatgptManagement extends plugin {
|
|||
prompts.push(generatePrompt(plugin, commands))
|
||||
}
|
||||
}
|
||||
let msg = await makeForwardMsg(e, prompts, e.msg.slice(1))
|
||||
let msg = await makeForwardMsg(e, prompts, e.msg.slice(1).startsWith('chatgpt') ? e.msg.slice(1) : ('chatgpt' + e.msg.slice(1)))
|
||||
await this.reply(msg)
|
||||
return true
|
||||
}
|
||||
|
|
@ -513,7 +553,7 @@ export class ChatgptManagement extends plugin {
|
|||
}
|
||||
|
||||
async setDefaultReplySetting (e) {
|
||||
const reg = /^#chatgpt(打开|关闭|设置)?全局((图片模式|语音模式|(语音角色|角色语音|角色).*)|回复帮助)/
|
||||
const reg = /^#chatgpt(打开|关闭|设置)?全局((文本模式|图片模式|语音模式|(语音角色|角色语音|角色).*)|回复帮助)/
|
||||
const matchCommand = e.msg.match(reg)
|
||||
const settingType = matchCommand[2]
|
||||
let replyMsg = ''
|
||||
|
|
@ -533,6 +573,23 @@ export class ChatgptManagement extends plugin {
|
|||
} else if (matchCommand[1] === '设置') {
|
||||
replyMsg = '请使用“#chatgpt打开全局图片模式”或“#chatgpt关闭全局图片模式”命令来设置回复模式'
|
||||
} break
|
||||
case '文本模式':
|
||||
if (matchCommand[1] === '打开') {
|
||||
Config.defaultUsePicture = false
|
||||
Config.defaultUseTTS = false
|
||||
replyMsg = 'ChatGPT将默认以文本回复'
|
||||
} else if (matchCommand[1] === '关闭') {
|
||||
if (Config.defaultUseTTS) {
|
||||
replyMsg = 'ChatGPT将默认以语音回复'
|
||||
} else if (Config.defaultUsePicture) {
|
||||
replyMsg = 'ChatGPT将默认以图片回复'
|
||||
} else {
|
||||
Config.defaultUseTTS = true
|
||||
replyMsg = 'ChatGPT将默认以语音回复'
|
||||
}
|
||||
} else if (matchCommand[1] === '设置') {
|
||||
replyMsg = '请使用“#chatgpt打开全局文本模式”或“#chatgpt关闭全局文本模式”命令来设置回复模式'
|
||||
} break
|
||||
case '语音模式':
|
||||
if (!Config.ttsSpace) {
|
||||
replyMsg = '您没有配置VITS API,请前往锅巴面板进行配置'
|
||||
|
|
@ -553,7 +610,7 @@ export class ChatgptManagement extends plugin {
|
|||
replyMsg = '请使用“#chatgpt打开全局语音模式”或“#chatgpt关闭全局语音模式”命令来设置回复模式'
|
||||
} break
|
||||
case '回复帮助':
|
||||
replyMsg = '可使用以下命令配置全局回复:\n#chatgpt(打开/关闭)全局(语音/图片)模式\n#chatgpt设置全局(语音角色|角色语音|角色)+角色名称(留空则为随机)'
|
||||
replyMsg = '可使用以下命令配置全局回复:\n#chatgpt(打开/关闭)全局(语音/图片/文本)模式\n#chatgpt设置全局(语音角色|角色语音|角色)+角色名称(留空则为随机)'
|
||||
break
|
||||
default:
|
||||
if (!Config.ttsSpace) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue