diff --git a/apps/memory.js b/apps/memory.js index a0c785d..7cd4370 100644 --- a/apps/memory.js +++ b/apps/memory.js @@ -1,26 +1,10 @@ import Config from '../config/config.js' import { GroupMessageCollector } from '../models/memory/collector.js' import { memoryService } from '../models/memory/service.js' +import common from '../../../lib/common/common.js' const collector = new GroupMessageCollector() -function formatUserMemoryList (memories) { - if (!memories.length) { - return '暂无记录~' - } - return memories.map(item => `${item.id}. ${item.value}(重要度 ${item.importance.toFixed(2)})`).join('\n') -} - -function formatGroupFactList (facts) { - if (!facts.length) { - return '暂无群记忆。' - } - return facts.map(item => { - const topic = item.topic ? `【${item.topic}】` : '' - return `${item.id}. ${topic}${item.fact}` - }).join('\n') -} - function isGroupManager (e) { if (e.isMaster) { return true @@ -55,6 +39,10 @@ export class MemoryManager extends plugin { reg: '^#?(我的)?记忆$', fnc: 'showUserMemory' }, + { + reg: '^#?他的记忆$', + fnc: 'showTargetUserMemory' + }, { reg: '^#?(删除|清除)(我的)?记忆\\s*(\\d+)$', fnc: 'deleteUserMemory' @@ -96,9 +84,52 @@ export class MemoryManager extends plugin { await e.reply('私人记忆未开启或您未被授权。') return false } - const memories = memoryService.listUserMemories(e.sender.user_id, e.isGroup ? e.group_id : null, 10) - const content = formatUserMemoryList(memories) - await e.reply(`🧠 您的记忆:\n${content}`) + const memories = memoryService.listUserMemories(e.sender.user_id, e.isGroup ? e.group_id : null) + + if (!memories.length) { + await e.reply('🧠 您的记忆:\n暂无记录~') + return true + } + + const msgs = memories.map(item => + `${item.id}. ${item.value}(重要度 ${item.importance.toFixed(2)})` + ) + + const forwardMsg = await common.makeForwardMsg(e, ['🧠 您的记忆:', ...msgs], '私人记忆列表') + await e.reply(forwardMsg) + return true + } + + async showTargetUserMemory (e) { + if (!e.isGroup) { + await e.reply('该指令仅可在群聊中使用。') + return false + } + + const at = e.at || (e.message?.find(m => m.type === 'at')?.qq) + if (!at) { + await e.reply('请@要查询的用户。') + return false + } + + if (!memoryService.isUserMemoryEnabled(at)) { + await e.reply('该用户未开启私人记忆或未被授权。') + return false + } + + const memories = memoryService.listUserMemories(at, e.group_id) + + if (!memories.length) { + await e.reply('🧠 TA的记忆:\n暂无记录~') + return true + } + + const msgs = memories.map(item => + `${item.id}. ${item.value}(重要度 ${item.importance.toFixed(2)})` + ) + + const forwardMsg = await common.makeForwardMsg(e, ['🧠 TA的记忆:', ...msgs], 'TA的记忆列表') + await e.reply(forwardMsg) return true } @@ -130,9 +161,20 @@ export class MemoryManager extends plugin { return false } await collector.flush(e.group_id) - const facts = memoryService.listGroupFacts(e.group_id, 10) - const content = formatGroupFactList(facts) - await e.reply(`📚 本群记忆:\n${content}`) + const facts = memoryService.listGroupFacts(e.group_id) + + if (!facts.length) { + await e.reply('📚 本群记忆:\n暂无群记忆。') + return true + } + + const msgs = facts.map(item => { + const topic = item.topic ? `【${item.topic}】` : '' + return `${item.id}. ${topic}${item.fact}` + }) + + const forwardMsg = await common.makeForwardMsg(e, ['📚 本群记忆:', ...msgs], '群记忆列表') + await e.reply(forwardMsg) return true } diff --git a/models/memory/router.js b/models/memory/router.js index f09c097..0395013 100644 --- a/models/memory/router.js +++ b/models/memory/router.js @@ -5,7 +5,13 @@ import path from 'path' import https from 'https' import { pipeline } from 'stream' import { promisify } from 'util' -import AdmZip from 'adm-zip' +let AdmZip +try { + AdmZip = (await import('adm-zip')).default +} catch (e) { + logger.warn('Failed to load AdmZip, maybe you need to install it manually:', e) +} +import { execSync } from "child_process" import { Chaite, ChaiteResponse, @@ -219,14 +225,28 @@ async function downloadSimpleExtensionArchive ({ assetKey, assetName, targetDir await downloadToFile(downloadUrl, tempFile) removeDirectoryIfExists(targetDir) ensureDirectoryExists(targetDir) - try { - const zip = new AdmZip(tempFile) - zip.extractAllTo(targetDir, true) - } finally { - if (fs.existsSync(tempFile)) { - fs.unlinkSync(tempFile) + if (AdmZip) { + try { + const zip = new AdmZip(tempFile) + zip.extractAllTo(targetDir, true) + } finally { + if (fs.existsSync(tempFile)) { + fs.unlinkSync(tempFile) + } + } + } else { + // 尝试使用 unzip 命令解压 + try { + execSync(`unzip "${tempFile}" -d "${targetDir}"`, { stdio: 'inherit' }) + } catch (error) { + throw new Error(`Failed to extract zip file: ${error.message}. Please install adm-zip manually: pnpm i`) + } finally { + if (fs.existsSync(tempFile)) { + fs.unlinkSync(tempFile) + } } } + const libraryFile = findLibraryFile(targetDir) if (!libraryFile) { throw new Error('Downloaded extension package does not contain libsimple library.') diff --git a/package.json b/package.json index fe76cd5..7a4e110 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chatgpt-plugin", - "version": "3.0.0-beta.1", + "version": "3.0.0", "type": "module", "author": "ikechan8370", "dependencies": { @@ -12,8 +12,10 @@ "keyv-file": "^5.1.2", "lowdb": "^7.0.1", "sqlite-vec": "^0.1.7-alpha.2", - "sqlite3": "^5.1.6", "vectra": "^0.9.0" }, + "peerDependencies": { + "sqlite3": ">=5.1.6" + }, "pnpm": {} }