feat(client): Improve pages aiscript

This commit is contained in:
syuilo 2020-04-13 23:46:53 +09:00
parent 63225ed0fd
commit a19e252c9e
6 changed files with 61 additions and 37 deletions

View file

@ -42,7 +42,7 @@
"@koa/cors": "3.0.0", "@koa/cors": "3.0.0",
"@koa/multer": "2.0.2", "@koa/multer": "2.0.2",
"@koa/router": "8.0.8", "@koa/router": "8.0.8",
"@syuilo/aiscript": "0.1.4", "@syuilo/aiscript": "0.2.0",
"@types/bcryptjs": "2.4.2", "@types/bcryptjs": "2.4.2",
"@types/bull": "3.12.1", "@types/bull": "3.12.1",
"@types/cbor": "5.0.0", "@types/cbor": "5.0.0",

View file

@ -26,7 +26,7 @@ class Script {
this.aoiScript = aoiScript; this.aoiScript = aoiScript;
this.onError = onError; this.onError = onError;
if (this.page.script) { if (this.page.script && this.aoiScript.aiscript) {
let ast; let ast;
try { try {
ast = parse(this.page.script); ast = parse(this.page.script);
@ -49,8 +49,10 @@ class Script {
});*/ });*/
}); });
} else { } else {
this.eval(); setTimeout(() => {
cb(); this.eval();
cb();
}, 1);
} }
} }
@ -71,7 +73,7 @@ class Script {
} }
public callAiScript(fn: string) { public callAiScript(fn: string) {
this.aoiScript.aiscript.execFn(this.aoiScript.aiscript.scope.get(fn), []); if (this.aoiScript.aiscript) this.aoiScript.aiscript.execFn(this.aoiScript.aiscript.scope.get(fn), []);
} }
} }
@ -103,18 +105,23 @@ export default Vue.extend({
randomSeed: Math.random(), randomSeed: Math.random(),
visitor: this.$store.state.i, visitor: this.$store.state.i,
page: this.page, page: this.page,
url: url url: url,
enableAiScript: !this.$store.state.device.disablePagesScript
}), e => { }), e => {
console.dir(e); console.dir(e);
}, () => { }, () => {
this.script = s; this.script = s;
}); });
s.aoiScript.aiscript.scope.opts.onUpdated = (name, value) => { if (s.aoiScript.aiscript) s.aoiScript.aiscript.scope.opts.onUpdated = (name, value) => {
s.eval(); s.eval();
}; };
}, },
beforeDestroy() {
if (this.script.aoiScript.aiscript) this.script.aoiScript.aiscript.abort();
},
methods: { methods: {
getPageVars() { getPageVars() {
return collectPageVars(this.page.content); return collectPageVars(this.page.content);

View file

@ -65,6 +65,7 @@
<template #desc><mfm text="🍮🍦🍭🍩🍰🍫🍬🥞🍪"/></template> <template #desc><mfm text="🍮🍦🍭🍩🍰🍫🍬🥞🍪"/></template>
</mk-switch> </mk-switch>
<mk-switch v-model="showFixedPostForm">{{ $t('showFixedPostForm') }}</mk-switch> <mk-switch v-model="showFixedPostForm">{{ $t('showFixedPostForm') }}</mk-switch>
<mk-switch v-model="disablePagesScript">{{ $t('disablePagesScript') }}</mk-switch>
</div> </div>
<div class="_content"> <div class="_content">
<mk-select v-model="lang"> <mk-select v-model="lang">
@ -171,6 +172,11 @@ export default Vue.extend({
set(value) { this.$store.commit('device/set', { key: 'imageNewTab', value }); } set(value) { this.$store.commit('device/set', { key: 'imageNewTab', value }); }
}, },
disablePagesScript: {
get() { return this.$store.state.device.disablePagesScript; },
set(value) { this.$store.commit('device/set', { key: 'disablePagesScript', value }); }
},
showFixedPostForm: { showFixedPostForm: {
get() { return this.$store.state.device.showFixedPostForm; }, get() { return this.$store.state.device.showFixedPostForm; },
set(value) { this.$store.commit('device/set', { key: 'showFixedPostForm', value }); } set(value) { this.$store.commit('device/set', { key: 'showFixedPostForm', value }); }

View file

@ -17,41 +17,45 @@ export class ASEvaluator {
private variables: Variable[]; private variables: Variable[];
private pageVars: PageVar[]; private pageVars: PageVar[];
private envVars: Record<keyof typeof envVarsDef, any>; private envVars: Record<keyof typeof envVarsDef, any>;
public aiscript: AiScript; public aiscript: AiScript | undefined;
private pageVarUpdatedCallback; private pageVarUpdatedCallback;
private opts: { private opts: {
randomSeed: string; visitor?: any; page?: any; url?: string; randomSeed: string; visitor?: any; page?: any; url?: string;
enableAiScript: boolean;
}; };
constructor(vm: any, variables: Variable[], pageVars: PageVar[], opts: ASEvaluator['opts']) { constructor(vm: any, variables: Variable[], pageVars: PageVar[], opts: ASEvaluator['opts']) {
this.variables = variables; this.variables = variables;
this.pageVars = pageVars; this.pageVars = pageVars;
this.opts = opts; this.opts = opts;
this.aiscript = new AiScript({ ...createAiScriptEnv(vm, {
storageKey: 'pages:' + opts.page.id if (this.opts.enableAiScript) {
}), ...{ this.aiscript = new AiScript({ ...createAiScriptEnv(vm, {
'MkPages:updated': values.FN_NATIVE(([callback]) => { storageKey: 'pages:' + opts.page.id
this.pageVarUpdatedCallback = callback; }), ...{
}) 'MkPages:updated': values.FN_NATIVE(([callback]) => {
}}, { this.pageVarUpdatedCallback = callback;
in: (q) => { })
return new Promise(ok => { }}, {
vm.$root.dialog({ in: (q) => {
title: q, return new Promise(ok => {
input: {} vm.$root.dialog({
}).then(({ canceled, result: a }) => { title: q,
ok(a); input: {}
}).then(({ canceled, result: a }) => {
ok(a);
});
}); });
}); },
}, out: (value) => {
out: (value) => { console.log(value);
console.log(value); },
}, log: (type, params) => {
log: (type, params) => { },
}, maxStep: 16384
maxStep: 16384 });
}); }
const date = new Date(); const date = new Date();
@ -79,7 +83,7 @@ export class ASEvaluator {
if (pageVar !== undefined) { if (pageVar !== undefined) {
pageVar.value = value; pageVar.value = value;
if (this.pageVarUpdatedCallback) { if (this.pageVarUpdatedCallback) {
this.aiscript.execFn(this.pageVarUpdatedCallback, [values.STR(name), utils.jsToVal(value)]); if (this.aiscript) this.aiscript.execFn(this.pageVarUpdatedCallback, [values.STR(name), utils.jsToVal(value)]);
} }
} else { } else {
throw new AoiScriptError(`No such page var '${name}'`); throw new AoiScriptError(`No such page var '${name}'`);
@ -142,7 +146,11 @@ export class ASEvaluator {
} }
if (block.type === 'aiScriptVar') { if (block.type === 'aiScriptVar') {
return utils.valToJs(this.aiscript.scope.get(block.value)); if (this.aiscript) {
return utils.valToJs(this.aiscript.scope.get(block.value));
} else {
return null;
}
} }
if (isFnBlock(block)) { // ユーザー関数定義 if (isFnBlock(block)) { // ユーザー関数定義

View file

@ -42,6 +42,7 @@ const defaultDeviceSettings = {
animatedMfm: true, animatedMfm: true,
imageNewTab: false, imageNewTab: false,
showFixedPostForm: false, showFixedPostForm: false,
disablePagesScript: true,
sfxVolume: 0.3, sfxVolume: 0.3,
sfxNote: 'syuilo/down', sfxNote: 'syuilo/down',
sfxNoteMy: 'syuilo/up', sfxNoteMy: 'syuilo/up',

View file

@ -144,13 +144,15 @@
dependencies: dependencies:
type-detect "4.0.8" type-detect "4.0.8"
"@syuilo/aiscript@0.1.4": "@syuilo/aiscript@0.2.0":
version "0.1.4" version "0.2.0"
resolved "https://registry.yarnpkg.com/@syuilo/aiscript/-/aiscript-0.1.4.tgz#ff027552f32990ae3e29145ce6efe0a7a516b442" resolved "https://registry.yarnpkg.com/@syuilo/aiscript/-/aiscript-0.2.0.tgz#dcb489bca13f6d965ac86034a45fd46514b1487a"
integrity sha512-SMDlBInsGTL3DOe0U394X7na0N6ryYg0RGQPPtCVhXkJpVDZiaqUe5vDO+DkRyuRlkmBbN82LWToou19j/Uv8g== integrity sha512-N9fYchn3zjtniG9fNmZ81PwYZFdulk+RSBcjDZWBgHsFJQc1wxOCr9hZux/vSXrZ/ZWEzK0loNz1dorl2jJLeA==
dependencies: dependencies:
"@types/seedrandom" "2.4.28"
autobind-decorator "2.4.0" autobind-decorator "2.4.0"
chalk "4.0.0" chalk "4.0.0"
seedrandom "3.0.5"
uuid "7.0.3" uuid "7.0.3"
"@tokenizer/token@^0.1.0", "@tokenizer/token@^0.1.1": "@tokenizer/token@^0.1.0", "@tokenizer/token@^0.1.1":