diff --git a/src/client/components/post-form.vue b/src/client/components/post-form.vue index f0de602c29..307501b78a 100644 --- a/src/client/components/post-form.vue +++ b/src/client/components/post-form.vue @@ -69,6 +69,7 @@ import getAcct from '../../misc/acct/render'; import { formatTimeString } from '../../misc/format-time-string'; import { selectDriveFile } from '../scripts/select-drive-file'; import { noteVisibilities } from '../../types'; +import { utils } from '@syuilo/aiscript'; export default Vue.extend({ components: { @@ -533,9 +534,8 @@ export default Vue.extend({ localStorage.setItem('drafts', JSON.stringify(data)); }, - post() { - this.posting = true; - this.$root.api('notes/create', { + async post() { + let data = { text: this.text == '' ? undefined : this.text, fileIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined, replyId: this.reply ? this.reply.id : undefined, @@ -546,7 +546,17 @@ export default Vue.extend({ visibility: this.visibility, visibleUserIds: this.visibility == 'specified' ? this.visibleUsers.map(u => u.id) : undefined, viaMobile: this.$root.isMobile - }).then(data => { + }; + + // plugin + if (this.$store.state.notePostInterruptors.length > 0) { + for (const interruptor of this.$store.state.notePostInterruptors) { + data = utils.valToJs(await interruptor.handler(JSON.parse(JSON.stringify(data)))); + } + } + + this.posting = true; + this.$root.api('notes/create', data).then(() => { this.clear(); this.deleteDraft(); this.$emit('posted'); diff --git a/src/client/scripts/aiscript/api.ts b/src/client/scripts/aiscript/api.ts index f3ab6c372a..d9f311bde3 100644 --- a/src/client/scripts/aiscript/api.ts +++ b/src/client/scripts/aiscript/api.ts @@ -73,6 +73,9 @@ export function createPluginEnv(vm, opts) { 'Plugin:register_note_view_interruptor': values.FN_NATIVE(([handler]) => { vm.$store.commit('registerNoteViewInterruptor', { pluginId: opts.plugin.id, handler }); }), + 'Plugin:register_note_post_interruptor': values.FN_NATIVE(([handler]) => { + vm.$store.commit('registerNotePostInterruptor', { pluginId: opts.plugin.id, handler }); + }), 'Plugin:open_url': values.FN_NATIVE(([url]) => { window.open(url.value, '_blank'); }), diff --git a/src/client/store.ts b/src/client/store.ts index 7046e10f98..0e16115903 100644 --- a/src/client/store.ts +++ b/src/client/store.ts @@ -112,6 +112,7 @@ export default () => new Vuex.Store({ userActions: [], noteActions: [], noteViewInterruptors: [], + notePostInterruptors: [], }, getters: { @@ -283,6 +284,14 @@ export default () => new Vuex.Store({ } }); }, + + registerNotePostInterruptor(state, { pluginId, handler }) { + state.notePostInterruptors.push({ + handler: (note) => { + return state.pluginContexts.get(pluginId).execFn(handler, [utils.jsToVal(note)]); + } + }); + }, }, actions: {