MisskeyPagesにイベント送信ボタンを追加
This commit is contained in:
		
							parent
							
								
									5ae6b0058f
								
							
						
					
					
						commit
						64397708fd
					
				|  | @ -2030,6 +2030,10 @@ pages: | |||
|         _dialog: | ||||
|           content: "内容" | ||||
|         resetRandom: "乱数をリセット" | ||||
|         pushEvent: "イベントを送信させる" | ||||
|         _pushEvent: | ||||
|           event: "イベント名" | ||||
|           message: "押したときに表示するメッセージ" | ||||
| 
 | ||||
|   script: | ||||
|     categories: | ||||
|  |  | |||
|  | @ -8,8 +8,15 @@ | |||
| 			<template #label>{{ $t('blocks._button.action') }}</template> | ||||
| 			<option value="dialog">{{ $t('blocks._button._action.dialog') }}</option> | ||||
| 			<option value="resetRandom">{{ $t('blocks._button._action.resetRandom') }}</option> | ||||
| 			<option value="pushEvent">{{ $t('blocks._button._action.pushEvent') }}</option> | ||||
| 		</ui-select> | ||||
| 		<ui-input v-if="value.action === 'dialog'" v-model="value.content"><span>{{ $t('blocks._button._action._dialog.content') }}</span></ui-input> | ||||
| 		<template v-if="value.action === 'dialog'"> | ||||
| 			<ui-input v-model="value.content"><span>{{ $t('blocks._button._action._dialog.content') }}</span></ui-input> | ||||
| 		</template> | ||||
| 		<template v-else-if="value.action === 'pushEvent'"> | ||||
| 			<ui-input v-model="value.event"><span>{{ $t('blocks._button._action._pushEvent.event') }}</span></ui-input> | ||||
| 			<ui-input v-model="value.message"><span>{{ $t('blocks._button._action._pushEvent.message') }}</span></ui-input> | ||||
| 		</template> | ||||
| 	</section> | ||||
| </x-container> | ||||
| </template> | ||||
|  | @ -43,6 +50,8 @@ export default Vue.extend({ | |||
| 		if (this.value.text == null) Vue.set(this.value, 'text', ''); | ||||
| 		if (this.value.action == null) Vue.set(this.value, 'action', 'dialog'); | ||||
| 		if (this.value.content == null) Vue.set(this.value, 'content', null); | ||||
| 		if (this.value.event == null) Vue.set(this.value, 'event', null); | ||||
| 		if (this.value.message == null) Vue.set(this.value, 'message', null); | ||||
| 	}, | ||||
| }); | ||||
| </script> | ||||
|  |  | |||
|  | @ -27,6 +27,16 @@ export default Vue.extend({ | |||
| 			} else if (this.value.action === 'resetRandom') { | ||||
| 				this.script.aiScript.updateRandomSeed(Math.random()); | ||||
| 				this.script.eval(); | ||||
| 			} else if (this.value.action === 'pushEvent') { | ||||
| 				this.$root.api('page-push', { | ||||
| 					pageId: this.script.page.id, | ||||
| 					event: this.value.event | ||||
| 				}); | ||||
| 
 | ||||
| 				this.$root.dialog({ | ||||
| 					type: 'success', | ||||
| 					text: this.script.interpolate(this.value.message) | ||||
| 				}); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  |  | |||
|  | @ -35,8 +35,10 @@ class Script { | |||
| 	public aiScript: ASEvaluator; | ||||
| 	private onError: any; | ||||
| 	public vars: Record<string, any>; | ||||
| 	public page: Record<string, any>; | ||||
| 
 | ||||
| 	constructor(aiScript, onError) { | ||||
| 	constructor(page, aiScript, onError) { | ||||
| 		this.page = page; | ||||
| 		this.aiScript = aiScript; | ||||
| 		this.onError = onError; | ||||
| 		this.eval(); | ||||
|  | @ -113,7 +115,7 @@ export default Vue.extend({ | |||
| 					icon: faStickyNote | ||||
| 				}); | ||||
| 				const pageVars = this.getPageVars(); | ||||
| 				this.script = new Script(new ASEvaluator(this.page.variables, pageVars, { | ||||
| 				this.script = new Script(this.page, new ASEvaluator(this.page.variables, pageVars, { | ||||
| 					randomSeed: Math.random(), | ||||
| 					user: page.user, | ||||
| 					visitor: this.$store.state.i, | ||||
|  |  | |||
|  | @ -0,0 +1,44 @@ | |||
| import $ from 'cafy'; | ||||
| import define from '../define'; | ||||
| import { ID } from '../../../misc/cafy-id'; | ||||
| import { publishMainStream } from '../../../services/stream'; | ||||
| import { Users, Pages } from '../../../models'; | ||||
| import { ApiError } from '../error'; | ||||
| 
 | ||||
| export const meta = { | ||||
| 	requireCredential: true, | ||||
| 	secure: true, | ||||
| 
 | ||||
| 	params: { | ||||
| 		pageId: { | ||||
| 			validator: $.type(ID) | ||||
| 		}, | ||||
| 
 | ||||
| 		event: { | ||||
| 			validator: $.str | ||||
| 		} | ||||
| 	}, | ||||
| 
 | ||||
| 	errors: { | ||||
| 		noSuchPage: { | ||||
| 			message: 'No such page.', | ||||
| 			code: 'NO_SUCH_PAGE', | ||||
| 			id: '4a13ad31-6729-46b4-b9af-e86b265c2e74' | ||||
| 		} | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| export default define(meta, async (ps, user) => { | ||||
| 	const page = await Pages.findOne(ps.pageId); | ||||
| 	if (page == null) { | ||||
| 		throw new ApiError(meta.errors.noSuchPage); | ||||
| 	} | ||||
| 
 | ||||
| 	publishMainStream(user.id, 'pageEvent', { | ||||
| 		pageId: ps.pageId, | ||||
| 		event: ps.event, | ||||
| 		user: await Users.pack(user, page.userId, { | ||||
| 			detail: true | ||||
| 		}) | ||||
| 	}); | ||||
| }); | ||||
		Loading…
	
		Reference in New Issue