From 11cc9cbc7caf5c03c5f30b722995b81fc160615e Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 13 Apr 2020 03:23:23 +0900 Subject: Resolve #5755 --- src/client/scripts/aoiscript/evaluator.ts | 37 ++++++++++++++++++++++++++++++- src/client/scripts/aoiscript/index.ts | 1 + src/client/scripts/create-aiscript-env.ts | 3 +++ 3 files changed, 40 insertions(+), 1 deletion(-) (limited to 'src/client/scripts') diff --git a/src/client/scripts/aoiscript/evaluator.ts b/src/client/scripts/aoiscript/evaluator.ts index 2e952da404..8d8a5b2e08 100644 --- a/src/client/scripts/aoiscript/evaluator.ts +++ b/src/client/scripts/aoiscript/evaluator.ts @@ -2,6 +2,8 @@ import autobind from 'autobind-decorator'; import * as seedrandom from 'seedrandom'; import { Variable, PageVar, envVarsDef, funcDefs, Block, isFnBlock } from '.'; import { version } from '../../config'; +import { AiScript, utils, parse, values } from '@syuilo/aiscript'; +import { createAiScriptEnv } from '../create-aiscript-env'; type Fn = { slots: string[]; @@ -15,15 +17,41 @@ export class ASEvaluator { private variables: Variable[]; private pageVars: PageVar[]; private envVars: Record; + public aiscript: AiScript; + private pageVarUpdatedCallback; private opts: { randomSeed: string; visitor?: any; page?: any; url?: string; }; - constructor(variables: Variable[], pageVars: PageVar[], opts: ASEvaluator['opts']) { + constructor(vm: any, variables: Variable[], pageVars: PageVar[], opts: ASEvaluator['opts']) { this.variables = variables; this.pageVars = pageVars; this.opts = opts; + this.aiscript = new AiScript({ ...createAiScriptEnv(vm, { + storageKey: 'pages:' + opts.page.id + }), ...{ + 'MkPages:updated': values.FN_NATIVE(([callback]) => { + this.pageVarUpdatedCallback = callback; + }) + }}, { + in: (q) => { + return new Promise(ok => { + vm.$root.dialog({ + title: q, + input: {} + }).then(({ canceled, result: a }) => { + ok(a); + }); + }); + }, + out: (value) => { + console.log(value); + }, + log: (type, params) => { + }, + maxStep: 16384 + }); const date = new Date(); @@ -50,6 +78,9 @@ export class ASEvaluator { const pageVar = this.pageVars.find(v => v.name === name); if (pageVar !== undefined) { pageVar.value = value; + if (this.pageVarUpdatedCallback) { + this.aiscript.execFn(this.pageVarUpdatedCallback, [values.STR(name), utils.jsToVal(value)]); + } } else { throw new AoiScriptError(`No such page var '${name}'`); } @@ -110,6 +141,10 @@ export class ASEvaluator { return scope.getState(block.value); } + if (block.type === 'aiScriptVar') { + return utils.valToJs(this.aiscript.scope.get(block.value)); + } + if (isFnBlock(block)) { // ユーザー関数定義 return { slots: block.value.slots.map(x => x.name), diff --git a/src/client/scripts/aoiscript/index.ts b/src/client/scripts/aoiscript/index.ts index 42d67b3fad..e6de5faaae 100644 --- a/src/client/scripts/aoiscript/index.ts +++ b/src/client/scripts/aoiscript/index.ts @@ -95,6 +95,7 @@ export const literalDefs: Record { + apiRequests++; + if (apiRequests > 16) return values.NULL; const res = await vm.$root.api(ep.value, utils.valToJs(param), token || null); return utils.jsToVal(res); }), -- cgit v1.2.3-freya