diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2023-01-03 15:51:49 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2023-01-03 15:51:49 +0900 |
| commit | e44f83fb9c13e4fab8aee07603632d533d12b4d8 (patch) | |
| tree | f6600883a03876d9d966ec377ef9ac8cb8888768 /packages | |
| parent | clean up (diff) | |
| download | sharkey-e44f83fb9c13e4fab8aee07603632d533d12b4d8.tar.gz sharkey-e44f83fb9c13e4fab8aee07603632d533d12b4d8.tar.bz2 sharkey-e44f83fb9c13e4fab8aee07603632d533d12b4d8.zip | |
update AiScript to 0.12.0
Diffstat (limited to 'packages')
| -rw-r--r-- | packages/backend/package.json | 1 | ||||
| -rw-r--r-- | packages/frontend/package.json | 2 | ||||
| -rw-r--r-- | packages/frontend/src/components/page/page.vue | 30 | ||||
| -rw-r--r-- | packages/frontend/src/pages/scratchpad.vue | 8 | ||||
| -rw-r--r-- | packages/frontend/src/pages/settings/general.vue | 2 | ||||
| -rw-r--r-- | packages/frontend/src/pages/settings/plugin.install.vue | 31 | ||||
| -rw-r--r-- | packages/frontend/src/pages/settings/preferences-backups.vue | 1 | ||||
| -rw-r--r-- | packages/frontend/src/plugin.ts | 15 | ||||
| -rw-r--r-- | packages/frontend/src/scripts/hpml/evaluator.ts | 61 | ||||
| -rw-r--r-- | packages/frontend/src/scripts/hpml/lib.ts | 5 | ||||
| -rw-r--r-- | packages/frontend/src/store.ts | 4 | ||||
| -rw-r--r-- | packages/frontend/src/widgets/aiscript.vue | 8 | ||||
| -rw-r--r-- | packages/frontend/src/widgets/button.vue | 8 |
13 files changed, 56 insertions, 120 deletions
diff --git a/packages/backend/package.json b/packages/backend/package.json index e4e3274c0b..e78b3ef70a 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -37,7 +37,6 @@ "@nestjs/testing": "9.2.1", "@peertube/http-signature": "1.7.0", "@sinonjs/fake-timers": "10.0.2", - "@syuilo/aiscript": "0.11.1", "accepts": "^1.3.8", "ajv": "8.11.2", "archiver": "5.3.1", diff --git a/packages/frontend/package.json b/packages/frontend/package.json index e380165681..2506e8e9d3 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -11,7 +11,7 @@ "@rollup/plugin-alias": "4.0.2", "@rollup/plugin-json": "6.0.0", "@rollup/pluginutils": "5.0.2", - "@syuilo/aiscript": "0.11.1", + "@syuilo/aiscript": "0.12.0", "@tabler/icons": "^1.118.0", "@vitejs/plugin-vue": "4.0.0", "@vue/compiler-sfc": "3.2.45", diff --git a/packages/frontend/src/components/page/page.vue b/packages/frontend/src/components/page/page.vue index b5cb73c009..87a288befe 100644 --- a/packages/frontend/src/components/page/page.vue +++ b/packages/frontend/src/components/page/page.vue @@ -6,7 +6,6 @@ <script lang="ts"> import { defineComponent, onMounted, nextTick, onUnmounted, PropType } from 'vue'; -import { parse } from '@syuilo/aiscript'; import XBlock from './page.block.vue'; import { Hpml } from '@/scripts/hpml/evaluator'; import { url } from '@/config'; @@ -28,38 +27,11 @@ export default defineComponent({ randomSeed: Math.random(), visitor: $i, url: url, - enableAiScript: !defaultStore.state.disablePagesScript, }); onMounted(() => { nextTick(() => { - if (props.page.script && hpml.aiscript) { - let ast; - try { - ast = parse(props.page.script); - } catch (err) { - console.error(err); - /*os.alert({ - type: 'error', - text: 'Syntax error :(' - });*/ - return; - } - hpml.aiscript.exec(ast).then(() => { - hpml.eval(); - }).catch(err => { - console.error(err); - /*os.alert({ - type: 'error', - text: err - });*/ - }); - } else { - hpml.eval(); - } - }); - onUnmounted(() => { - if (hpml.aiscript) hpml.aiscript.abort(); + hpml.eval(); }); }); diff --git a/packages/frontend/src/pages/scratchpad.vue b/packages/frontend/src/pages/scratchpad.vue index edb2d8e18c..9db17efc03 100644 --- a/packages/frontend/src/pages/scratchpad.vue +++ b/packages/frontend/src/pages/scratchpad.vue @@ -27,7 +27,7 @@ import 'prismjs/components/prism-javascript'; import 'prismjs/themes/prism-okaidia.css'; import { PrismEditor } from 'vue-prism-editor'; import 'vue-prism-editor/dist/prismeditor.min.css'; -import { AiScript, parse, utils } from '@syuilo/aiscript'; +import { Interpreter, Parser, utils } from '@syuilo/aiscript'; import MkContainer from '@/components/MkContainer.vue'; import MkButton from '@/components/MkButton.vue'; import { createAiScriptEnv } from '@/scripts/aiscript/api'; @@ -36,6 +36,8 @@ import { $i } from '@/account'; import { i18n } from '@/i18n'; import { definePageMetadata } from '@/scripts/page-metadata'; +const parser = new Parser(); + const code = ref(''); const logs = ref<any[]>([]); @@ -50,7 +52,7 @@ watch(code, () => { async function run() { logs.value = []; - const aiscript = new AiScript(createAiScriptEnv({ + const aiscript = new Interpreter(createAiScriptEnv({ storageKey: 'scratchpad', token: $i?.token, }), { @@ -84,7 +86,7 @@ async function run() { let ast; try { - ast = parse(code.value); + ast = parser.parse(code.value); } catch (error) { os.alert({ type: 'error', diff --git a/packages/frontend/src/pages/settings/general.vue b/packages/frontend/src/pages/settings/general.vue index 84d99d2fd7..b426ccfa0a 100644 --- a/packages/frontend/src/pages/settings/general.vue +++ b/packages/frontend/src/pages/settings/general.vue @@ -27,7 +27,6 @@ <FormSwitch v-model="imageNewTab" class="_formBlock">{{ i18n.ts.openImageInNewTab }}</FormSwitch> <FormSwitch v-model="enableInfiniteScroll" class="_formBlock">{{ i18n.ts.enableInfiniteScroll }}</FormSwitch> <FormSwitch v-model="useReactionPickerForContextMenu" class="_formBlock">{{ i18n.ts.useReactionPickerForContextMenu }}</FormSwitch> - <FormSwitch v-model="disablePagesScript" class="_formBlock">{{ i18n.ts.disablePagesScript }}</FormSwitch> <FormSelect v-model="serverDisconnectedBehavior" class="_formBlock"> <template #label>{{ i18n.ts.whenServerDisconnected }}</template> @@ -141,7 +140,6 @@ const disableShowingAnimatedImages = computed(defaultStore.makeGetterSetter('dis const loadRawImages = computed(defaultStore.makeGetterSetter('loadRawImages')); const imageNewTab = computed(defaultStore.makeGetterSetter('imageNewTab')); const nsfw = computed(defaultStore.makeGetterSetter('nsfw')); -const disablePagesScript = computed(defaultStore.makeGetterSetter('disablePagesScript')); const showFixedPostForm = computed(defaultStore.makeGetterSetter('showFixedPostForm')); const numberOfPageCache = computed(defaultStore.makeGetterSetter('numberOfPageCache')); const instanceTicker = computed(defaultStore.makeGetterSetter('instanceTicker')); diff --git a/packages/frontend/src/pages/settings/plugin.install.vue b/packages/frontend/src/pages/settings/plugin.install.vue index 550bba242e..40ad9a95dd 100644 --- a/packages/frontend/src/pages/settings/plugin.install.vue +++ b/packages/frontend/src/pages/settings/plugin.install.vue @@ -14,8 +14,7 @@ <script lang="ts" setup> import { defineAsyncComponent, nextTick, ref } from 'vue'; -import { AiScript, parse } from '@syuilo/aiscript'; -import { serialize } from '@syuilo/aiscript/built/serializer'; +import { Interpreter, Parser, utils } from '@syuilo/aiscript'; import { v4 as uuid } from 'uuid'; import FormTextarea from '@/components/form/textarea.vue'; import FormButton from '@/components/MkButton.vue'; @@ -26,23 +25,41 @@ import { unisonReload } from '@/scripts/unison-reload'; import { i18n } from '@/i18n'; import { definePageMetadata } from '@/scripts/page-metadata'; +const parser = new Parser(); const code = ref(null); -function installPlugin({ id, meta, ast, token }) { +function installPlugin({ id, meta, src, token }) { ColdDeviceStorage.set('plugins', ColdDeviceStorage.get('plugins').concat({ ...meta, id, active: true, configData: {}, token: token, - ast: ast, + src: src, })); } async function install() { + if (code.value == null) return; + + const lv = utils.getLangVersion(code.value); + if (lv == null) { + os.alert({ + type: 'error', + text: 'No language version annotation found :(', + }); + return; + } else if (lv !== '0.12.0') { + os.alert({ + type: 'error', + text: `aiscript version '${lv}' is not supported :(`, + }); + return; + } + let ast; try { - ast = parse(code.value); + ast = parser.parse(code.value); } catch (err) { os.alert({ type: 'error', @@ -51,7 +68,7 @@ async function install() { return; } - const meta = AiScript.collectMetadata(ast); + const meta = Interpreter.collectMetadata(ast); if (meta == null) { os.alert({ type: 'error', @@ -103,7 +120,7 @@ async function install() { name, version, author, description, permissions, config, }, token, - ast: serialize(ast), + src: code.value, }); os.success(); diff --git a/packages/frontend/src/pages/settings/preferences-backups.vue b/packages/frontend/src/pages/settings/preferences-backups.vue index 8b7548f25b..a713c1262d 100644 --- a/packages/frontend/src/pages/settings/preferences-backups.vue +++ b/packages/frontend/src/pages/settings/preferences-backups.vue @@ -62,7 +62,6 @@ const defaultStoreSaveKeys: (keyof typeof defaultStore['state'])[] = [ 'loadRawImages', 'imageNewTab', 'disableShowingAnimatedImages', - 'disablePagesScript', 'emojiStyle', 'disableDrawer', 'useBlurEffectForModal', diff --git a/packages/frontend/src/plugin.ts b/packages/frontend/src/plugin.ts index 3a00cd0455..c19fe2b08d 100644 --- a/packages/frontend/src/plugin.ts +++ b/packages/frontend/src/plugin.ts @@ -1,16 +1,17 @@ -import { AiScript, utils, values } from '@syuilo/aiscript'; -import { deserialize } from '@syuilo/aiscript/built/serializer'; -import { jsToVal } from '@syuilo/aiscript/built/interpreter/util'; +import { Interpreter, Parser, utils, values } from '@syuilo/aiscript'; import { createAiScriptEnv } from '@/scripts/aiscript/api'; import { inputText } from '@/os'; import { noteActions, notePostInterruptors, noteViewInterruptors, postFormActions, userActions } from '@/store'; -const pluginContexts = new Map<string, AiScript>(); +const parser = new Parser(); +const pluginContexts = new Map<string, Interpreter>(); export function install(plugin) { + // 後方互換性のため + if (plugin.src == null) return; console.info('Plugin installed:', plugin.name, 'v' + plugin.version); - const aiscript = new AiScript(createPluginEnv({ + const aiscript = new Interpreter(createPluginEnv({ plugin: plugin, storageKey: 'plugins:' + plugin.id, }), { @@ -32,13 +33,13 @@ export function install(plugin) { initPlugin({ plugin, aiscript }); - aiscript.exec(deserialize(plugin.ast)); + aiscript.exec(parser.parse(plugin.src)); } function createPluginEnv(opts) { const config = new Map(); for (const [k, v] of Object.entries(opts.plugin.config || {})) { - config.set(k, jsToVal(typeof opts.plugin.configData[k] !== 'undefined' ? opts.plugin.configData[k] : v.default)); + config.set(k, utils.jsToVal(typeof opts.plugin.configData[k] !== 'undefined' ? opts.plugin.configData[k] : v.default)); } return { diff --git a/packages/frontend/src/scripts/hpml/evaluator.ts b/packages/frontend/src/scripts/hpml/evaluator.ts index 196b3142a1..d4090ea15c 100644 --- a/packages/frontend/src/scripts/hpml/evaluator.ts +++ b/packages/frontend/src/scripts/hpml/evaluator.ts @@ -1,13 +1,11 @@ import autobind from 'autobind-decorator'; -import { PageVar, envVarsDef, Fn, HpmlScope, HpmlError } from '.'; -import { version } from '@/config'; -import { AiScript, utils, values } from '@syuilo/aiscript'; -import { createAiScriptEnv } from '../aiscript/api'; +import { markRaw, ref, Ref, unref } from 'vue'; import { collectPageVars } from '../collect-page-vars'; import { initHpmlLib, initAiLib } from './lib'; -import * as os from '@/os'; -import { markRaw, ref, Ref, unref } from 'vue'; import { Expr, isLiteralValue, Variable } from './expr'; +import { PageVar, envVarsDef, Fn, HpmlScope, HpmlError } from '.'; +import { version } from '@/config'; +import * as os from '@/os'; /** * Hpml evaluator @@ -16,7 +14,6 @@ export class Hpml { private variables: Variable[]; private pageVars: PageVar[]; private envVars: Record<keyof typeof envVarsDef, any>; - public aiscript?: AiScript; public pageVarUpdatedCallback?: values.VFn; public canvases: Record<string, HTMLCanvasElement> = {}; public vars: Ref<Record<string, any>> = ref({}); @@ -24,7 +21,6 @@ export class Hpml { private opts: { randomSeed: string; visitor?: any; url?: string; - enableAiScript: boolean; }; constructor(page: Hpml['page'], opts: Hpml['opts']) { @@ -33,31 +29,6 @@ export class Hpml { this.pageVars = collectPageVars(this.page.content); this.opts = opts; - if (this.opts.enableAiScript) { - this.aiscript = markRaw(new AiScript({ ...createAiScriptEnv({ - storageKey: 'pages:' + this.page.id, - }), ...initAiLib(this) }, { - in: (q) => { - return new Promise(ok => { - os.inputText({ - title: q, - }).then(({ canceled, result: a }) => { - ok(a); - }); - }); - }, - out: (value) => { - console.log(value); - }, - log: (type, params) => { - }, - })); - - this.aiscript.scope.opts.onUpdated = (name, value) => { - this.eval(); - }; - } - const date = new Date(); this.envVars = { @@ -74,7 +45,7 @@ export class Hpml { IS_CAT: opts.visitor ? opts.visitor.isCat : false, SEED: opts.randomSeed ? opts.randomSeed : '', YMD: `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`, - AISCRIPT_DISABLED: !this.opts.enableAiScript, + AISCRIPT_DISABLED: true, NULL: null, }; @@ -100,13 +71,6 @@ export class Hpml { } @autobind - public callAiScript(fn: string) { - try { - if (this.aiscript) this.aiscript.execFn(this.aiscript.scope.get(fn), []); - } catch (err) {} - } - - @autobind public registerCanvas(id: string, canvas: any) { this.canvases[id] = canvas; } @@ -116,9 +80,6 @@ export class Hpml { const pageVar = this.pageVars.find(v => v.name === name); if (pageVar !== undefined) { pageVar.value = value; - if (this.pageVarUpdatedCallback) { - if (this.aiscript) this.aiscript.execFn(this.pageVarUpdatedCallback, [values.STR(name), utils.jsToVal(value)]); - } } else { throw new HpmlError(`No such page var '${name}'`); } @@ -180,18 +141,6 @@ export class Hpml { return scope.getState(expr.value); } - if (expr.type === 'aiScriptVar') { - if (this.aiscript) { - try { - return utils.valToJs(this.aiscript.scope.get(expr.value)); - } catch (err) { - return null; - } - } else { - return null; - } - } - // Define user function if (expr.type === 'fn') { return { diff --git a/packages/frontend/src/scripts/hpml/lib.ts b/packages/frontend/src/scripts/hpml/lib.ts index b684876a7f..02d663b31b 100644 --- a/packages/frontend/src/scripts/hpml/lib.ts +++ b/packages/frontend/src/scripts/hpml/lib.ts @@ -1,9 +1,8 @@ import tinycolor from 'tinycolor2'; +import seedrandom from 'seedrandom'; import { Hpml } from './evaluator'; -import { values, utils } from '@syuilo/aiscript'; -import { Fn, HpmlScope } from '.'; import { Expr } from './expr'; -import seedrandom from 'seedrandom'; +import { Fn, HpmlScope } from '.'; /* TODO: https://www.chartjs.org/docs/latest/configuration/canvas-background.html#color // https://stackoverflow.com/questions/38493564/chart-area-background-color-chartjs diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts index 8e3e6b36da..4b1f47c2bc 100644 --- a/packages/frontend/src/store.ts +++ b/packages/frontend/src/store.ts @@ -170,10 +170,6 @@ export const defaultStore = markRaw(new Storage('base', { where: 'device', default: false, }, - disablePagesScript: { - where: 'device', - default: false, - }, emojiStyle: { where: 'device', default: 'twemoji', // twemoji / fluentEmoji / native diff --git a/packages/frontend/src/widgets/aiscript.vue b/packages/frontend/src/widgets/aiscript.vue index 4009edb8b8..dcc73db201 100644 --- a/packages/frontend/src/widgets/aiscript.vue +++ b/packages/frontend/src/widgets/aiscript.vue @@ -14,7 +14,7 @@ <script lang="ts" setup> import { onMounted, onUnmounted, ref, watch } from 'vue'; -import { AiScript, parse, utils } from '@syuilo/aiscript'; +import { Interpreter, Parser, utils } from '@syuilo/aiscript'; import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget'; import { GetFormResultType } from '@/scripts/form'; import * as os from '@/os'; @@ -52,6 +52,8 @@ const { widgetProps, configure } = useWidgetPropsManager(name, emit, ); +const parser = new Parser(); + const logs = ref<{ id: string; text: string; @@ -60,7 +62,7 @@ const logs = ref<{ const run = async () => { logs.value = []; - const aiscript = new AiScript(createAiScriptEnv({ + const aiscript = new Interpreter(createAiScriptEnv({ storageKey: 'widget', token: $i?.token, }), { @@ -94,7 +96,7 @@ const run = async () => { let ast; try { - ast = parse(widgetProps.script); + ast = parser.parse(widgetProps.script); } catch (err) { os.alert({ type: 'error', diff --git a/packages/frontend/src/widgets/button.vue b/packages/frontend/src/widgets/button.vue index f0148d7f4e..f65b115cc0 100644 --- a/packages/frontend/src/widgets/button.vue +++ b/packages/frontend/src/widgets/button.vue @@ -8,7 +8,7 @@ <script lang="ts" setup> import { onMounted, onUnmounted, ref, watch } from 'vue'; -import { AiScript, parse, utils } from '@syuilo/aiscript'; +import { Interpreter, Parser, utils } from '@syuilo/aiscript'; import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget'; import { GetFormResultType } from '@/scripts/form'; import * as os from '@/os'; @@ -48,8 +48,10 @@ const { widgetProps, configure } = useWidgetPropsManager(name, emit, ); +const parser = new Parser(); + const run = async () => { - const aiscript = new AiScript(createAiScriptEnv({ + const aiscript = new Interpreter(createAiScriptEnv({ storageKey: 'widget', token: $i?.token, }), { @@ -72,7 +74,7 @@ const run = async () => { let ast; try { - ast = parse(widgetProps.script); + ast = parser.parse(widgetProps.script); } catch (err) { os.alert({ type: 'error', |