import type { RegisterClientOptions } from '@peertube/peertube-types/client' import type { ChannelConfiguration } from 'shared/lib/types' import { getBaseRoute } from '../../../videowatch/uri' import { localizedHelpUrl } from '../../../utils/help' import { helpButtonSVG } from '../../../videowatch/buttons' // Must use require for mustache, import seems buggy. const Mustache = require('mustache') /** * Renders the configuration settings page for a given channel. * @param registerClientOptions Peertube client options * @param channelId The channel id * @returns The page content */ async function renderConfigurationChannel ( registerClientOptions: RegisterClientOptions, channelId: string ): Promise { const { peertubeHelpers } = registerClientOptions try { if (!channelId || !/^\d+$/.test(channelId)) { throw new Error('Missing or invalid channel id.') } const response = await fetch( getBaseRoute(registerClientOptions) + '/api/configuration/channel/' + encodeURIComponent(channelId), { method: 'GET', headers: peertubeHelpers.getAuthHeader() } ) if (!response.ok) { throw new Error('Can\'t get channel configuration options.') } const channelConfiguration: ChannelConfiguration = await (response).json() // Basic testing that channelConfiguration has the correct format if ((typeof channelConfiguration !== 'object') || !channelConfiguration.channel) { throw new Error('Invalid channel configuration options.') } const helpUrl = await localizedHelpUrl(registerClientOptions, { page: 'documentation/user/streamers/' // FIXME: this is not the good link }) const helpIcon = helpButtonSVG() const helpButton = `${helpIcon}` const view = { title: await peertubeHelpers.translate(LOC_LIVECHAT_CONFIGURATION_CHANNEL_TITLE), description: await peertubeHelpers.translate(LOC_LIVECHAT_CONFIGURATION_CHANNEL_DESC), enableBot: await peertubeHelpers.translate(LOC_LIVECHAT_CONFIGURATION_CHANNEL_ENABLE_BOT_LABEL), botOptions: await peertubeHelpers.translate(LOC_LIVECHAT_CONFIGURATION_CHANNEL_BOT_OPTIONS_TITLE), forbiddenWords: await peertubeHelpers.translate(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_LABEL), forbiddenWordsDesc: await peertubeHelpers.translate(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_DESC), forbiddenWordsDesc2: await peertubeHelpers.translate(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_DESC2), forbiddenWordsReason: await peertubeHelpers.translate( LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_REASON_LABEL ), forbiddenWordsReasonDesc: await peertubeHelpers.translate( LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_REASON_DESC ), forbiddenWordsRegexp: await peertubeHelpers.translate( LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_REGEXP_LABEL ), forbiddenWordsRegexpDesc: await peertubeHelpers.translate( LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_REGEXP_DESC ), quoteLabel: await peertubeHelpers.translate(LOC_LIVECHAT_CONFIGURATION_CHANNEL_QUOTE_LABEL), quoteDesc: await peertubeHelpers.translate(LOC_LIVECHAT_CONFIGURATION_CHANNEL_QUOTE_DESC), quoteDelayLabel: await peertubeHelpers.translate(LOC_LIVECHAT_CONFIGURATION_CHANNEL_QUOTE_DELAY_LABEL), quoteDelayDesc: await peertubeHelpers.translate(LOC_LIVECHAT_CONFIGURATION_CHANNEL_QUOTE_DELAY_DESC), quoteCommandLabel: await peertubeHelpers.translate(LOC_LIVECHAT_CONFIGURATION_CHANNEL_QUOTE_COMMAND_LABEL), quoteCommandDesc: await peertubeHelpers.translate(LOC_LIVECHAT_CONFIGURATION_CHANNEL_QUOTE_COMMAND_DESC), // bannedJIDs: await peertubeHelpers.translate(LOC_LIVECHAT_CONFIGURATION_CHANNEL_BANNED_JIDS_LABEL), save: await peertubeHelpers.translate(LOC_SAVE), cancel: await peertubeHelpers.translate(LOC_CANCEL), botNickname: await peertubeHelpers.translate(LOC_LIVECHAT_CONFIGURATION_CHANNEL_BOT_NICKNAME), forbiddenWordsArray: [0, 1, 2].map(count => { return { displayNumber: count + 1, fieldNumber: count, displayHelp: count === 0 } }), quotesArray: [0, 1, 2].map(count => { return { displayNumber: count + 1, fieldNumber: count, displayHelp: count === 0 } }), helpButton, channelConfiguration } return Mustache.render(`

{{title}}: {{channelConfiguration.channel.displayName}} {{channelConfiguration.channel.name}}

{{description}}

{{botOptions}}

{{#forbiddenWordsArray}}{{! iterating on forbiddenWordsArray to display N fields }}

{{forbiddenWords}} #{{displayNumber}}

{{#displayHelp}}

{{forbiddenWordsDesc}}

{{{helpButton}}} {{/displayHelp}}
{{! warning: don't add extra line break in textarea! }}

{{forbiddenWordsDesc2}}

{{forbiddenWordsRegexpDesc}}

{{forbiddenWordsReasonDesc}}

{{/forbiddenWordsArray}} {{#quotesArray}}{{! iterating on quotesArray to display N fields }}

{{quoteLabel}} #{{displayNumber}}

{{#displayHelp}}

{{quoteDesc}}

{{{helpButton}}} {{/displayHelp}}

{{quoteDelayDesc}}

{{quoteCommandDesc}}

{{/quotesArray}}
`, view) as string } catch (err: any) { peertubeHelpers.notifier.error(err.toString()) return '' } } export { renderConfigurationChannel }