diff --git a/package.json b/package.json index 8fa0129cb..9146d73c7 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@koa/cors": "3.0.0", "@koa/multer": "2.0.2", "@koa/router": "8.0.8", - "@syuilo/aiscript": "0.1.4", + "@syuilo/aiscript": "0.2.0", "@types/bcryptjs": "2.4.2", "@types/bull": "3.12.1", "@types/cbor": "5.0.0", diff --git a/src/client/components/page/page.vue b/src/client/components/page/page.vue index 0f1769fc8..3723fcd3c 100644 --- a/src/client/components/page/page.vue +++ b/src/client/components/page/page.vue @@ -26,7 +26,7 @@ class Script { this.aoiScript = aoiScript; this.onError = onError; - if (this.page.script) { + if (this.page.script && this.aoiScript.aiscript) { let ast; try { ast = parse(this.page.script); @@ -49,8 +49,10 @@ class Script { });*/ }); } else { - this.eval(); - cb(); + setTimeout(() => { + this.eval(); + cb(); + }, 1); } } @@ -71,7 +73,7 @@ class Script { } 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(), visitor: this.$store.state.i, page: this.page, - url: url + url: url, + enableAiScript: !this.$store.state.device.disablePagesScript }), e => { console.dir(e); }, () => { 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(); }; }, + beforeDestroy() { + if (this.script.aoiScript.aiscript) this.script.aoiScript.aiscript.abort(); + }, + methods: { getPageVars() { return collectPageVars(this.page.content); diff --git a/src/client/pages/preferences/index.vue b/src/client/pages/preferences/index.vue index 2b1b3083a..e6d0fd0fe 100644 --- a/src/client/pages/preferences/index.vue +++ b/src/client/pages/preferences/index.vue @@ -65,6 +65,7 @@ {{ $t('showFixedPostForm') }} + {{ $t('disablePagesScript') }}
@@ -171,6 +172,11 @@ export default Vue.extend({ 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: { get() { return this.$store.state.device.showFixedPostForm; }, set(value) { this.$store.commit('device/set', { key: 'showFixedPostForm', value }); } diff --git a/src/client/scripts/aoiscript/evaluator.ts b/src/client/scripts/aoiscript/evaluator.ts index 8d8a5b2e0..40e62210b 100644 --- a/src/client/scripts/aoiscript/evaluator.ts +++ b/src/client/scripts/aoiscript/evaluator.ts @@ -17,41 +17,45 @@ export class ASEvaluator { private variables: Variable[]; private pageVars: PageVar[]; private envVars: Record; - public aiscript: AiScript; + public aiscript: AiScript | undefined; private pageVarUpdatedCallback; private opts: { randomSeed: string; visitor?: any; page?: any; url?: string; + enableAiScript: boolean; }; 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); + + if (this.opts.enableAiScript) { + 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 - }); + }, + out: (value) => { + console.log(value); + }, + log: (type, params) => { + }, + maxStep: 16384 + }); + } const date = new Date(); @@ -79,7 +83,7 @@ export class ASEvaluator { if (pageVar !== undefined) { pageVar.value = value; 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 { throw new AoiScriptError(`No such page var '${name}'`); @@ -142,7 +146,11 @@ export class ASEvaluator { } 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)) { // ユーザー関数定義 diff --git a/src/client/store.ts b/src/client/store.ts index 14c854860..0b596ba41 100644 --- a/src/client/store.ts +++ b/src/client/store.ts @@ -42,6 +42,7 @@ const defaultDeviceSettings = { animatedMfm: true, imageNewTab: false, showFixedPostForm: false, + disablePagesScript: true, sfxVolume: 0.3, sfxNote: 'syuilo/down', sfxNoteMy: 'syuilo/up', diff --git a/yarn.lock b/yarn.lock index 598ea8ee5..724488a69 100644 --- a/yarn.lock +++ b/yarn.lock @@ -144,13 +144,15 @@ dependencies: type-detect "4.0.8" -"@syuilo/aiscript@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@syuilo/aiscript/-/aiscript-0.1.4.tgz#ff027552f32990ae3e29145ce6efe0a7a516b442" - integrity sha512-SMDlBInsGTL3DOe0U394X7na0N6ryYg0RGQPPtCVhXkJpVDZiaqUe5vDO+DkRyuRlkmBbN82LWToou19j/Uv8g== +"@syuilo/aiscript@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@syuilo/aiscript/-/aiscript-0.2.0.tgz#dcb489bca13f6d965ac86034a45fd46514b1487a" + integrity sha512-N9fYchn3zjtniG9fNmZ81PwYZFdulk+RSBcjDZWBgHsFJQc1wxOCr9hZux/vSXrZ/ZWEzK0loNz1dorl2jJLeA== dependencies: + "@types/seedrandom" "2.4.28" autobind-decorator "2.4.0" chalk "4.0.0" + seedrandom "3.0.5" uuid "7.0.3" "@tokenizer/token@^0.1.0", "@tokenizer/token@^0.1.1":