mirror of
https://github.com/ikechan8370/chatgpt-plugin.git
synced 2025-12-17 05:47:11 +00:00
feat: 聊天记录
This commit is contained in:
parent
0755b54486
commit
fbfd105e0d
4 changed files with 221 additions and 1 deletions
|
|
@ -50,6 +50,11 @@ let helpData = [
|
|||
icon: 'destroy-other',
|
||||
title: '#结束对话 @某人',
|
||||
desc: '结束该用户当前对话,下次开启对话机器人将遗忘掉本次对话内容。'
|
||||
},
|
||||
{
|
||||
icon: 'confirm',
|
||||
title: '#chatgpt(导出)聊天记录',
|
||||
desc: '图片形式导出聊天记录,目前仅支持Bing下的Sydney和自定义'
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
|
|||
116
apps/history.js
Normal file
116
apps/history.js
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
import plugin from '../../../lib/plugins/plugin.js'
|
||||
import { render } from '../utils/common.js'
|
||||
import { Config } from '../utils/config.js'
|
||||
import { KeyvFile } from 'keyv-file'
|
||||
|
||||
async function getKeyv () {
|
||||
let Keyv
|
||||
try {
|
||||
Keyv = (await import('keyv')).default
|
||||
} catch (error) {
|
||||
throw new Error('keyv依赖未安装,请使用pnpm install keyv安装')
|
||||
}
|
||||
return Keyv
|
||||
}
|
||||
export class history extends plugin {
|
||||
constructor (e) {
|
||||
super({
|
||||
name: 'ChatGPT-Plugin聊天记录',
|
||||
dsc: 'ChatGPT-Plugin聊天记录提取',
|
||||
event: 'message',
|
||||
priority: 500,
|
||||
rule: [
|
||||
{
|
||||
reg: '^#(chatgpt|ChatGPT)(导出)?聊天记录',
|
||||
fnc: 'history'
|
||||
}
|
||||
]
|
||||
})
|
||||
}
|
||||
|
||||
async history (e) {
|
||||
let use = await redis.get('CHATGPT:USE') || 'api'
|
||||
let chat = []
|
||||
let filtered = e.message.filter(m => m.type === 'at').filter(m => m.qq !== Bot.uin)
|
||||
let queryUser = e.sender.user_id
|
||||
if (filtered.length > 0) {
|
||||
queryUser = filtered[0].qq
|
||||
}
|
||||
switch (use) {
|
||||
case 'api': {
|
||||
await e.reply('还不支持API模式呢')
|
||||
return true
|
||||
}
|
||||
case 'api3': {
|
||||
await e.reply('还不支持API3模式呢')
|
||||
return true
|
||||
}
|
||||
case 'bing': {
|
||||
if (Config.toneStyle === 'Sydney' || Config.toneStyle === 'Custom') {
|
||||
const cacheOptions = {
|
||||
namespace: Config.toneStyle,
|
||||
store: new KeyvFile({ filename: 'cache.json' })
|
||||
}
|
||||
let Keyv = await getKeyv()
|
||||
let conversationsCache = new Keyv(cacheOptions)
|
||||
const conversation = (await conversationsCache.get(`SydneyUser_${queryUser}`)) || {
|
||||
messages: [],
|
||||
createdAt: Date.now()
|
||||
}
|
||||
let key = `CHATGPT:CONVERSATIONS_BING:${e.sender.user_id}`
|
||||
let previousConversation = await redis.get(key) || JSON.stringify({})
|
||||
previousConversation = JSON.parse(previousConversation)
|
||||
let parentMessageId = previousConversation.parentMessageId
|
||||
let tmp = {}
|
||||
const previousCachedMessages = getMessagesForConversation(conversation.messages, parentMessageId)
|
||||
.map((message) => {
|
||||
return {
|
||||
text: message.message,
|
||||
author: message.role === 'User' ? 'user' : 'bot'
|
||||
}
|
||||
})
|
||||
previousCachedMessages.forEach(m => {
|
||||
if (m.author === 'user') {
|
||||
tmp.prompt = m.text
|
||||
} else {
|
||||
tmp.response = m.text
|
||||
chat.push(tmp)
|
||||
tmp = {}
|
||||
}
|
||||
})
|
||||
} else {
|
||||
await e.reply('还不支持BING模式呢')
|
||||
return true
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
await e.reply(await render(e, 'chatgpt-plugin', 'content/History/index', {
|
||||
version: Config.version,
|
||||
user: {
|
||||
qq: e.sender.user_id,
|
||||
name: e.sender.card || e.sender.nickname || e.sender.user_id
|
||||
},
|
||||
bot: {
|
||||
qq: Bot.uin,
|
||||
name: Bot.nickname
|
||||
},
|
||||
chat
|
||||
}, {}))
|
||||
}
|
||||
}
|
||||
|
||||
function getMessagesForConversation (messages, parentMessageId) {
|
||||
const orderedMessages = []
|
||||
let currentMessageId = parentMessageId
|
||||
while (currentMessageId) {
|
||||
const message = messages.find((m) => m.id === currentMessageId)
|
||||
if (!message) {
|
||||
break
|
||||
}
|
||||
orderedMessages.unshift(message)
|
||||
currentMessageId = message.parentMessageId
|
||||
}
|
||||
|
||||
return orderedMessages
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue