summaryrefslogtreecommitdiff
path: root/src/client/scripts
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2020-04-13 03:23:23 +0900
committersyuilo <syuilotan@yahoo.co.jp>2020-04-13 03:23:23 +0900
commit11cc9cbc7caf5c03c5f30b722995b81fc160615e (patch)
tree1577e50408e75b066a9341a09c4b74e4ff280a4c /src/client/scripts
parentプロキシの除外ホスト (#6244) (diff)
downloadsharkey-11cc9cbc7caf5c03c5f30b722995b81fc160615e.tar.gz
sharkey-11cc9cbc7caf5c03c5f30b722995b81fc160615e.tar.bz2
sharkey-11cc9cbc7caf5c03c5f30b722995b81fc160615e.zip
Resolve #5755
Diffstat (limited to 'src/client/scripts')
-rw-r--r--src/client/scripts/aoiscript/evaluator.ts37
-rw-r--r--src/client/scripts/aoiscript/index.ts1
-rw-r--r--src/client/scripts/create-aiscript-env.ts3
3 files changed, 40 insertions, 1 deletions
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<keyof typeof envVarsDef, any>;
+ 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<string, { out: any; category: string; icon: any
textList: { out: 'stringArray', category: 'value', icon: faList, },
number: { out: 'number', category: 'value', icon: faSortNumericUp, },
ref: { out: null, category: 'value', icon: faMagic, },
+ aiScriptVar: { out: null, category: 'value', icon: faMagic, },
fn: { out: 'function', category: 'value', icon: faSquareRootAlt, },
};
diff --git a/src/client/scripts/create-aiscript-env.ts b/src/client/scripts/create-aiscript-env.ts
index 3f7b0c80b5..5a492c64dd 100644
--- a/src/client/scripts/create-aiscript-env.ts
+++ b/src/client/scripts/create-aiscript-env.ts
@@ -1,6 +1,7 @@
import { utils, values } from '@syuilo/aiscript';
export function createAiScriptEnv(vm, opts) {
+ let apiRequests = 0;
return {
USER_ID: values.STR(vm.$store.state.i.id),
USER_USERNAME: values.STR(vm.$store.state.i.username),
@@ -21,6 +22,8 @@ export function createAiScriptEnv(vm, opts) {
return confirm.canceled ? values.FALSE : values.TRUE
}),
'Mk:api': values.FN_NATIVE(async ([ep, param, token]) => {
+ apiRequests++;
+ if (apiRequests > 16) return values.NULL;
const res = await vm.$root.api(ep.value, utils.valToJs(param), token || null);
return utils.jsToVal(res);
}),