import type { RegisterServerOptions } from '@peertube/peertube-types'
import { ensureProsodyRunning } from './prosody/ctl'
import type { ConverseJSTheme } from '../../shared/lib/types'
function initSettings (options: RegisterServerOptions): void {
const { peertubeHelpers, registerSetting, settingsManager } = options
// ********** IMPORTANT NOTES
registerSetting({
type: 'html',
private: true,
descriptionHTML: '
Important notes
'
})
registerSetting({
type: 'html',
private: true,
descriptionHTML: `You can find the plugin documentation here:
Peertube Plugin Livechat documentation
.`
})
registerSetting({
type: 'html',
private: true,
descriptionHTML: `Before asking for help, please use the diagnostic tool:
Launch diagnostic
(if this button is not opening a new window, please try to refresh the page).`
})
if (process.arch !== 'x64' && process.arch !== 'x86_64') {
registerSetting({
name: 'prosody-arch-warning',
type: 'html',
private: true,
descriptionHTML: `
It seems that your are using a ${process.arch} CPU,
which is not compatible with the plugin.
Please read
this page
for a workaround.
`
})
}
// ********** Chat
registerSetting({
type: 'html',
private: true,
descriptionHTML: 'Chat
'
})
registerSetting({
name: 'prosody-list-rooms',
label: 'List existing rooms',
type: 'html',
descriptionHTML: 'List rooms',
private: true
})
// ********** Chat behaviour
registerSetting({
type: 'html',
private: true,
descriptionHTML: 'Chat behaviour
'
})
registerSetting({
name: 'prosody-room-type',
label: 'Room type',
type: 'select',
descriptionHTML: 'You can choose here to have separate rooms for each video, or to group them by channel.',
private: false,
default: 'video',
options: [
{ value: 'video', label: 'Each video has its own webchat room' },
{ value: 'channel', label: 'Webchat rooms are grouped by channel' }
]
})
registerSetting({
name: 'chat-auto-display',
label: 'Automatically open the chat',
descriptionHTML: 'When watching a video, the chatbox will automatically open',
type: 'input-checkbox',
default: true,
private: false
})
registerSetting({
name: 'chat-open-blank',
label: 'Show the «open in new window» button',
descriptionHTML: 'There will be a button for opening the web chat in a new window.',
private: false,
type: 'input-checkbox',
default: true
})
registerSetting({
name: 'chat-share-url',
label: 'Show the «share chat link» button',
descriptionHTML: 'There will be a button for sharing a chat url (could be used to intregrated in OBS for example).',
private: false,
type: 'select',
default: 'owner',
options: [
{ label: 'Show for nobody', value: 'nobody' },
{ label: 'Show for everyone', value: 'everyone' },
{ label: 'Show for the video owner', value: 'owner' },
{ label: 'Show for the video owner and instance\'s moderators', value: 'owner+moderators' }
]
})
registerSetting({
name: 'chat-per-live-video',
label: 'Users can activate the chat for their lives',
type: 'input-checkbox',
default: true,
descriptionHTML: 'If checked, all live videos will have a checkbox in their properties for enabling the web chat.',
private: false
})
registerSetting({
name: 'chat-per-live-video-warning',
type: 'html',
private: true,
descriptionHTML:
`
You have enabled the setting «Users can activate the chat for their lives».
It is redundant with the «Activate chat for all lives» setting.
`
})
registerSetting({
name: 'chat-all-lives',
label: 'Activate chat for all lives',
type: 'input-checkbox',
default: false,
descriptionHTML: 'If checked, the chat will be enabled for all lives.',
private: false
})
registerSetting({
name: 'chat-all-non-lives',
label: 'Activate chat for all non-lives',
type: 'input-checkbox',
default: false,
descriptionHTML: 'If checked, the chat will be enable for all video that are not lives.',
private: false
})
registerSetting({
name: 'chat-videos-list',
label: 'Activate chat for these videos',
type: 'input-textarea',
default: '',
descriptionHTML:
`Videos UUIDs for which we want a web chat.
Can be non-live videos. One per line.
You can add comments: everything after the # character will be stripped off, and empty lines ignored.
Don't add private videos, the UUIDs will be send to frontend.`,
private: false
})
registerSetting({
name: 'chat-no-anonymous',
label: 'Hide the chat for anonymous users',
type: 'input-checkbox',
default: false,
descriptionHTML: 'If checked, anonymous Peertube users won\'t see the chat.',
private: false
})
// ********** Theming
registerSetting({
name: 'theming-advanced',
type: 'html',
private: true,
descriptionHTML: 'Theming
'
})
registerSetting({
name: 'converse-theme',
label: 'ConverseJS theme',
type: 'select',
default: 'peertube' as ConverseJSTheme,
private: false,
options: [
{ value: 'peertube', label: 'Peertube theme' },
{ value: 'default', label: 'Default ConverseJS theme' },
{ value: 'concord', label: 'ConverseJS concord theme' }
] as Array<{value: ConverseJSTheme, label: string}>,
descriptionHTML: 'Please choose the converseJS theme you want to use.'
})
registerSetting({
name: 'converse-autocolors',
label: 'Automatic color detection',
type: 'input-checkbox',
default: true,
private: false,
descriptionHTML:
`Try to auto detect colors from user's current theme.
When this settings is enabled, the plugin tries to auto-detect colors to apply to the chat theme.
If this is not correctly working for some of your Peertube theme, you can disable this option.
You can report the bug on the official
issue tracker
. Don't forget to specify which theme is not working.`
})
registerSetting({
name: 'chat-style',
label: 'Webchat iframe style attribute',
type: 'input-textarea',
default: '',
descriptionHTML:
`Additional styles to be added on the iframe style attribute.
Example: height:400px;`,
private: false
})
// ********** Chat server advanced settings
registerSetting({
name: 'prosody-advanced',
type: 'html',
private: true,
descriptionHTML: 'Chat server advanced settings
'
})
registerSetting({
name: 'chat-help-builtin-prosody',
type: 'html',
label: 'Prosody server',
descriptionHTML: `This plugin uses the Prosody XMPP server to handle chat rooms.
This plugin comes with a Prosody AppImage, that will be used to run the service.`,
private: true
})
registerSetting({
name: 'use-system-prosody',
type: 'input-checkbox',
label: 'Use system Prosody',
descriptionHTML: `Warning: don't check this settings if you are not sure of what you are doing.
By checking this settings, your Peertube will use the Prosody server that comes with your system,
and not the embeded AppImage.
Only use this if you encounter problems with the embedded Prosody.`,
private: true,
default: false
})
registerSetting({
name: 'disable-websocket',
type: 'input-checkbox',
label: 'Disable Websocket',
descriptionHTML: `With Peertube >= 5.0.0, this plugin try to use Websocket connection for chatting.
If the user's browser or connection is not compatible, the browser will automatically fallback on the BOSH protocol.
But in rare case, this can fail. For example if you have a reverse proxy in front of Peertube that does not
allow Websocket connection for plugins.
In this case, you can check this settings to disable Websocket connections.`,
private: true,
default: false
})
registerSetting({
name: 'prosody-port',
label: 'Prosody port',
type: 'input',
default: '52800',
private: true,
descriptionHTML:
`The port that will be used by the builtin Prosody server.
Change it if this port is already in use on your server.
You can close this port on your firewall, it will not be accessed from the outer world.`
})
registerSetting({
name: 'prosody-peertube-uri',
label: 'Peertube url for API calls',
type: 'input',
default: '',
private: true,
descriptionHTML:
`Please let this settings empty if you don't know what you are doing.
In some rare case, Prosody can't call Peertube's API from its public URI.
You can use this field to customise Peertube's URI for Prosody modules
(for example with «http://localhost:9000» or «http://127.0.0.1:9000»).`
})
registerSetting({
name: 'prosody-muc-log-by-default',
label: 'Log rooms content by default',
type: 'input-checkbox',
default: true,
private: true,
descriptionHTML:
`If checked, room contents will be saved by default.
Any user that join a room will see what was written before he joins.
Please note that it is always possible to enable/disable the content
archiving for a specific room, by editing its properties.
`
})
registerSetting({
name: 'prosody-muc-expiration',
label: 'Room logs expiration',
type: 'input',
default: '1w',
private: true,
descriptionHTML:
`You can choose here how long the chatting room's content is kept by the server. The value can be:
- 60: the content will be saved for 60 seconds. You can replace 60 by any integer value.
- 1d: the content will be saved for 1 day. You can replace 1 by any integer value.
- 1w: the content will be saved for 1 week. You can replace 1 by any integer value.
- 1m: the content will be saved for 1 month. You can replace 1 by any integer value.
- 1y: the content will be saved for 1 year. You can replace 1 by any integer value.
- never: the content will never expire, and will be kept forever.
`
})
registerSetting({
name: 'prosody-c2s',
label: 'Enable client to server connections',
type: 'input-checkbox',
default: false,
private: true,
descriptionHTML:
`Enable XMPP clients to connect to the builtin Prosody server.
This option alone only allows connections from localhost clients.`
})
registerSetting({
name: 'prosody-c2s-port',
label: 'Prosody client to server port',
type: 'input',
default: '52822',
private: true,
descriptionHTML:
`The port that will be used by the c2s module of the builtin Prosody server.
XMPP clients shall use this port to connect.
Change it if this port is already in use on your server.
You can keep this port closed on your firewall for now, it will not be accessed from the outer world.`
})
registerSetting({
name: 'prosody-components',
label: 'Enable custom Prosody external components',
type: 'input-checkbox',
default: false,
private: true,
descriptionHTML:
`Enable the use of external XMPP components.
This option alone only allows connections from localhost.
This feature can for example be used to connect some bots to the chatting rooms.`
})
registerSetting({
name: 'prosody-components-port',
label: 'Prosody external components port',
type: 'input',
default: '53470',
private: true,
descriptionHTML:
`The port that will be used by XMPP components to connect to the Prosody server.
Change it if this port is already in use on your server.
You can keep this port closed on your firewall for now, it will not be accessed from the outer world.`
})
registerSetting({
name: 'prosody-components-list',
label: 'External components',
type: 'input-textarea',
default: '',
private: true,
descriptionHTML:
`The external components to create:
- One per line.
- Use the format «component_name:component_secret» (spaces will be trimmed)
- You can add comments: everything after the # character will be stripped off, and empty lines ignored
- The name can only contain alphanumeric characters and dots
-
If the name contains only alphanumeric characters, it will be suffixed with the XMPP domain.
For exemple «bridge» will become «bridge.your_domain.tld».
You can also specify a full domain name, but you have to make sure to configure your DNS correctly.
- Only use alphanumeric characters in the secret passphrase (use at least 15 characters).
`
})
// ********** settings changes management
settingsManager.onSettingsChange(async (_settings: any) => {
peertubeHelpers.logger.info('Saving settings, ensuring prosody is running')
await ensureProsodyRunning(options)
})
}
export {
initSettings
}