From 68382cb38e6b21fbf8f58cc0b99e6b1a28c13247 Mon Sep 17 00:00:00 2001 From: kwaroran Date: Wed, 7 Feb 2024 02:21:16 +0900 Subject: [PATCH] Add Modules --- src/lang/en.ts | 13 ++ src/lib/ChatScreens/ChatScreen.svelte | 10 +- src/lib/ChatScreens/DefaultChatScreen.svelte | 17 +- .../Pages/Module/ModuleChatMenu.svelte | 77 +++++++++ .../Setting/Pages/Module/ModuleMenu.svelte | 153 ++++++++++++++++++ .../Pages/Module/ModuleSettings.svelte | 109 +++++++++++++ src/lib/Setting/Settings.svelte | 21 ++- src/lib/SideBars/Scripts/RegexList.svelte | 2 +- src/lib/SideBars/Scripts/TriggerList.svelte | 2 +- src/ts/process/lorebook.ts | 5 +- src/ts/process/modules.ts | 120 ++++++++++++++ src/ts/process/scripts.ts | 3 +- src/ts/process/triggers.ts | 3 +- src/ts/storage/database.ts | 6 + src/ts/storage/globalApi.ts | 6 +- 15 files changed, 527 insertions(+), 20 deletions(-) create mode 100644 src/lib/Setting/Pages/Module/ModuleChatMenu.svelte create mode 100644 src/lib/Setting/Pages/Module/ModuleMenu.svelte create mode 100644 src/lib/Setting/Pages/Module/ModuleSettings.svelte create mode 100644 src/ts/process/modules.ts diff --git a/src/lang/en.ts b/src/lang/en.ts index 5975574f..c823c24e 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -515,4 +515,17 @@ export const languageEnglish = { license: "License", licenseDesc: "You can choose license for the downloaders to limit the usages of your card's prompt.", passwordDesc: "You can set a password to protect your card from unauthorized access.", + module: "Module", + modules: "Modules", + noModules: "No modules has been installed.", + createModule: "Create Module", + basicInfo: "Basic Info", + moduleContent: "Module Content", + confirmRemoveModuleFeature: "Do you really want to remove this feature? This action cannot be undone.", + editModule: "Edit Module", + importModule: "Import Module", + download: "Download", + edit: "Edit", + enableGlobal: "Enable Globally", + chatModulesInfo: "You can enable or disable modules for this chat.", } \ No newline at end of file diff --git a/src/lib/ChatScreens/ChatScreen.svelte b/src/lib/ChatScreens/ChatScreen.svelte index 01fe227f..c5500d79 100644 --- a/src/lib/ChatScreens/ChatScreen.svelte +++ b/src/lib/ChatScreens/ChatScreen.svelte @@ -10,7 +10,9 @@ import BackgroundDom from "./BackgroundDom.svelte"; import SideBarArrow from "../UI/GUI/SideBarArrow.svelte"; import VisualNovelMain from "../VisualNovel/VisualNovelMain.svelte"; + import ModuleChatMenu from "../Setting/Pages/Module/ModuleChatMenu.svelte"; let openChatList = false + let openModuleList = false const wallPaper = `background: url(${defaultWallpaper})` const externalStyles = @@ -40,7 +42,7 @@ {/if} {/if} - 2 ? `${externalStyles}`: ''} bind:openChatList/> + 2 ? `${externalStyles}`: ''} bind:openChatList bind:openModuleList/> {:else if $DataBase.theme === 'waifu'} @@ -55,7 +57,7 @@ {/if} {/if}
= 0 && $CurrentCharacter.viewScreen !== 'none'}> - +
{:else if $DataBase.theme === 'waifuMobile'} @@ -66,7 +68,7 @@ class:per33={$selectedCharID >= 0 && $CurrentCharacter.viewScreen !== 'none'} class:h-full={!($selectedCharID >= 0 && $CurrentCharacter.viewScreen !== 'none')} > - + {#if $selectedCharID >= 0} {#if $CurrentCharacter.viewScreen !== 'none'} @@ -79,6 +81,8 @@ {/if} {#if openChatList} {openChatList = false}}/> +{:else if openModuleList} + {openModuleList = false}}/> {/if} \ No newline at end of file diff --git a/src/lib/Setting/Pages/Module/ModuleMenu.svelte b/src/lib/Setting/Pages/Module/ModuleMenu.svelte new file mode 100644 index 00000000..f3d5e04e --- /dev/null +++ b/src/lib/Setting/Pages/Module/ModuleMenu.svelte @@ -0,0 +1,153 @@ + + +{language.basicInfo} + + +{language.moduleContent} +
+ + + + +
+ +{#if (Array.isArray(currentModule.lorebook))} + {language.loreBook} +
+ {#each currentModule.lorebook as lore, i} + { + currentModule.lorebook.splice(i, 1) + currentModule.lorebook = currentModule.lorebook + }}/> + {/each} +
+ +{/if} + +{#if (Array.isArray(currentModule.regex))} + {language.regexScript} + + +{/if} + +{#if (Array.isArray(currentModule.trigger))} + {language.triggerScript} + + +{/if} \ No newline at end of file diff --git a/src/lib/Setting/Pages/Module/ModuleSettings.svelte b/src/lib/Setting/Pages/Module/ModuleSettings.svelte new file mode 100644 index 00000000..e3275f94 --- /dev/null +++ b/src/lib/Setting/Pages/Module/ModuleSettings.svelte @@ -0,0 +1,109 @@ + +{#if mode === 0} +

{language.modules}

+ +
+ {#if $DataBase.modules.length === 0} +
{language.noModules}
+ {:else} + {#each $DataBase.modules as rmodule, i} + {#if i !== 0} +
+ {/if} + +
+ {rmodule.name} +
+ + + + +
+
+
+ {rmodule.description || 'No description provided'} +
+ {/each} + {/if} +
+ + +{:else if mode === 1} +

{language.createModule}

+ + {#if tempModule.name !== ''} + + {/if} +{:else if mode === 2} +

{language.editModule}

+ + {#if tempModule.name !== ''} + + {/if} +{/if} \ No newline at end of file diff --git a/src/lib/Setting/Settings.svelte b/src/lib/Setting/Settings.svelte index 619aef96..3c4713d9 100644 --- a/src/lib/Setting/Settings.svelte +++ b/src/lib/Setting/Settings.svelte @@ -1,5 +1,5 @@ -
+
{#if value.length === 0}
No Scripts
{/if} diff --git a/src/lib/SideBars/Scripts/TriggerList.svelte b/src/lib/SideBars/Scripts/TriggerList.svelte index 4a82ec09..80382b4b 100644 --- a/src/lib/SideBars/Scripts/TriggerList.svelte +++ b/src/lib/SideBars/Scripts/TriggerList.svelte @@ -7,7 +7,7 @@ -
+
{#if value.length === 0}
No Scripts
{/if} diff --git a/src/ts/process/lorebook.ts b/src/ts/process/lorebook.ts index c1dd272e..08f4c262 100644 --- a/src/ts/process/lorebook.ts +++ b/src/ts/process/lorebook.ts @@ -7,6 +7,7 @@ import { alertError, alertNormal } from "../alert"; import { language } from "../../lang"; import { downloadFile } from "../storage/globalApi"; import { HypaProcesser } from "./memory/hypamemory"; +import { getModuleLorebooks } from "./modules"; export function addLorebook(type:number) { let selectedID = get(selectedCharID) @@ -71,12 +72,12 @@ export async function loadLoreBookPrompt(){ const characterLore = char.globalLore ?? [] const chatLore = char.chats[page].localLore ?? [] const globalLore = db.loreBook[db.loreBookPage]?.data ?? [] - const fullLore = characterLore.concat(chatLore.concat(globalLore)) + const moduleLorebook = getModuleLorebooks() + const fullLore = characterLore.concat(chatLore).concat(moduleLorebook).concat(globalLore) const currentChat = char.chats[page].message const loreDepth = char.loreSettings?.scanDepth ?? db.loreBookDepth const loreToken = char.loreSettings?.tokenBudget ?? db.loreBookToken const fullWordMatching = char.loreSettings?.fullWordMatching ?? false - if(char.lorePlus){ return await loadLoreBookPlusPrompt() } diff --git a/src/ts/process/modules.ts b/src/ts/process/modules.ts new file mode 100644 index 00000000..23c2d028 --- /dev/null +++ b/src/ts/process/modules.ts @@ -0,0 +1,120 @@ +import { language } from "src/lang" +import { alertError, alertNormal } from "../alert" +import { DataBase, type customscript, type loreBook, type triggerscript } from "../storage/database" +import { downloadFile } from "../storage/globalApi" +import { get } from "svelte/store" +import { CurrentChat } from "../stores" +import { selectSingleFile } from "../util" +import { v4 } from "uuid" + +export interface RisuModule{ + name: string + description: string + lorebook?: loreBook[] + regex?: customscript[] + cjs?: string + trigger?: triggerscript[] + id: string +} + +export async function exportModule(module:RisuModule){ + await downloadFile(module.name + '.json', JSON.stringify({ + ...module, + type: 'risuModule' + }, null, 2)) + alertNormal(language.successExport) +} + +export async function importModule(){ + const f = await selectSingleFile(['json']) + if(!f){ + return + } + const file = f.data + try { + const importedModule = JSON.parse(Buffer.from(file).toString()) + if(importedModule.type === 'risuModule'){ + const db = get(DataBase) + if( + (!importedModule.name) + || (!importedModule.description) + || (!importedModule.id) + ){ + alertError(language.errors.noData) + } + importedModule.id = v4() + db.modules.push(importedModule) + } + } catch (error) { + alertNormal(language.errors.noData) + } +} + +function getModuleById(id:string){ + const db = get(DataBase) + for(let i=0;i { const a = document.createElement('a') a.href = data