fix: merge

This commit is contained in:
ikechan8370 2023-12-12 19:50:15 +08:00
commit ca34338b72
11 changed files with 224 additions and 69 deletions

View file

@ -95,7 +95,7 @@ export default class BingDrawClient {
let pollingUrl = `${this.opts.baseUrl}/images/create/async/results/${requestId}?q=${urlEncodedPrompt}`
logger.info({ pollingUrl })
logger.info('waiting for bing draw results...')
let timeoutTimes = 30
let timeoutTimes = 50
let found = false
let timer = setInterval(async () => {
if (found) {
@ -113,15 +113,20 @@ export default class BingDrawClient {
// 很可能是微软内部error重试即可
return
}
imageLinks = imageLinks.map(link => link.split('?w=')[0]).map(link => link.replace('src="', ''))
imageLinks = imageLinks
.map(link => link.split('?w=')[0])
.map(link => link.replace('src="', ''))
.filter(link => !link.includes('.svg'))
imageLinks = [...new Set(imageLinks)]
const badImages = [
'https://r.bing.com/rp/in-2zU3AJUdkgFe7ZKv19yPBHVs.png"',
'https://r.bing.com/rp/TX9QuO3WzcCJz1uaaSwQAz39Kb0.jpg"',
'https://r.bing.com/rp/in-2zU3AJUdkgFe7ZKv19yPBHVs.png',
'https://r.bing.com/rp/TX9QuO3WzcCJz1uaaSwQAz39Kb0.jpg'
]
for (let imageLink of imageLinks) {
if (badImages.indexOf(imageLink) > -1) {
await e.reply('绘图失败Bad images', true)
await e.reply('绘图失败Bad images', true)
logger.error(rText)
}
}
@ -132,7 +137,7 @@ export default class BingDrawClient {
clearInterval(timer)
} else {
if (timeoutTimes === 0) {
await e.reply('绘图超时', true)
await e.reply('绘图超时', true)
clearInterval(timer)
timer = null
} else {
@ -140,6 +145,6 @@ export default class BingDrawClient {
timeoutTimes--
}
}
}, 2000)
}, 3000)
}
}

View file

@ -1,3 +1,4 @@
export async function getChatHistoryGroup (e, num) {
// if (e.adapter === 'shamrock') {
// return await e.group.getChatHistory(0, num, false)
@ -16,12 +17,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 +44,17 @@ export async function getChatHistoryGroup (e, num) {
// }
return []
}
async function pickMemberAsync (e, userId) {
let key = `CHATGPT:GroupMemberInfo:${e.group_id}:${userId}`
let cache = await redis.get(key)
if (cache) {
return JSON.parse(cache)
}
return new Promise((resolve, reject) => {
e.group.pickMember(userId, true, (sender) => {
redis.set(key, JSON.stringify(sender), { EX: 86400 })
resolve(sender)
})
})
}

View file

@ -13,7 +13,8 @@ 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'
import https from "https";
let pdfjsLib
try {
pdfjsLib = (await import('pdfjs-dist')).default
@ -785,10 +786,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 +814,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 +851,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)
@ -1003,10 +1035,15 @@ export function getUserSpeaker (userSetting) {
* @param url 要下载的文件链接
* @param destPath 目标路径如received/abc.pdf. 目前如果文件名重复会覆盖
* @param absolute 是否是绝对路径默认为false此时拼接在data/chatgpt下
* @param ignoreCertificateError 忽略证书错误
* @returns {Promise<string>} 最终下载文件的存储位置
*/
export async function downloadFile (url, destPath, absolute = false) {
let response = await fetch(url)
export async function downloadFile (url, destPath, absolute = false, ignoreCertificateError = true) {
let response = await fetch(url, {
agent: new https.Agent({
rejectUnauthorized: !ignoreCertificateError
})
})
if (!response.ok) {
throw new Error(`download file http error: status: ${response.status}`)
}
@ -1061,7 +1098,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': {

View file

@ -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 = {}

View file

@ -15,21 +15,13 @@ export class QueryUserinfoTool extends AbstractTool {
}
func = async function (opts, e) {
let { qq } = opts
qq = isNaN(qq) || !qq ? e.sender.user_id : parseInt(qq.trim())
if (e.isGroup && typeof e.group.getMemberMap === 'function') {
let mm = await e.group.getMemberMap()
let user = mm.get(qq) || e.sender.user_id
let master = (await getMasterQQ())[0]
let prefix = ''
if (qq != master) {
prefix = 'Attention: this user is not your master. \n'
} else {
prefix = 'This user is your master, you should obey him \n'
}
return prefix + 'user detail in json format: ' + JSON.stringify(user)
} else {
if (e.sender.user_id == qq) {
try {
let { qq } = opts
qq = isNaN(qq) || !qq ? e.sender.user_id : parseInt(qq.trim())
if (e.isGroup && typeof e.bot.getGroupMemberInfo === 'function') {
let user = await e.bot.getGroupMemberInfo(e.group_id, qq || e.sender.user_id, true)
// let mm = await e.group.getMemberMap()
// let user = mm.get(qq) || e.sender.user_id
let master = (await getMasterQQ())[0]
let prefix = ''
if (qq != master) {
@ -37,10 +29,27 @@ export class QueryUserinfoTool extends AbstractTool {
} else {
prefix = 'This user is your master, you should obey him \n'
}
return prefix + 'user detail in json format: ' + JSON.stringify(e.sender)
if (!user) {
return prefix
}
return prefix + 'user detail in json format: ' + JSON.stringify(user)
} else {
return 'query failed'
if (e.sender.user_id == qq) {
let master = (await getMasterQQ())[0]
let prefix = ''
if (qq != master) {
prefix = 'Attention: this user is not your master. \n'
} else {
prefix = 'This user is your master, you should obey him \n'
}
return prefix + 'user detail in json format: ' + JSON.stringify(e.sender)
} else {
return 'query failed'
}
}
} catch (err) {
logger.warn(err)
return err.message
}
}