diff --git a/apps/chat.js b/apps/chat.js index 631d2f2..8b1bac4 100644 --- a/apps/chat.js +++ b/apps/chat.js @@ -797,7 +797,7 @@ export class chatgpt extends plugin { * #chatgpt */ async chatgpt (e) { - let msg = Version.isTrss ? e.msg : e.raw_message + let msg = (Version.isTrss || e.adapter === 'shamrock') ? e.msg : e.raw_message let prompt if (this.toggleMode === 'at') { if (!msg || e.msg?.startsWith('#')) { @@ -1669,7 +1669,11 @@ export class chatgpt extends plugin { let toSummaryFileContent try { if (e.source) { - let msgs = e.isGroup ? await e.group.getChatHistory(e.source.seq, 1) : await e.friend.getChatHistory(e.source.time, 1) + let seq = e.isGroup ? e.source.seq : e.source.time + if (e.adapter === 'shamrock') { + seq = e.source.message_id + } + let msgs = e.isGroup ? await e.group.getChatHistory(seq, 1) : await e.friend.getChatHistory(seq, 1) let sourceMsg = msgs[0] let fileMsgElem = sourceMsg.message.find(msg => msg.type === 'file') if (fileMsgElem) { @@ -2127,6 +2131,7 @@ export class chatgpt extends plugin { } } default: { + // openai api let completionParams = {} if (Config.model) { completionParams.model = Config.model @@ -2317,27 +2322,7 @@ export class chatgpt extends plugin { } } } - let img = [] - 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) { - for (let val of reply) { - if (val.type === 'image') { - console.log(val) - img.push(val.url) - } - } - } - } - if (e.img) { - img.push(...e.img) - } + let img = await getImg(e) if (img.length > 0 && Config.extraUrl) { tools.push(new ImageCaptionTool()) tools.push(new ProcessPictureTool()) diff --git a/utils/chat.js b/utils/chat.js index e249d0f..f37d5d9 100644 --- a/utils/chat.js +++ b/utils/chat.js @@ -1,3 +1,5 @@ +import common from '../../../lib/common/common.js' + export async function getChatHistoryGroup (e, num) { // if (e.adapter === 'shamrock') { // return await e.group.getChatHistory(0, num, false) @@ -16,12 +18,23 @@ export async function getChatHistoryGroup (e, num) { chats = chats.slice(0, num) try { let mm = await e.group.getMemberMap() - chats.forEach(chat => { - let sender = mm.get(chat.sender.user_id) - if (sender) { - chat.sender = sender + for (const chat of chats) { + if (e.adapter === 'shamrock') { + if (chat.sender?.user_id === 0) { + // 奇怪格式的历史消息,过滤掉 + continue + } + let sender = await pickMemberAsync(e, chat.sender.user_id) + if (sender) { + chat.sender = sender + } + } else { + let sender = mm.get(chat.sender.user_id) + if (sender) { + chat.sender = sender + } } - }) + } } catch (err) { logger.warn(err) } @@ -32,3 +45,11 @@ export async function getChatHistoryGroup (e, num) { // } return [] } + +function pickMemberAsync (e, userId) { + return new Promise((resolve, reject) => { + e.group.pickMember(userId, true, (sender) => { + resolve(sender) + }) + }) +} diff --git a/utils/common.js b/utils/common.js index f9b2de9..3c05aaf 100644 --- a/utils/common.js +++ b/utils/common.js @@ -13,7 +13,7 @@ import AzureTTS, { supportConfigurations as azureRoleList } from './tts/microsof import { translate } from './translate.js' import uploadRecord from './uploadRecord.js' import Version from './version.js' -import fetch from 'node-fetch' +import fetch, { FormData, fileFromSync } from 'node-fetch' let pdfjsLib try { pdfjsLib = (await import('pdfjs-dist')).default @@ -785,10 +785,14 @@ export async function getImg (e) { } if (e.source) { let reply + let seq = e.isGroup ? e.source.seq : e.source.time + if (e.adapter === 'shamrock') { + seq = e.source.message_id + } if (e.isGroup) { - reply = (await e.group.getChatHistory(e.source.seq, 1)).pop()?.message + reply = (await e.group.getChatHistory(seq, 1)).pop()?.message } else { - reply = (await e.friend.getChatHistory(e.source.time, 1)).pop()?.message + reply = (await e.friend.getChatHistory(seq, 1)).pop()?.message } if (reply) { let i = [] @@ -809,8 +813,34 @@ export async function getImageOcrText (e) { try { let resultArr = [] let eachImgRes = '' + if (!e.bot.imageOcr || typeof e.bot.imageOcr !== 'function') { + e.bot.imageOcr = async (image) => { + if (Config.extraUrl) { + let md5 = image.split(/[/-]/).find(s => s.length === 32)?.toUpperCase() + let filePath = await downloadFile(image, `ocr/${md5}.png`) + let formData = new FormData() + formData.append('file', fileFromSync(filePath)) + let res = await fetch(`${Config.extraUrl}/ocr?lang=chi_sim%2Beng`, { + body: formData, + method: 'POST', + headers: { + from: 'ikechan8370' + } + }) + if (res.status === 200) { + return { + wordslist: [{ words: await res.text() }] + } + } + } + return { + wordslist: [] + } + } + } for (let i in img) { const imgOCR = await e.bot.imageOcr(img[i]) + for (let text of imgOCR.wordslist) { eachImgRes += (`${text?.words} \n`) } @@ -820,6 +850,7 @@ export async function getImageOcrText (e) { // logger.warn('resultArr', resultArr) return resultArr } catch (err) { + logger.warn(err) logger.warn('OCR失败,可能使用的适配器不支持OCR') return false // logger.error(err) @@ -1061,7 +1092,7 @@ export async function extractContentFromFile (fileMsgElem, e) { let fileType = isPureText(fileMsgElem.name) if (fileType) { // 可读的文件类型 - let fileUrl = e.isGroup ? await e.group.getFileUrl(fileMsgElem.fid) : await e.friend.getFileUrl(fileMsgElem.fid) + let fileUrl = fileMsgElem.url || (e.isGroup ? await e.group.getFileUrl(fileMsgElem.fid) : await e.friend.getFileUrl(fileMsgElem.fid)) let filePath = await downloadFile(fileUrl, path.join('received', fileMsgElem.name)) switch (fileType) { case 'pdf': { diff --git a/utils/config.js b/utils/config.js index fe95971..7e94acc 100644 --- a/utils/config.js +++ b/utils/config.js @@ -162,7 +162,7 @@ const defaultConfig = { qwenSeed: 0, qwenTemperature: 1, qwenEnableSearch: true, - version: 'v2.7.7' + version: 'v2.7.8' } const _path = process.cwd() let config = {}