<template> <div> <b-row> <b-col> <b-table key="autoMessagesTable" :busy="!autoMessages" :fields="autoMessageFields" hover :items="autoMessages" striped > <template #cell(actions)="data"> <b-button-group size="sm"> <b-button @click="editAutoMessage(data.item)"> <font-awesome-icon fixed-width class="mr-1" :icon="['fas', 'pen']" /> </b-button> <b-button variant="danger" @click="deleteAutoMessage(data.item.uuid)" > <font-awesome-icon fixed-width class="mr-1" :icon="['fas', 'minus']" /> </b-button> </b-button-group> </template> <template #cell(channel)="data"> <font-awesome-icon fixed-width class="mr-1" :icon="['fas', 'hashtag']" /> {{ data.value }} </template> <template #cell(cron)="data"> <code>{{ data.value }}</code> </template> <template #head(actions)=""> <b-button-group size="sm"> <b-button variant="success" @click="newAutoMessage" > <font-awesome-icon fixed-width class="mr-1" :icon="['fas', 'plus']" /> </b-button> </b-button-group> </template> </b-table> </b-col> </b-row> <!-- Auto-Message Editor --> <b-modal v-if="showAutoMessageEditModal" hide-header-close :ok-disabled="!validateAutoMessage" ok-title="Save" size="lg" :visible="showAutoMessageEditModal" title="Edit Auto-Message" @hidden="showAutoMessageEditModal=false" @ok="saveAutoMessage" > <b-row> <b-col cols="8"> <b-form-group label="Channel" label-for="formAutoMessageChannel" > <b-input-group prepend="#" > <b-form-input id="formAutoMessageChannel" v-model="models.autoMessage.channel" :state="validateAutoMessageChannel" type="text" required /> </b-input-group> </b-form-group> <hr> <b-form-group label="Message" label-for="formAutoMessageMessage" > <template-editor id="formAutoMessageMessage" v-model="models.autoMessage.message" :state="models.autoMessage.message ? models.autoMessage.message.length <= validateAutoMessageMessageLength : false" /> <div slot="description"> <font-awesome-icon fixed-width class="mr-1 text-success" :icon="['fas', 'code']" title="Supports Templating" /> {{ models.autoMessage.message && models.autoMessage.message.length || 0 }} / {{ validateAutoMessageMessageLength }} </div> </b-form-group> <b-form-group> <b-form-checkbox v-model="models.autoMessage.use_action" switch > Send message as action (<code>/me</code>) </b-form-checkbox> </b-form-group> <hr> <b-form-group label="Sending Mode" label-for="formAutoMessageSendMode" > <b-form-select id="formAutoMessageSendMode" v-model="models.autoMessage.sendMode" :options="autoMessageSendModes" /> </b-form-group> <b-form-group v-if="models.autoMessage.sendMode === 'cron'" label="Send at" label-for="formAutoMessageCron" > <b-form-input id="formAutoMessageCron" v-model="models.autoMessage.cron" :state="validateAutoMessageCron" type="text" /> <div slot="description"> <code>@every [time]</code> or Cron syntax </div> </b-form-group> <b-form-group v-if="models.autoMessage.sendMode === 'lines'" label="Send every" label-for="formAutoMessageNLines" > <b-input-group append="Lines" > <b-form-input id="formAutoMessageNLines" v-model="models.autoMessage.message_interval" type="number" /> </b-input-group> </b-form-group> <hr> <b-form-group> <b-form-checkbox v-model="models.autoMessage.only_on_live" switch > Send only when channel is live </b-form-checkbox> </b-form-group> <b-form-group label="Disable on Template" label-for="formAutoMessageDisableOnTemplate" > <div slot="description"> <font-awesome-icon fixed-width class="mr-1 text-success" :icon="['fas', 'code']" title="Supports Templating" /> Template expression resulting in <code>true</code> to disable the rule or <code>false</code> to enable it </div> <template-editor id="formAutoMessageDisableOnTemplate" v-model="models.autoMessage.disable_on_template" /> </b-form-group> </b-col> <b-col cols="4"> <h6>Getting Help</h6> <p> For information about available template functions and variables to use in the <strong>Message</strong> see the <a href="https://github.com/Luzifer/twitch-bot/wiki#templating" rel="noopener noreferrer" target="_blank" >Templating</a> section of the Wiki. </p> <p> For information about the <strong>Cron</strong> syntax have a look at the <a href="https://cron.help/" rel="noopener noreferrer" target="_blank" >cron.help</a> site. Aditionally you can use <code>@every [time]</code> syntax. The <code>[time]</code> part is in format <code>1h30m20s</code>. You can leave out every segment but need to specify the unit of every segment. So for example <code>@every 1h</code> or <code>@every 10m</code> would be a valid specification. </p> </b-col> </b-row> </b-modal> </div> </template> <script> import * as constants from './const.js' import axios from 'axios' import TemplateEditor from './tplEditor.vue' import Vue from 'vue' export default { components: { TemplateEditor }, computed: { validateAutoMessage() { if (!this.models.autoMessage.sendMode) { return false } if (this.models.autoMessage.sendMode === 'cron' && !this.validateAutoMessageCron) { return false } if (this.models.autoMessage.sendMode === 'lines' && (!this.models.autoMessage.message_interval || Number(this.models.autoMessage.message_interval) <= 0)) { return false } if (this.validateAutoMessageMessageLength < this.models.autoMessage.message?.length) { return false } if (!this.validateAutoMessageChannel) { return false } return true }, validateAutoMessageChannel() { return Boolean(this.models.autoMessage.channel?.match(/^[a-zA-Z0-9_]{4,25}$/)) }, validateAutoMessageCron() { if (this.models.autoMessage.sendMode !== 'cron' && !this.models.autoMessage.cron) { return true } return Boolean(this.models.autoMessage.cron?.match(constants.CRON_VALIDATION)) }, validateAutoMessageMessageLength() { return this.models.autoMessage.use_action ? 496 : 500 }, }, data() { return { autoMessageFields: [ { class: 'col-1 text-nowrap', key: 'channel', sortable: true, thClass: 'align-middle', }, { class: 'col-9', key: 'message', sortable: true, thClass: 'align-middle', }, { class: 'col-1 text-nowrap', key: 'cron', thClass: 'align-middle', }, { class: 'col-1 text-right', key: 'actions', label: '', thClass: 'align-middle', }, ], autoMessageSendModes: [ { text: 'Cron', value: 'cron' }, { text: 'Number of lines', value: 'lines' }, ], autoMessages: [], models: { autoMessage: {}, }, showAutoMessageEditModal: false, } }, methods: { deleteAutoMessage(uuid) { axios.delete(`config-editor/auto-messages/${uuid}`, this.$root.axiosOptions) .then(() => { this.$bus.$emit(constants.NOTIFY_CHANGE_PENDING, true) }) .catch(err => this.$bus.$emit(constants.NOTIFY_FETCH_ERROR, err)) }, editAutoMessage(msg) { Vue.set(this.models, 'autoMessage', { ...msg, sendMode: msg.cron ? 'cron' : 'lines', }) this.showAutoMessageEditModal = true }, fetchAutoMessages() { this.$bus.$emit(constants.NOTIFY_LOADING_DATA, true) return axios.get('config-editor/auto-messages', this.$root.axiosOptions) .then(resp => { this.autoMessages = resp.data this.$bus.$emit(constants.NOTIFY_CHANGE_PENDING, false) this.$bus.$emit(constants.NOTIFY_LOADING_DATA, false) }) .catch(err => this.$bus.$emit(constants.NOTIFY_FETCH_ERROR, err)) }, newAutoMessage() { Vue.set(this.models, 'autoMessage', {}) this.showAutoMessageEditModal = true }, saveAutoMessage(evt) { if (!this.validateAutoMessage) { evt.preventDefault() return } const obj = { ...this.models.autoMessage } if (this.models.autoMessage.sendMode === 'cron') { delete obj.message_interval } else if (this.models.autoMessage.sendMode === 'lines') { delete obj.cron } let promise = null if (obj.uuid) { promise = axios.put(`config-editor/auto-messages/${obj.uuid}`, obj, this.$root.axiosOptions) } else { promise = axios.post(`config-editor/auto-messages`, obj, this.$root.axiosOptions) } promise.then(() => { this.$bus.$emit(constants.NOTIFY_CHANGE_PENDING, true) }) .catch(err => this.$bus.$emit(constants.NOTIFY_FETCH_ERROR, err)) }, }, mounted() { this.$bus.$on(constants.NOTIFY_CONFIG_RELOAD, () => { this.fetchAutoMessages() }) this.fetchAutoMessages() }, name: 'TwitchBotEditorAppAutomessages', } </script>