diff --git a/public/pluginApi.js b/public/pluginApi.js index d903acff..1c62fd59 100644 --- a/public/pluginApi.js +++ b/public/pluginApi.js @@ -173,6 +173,17 @@ var __generator = (this && this.__generator) || function (thisArg, body) { body: char }); } + function addCharaJs(code, position) { + if (position === void 0) { position = 'back'; } + var codeString = code.toString().replace(/.+?\{/, '{'); + postMessage({ + type: 'addCharaJs', + body: { + code: codeString, + position: position + } + }); + } function handleOnmessage(data) { return __awaiter(this, void 0, void 0, function () { var _a, body, providers, providerfunc, _i, providers_1, provider, _b, error_1; diff --git a/public/pluginApi.ts b/public/pluginApi.ts index 2d44492f..d2cd05c0 100644 --- a/public/pluginApi.ts +++ b/public/pluginApi.ts @@ -119,6 +119,17 @@ body: char }) } + + function addCharaJs(code:Function, position:'front'|'back' = 'back'){ + const codeString = code.toString().replace(/.+?\{/, '{') + postMessage({ + type: 'addCharaJs', + body: { + code: codeString, + position: position + } + }) + } async function handleOnmessage(data:{type:string,body:any}) { if(!data.type){ diff --git a/src/ts/plugins/embedscript.ts b/src/ts/plugins/embedscript.ts index 66854b24..002daaf1 100644 --- a/src/ts/plugins/embedscript.ts +++ b/src/ts/plugins/embedscript.ts @@ -10,6 +10,17 @@ import { setDatabase } from '../storage/database' let worker = new Worker(WorkerUrl, {type: 'module'}) +let additionalCharaJS:string[] = [] + +export function addAdditionalCharaJS(code:string, position:'front'|'back' = 'back'){ + if(position === 'front'){ + additionalCharaJS.unshift(code) + } + else{ + additionalCharaJS.push(code) + } +} + let results:{ id: string, result: any @@ -208,8 +219,7 @@ addWorkerFunction('setState', async (statename, data) => { -let lastCode = '' -let lastModeList:string[] = [] +let compCode:{[key:string]:string[]} = {} export async function runCharacterJS(arg:{ code: string|null, @@ -230,30 +240,51 @@ export async function runCharacterJS(arg:{ 'onButtonClick': "onButtonClick" } as const - if(lastCode !== arg.code){ - lastModeList = [] - const codesplit = arg.code.split('\n') - for(let i = 0; i < codesplit.length; i++){ - const line = codesplit[i] - if(line.startsWith('//@use')){ - lastModeList.push(line.replace('//@use','').trim()) + let runCodes = [...additionalCharaJS, arg.code] + + let r = arg.data + + for(const code of runCodes){ + if(!code){ + continue + } + if(!compCode[code]){ + let modeList:string[] = [] + const codesplit = code.split('\n') + for(let i = 0; i < codesplit.length; i++){ + const line = codesplit[i].trim() + if(line.startsWith('//@use')){ + modeList.push(line.replace('//@use','').trim()) + } + } + compCode[code] = modeList + // compcode length max 100 + if(Object.keys(compCode).length > 100){ + delete compCode[Object.keys(compCode)[50]] } } - lastCode = arg.code - } - const runCode = codes[arg.mode] + const runCode = codes[arg.mode] - if(!lastModeList.includes(runCode)){ - return arg.data - } - const result = await runVirtualJS(`${arg.code}\n${runCode}(${JSON.stringify(arg.data)})`) + console.log(compCode[code]) - if(!result){ - return arg.data + if(!compCode[code].includes(runCode)){ + continue + } + const result = await runVirtualJS(`${code}\n${runCode}(${JSON.stringify(r)})`) + + if(!result){ + continue + } + + r = result.toString() + + if(runCode === 'onButtonClick'){ + return r + } } - - return result.toString() + return r + } catch (error) { if(arg.mode !== 'editprocess'){ return `Error: ${error}` diff --git a/src/ts/plugins/plugins.ts b/src/ts/plugins/plugins.ts index ad987be3..3acfa1d1 100644 --- a/src/ts/plugins/plugins.ts +++ b/src/ts/plugins/plugins.ts @@ -6,6 +6,7 @@ import { checkNullish, selectSingleFile, sleep } from "../util"; import type { OpenAIChat } from "../process"; import { globalFetch } from "../storage/globalApi"; import { selectedCharID } from "../stores"; +import { addAdditionalCharaJS } from "./embedscript"; export const customProviderStore = writable([] as string[]) @@ -206,6 +207,15 @@ export async function loadPlugins() { }) break } + case 'addCharaJs': { + let c:string = data.body.code + c.trim() + if(c.startsWith('{') && c.endsWith('}')){ + c = c.slice(1, -1) + } + addAdditionalCharaJS(c, data.body.position) + break + } case "getArg":{ try { const db = get(DataBase) diff --git a/src/ts/process/scripts.ts b/src/ts/process/scripts.ts index 51cd1fc4..0c86592c 100644 --- a/src/ts/process/scripts.ts +++ b/src/ts/process/scripts.ts @@ -62,13 +62,11 @@ export async function processScriptFull(char:character|groupChat|simpleCharacter if(db.officialplugins.automark && mode === 'editdisplay'){ data = autoMarkPlugin(data) } - if(char.virtualscript){ - data = await runCharacterJS({ - code: char.virtualscript, - mode, - data, - }) - } + data = await runCharacterJS({ + code: char.virtualscript ?? null, + mode, + data, + }) if(scripts.length === 0){ return {data, emoChanged} }