diff --git a/src/lib/Setting/Pages/Module/ModuleMenu.svelte b/src/lib/Setting/Pages/Module/ModuleMenu.svelte index 82e51fce..d06d16ac 100644 --- a/src/lib/Setting/Pages/Module/ModuleMenu.svelte +++ b/src/lib/Setting/Pages/Module/ModuleMenu.svelte @@ -2,6 +2,9 @@ import { language } from "src/lang"; import TextInput from "src/lib/UI/GUI/TextInput.svelte"; import LoreBookData from "src/lib/SideBars/LoreBook/LoreBookData.svelte"; + import type { loreBook } from "src/ts/storage/database.svelte"; + import LoreBookList from "src/lib/SideBars/LoreBook/LoreBookList.svelte"; + import { type CCLorebook, convertExternalLorebook } from "src/ts/process/lorebook.svelte"; import type { RisuModule } from "src/ts/process/modules"; import { DownloadIcon, FolderUpIcon, PlusIcon, TrashIcon } from "lucide-svelte"; import RegexList from "src/lib/SideBars/Scripts/RegexList.svelte"; @@ -9,7 +12,8 @@ import Check from "src/lib/UI/GUI/CheckInput.svelte"; import Help from "src/lib/Others/Help.svelte"; import TextAreaInput from "src/lib/UI/GUI/TextAreaInput.svelte"; - import { getFileSrc, openURL, saveAsset } from "src/ts/globalApi.svelte"; + import { getFileSrc, openURL, saveAsset, downloadFile } from "src/ts/globalApi.svelte"; + import { alertNormal, alertError } from "src/ts/alert"; import { exportRegex, importRegex } from "src/ts/process/scripts"; import { selectMultipleFile } from "src/ts/util"; @@ -57,6 +61,48 @@ } } + async function exportLoreBook(){ + try { + const lore = currentModule.lorebook + const stringl = Buffer.from(JSON.stringify({ + type: 'risu', + ver: 1, + data: lore + }), 'utf-8') + + await downloadFile(`lorebook_export.json`, stringl) + + alertNormal(language.successExport) + } catch (error) { + alertError(`${error}`) + } + } + + async function importLoreBook(){ + let lore = currentModule.lorebook + const lorebook = (await selectMultipleFile(['json', 'lorebook'])) + if(!lorebook){ + return + } + try { + for(const f of lorebook){ + const importedlore = JSON.parse(Buffer.from(f.data).toString('utf-8')) + if(importedlore.type === 'risu' && importedlore.data){ + const datas:loreBook[] = importedlore.data + for(const data of datas){ + lore.push(data) + } + } + else if(importedlore.entries){ + const entries:{[key:string]:CCLorebook} = importedlore.entries + lore.push(...convertExternalLorebook(entries)) + } + } + } catch (error) { + alertError(`${error}`) + } + } + function addRegex(){ if(Array.isArray(currentModule.regex)){ currentModule.regex.push({ @@ -150,17 +196,18 @@ {/if} {#if submenu === 1 && (Array.isArray(currentModule.lorebook))} -
- {#each currentModule.lorebook as lore, i} - { - currentModule.lorebook.splice(i, 1) - currentModule.lorebook = currentModule.lorebook - }}/> - {/each} + +
+ + +
- {/if} {#if submenu === 2 && (Array.isArray(currentModule.regex))} diff --git a/src/lib/SideBars/LoreBook/LoreBookList.svelte b/src/lib/SideBars/LoreBook/LoreBookList.svelte index 89b1f455..213eec65 100644 --- a/src/lib/SideBars/LoreBook/LoreBookList.svelte +++ b/src/lib/SideBars/LoreBook/LoreBookList.svelte @@ -11,9 +11,10 @@ globalMode?: boolean; submenu?: number; lorePlus?: boolean; + externalLoreBooks?: loreBook[]; } - let { globalMode = false, submenu = 0, lorePlus = false }: Props = $props(); + let { globalMode = false, submenu = 0, lorePlus = false, externalLoreBooks = null }: Props = $props(); let stb: Sortable = null let ele: HTMLDivElement = $state() let sorted = $state(0) @@ -31,6 +32,13 @@ }) DBState.db.loreBook[DBState.db.loreBookPage].data = newLore } + else if(externalLoreBooks){ + let newLore:loreBook[] = [] + idx.forEach((i) => { + newLore.push(externalLoreBooks[i]) + }) + externalLoreBooks = newLore + } else if(submenu === 1){ let newLore:loreBook[] = [] idx.forEach((i) => { @@ -97,6 +105,18 @@ }} onOpen={onOpen} onClose={onClose}/> {/each} {/if} + {:else if externalLoreBooks} + {#if externalLoreBooks.length === 0} + No Lorebook + {:else} + {#each externalLoreBooks as book, i} + { + let lore = externalLoreBooks + lore.splice(i, 1) + externalLoreBooks = lore + }} onOpen={onOpen} onClose={onClose}/> + {/each} + {/if} {:else if submenu === 0} {#if DBState.db.characters[$selectedCharID].globalLore.length === 0} No Lorebook diff --git a/src/ts/process/lorebook.svelte.ts b/src/ts/process/lorebook.svelte.ts index 973898fc..d428c6e1 100644 --- a/src/ts/process/lorebook.svelte.ts +++ b/src/ts/process/lorebook.svelte.ts @@ -516,7 +516,7 @@ export async function importLoreBook(mode:'global'|'local'|'sglobal'){ } } -interface CCLorebook{ +export interface CCLorebook{ key:string[] comment:string content:string