12 Commits

Author SHA1 Message Date
de14b95f9a better send button 2024-06-19 21:52:15 -04:00
4f80119c83 slightly edit send button style 2024-06-19 21:36:15 -04:00
80b2093202 livechat message form formatting 2024-06-19 21:00:18 -04:00
3d4afc4341 edit chat text area size 2024-06-19 20:39:46 -04:00
49a87237ec better sizing for mobile 2024-06-19 20:15:45 -04:00
0737e14472 better sizing for mobile 2024-06-19 19:52:55 -04:00
226ea38e4d better sizing for mobile 2024-06-19 19:34:40 -04:00
559fe731e0 update package json 2024-06-19 19:24:27 -04:00
e8eb56d0b7 fix dumb nigger shit 2024-06-19 19:02:36 -04:00
1b97366cd8 fix dumb nigger shit 2024-06-19 18:19:19 -04:00
1f3eee9889 better mobile device sizing 2024-06-19 17:56:09 -04:00
772c1c1d14 better sizing for mobile and desktop devices 2024-06-19 17:43:09 -04:00
127 changed files with 1587 additions and 16091 deletions

View File

@ -1,29 +1,5 @@
# Changelog
## 10.2.0
### New features
* #231: [polls](https://livingston.frama.io/peertube-plugin-livechat/documentation/user/streamers/polls/).
* #233: new option to [mute anonymous users](https://livingston.frama.io/peertube-plugin-livechat/documentation/user/streamers/moderation/).
* #18: terms & conditions. You can configure terms&conditions on your instance that will be shown to each joining users. Streamers can also add [terms&conditions in their channels options](https://livingston.frama.io/peertube-plugin-livechat/documentation/user/streamers/terms/).
### Minor changes and fixes
* Fix #449: Remove the constraint for custom emojis shortnames to have ":" at the beginning and at the end.
* Translations updates: french, german, crotian, polish, slovak.
## 10.1.2
* Fix: clicking on the import custom emojis button, without selected any file, was resulting in a state with all action button disabled.
## 10.1.1
* Fix #436: Saving emojis per batch, to avoid hitting max payload limit.
* Fix: the emojis import function could add more entries than max allowed emoji count.
* Fix #437: removing last line if empty when importing emojis.
* Updated translations: de, sk.
## 10.1.0
### New features
@ -58,7 +34,7 @@
### New features
* #177: streamer's task/to-do lists: streamers, and their room's moderators, can handle task lists directly. This can be used to handle viewers questions, moderation actions, ... More info in the [tasks documentation](https://livingston.frama.io/peertube-plugin-livechat/documentation/user/streamers/tasks/).
* #177: streamer's task/to-do lists: streamers, and their room's moderators, can handle task lists directly. This can be used to handle viewers questions, moderation actions, ... More info in the [tasks documentation](https://livingston.frama.io/peertube-plugin-livechat/fr/documentation/user/streamers/tasks/).
* #385: new way of managing chat access rights. Now streamers are owner of their chat rooms. Peertube admins/moderators are not by default, so that their identities are not leaking. But they have a button to promote as chat room owner, if they need to take action. Please note that there is a migration script that will remove all Peertube admins/moderators affiliations (unless they are video/channel's owner). They can get this access back using the button.
* #385: the slow mode duration on the channel option page is now a default value for new rooms. Streamers can change the value room per room in the room's configuration.

View File

@ -31,3 +31,40 @@
min-height: max(30vh, 200px);
}
}
/* Media query for mobile devices */
@media only screen and (max-width: 50vw) {
#peertube-plugin-livechat-container converse-root {
converse-muc {
min-height: 62vh;
/* 100vh - 30vh for video = 70vh remaining */
}
}
}
/* Media query for tablets in portrait mode */
@media only screen and (min-width: 50vw) and (max-width: 75vw) {
#peertube-plugin-livechat-container converse-root {
converse-muc {
min-height: 62vh;
/* Slightly less to account for other elements */
}
}
}
/* Media query for tablets in landscape mode */
@media only screen and (min-width: 76vw) and (max-width: 100vw) {
#peertube-plugin-livechat-container converse-root {
converse-muc {
min-height: 62vh;
/* Assuming more height can be used */
}
}
}
/* custom toolbar CSS */
.send-button {
border-radius: 0.25rem !important;
}

View File

@ -81,13 +81,8 @@ declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_QUOTE_DELAY_DESC: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_BANNED_JIDS_LABEL: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_BOT_NICKNAME: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_FOR_MORE_INFO: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_MUTE_ANONYMOUS_LABEL: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_MUTE_ANONYMOUS_DESC: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_TERMS_LABEL: string
declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_TERMS_DESC: string
declare const LOC_VALIDATION_ERROR: string
declare const LOC_TOO_MANY_ENTRIES: string
declare const LOC_INVALID_VALUE: string
declare const LOC_INVALID_VALUE_MISSING: string
declare const LOC_INVALID_VALUE_WRONG_TYPE: string
@ -95,7 +90,6 @@ declare const LOC_INVALID_VALUE_WRONG_FORMAT: string
declare const LOC_INVALID_VALUE_NOT_IN_RANGE: string
declare const LOC_INVALID_VALUE_FILE_TOO_BIG: string
declare const LOC_INVALID_VALUE_DUPLICATE: string
declare const LOC_INVALID_VALUE_TOO_LONG: string
declare const LOC_CHATROOM_NOT_ACCESSIBLE: string
@ -128,5 +122,3 @@ declare const LOC_TOKEN_ACTION_CREATE: string
declare const LOC_TOKEN_ACTION_REVOKE: string
declare const LOC_TOKEN_DEFAULT_LABEL: string
declare const LOC_TOKEN_ACTION_REVOKE_CONFIRM: string
declare const LOC_POLL_VOTE_OK: string

View File

@ -14,7 +14,6 @@ import { customElement, property, state } from 'lit/decorators.js'
import { ptTr } from '../../lib/directives/translation'
import { Task } from '@lit/task'
import { provide } from '@lit/context'
import { channelTermsMaxLength } from 'shared/lib/constants'
@customElement('livechat-channel-configuration')
export class ChannelConfigurationElement extends LivechatElement {
@ -52,10 +51,6 @@ export class ChannelConfigurationElement extends LivechatElement {
})
}
public termsMaxLength (): number {
return channelTermsMaxLength
}
/**
* Resets the form by reloading data from backend.
*/
@ -125,11 +120,7 @@ export class ChannelConfigurationElement extends LivechatElement {
const validationErrorTypes: ValidationErrorType[] | undefined =
this.validationError?.properties[`${propertyName}`] ?? undefined
// FIXME: this code is duplicated in dymamic table form
if (validationErrorTypes && validationErrorTypes.length !== 0) {
if (validationErrorTypes.includes(ValidationErrorType.Missing)) {
errorMessages.push(html`${ptTr(LOC_INVALID_VALUE_MISSING)}`)
}
if (validationErrorTypes.includes(ValidationErrorType.WrongType)) {
errorMessages.push(html`${ptTr(LOC_INVALID_VALUE_WRONG_TYPE)}`)
}
@ -139,9 +130,6 @@ export class ChannelConfigurationElement extends LivechatElement {
if (validationErrorTypes.includes(ValidationErrorType.NotInRange)) {
errorMessages.push(html`${ptTr(LOC_INVALID_VALUE_NOT_IN_RANGE)}`)
}
if (validationErrorTypes.includes(ValidationErrorType.TooLong)) {
errorMessages.push(html`${ptTr(LOC_INVALID_VALUE_TOO_LONG)}`)
}
return html`<div id=${feedbackId} class="invalid-feedback">${errorMessages}</div>`
} else {

View File

@ -102,13 +102,9 @@ export class ChannelEmojisElement extends LivechatElement {
try {
this.actionDisabled = true
this.channelEmojisConfiguration = await this._channelDetailsService.saveEmojisConfiguration(
this.channelId,
this.channelEmojisConfiguration.emojis
)
await this._channelDetailsService.saveEmojisConfiguration(this.channelId, this.channelEmojisConfiguration.emojis)
this.validationError = undefined
this.ptNotifier.info(await this.ptTranslate(LOC_SUCCESSFULLY_SAVED))
this.requestUpdate('channelEmojisConfiguration')
this.requestUpdate('_validationError')
} catch (error) {
this.validationError = undefined
@ -132,6 +128,7 @@ export class ChannelEmojisElement extends LivechatElement {
*/
public async importEmojis (ev: Event): Promise<void> {
ev.preventDefault()
this.actionDisabled = true
try {
// download a json file:
const file = await new Promise<File>((resolve, reject) => {
@ -152,8 +149,6 @@ export class ChannelEmojisElement extends LivechatElement {
input.remove()
})
this.actionDisabled = true
const content = await new Promise<string>((resolve, reject) => {
const fileReader = new FileReader()
fileReader.onerror = reject
@ -175,15 +170,6 @@ export class ChannelEmojisElement extends LivechatElement {
if (!Array.isArray(json)) {
throw new Error('Invalid data, an array was expected')
}
// Before adding new entries, we check if the last current line is empty,
// and remove it in such case.
// See https://github.com/JohnXLivingston/peertube-plugin-livechat/issues/437
const last = this.channelEmojisConfiguration?.emojis.customEmojis.slice(-1)[0]
if (last && last.sn === '' && last.url === '') {
this.channelEmojisConfiguration?.emojis.customEmojis.pop()
}
for (const entry of json) {
if (typeof entry !== 'object') {
throw new Error('Invalid data')
@ -193,7 +179,9 @@ export class ChannelEmojisElement extends LivechatElement {
}
const url = await this._convertImageToDataUrl(entry.url)
const sn = entry.sn as string
let sn = entry.sn as string
if (!sn.startsWith(':')) { sn = ':' + sn }
if (!sn.endsWith(':')) { sn += ':' }
const item: ChannelEmojisConfiguration['emojis']['customEmojis'][0] = {
sn,

View File

@ -127,63 +127,6 @@ export function tplChannelConfiguration (el: ChannelConfigurationElement): Templ
</p>
<form livechat-configuration-channel-options role="form" @submit=${el.saveConfig} @change=${el.resetValidation}>
<livechat-configuration-section-header
.label=${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_TERMS_LABEL)}
.description=${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_TERMS_DESC, true)}
.helpPage=${'documentation/user/streamers/terms'}>
</livechat-configuration-section-header>
<div class="form-group">
<textarea
name="terms"
id="peertube-livechat-terms"
.value=${el.channelConfiguration?.configuration.terms ?? ''}
maxlength=${el.termsMaxLength()}
class=${classMap(
Object.assign(
{ 'form-control': true },
el.getInputValidationClass('terms')
)
)}
@change=${(event: Event) => {
if (event?.target && el.channelConfiguration) {
let value: string | undefined = (event.target as HTMLTextAreaElement).value
if (value === '') { value = undefined }
el.channelConfiguration.configuration.terms = value
}
el.requestUpdate('channelConfiguration')
}
}
></textarea>
${el.renderFeedback('peertube-livechat-terms-feedback', 'terms')}
</div>
<livechat-configuration-section-header
.label=${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_MUTE_ANONYMOUS_LABEL)}
.description=${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_MUTE_ANONYMOUS_DESC, true)}
.helpPage=${'documentation/user/streamers/moderation'}>
</livechat-configuration-section-header>
<div class="form-group">
<label>
<input
type="checkbox"
name="bot"
id="peertube-livechat-mute-anonymous"
@input=${(event: InputEvent) => {
if (event?.target && el.channelConfiguration) {
el.channelConfiguration.configuration.mute.anonymous =
(event.target as HTMLInputElement).checked
}
el.requestUpdate('channelConfiguration')
}
}
value="1"
?checked=${el.channelConfiguration?.configuration.mute.anonymous}
/>
${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_MUTE_ANONYMOUS_LABEL)}
</label>
</div>
<livechat-configuration-section-header
.label=${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_SLOW_MODE_LABEL)}
.description=${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_SLOW_MODE_DESC, true)}

View File

@ -91,6 +91,12 @@ export function tplChannelEmojis (el: ChannelEmojisElement): TemplateResult {
el.resetValidation(e)
if (el.channelEmojisConfiguration) {
el.channelEmojisConfiguration.emojis.customEmojis = e.detail
// Fixing missing ':' for shortnames:
for (const desc of el.channelEmojisConfiguration.emojis.customEmojis) {
if (desc.sn === '') { continue }
if (!desc.sn.startsWith(':')) { desc.sn = ':' + desc.sn }
if (!desc.sn.endsWith(':')) { desc.sn += ':' }
}
el.requestUpdate('channelEmojisConfiguration')
}
}

View File

@ -5,13 +5,10 @@
import type { RegisterClientOptions } from '@peertube/peertube-types/client'
import type {
ChannelLiveChatInfos, ChannelConfiguration, ChannelConfigurationOptions, ChannelEmojisConfiguration, ChannelEmojis,
CustomEmojiDefinition
ChannelLiveChatInfos, ChannelConfiguration, ChannelConfigurationOptions, ChannelEmojisConfiguration, ChannelEmojis
} from 'shared/lib/types'
import { ValidationError, ValidationErrorType } from '../../lib/models/validation'
import { getBaseRoute } from '../../../utils/uri'
import { maxEmojisPerChannel } from 'shared/lib/emojis'
import { channelTermsMaxLength } from 'shared/lib/constants'
export class ChannelDetailsService {
public _registerClientOptions: RegisterClientOptions
@ -28,10 +25,6 @@ export class ChannelDetailsService {
validateOptions = async (channelConfigurationOptions: ChannelConfigurationOptions): Promise<boolean> => {
const propertiesError: ValidationError['properties'] = {}
if (channelConfigurationOptions.terms && channelConfigurationOptions.terms.length > channelTermsMaxLength) {
propertiesError.terms = [ValidationErrorType.TooLong]
}
const botConf = channelConfigurationOptions.bot
const slowModeDuration = channelConfigurationOptions.slowMode.duration
@ -186,22 +179,12 @@ export class ChannelDetailsService {
public async validateEmojisConfiguration (channelEmojis: ChannelEmojis): Promise<boolean> {
const propertiesError: ValidationError['properties'] = {}
if (channelEmojis.customEmojis.length > maxEmojisPerChannel) {
// This can happen when using the import function.
const validationError = new ValidationError(
'ChannelEmojisValidationError',
await this._registerClientOptions.peertubeHelpers.translate(LOC_TOO_MANY_ENTRIES),
propertiesError
)
throw validationError
}
const seen = new Map<string, true>()
for (const [i, e] of channelEmojis.customEmojis.entries()) {
propertiesError[`emojis.${i}.sn`] = []
if (e.sn === '') {
propertiesError[`emojis.${i}.sn`].push(ValidationErrorType.Missing)
} else if (!/^:?[\w-]+:?$/.test(e.sn)) { // optional ':' at the beggining and at the end
} else if (!/^:[\w-]+:$/.test(e.sn)) {
propertiesError[`emojis.${i}.sn`].push(ValidationErrorType.WrongFormat)
} else if (seen.has(e.sn)) {
propertiesError[`emojis.${i}.sn`].push(ValidationErrorType.Duplicate)
@ -230,57 +213,11 @@ export class ChannelDetailsService {
public async saveEmojisConfiguration (
channelId: number,
channelEmojis: ChannelEmojis
): Promise<ChannelEmojisConfiguration> {
): Promise<void> {
if (!await this.validateEmojisConfiguration(channelEmojis)) {
throw new Error('Invalid form data')
}
// Note: API request body size is limited to 100Kb (expressjs body-parser defaut limit, and Peertube nginx config).
// So we must send new emojis 1 by 1, to be sure to not reach the limit.
if (!channelEmojis.customEmojis.find(e => e.url.startsWith('data:'))) {
// No new emojis, just saving.
return this._saveEmojisConfiguration(channelId, channelEmojis)
}
let lastResult: ChannelEmojisConfiguration | undefined
let customEmojis: CustomEmojiDefinition[] = [...channelEmojis.customEmojis] // copy the original array
let i = customEmojis.findIndex(e => e.url.startsWith('data:'))
let watchDog = 0
while (i >= 0) {
watchDog++
if (watchDog > channelEmojis.customEmojis.length + 10) { // just to avoid infinite loop
throw new Error('Seems we have sent too many emojis, this was not expected')
}
const data: CustomEmojiDefinition[] = customEmojis.slice(0, i + 1) // all elements until first new file
data.push(
// all remaining elements that where already uploaded (to not loose them):
...customEmojis.slice(i + 1).filter((e) => !e.url.startsWith('data:'))
)
lastResult = await this._saveEmojisConfiguration(channelId, {
customEmojis: data
})
// Must inject the result in customEmojis
const temp = lastResult.emojis.customEmojis.slice(0, i + 1) // last element should have been replace by a http url
temp.push(
...customEmojis.slice(i + 1) // remaining elements in the previous array
)
customEmojis = temp
// and searching again next new emojis
i = customEmojis.findIndex(e => e.url.startsWith('data:'))
}
if (!lastResult) {
// This should not happen...
throw new Error('Unexpected: no last result')
}
return lastResult
}
private async _saveEmojisConfiguration (
channelId: number,
channelEmojis: ChannelEmojis
): Promise<ChannelEmojisConfiguration> {
const response = await fetch(
getBaseRoute(this._registerClientOptions) +
'/api/configuration/channel/emojis/' +
@ -293,9 +230,10 @@ export class ChannelDetailsService {
)
if (!response.ok) {
if (response.status === 404) {
// File does not exist yet, that is a normal use case.
}
throw new Error('Can\'t get channel emojis options.')
}
return response.json()
}
}

View File

@ -672,7 +672,6 @@ export class DynamicTableFormElement extends LivechatElement {
const validationErrorTypes: ValidationErrorType[] | undefined =
this.validation?.[`${this.validationPrefix}.${originalIndex}.${propertyName}`]
// FIXME: this code is duplicated in channel-configuration
if (validationErrorTypes !== undefined && validationErrorTypes.length !== 0) {
if (validationErrorTypes.includes(ValidationErrorType.Missing)) {
errorMessages.push(html`${ptTr(LOC_INVALID_VALUE_MISSING)}`)
@ -689,9 +688,6 @@ export class DynamicTableFormElement extends LivechatElement {
if (validationErrorTypes.includes(ValidationErrorType.Duplicate)) {
errorMessages.push(html`${ptTr(LOC_INVALID_VALUE_DUPLICATE)}`)
}
if (validationErrorTypes.includes(ValidationErrorType.TooLong)) {
errorMessages.push(html`${ptTr(LOC_INVALID_VALUE_TOO_LONG)}`)
}
return html`<div id="${inputId}-feedback" class="invalid-feedback">${errorMessages}</div>`
} else {

View File

@ -7,8 +7,7 @@ export enum ValidationErrorType {
WrongType,
WrongFormat,
NotInRange,
Duplicate,
TooLong
Duplicate
}
export class ValidationError extends Error {

View File

@ -17,8 +17,6 @@ declare global {
}
}
let pollListenerInitiliazed: boolean = false
/**
* load the ConverseJS CSS.
* @param url CSS url
@ -166,15 +164,6 @@ async function displayConverseJS (
}
const converseJSParams: InitConverseJSParams = await (response).json()
if (!pollListenerInitiliazed) {
// First time we got here, initiliaze this event:
const i18nVoteOk = await clientOptions.peertubeHelpers.translate(LOC_POLL_VOTE_OK)
pollListenerInitiliazed = true
document.addEventListener('livechat-poll-vote', () => {
clientOptions.peertubeHelpers.notifier.success(i18nVoteOk)
})
}
await loadConverseJS(converseJSParams)
await window.initConverse(converseJSParams, chatIncludeMode, authHeader ?? null)
}

View File

@ -185,7 +185,6 @@ async function initConverse (
params.livechat_enable_viewer_mode = autoViewerMode && !isAuthenticated && !isRemoteWithNicknameSet
params.livechat_specific_external_authent = isAuthenticatedWithExternalAccount
params.livechat_specific_is_anonymous = !isAuthenticated
if (tryOIDC && !isAuthenticated) {
params.livechat_external_auth_oidc_buttons = initConverseParams.externalAuthOIDC

View File

@ -46,20 +46,12 @@ import './plugins/fullscreen/index.js'
import '../custom/plugins/size/index.js'
import '../custom/plugins/tasks/index.js'
import '../custom/plugins/terms/index.js'
import '../custom/plugins/poll/index.js'
/* END: Removable components */
import { CORE_PLUGINS } from './headless/shared/constants.js'
import { ROOM_FEATURES } from './headless/plugins/muc/constants.js'
// We must add our custom plugins to CORE_PLUGINS (so it is white listed):
import { CORE_PLUGINS } from './headless/shared/constants.js'
CORE_PLUGINS.push('livechat-converse-size')
CORE_PLUGINS.push('livechat-converse-tasks')
CORE_PLUGINS.push('livechat-converse-terms')
CORE_PLUGINS.push('livechat-converse-poll')
// We must also add our custom ROOM_FEATURES, so that they correctly resets
// (see headless/plugins/muc, getDiscoInfoFeatures, which loops on this const)
ROOM_FEATURES.push('x_peertubelivechat_mute_anonymous')
_converse.CustomElement = CustomElement

View File

@ -1,136 +0,0 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
import { XMLNS_POLL } from '../constants.js'
import { tplPollForm } from '../templates/poll-form.js'
import { CustomElement } from 'shared/components/element.js'
import { converse, api } from '@converse/headless/core'
import { webForm2xForm } from '@converse/headless/utils/form'
import { __ } from 'i18n'
import '../styles/poll-form.scss'
const $iq = converse.env.$iq
const u = converse.env.utils
const sizzle = converse.env.sizzle
const Strophe = converse.env.Strophe
export default class MUCPollFormView extends CustomElement {
static get properties () {
return {
model: { type: Object, attribute: true },
modal: { type: Object, attribute: true },
form_fields: { type: Object, attribute: false },
alert_message: { type: Object, attribute: false },
title: { type: String, attribute: false },
instructions: { type: String, attribute: false }
}
}
_fieldTranslationMap = new Map()
async initialize () {
this.alert_message = undefined
if (!this.model) {
this.alert_message = __('Error')
return
}
try {
this._initFieldTranslations()
const stanza = await this._fetchPollForm()
const query = stanza.querySelector('query')
const xform = sizzle(`x[xmlns="${Strophe.NS.XFORM}"]`, query)[0]
if (!xform) {
throw Error('Missing xform in stanza')
}
// eslint-disable-next-line no-undef
this.title = __(LOC_poll_title) // xform.querySelector('title')?.textContent ?? ''
// eslint-disable-next-line no-undef
this.instructions = __(LOC_poll_instructions) // xform.querySelector('instructions')?.textContent ?? ''
this.form_fields = Array.from(xform.querySelectorAll('field')).map(field => {
this._translateField(field)
return u.xForm2TemplateResult(field, stanza)
})
} catch (err) {
console.error(err)
this.alert_message = __('Error')
}
}
render () {
return tplPollForm(this)
}
_fetchPollForm () {
return api.sendIQ(
$iq({
to: this.model.get('jid'),
type: 'get'
}).c('query', { xmlns: XMLNS_POLL })
)
}
_initFieldTranslations () {
// eslint-disable-next-line no-undef
this._fieldTranslationMap.set('muc#roompoll_question', __(LOC_poll_question))
// eslint-disable-next-line no-undef
this._fieldTranslationMap.set('muc#roompoll_duration', __(LOC_poll_duration))
// eslint-disable-next-line no-undef
this._fieldTranslationMap.set('muc#roompoll_anonymous_results', __(LOC_poll_anonymous_results))
for (let i = 1; i <= 10; i++) {
this._fieldTranslationMap.set(
'muc#roompoll_choice' + i.toString(),
// eslint-disable-next-line no-undef
__(LOC_poll_choice_n).replace('{{N}}', i.toString())
)
}
}
_translateField (field) {
const v = field.getAttribute('var')
const label = this._fieldTranslationMap.get(v)
if (label) {
field.setAttribute('label', label)
}
}
async formSubmit (ev) {
ev.preventDefault()
try {
this.alert_message = undefined
const form = ev.target
const inputs = sizzle(':input:not([type=button]):not([type=submit])', form)
const iq = $iq({
type: 'set',
to: this.model.get('jid'),
id: u.getUniqueId()
}).c('query', { xmlns: XMLNS_POLL })
iq.c('x', { xmlns: Strophe.NS.XFORM, type: 'submit' })
const xmlNodes = inputs.map(i => webForm2xForm(i)).filter(n => n)
xmlNodes.forEach(n => iq.cnode(n).up())
await api.sendIQ(iq)
if (this.modal) {
this.modal.onHide()
}
} catch (err) {
if (u.isErrorStanza(err)) {
// Checking if there is a text error that we can show to the user.
if (sizzle('error bad-request', err).length) {
const text = sizzle('error text', err)
if (text.length) {
this.alert_message = __('Error') + ': ' + text[0].textContent
return
}
}
}
console.error(err)
this.alert_message = __('Error')
}
}
}
api.elements.define('livechat-converse-poll-form', MUCPollFormView)

View File

@ -1,82 +0,0 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
import { tplPoll } from '../templates/poll.js'
import { CustomElement } from 'shared/components/element.js'
import { converse, _converse, api } from '@converse/headless/core'
import '../styles/poll.scss'
export default class MUCPollView extends CustomElement {
static get properties () {
return {
model: { type: Object, attribute: true },
collapsed: { type: Boolean, attribute: false },
buttonDisabled: { type: Boolean, attribute: false }
}
}
async initialize () {
this.collapsed = false
this.buttonDisabled = false
if (!this.model) {
return
}
this.listenTo(this.model, 'change:current_poll', () => {
this.buttonDisabled = false
this.requestUpdate()
})
this.listenTo(this.model.occupants, 'change:role', occupant => {
if (occupant.get('jid') !== _converse.bare_jid) { // only for myself
return
}
// visitors cant vote. So we must refresh the polls results when current occupant role changes.
this.requestUpdate()
})
}
render () {
const currentPoll = this.model?.get('current_poll')
const entered = this.model.session.get('connection_status') === converse.ROOMSTATUS.ENTERED
const canVote = entered && this.model.getOwnRole() !== 'visitor'
return tplPoll(this, currentPoll, canVote)
}
toggle (ev) {
ev.preventDefault()
this.collapsed = !this.collapsed
}
async voteFor (choice) {
if (this.buttonDisabled) { return }
const currentPoll = this.model?.get('current_poll')
if (!currentPoll) { return }
if (currentPoll.over) { return }
console.info('User has voted for choice: ', choice)
// We disable vote buttons until next refresh:
this.buttonDisabled = true
this.requestUpdate()
await this.model.sendMessage({
body: '!' + choice.choice
})
// Dispatching an event.
// When in Peertube interface, this will open a Peertube notifier with a message.
// FIXME: we should only trigger this on the message echo or bounce,
// but seems ConverseJs does not provide any promise for that.
const event = new Event('livechat-poll-vote', {
bubbles: true
})
this.dispatchEvent(event)
}
closePoll (ev) {
ev.preventDefault()
this.model.set('current_poll', undefined)
}
}
api.elements.define('livechat-converse-muc-poll', MUCPollView)

View File

@ -1,9 +0,0 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
export const XMLNS_POLL = 'http://jabber.org/protocol/muc#x-poll'
export const XMLNS_POLL_MESSAGE = 'http://jabber.org/protocol/muc#x-poll-message'
export const POLL_MESSAGE_TAG = 'x-poll'
export const POLL_QUESTION_TAG = 'x-poll-question'
export const POLL_CHOICE_TAG = 'x-poll-choice'

View File

@ -1,110 +0,0 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
import { _converse, converse } from '../../../src/headless/core.js'
import { getHeadingButtons } from './utils.js'
import { POLL_MESSAGE_TAG, POLL_QUESTION_TAG, POLL_CHOICE_TAG } from './constants.js'
import { __ } from 'i18n'
import './modals/poll-form.js'
import './components/poll-view.js'
import './components/poll-form-view.js'
const { sizzle } = converse.env
converse.plugins.add('livechat-converse-poll', {
dependencies: ['converse-muc', 'converse-disco'],
initialize () {
// adding the poll actions in the MUC heading buttons:
_converse.api.listen.on('getHeadingButtons', getHeadingButtons)
_converse.api.listen.on('parseMUCMessage', (stanza, attrs) => {
// Localizing specific error messages
if (attrs.is_error) {
// eslint-disable-next-line no-undef, camelcase
if (attrs.error_text === LOC_poll_is_over) {
// eslint-disable-next-line no-undef
attrs.error_text = __(LOC_poll_is_over)
// eslint-disable-next-line no-undef, camelcase
} else if (attrs.error_text === LOC_poll_choice_invalid) {
// eslint-disable-next-line no-undef
attrs.error_text = __(LOC_poll_choice_invalid)
// eslint-disable-next-line no-undef, camelcase
} else if (attrs.error_text === LOC_poll_anonymous_vote_ok) {
// eslint-disable-next-line no-undef
attrs.error_text = __(LOC_poll_anonymous_vote_ok)
}
}
// Checking if there is any poll data in the message.
const poll = sizzle(POLL_MESSAGE_TAG, stanza)?.[0]
if (!poll) {
return attrs
}
const question = sizzle(POLL_QUESTION_TAG, poll)?.[0]
const choices = sizzle(POLL_CHOICE_TAG, poll)
if (!question || !choices.length) {
return attrs
}
const endDate = poll.hasAttribute('end')
? new Date(1000 * parseInt(poll.getAttribute('end')))
: null
const currentPoll = {
question: question.textContent,
id: poll.getAttribute('id'),
votes: parseInt(poll.getAttribute('votes') ?? 0),
over: poll.hasAttribute('over'),
endDate: endDate,
time: attrs.time, // this is to be sure that we update the custom element (needed to re-enable buttons)
choices: choices.map(c => {
return {
label: c.textContent,
choice: c.getAttribute('choice'),
votes: parseInt(c.getAttribute('votes') ?? 0)
}
})
}
// We will also translate some strings here.
const body = (attrs.body ?? '')
// eslint-disable-next-line no-undef
.replace(LOC_poll_is_over, __(LOC_poll_is_over))
// eslint-disable-next-line no-undef
.replace(LOC_poll_vote_instructions_xmpp, __(LOC_poll_vote_instructions)) // changing instructions on the fly
return Object.assign(
attrs,
{
current_poll: currentPoll,
body
}
)
})
},
overrides: {
ChatRoom: {
onMessage: function onMessage (attrs) {
if (!attrs.current_poll) {
return this.__super__.onMessage(attrs)
}
// We intercept poll messages, to show the banner.
// We just drop archived messages, to not show the banner for finished polls.
if (attrs.is_archived) {
return this.__super__.onMessage(attrs)
}
console.info('Got a poll message, setting it as the current_poll')
// this will be displayed by the livechat-converse-muc-poll custom element,
// which is inserted in the DOM by the muc.js template overload.
this.set('current_poll', attrs.current_poll)
return this.__super__.onMessage(attrs)
}
}
}
})

View File

@ -1,49 +0,0 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
import { __ } from 'i18n'
import BaseModal from 'plugins/modal/modal.js'
import { api } from '@converse/headless/core'
import { modal_close_button as ModalCloseButton } from 'plugins/modal/templates/buttons.js'
import { html } from 'lit'
class PollFormModal extends BaseModal {
initialize () {
super.initialize()
}
onHide () {
super.onHide()
api.modal.remove('livechat-converse-poll-form-modal')
}
renderModal () {
return html`<livechat-converse-poll-form .model=${this.model} .modal=${this}></livechat-converse-poll-form>`
}
getModalTitle () {
// eslint-disable-next-line no-undef
return __(LOC_new_poll)
}
renderModalFooter () {
return html`
<div class="modal-footer">
${ModalCloseButton}
<button
type="submit"
class="btn btn-primary"
@click=${(ev) => {
ev.preventDefault()
this.querySelector('livechat-converse-poll-form form')?.requestSubmit()
}}
>
${__('Ok')}
</button>
</div>
`
}
}
api.elements.define('livechat-converse-poll-form-modal', PollFormModal)

View File

@ -1,17 +0,0 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
.conversejs {
livechat-converse-poll-form-modal {
/* Special case: when the form is in a modal */
.converse-form {
max-height: 50vh;
overflow-y: scroll;
padding-top: 0;
}
}
}

View File

@ -1,134 +0,0 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
.conversejs {
livechat-converse-muc-poll {
background-color: var(--peertube-main-background);
color: var(--peertube-main-foreground);
& > div {
border: 1px solid var(--peertube-menu-background);
margin: 5px;
padding: 5px;
.livechat-poll-toggle {
background: unset;
border: 0;
padding-left: 0.25em;
padding-right: 0.25em;
}
.livechat-poll-close {
background: unset;
border: 0;
float: right;
}
p.livechat-poll-question {
text-align: center;
font-weight: bold;
span {
cursor: pointer; // because a click toggles
}
}
p.livechat-poll-instructions {
text-align: right;
}
p.livechat-poll-end {
text-align: right;
}
table {
text-align: left;
vertical-align: middle;
width: 100%;
td:first-child {
padding-right: 0.5rem;
white-space: nowrap;
}
td.livechat-poll-choice-label {
width: 100%;
}
td:last-child {
white-space: nowrap;
width: 120px;
}
}
.livechat-progress-bar {
background-color: var(--peertube-menu-background);
border: 1px solid var(--peertube-menu-background);
color: var(--peertube-menu-foreground);
height: 1.25rem;
font-size: 0.75rem;
margin: 0;
position: relative;
width: 100px;
div {
background-color: var(--peertube-button-background);
float: left;
height: 100%;
position: absolute;
z-index: 1;
}
p {
display: inline;
height: 100%;
text-align: center;
position: absolute;
white-space: nowrap;
width: 100%;
z-index: 2;
}
}
}
}
&[livechat-converse-root-height="small"],
&[livechat-converse-root-height="medium"] {
/* stylelint-disable-next-line no-descending-specificity */
livechat-converse-muc-poll > div {
max-height: 150px;
overflow-y: scroll;
}
}
}
body[livechat-viewer-mode="on"] {
livechat-converse-muc-poll {
/* Dont display the poll before user choose a nickname */
display: none !important;
}
}
.livechat-readonly {
.conversejs {
/* stylelint-disable-next-line no-descending-specificity */
livechat-converse-muc-poll > div {
// In readonly mode, dont impose max-height
max-height: initial !important;
overflow-y: visible !important;
&.livechat-poll-over {
// stop showing poll when over in readonly mode
display: none !important;
}
p.livechat-poll-instructions {
// No need for instruction in readonly mode
display: none !important;
}
}
}
}

View File

@ -1,41 +0,0 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
import { converseLocalizedHelpUrl } from '../../../shared/lib/help'
import { html } from 'lit'
import { __ } from 'i18n'
export function tplPollForm (el) {
const i18nOk = __('Ok')
// eslint-disable-next-line no-undef
const i18nHelp = __(LOC_online_help)
const helpUrl = converseLocalizedHelpUrl({
page: 'documentation/user/streamers/polls'
})
return html`
${el.alert_message ? html`<div class="error">${el.alert_message}</div>` : ''}
${
el.form_fields
? html`
<form class="converse-form" @submit=${ev => el.formSubmit(ev)}>
<p class="title">
${el.title}
<a href="${helpUrl}" target="_blank"><converse-icon
class="fa fa-circle-question"
size="1em"
title="${i18nHelp}"
></converse-icon></a>
</p>
<p class="form-help instructions">${el.instructions}</p>
<div class="form-errors hidden"></div>
${el.form_fields}
<fieldset class="buttons form-group">
<input type="submit" class="btn btn-primary" value="${i18nOk}" />
</fieldset>
</form>`
: ''
}`
}

View File

@ -1,123 +0,0 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
import { html } from 'lit'
import { repeat } from 'lit/directives/repeat.js'
import { __ } from 'i18n'
function _tplPollInstructions (el, currentPoll, canVote) {
if (currentPoll.over || !canVote) {
return html``
}
// eslint-disable-next-line no-undef
const i18nPollInstructions = __(LOC_poll_vote_instructions)
return html`<p class="livechat-poll-instructions">
${i18nPollInstructions}
</p>`
}
function _tplPollEnd (el, currentPoll) {
if (!currentPoll.endDate) {
return html``
}
// eslint-disable-next-line no-undef
const i18nPollEnd = __(LOC_poll_end)
return html`<p class="livechat-poll-end">
${i18nPollEnd}
${currentPoll.endDate.toLocaleString()}
</p>`
}
function _tplChoice (el, currentPoll, choice, canVote) {
// eslint-disable-next-line no-undef
const i18nChoiceN = '' + choice.choice + ':'
const votes = choice.votes
const totalVotes = currentPoll.votes
const percent = totalVotes ? (100 * votes / totalVotes).toFixed(2) : '0.00'
return html`
<tr>
<td>
${
currentPoll.over || !canVote
? html`${i18nChoiceN}`
: html`
<button type="button" class="btn btn-primary btn-sm"
@click=${ev => {
ev.preventDefault()
el.voteFor(choice)
}}
?disabled=${el.buttonDisabled}
>
${i18nChoiceN}
</button>`
}
</td>
<td class="livechat-poll-choice-label">
${choice.label}
</td>
<td>
<div class="livechat-progress-bar">
<div
role="progressbar"
style="width: ${percent}%;"
aria-valuenow="${percent}" aria-valuemin="0" aria-valuemax="100"
></div>
<p>
${votes}/${totalVotes}
(${percent}%)
</p>
</div>
</td>
</tr>`
}
export function tplPoll (el, currentPoll, canVote) {
if (!currentPoll) {
return html``
}
return html`<div class="${currentPoll.over ? 'livechat-poll-over' : ''}">
<p class="livechat-poll-question">
${currentPoll.over
? html`<button class="livechat-poll-close" @click=${el.closePoll} title="${__('Close')}">
<converse-icon class="fa fa-times" size="1em"></converse-icon>
</button>`
: ''
}
${el.collapsed
? html`
<button @click=${el.toggle} class="livechat-poll-toggle">
<converse-icon
color="var(--muc-toolbar-btn-color)"
class="fa fa-angle-right"
size="1em"></converse-icon>
</button>`
: html`
<button @click=${el.toggle} class="livechat-poll-toggle">
<converse-icon
color="var(--muc-toolbar-btn-color)"
class="fa fa-angle-down"
size="1em"></converse-icon>
</button>`
}
<span @click=${el.toggle}>
${currentPoll.question}
</span>
</p>
${
el.collapsed
? ''
: html`
<table><tbody>
${repeat(currentPoll.choices ?? [], (c) => c.choice, (c) => _tplChoice(el, currentPoll, c, canVote))}
</tbody></table>
${_tplPollInstructions(el, currentPoll, canVote)}
${_tplPollEnd(el, currentPoll)}
`
}
</div>`
}

View File

@ -1,40 +0,0 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
import { XMLNS_POLL } from './constants.js'
import { _converse, api } from '../../../src/headless/core.js'
import { __ } from 'i18n'
export function getHeadingButtons (view, buttons) {
const muc = view.model
if (muc.get('type') !== _converse.CHATROOMS_TYPE) {
// only on MUC.
return buttons
}
if (!muc.features?.get?.(XMLNS_POLL)) {
// Poll feature not available (can happen if the chat is remote, and the plugin not up to date)
return buttons
}
const myself = muc.getOwnOccupant()
if (!myself || !['admin', 'owner'].includes(myself.get('affiliation'))) {
return buttons
}
// Adding a "New poll" button.
buttons.unshift({
// eslint-disable-next-line no-undef
i18n_text: __(LOC_new_poll),
handler: async (ev) => {
ev.preventDefault()
api.modal.show('livechat-converse-poll-form-modal', { model: muc })
},
a_class: '',
icon_class: 'fa-list-check', // FIXME
name: 'muc-create-poll'
})
return buttons
}

View File

@ -43,25 +43,17 @@ function start () {
function stop () {
rootResizeObserver.disconnect()
const root = document.querySelector('converse-root')
if (root) {
root.removeAttribute('livechat-converse-root-width')
root.removeAttribute('livechat-converse-root-height')
}
document.querySelector('converse-root')?.removeAttribute('livechat-converse-root-width')
}
function handle (el) {
const rect = el.getBoundingClientRect()
const height = rect.height > 576 ? 'high' : (rect.height > 250 ? 'medium' : 'small')
const width = rect.width > 576 ? 'large' : (rect.width > 250 ? 'medium' : 'small')
const previousHeight = el.getAttribute('livechat-converse-root-height')
const previousWidth = el.getAttribute('livechat-converse-root-width')
if (width === previousWidth && height === previousHeight) { return }
const previous = el.getAttribute('livechat-converse-root-width')
if (width === previous) { return }
el.setAttribute('livechat-converse-root-width', width)
el.setAttribute('livechat-converse-root-height', height)
api.trigger('livechatSizeChanged', {
height: height,
width: width
})
}

View File

@ -1,62 +0,0 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
import { CustomElement } from 'shared/components/element.js'
import { api } from '@converse/headless/core'
import { html } from 'lit'
import { __ } from 'i18n'
import '../styles/muc-terms.scss'
export default class MUCTermsView extends CustomElement {
static get properties () {
return {
model: { type: Object, attribute: true },
termstype: { type: String, attribute: true }
}
}
async initialize () {
if (!this.model) {
return
}
this.listenTo(this.model, 'change:x_livechat_terms_' + this.termstype, () => this.requestUpdate())
}
render () {
const terms = this.model?.get('x_livechat_terms_' + this.termstype)
return html`
${terms && terms.body && !this._hideInfoBox(terms.body)
? html`
<div>
<converse-rich-text text=${terms.body} render_styling></converse-rich-text>
<i class="livechat-hide-terms-info-box" @click=${this.closeInfoBox} title=${__('Close')}>
<converse-icon class="fa fa-times" size="1em"></converse-icon>
</i>
</div>`
: ''
}`
}
closeInfoBox (ev) {
ev.preventDefault()
const terms = this.model?.get('x_livechat_terms_' + this.termstype)
if (terms) {
localStorage?.setItem('x_livechat_terms_' + this.termstype + '_hidden', terms.body)
}
this.requestUpdate()
}
_hideInfoBox (body) {
// When hiding the infobox, we store in localStorage the current body, so we will show it again if message change.
// Note: for termstype=global we don't store the MUC server, so if user join chat from different instances,
// it will show terms again
// Note: same for termstype=muc, we don't store the MUC JID, so if user changes channel,
// it will probably show terms again
const lsHideInfoBox = localStorage?.getItem('x_livechat_terms_' + this.termstype + '_hidden')
return lsHideInfoBox === body
}
}
api.elements.define('livechat-converse-muc-terms', MUCTermsView)

View File

@ -1,53 +0,0 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
import { converse, api } from '../../../src/headless/core.js'
import './components/muc-terms.js'
const { sizzle } = converse.env
converse.plugins.add('livechat-converse-terms', {
dependencies: ['converse-muc'],
initialize () {
api.listen.on('parseMUCMessage', (stanza, attrs) => {
const livechatTerms = sizzle('x-livechat-terms', stanza)
if (!livechatTerms.length) {
return attrs
}
return Object.assign(
attrs,
{
x_livechat_terms: livechatTerms[0].getAttribute('type')
}
)
})
},
overrides: {
ChatRoom: {
onMessage: function onMessage (attrs) {
if (!attrs.x_livechat_terms) {
return this.__super__.onMessage(attrs)
}
// We received a x-livechat-terms message, we don't forward it to standard onMessage,
// but we just update the room attribute.
const type = attrs.x_livechat_terms
if (type !== 'global' && type !== 'muc') {
console.error('Invalid x-livechat-terms type: ', type)
return
}
if (attrs.is_archived) {
// This should not happen, as we add some no-store hints. But, just in case.
console.info('Dropping an archived x-livechat-terms message')
return
}
// console.info('Received a x-livechat-terms message', attrs)
const options = {}
options['x_livechat_terms_' + type] = attrs
this.set(options)
// this will be displayed by the livechat-converse-muc-terms custom element,
// which is inserted in the DOM by the muc.js template overload.
}
}
}
})

View File

@ -1,42 +0,0 @@
/*
* SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
.conversejs {
livechat-converse-muc-terms {
background-color: var(--peertube-main-background);
color: var(--peertube-main-foreground);
div {
align-items: center;
border: 1px solid var(--peertube-menu-background);
display: flex;
flex-flow: row;
justify-content: space-between;
margin: 5px;
padding: 5px;
converse-rich-text {
flex-grow: 2;
max-height: 5em;
overflow-y: scroll;
white-space: pre-wrap;
}
.livechat-hide-terms-info-box {
cursor: pointer;
font-size: var(--font-size-small);
flex-shrink: 2;
}
}
}
}
.livechat-readonly,
body[livechat-viewer-mode="on"] {
livechat-converse-muc-terms {
display: none !important;
}
}

View File

@ -65,7 +65,7 @@ body.converse-embedded converse-root.theme-peertube {
--chat-background-color: var(--peertube-main-background);
--chat-textarea-color: var(--peertube-input-foreground);
--chat-textarea-background-color: var(--peertube-input-background);
--chat-textarea-height: 60px;
--chat-textarea-height: 38px;
--send-button-height: 27px;
--send-button-margin: 3px;
--inline-action-margin: 0.75em;

View File

@ -134,8 +134,7 @@ body.livechat-transparent {
.chat-body,
.conversejs .chatroom .box-flyout,
.conversejs .chatbox .chat-content,
.conversejs .chatbox .chat-content .chat-content__notifications,
livechat-converse-muc-poll {
.conversejs .chatbox .chat-content .chat-content__notifications {
background-color: rgba(0 0 0 / 0%) !important;
}
@ -171,7 +170,8 @@ body.converse-embedded {
#peertube-plugin-livechat-container {
converse-muc-message-form {
// For an unknown reason, message field in truncated... so adding a bottom margin.
margin-bottom: 6px;
max-height: 1.25rem;
margin-bottom: 1rem;
}
}

View File

@ -63,7 +63,7 @@ class SlowMode extends CustomElement {
LOC_slow_mode_info,
this.model.config.get('slow_mode_duration')
)}
<i class="livechat-hide-slow-mode-info-box" @click=${this.closeSlowModeInfoBox} title=${__('Close')}>
<i class="livechat-hide-slow-mode-info-box" @click=${this.closeSlowModeInfoBox}>
<converse-icon class="fa fa-times" size="1em"></converse-icon>
</i>
</div>`
@ -79,21 +79,18 @@ class SlowMode extends CustomElement {
api.elements.define('livechat-slow-mode', SlowMode)
const tplSlowMode = (o) => {
if (!o.can_edit) { return html`` }
return html`<livechat-slow-mode jid=${o.model.get('jid')}>`
}
const tplViewerMode = (o) => {
if (!api.settings.get('livechat_enable_viewer_mode')) {
return html``
}
const model = o.model
const i18nNickname = __('Nickname')
const i18nJoin = __('Enter groupchat')
const i18nHeading = __('Choose a nickname to enter')
// eslint-disable-next-line no-undef
const i18nExternalLogin = __(LOC_login_using_external_account)
return html`
export default (o) => {
if (api.settings.get('livechat_enable_viewer_mode')) {
const model = o.model
const i18nNickname = __('Nickname')
const i18nJoin = __('Enter groupchat')
const i18nHeading = __('Choose a nickname to enter')
// eslint-disable-next-line no-undef
const i18nExternalLogin = __(LOC_login_using_external_account)
return html`
<div class="livechat-viewer-mode-content chatroom-form-container">
<form class="converse-form chatroom-form" @submit=${ev => setNickname(ev, model)}>
<label>${i18nHeading}</label>
@ -124,38 +121,12 @@ const tplViewerMode = (o) => {
</div>
`
}
</div>`
}
export default (o) => {
// ConverseJS 10.x does not handle properly the visitor role in unmoderated rooms.
// See https://github.com/conversejs/converse.js/issues/3428 for more info.
// So we will do a dirty hack here to fix this case.
// Note: ConverseJS 11.x has changed the code, and could be fixed more cleanly (or will be fixed if #3428 is fixed).
if (o.can_edit && o.model.getOwnRole() === 'visitor') {
o.can_edit = false
}
let mutedAnonymousMessage
if (
!o.can_edit &&
o.model.features?.get?.('x_peertubelivechat_mute_anonymous') &&
_converse.api.settings.get('livechat_specific_is_anonymous') === true
) {
// If we are moderated because we are anonymous, we want to display a custom message.
// FIXME: if x_peertubelivechat_mute_anonymous changes, user are first muted/voiced, and then only the
// status 104 is sent. But we don't listen to 'change:x_peertubelivechat_mute_anonymous'.
// So the custom message won't be correct. But this is not a big issue.
// eslint-disable-next-line no-undef
mutedAnonymousMessage = __(LOC_muted_anonymous_message)
</div>
${tplSlowMode(o)}
${tplMucBottomPanel(o)}`
}
return html`
${tplViewerMode(o)}
${tplSlowMode(o)}
${
mutedAnonymousMessage
? html`<span class="muc-bottom-panel muc-bottom-panel--muted">${mutedAnonymousMessage}</span>`
: tplMucBottomPanel(o)
}`
${tplMucBottomPanel(o)}`
}

View File

@ -72,7 +72,7 @@ function getPeertubeButtons () {
export default (el) => {
if (!api.settings.get('livechat_mini_muc_head')) {
// original Template (this setting comes with livechatMiniMucHeadPlugin)
// original Template (this settings comes with livechatMiniMucHeadPlugin)
return html`${tplMucHead(el)}`
}

View File

@ -1,28 +0,0 @@
// SPDX-FileCopyrightText: 2013-2024 JC Brand <https://github.com/conversejs/converse.js/>
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: MPL-2.0
// SPDX-License-Identifier: AGPL-3.0-only
// Must import the original muc.js, because it imports some custom elements files.
import '../../src/plugins/muc-views/templates/muc.js'
import { getChatRoomBodyTemplate } from '../../src/plugins/muc-views/utils.js'
import { html } from 'lit'
// Overloading the original muc.js, to add some custom elements.
export default (o) => {
return html`
<div class="flyout box-flyout">
<converse-dragresize></converse-dragresize>
${
o.model
? html`
<converse-muc-heading jid="${o.model.get('jid')}" class="chat-head chat-head-chatroom row no-gutters">
</converse-muc-heading>
<livechat-converse-muc-terms .model=${o.model} termstype="global"></livechat-converse-muc-terms>
<livechat-converse-muc-terms .model=${o.model} termstype="muc"></livechat-converse-muc-terms>
<livechat-converse-muc-poll .model=${o.model}></livechat-converse-muc-poll>
<div class="chat-body chatroom-body row no-gutters">${getChatRoomBodyTemplate(o)}</div>`
: ''}
</div>`
}

View File

@ -40,7 +40,6 @@ module.exports = merge(prod, {
alias: {
'./templates/muc-bottom-panel.js': path.resolve('custom/templates/muc-bottom-panel.js'),
'./templates/muc-head.js': path.resolve(__dirname, 'custom/templates/muc-head.js'),
'./templates/muc.js': path.resolve(__dirname, 'custom/templates/muc.js'),
'../../templates/background_logo.js$': path.resolve(__dirname, 'custom/templates/background_logo.js'),
'./templates/muc-chatarea.js': path.resolve('custom/templates/muc-chatarea.js'),

View File

@ -9,9 +9,7 @@ export const livechatSpecificsPlugin = {
_converse.api.settings.extend({
// if user is authenticated with an external account (to add a logout button)
livechat_specific_external_authent: false,
// if user is anonymous
livechat_specific_is_anonymous: false
livechat_specific_external_authent: false
})
_converse.api.listen.on('getHeadingButtons', (view: any, buttons: any[]) => {

View File

@ -34,22 +34,7 @@ const locKeys = [
'task_delete_confirm',
'task_list_pick_title',
'task_list_pick_empty',
'task_list_pick_message',
'muted_anonymous_message',
'new_poll',
'poll_question',
'poll_duration',
'poll_anonymous_results',
'poll_choice_n',
'poll_title',
'poll_instructions',
'poll_end',
'poll',
'poll_vote_instructions',
'poll_vote_instructions_xmpp',
'poll_is_over',
'poll_choice_invalid',
'poll_anonymous_vote_ok'
'task_list_pick_message'
]
module.exports = locKeys

View File

@ -468,11 +468,8 @@ invalid_value_file_too_big: 'Die Datei ist zu groß (maximale Größe: %s).'
invalid_value_duplicate: Doppelter Wert
livechat_configuration_channel_emojis_title: Kanal-Emojis
livechat_emojis_shortname: Kurzname
livechat_emojis_shortname_desc: "Sie können Emojis im Chat mit \":Kurzname:\" verwenden.\n
Der Kurzname kann mit einem Doppelpunkt (:) beginnen und/oder enden und darf nur
alphanumerische Zeichen, Unterstriche und Bindestriche enthalten.\nEs wird dringend
empfohlen, sie mit einem Doppelpunkt zu beginnen, damit die Benutzer die automatische
Vervollständigung nutzen können (indem sie \":\" eingeben und dann TAB drücken).\n"
livechat_emojis_shortname_desc: "Sie können Emojis mit \":Kurzname:\" verwenden.\n
Der Kurzname darf nur alphanumerische Zeichen, Unterstriche und Bindestriche enthalten.\n"
livechat_configuration_channel_emojis_desc: "Sie können benutzerdefinierte Emojis
für Ihren Kanal konfigurieren.\nDiese Emojis werden in der Emoji-Auswahl verfügbar
sein.\nBenutzer können sie auch mit ihrem Kurznamen verwenden (z. B. indem sie \"\
@ -514,20 +511,3 @@ token_action_revoke_confirm: Sind Sie sicher, dass Sie diesen Token widerrufen w
auth_description: "<h3>Authentifizierung</h3>\n"
livechat_token_disabled_label: Livechat-Token deaktivieren
share_chat_dock: Dock
token_date: Datum
too_many_entries: Zu viele Einträge
livechat_configuration_channel_mute_anonymous_label: Anonyme Benutzer stummschalten
muted_anonymous_message: Nur registrierte Benutzer können Nachrichten versenden.
livechat_configuration_channel_mute_anonymous_desc: "Standardwert für neue Chaträume.\n
Für bestehende Chaträume können Sie die Funktion im Raumkonfigurationsformular ändern.\n
Wenn diese Funktion aktiviert ist, können anonyme Benutzer den Chat nur lesen, aber
keine Nachrichten senden.\n"
chat_terms_label: Nutzungsbedingungen
chat_terms_description: "Diese Nutzungsbedingungen werden allen Nutzern angezeigt,
wenn sie Chaträumen beitreten.\nStreamer können auch Bedingungen für ihre Kanäle
konfigurieren, die direkt nach diesen globalen Bedingungen angezeigt werden.\n"
invalid_value_too_long: Wert zu lang
livechat_configuration_channel_terms_label: Chat Nutzungsbedingungen und Konditionen
des Kanals
livechat_configuration_channel_terms_desc: "Sie können eine \"Nutzungsbedingungen\"\
-Nachricht konfigurieren, die Benutzern angezeigt wird, die Ihren Chaträumen beitreten.\n"

View File

@ -45,11 +45,6 @@ diagnostic: |
chat_title: "<h3>Chat</h3>"
chat_terms_label: "Terms & Conditions"
chat_terms_description: |
These terms & conditions will be shown to all users when then join chatrooms.
Streamers can also configure terms & conditions for their channels, that will be shown right after these global terms & conditions.
list_rooms_label: "List existing rooms"
list_rooms_description: |
<a class="peertube-plugin-livechat-prosody-list-rooms-btn">List rooms</a>
@ -460,8 +455,6 @@ invalid_value_wrong_format: "Value is in the wrong format."
invalid_value_not_in_range: "Value is not in authorized range."
invalid_value_file_too_big: "File size is too big (max size: %s)."
invalid_value_duplicate: "Duplicate value"
invalid_value_too_long: "Value too long"
too_many_entries: "Too many entries"
slow_mode_info: "Slow mode is enabled, users can send a message every %1$s seconds."
@ -511,9 +504,8 @@ livechat_configuration_channel_emojis_desc: |
Users can also use them by with their short name (for example by writing ":shortname:").
livechat_emojis_shortname: 'Short name'
livechat_emojis_shortname_desc: |
You can use emojis in the chat using ":shortname:".
The short name can start and/or end by a colon (:), and only contain alphanumerical characters, underscores and hyphens.
It is strongly recommended to start them by a colon, so that users can use autocompletion (by typing ":" then press TAB).
You can use emojis using ":shortname:".
The short name can only contain alphanumerical characters, underscores and hyphens.
livechat_emojis_file: 'File'
livechat_emojis_file_desc: |
The emoji file.
@ -553,29 +545,3 @@ livechat_token_disabled_description: |
These tokens can for example be used to include the chat in OBS web docks.
Check <a href="https://livingston.frama.io/peertube-plugin-livechat/documentation/user/obs" target="_blank">the documentation</a> for more information.
You can disable this feature by checking this setting.
muted_anonymous_message: Only registered users can send messages.
livechat_configuration_channel_mute_anonymous_label: "Mute anonymous users"
livechat_configuration_channel_mute_anonymous_desc: |
Default value for new chatrooms.
For existing chatrooms, you can change the feature in the room configuration form.
When this feature is enabled, anonymous users can only read the chat, and not send messages.
livechat_configuration_channel_terms_label: "Channel's chat terms & conditions"
livechat_configuration_channel_terms_desc: |
You can configure a "terms & conditions" message that will be shown to users joining your chatrooms.
new_poll: Create a new poll
poll: Poll
poll_title: New poll
poll_instructions: Complete and submit this form to create a new poll. This will end and replace any existing poll.
poll_question: Question
poll_duration: Poll duration (in minutes)
poll_anonymous_results: Anonymous results
poll_choice_n: 'Choice {{N}}:'
poll_end: 'Poll ends at:'
poll_vote_instructions: "To vote, click on your choice or send a message with an exclamation mark followed by your choice number (Example: !1)."
poll_vote_instructions_xmpp: "Send a message with an exclamation mark followed by your choice number to vote. Example: !1"
poll_is_over: This poll is now over.
poll_choice_invalid: This choice is not valid.
poll_anonymous_vote_ok: Your vote is taken into account. Votes are anonymous, they will not be shown to other participants.
poll_vote_ok: Your vote has been taking into account, the counters will be updated in a moment.

View File

@ -484,11 +484,9 @@ invalid_value_file_too_big: 'La taille du fichier est trop grande (taille maximu
invalid_value_duplicate: Valeur en double
livechat_configuration_channel_emojis_title: Émojis de la chaîne
livechat_emojis_shortname: Nom court
livechat_emojis_shortname_desc: "Vous pouvez utiliser l'émojis dans le tchat en utilisant
\":nom_court:\".\nLe nom court peut commencer et/ou finir par des deux-points (:),
et seulement contenir des caractères alphanumériques des underscores et des tirets.\n
Il est fortement recommandé de les commencer par des deux-points, pour que les utilisateur⋅rices
puissent utiliser l'autocomplétion (en tapant \":\" puis en pressant TABULATION).\n"
livechat_emojis_shortname_desc: "Vous pouvez utiliser l'émojis en utilisant \":nom_court:\"\
.\nLe nom court peut seulement contenir des caractères alphanumériques des underscores
et des tirets.\n"
livechat_emojis_file: Fichier
livechat_emojis_file_desc: "Le fichier de l'émoji.\n"
action_export: Exporter
@ -524,46 +522,3 @@ livechat_token_disabled_description: "Les utilisateur⋅rices peuvent générer
pour inclure le tchat dans les docks web dans OBS.\nConsultez <a href=\"https://livingston.frama.io/peertube-plugin-livechat/fr/documentation/user/obs\"\
\ target=\"_blank\">la documentation</a> pour plus d'informations.\nVous pouvez
désactiver cette fonctionnalité en cochant ce paramètre.\n"
too_many_entries: "Trop d'entrées"
livechat_configuration_channel_mute_anonymous_desc: "Valeur par défaut pour les nouveaux
salons de discussion.\nPour les salons existants, vous pouvez changer la fonctionnalité
via le formulaire de configuration du salon.\nQuand la fonctionnalité est active,
les utilisateur⋅rices anonymes ne peuvent que lire le tchat, et ne peuvent pas envoyer
de messages.\n"
livechat_configuration_channel_mute_anonymous_label: Silencier les utilisateur⋅rices
anonymes
muted_anonymous_message: Seuls les utilisateur⋅rices enregistré⋅es peuvent envoyer
des messages.
token_date: Date
chat_terms_label: Conditions d'utilisation
invalid_value_too_long: Valeur trop longue
chat_terms_description: "Ces conditions d'utilisation seront affichées à tous les
utilisateur⋅rices lorsqu'iels rejoindront les salons de discussion.\nLes streameur⋅euses
peuvent également configurer des conditions d'utilisation pour leurs canaux, qui
seront affichées juste après les conditions de l'instance.\n"
livechat_configuration_channel_terms_label: Conditions d'utilisation tchat de la chaîne
livechat_configuration_channel_terms_desc: "Vous pouvez configurer un message de \"\
conditions d'utilisation\" qui sera affiché aux utilisateur⋅rices qui rejoignent
vos salons de discussion.\n"
new_poll: Créer un nouveau sondage
poll_title: Nouveau sondage
poll_instructions: Complétez et soumettez ce formulaire pour créer un nouveau sondage.
Ceci mettra fin au sondage précédent le cas échéant.
poll_question: Question
poll_duration: Durée du sondage (en minutes)
poll_anonymous_results: Résultats anonymes
poll_choice_n: 'Choix {{N}} :'
poll_end: 'Fin du sondage :'
poll_vote_instructions: "Pour voter, cliquez sur votre choix, ou envoyez un message
avec un point d'exclamation suivi de votre choix (Exemple: !1)."
poll_is_over: Ce sondage est à présent terminé.
poll_choice_invalid: Ce choix n'est pas valide.
poll_anonymous_vote_ok: Votre vote a été pris en compte. Les votes sont anonymes,
ils ne seront pas montrés aux autres participant⋅es.
poll_vote_ok: Votre vote a été pris en compte, les compteurs seront mis à jour dans
un instant.
poll_vote_instructions_xmpp: Envoyez un message avec un point d'exclamation suivi
du numéro de votre choix pour voter. Exemple:!1
poll: Sondage

View File

@ -274,4 +274,3 @@ action_export: Izvezi
share_chat_embed: Ugradi
token_label: Oznaka
auth_description: "<h3>Autentifikacija</h3>\n"
chat_terms_label: Uvjeti i odredbe

View File

@ -229,4 +229,3 @@ external_auth_custom_oidc_description: "チャットへのログインに、外
次のドキュメントを参照してください:\n<a href=\"https://livingston.frama.io/peertube-plugin-livechat/ja/documentation/admin/settings/\"\
\ target=\"_blank\">設定</a>ページ\n"
external_auth_custom_oidc_button_label_description: このラベルは、OIDCプロバイダーを使用して認証するボタン名としてユーザーに表示されます。
copied: コピーしました

View File

@ -33,42 +33,3 @@ help_builtin_prosody_label: Serwer Prosody
disable_websocket_label: Wyłącz Websocket
prosody_port_label: Port Prosody
prosody_certificates_dir_label: Folder certyfikatów
poll_title: Nowa ankieta
theming_advanced_description: <h3>Zmiana motywu</h3>
livechat_configuration_channel_command_cmd_label: Polecenie
livechat_configuration_channel_command_message_label: Wiadomość
livechat_configuration_channel_title: Opcje kanałów
tasks: Zadania
promote: Zostań moderatorem
external_auth_facebook_oidc_label: Użyj Facebooka
login_external_auth_alert_message: Uwierzytelnianie nie powiodło się
cancel: Anuluj
menu_configuration_label: Czaty
successfully_saved: Pomyślnie zapisano
livechat_configuration_channel_bot_nickname: Pseudonim bota
livechat_configuration_channel_forbidden_words_comments_label: Komentarze
invalid_value: Nieprawidłowa wartość.
livechat_configuration_channel_slow_mode_label: Tryb spowolniony
action_export: Eksportuj
livechat_configuration_channel_command_label: Polecenie bota
token_label: Etykieta
livechat_emojis_file: Plik
livechat_emojis_shortname: Skrócona nazwa
save: Zapisz
avatar_set_option_bird: Ptaki
external_auth_google_oidc_label: Użyj Google
task_name: Nazwa zadania
avatar_set_option_cat: Koty
task_description: Opis
task_delete: Usuń zadanie
livechat_configuration_channel_forbidden_words_reason_label: Powód
livechat_configuration_channel_forbidden_words_label_label: Etykieta
copied: Skopiowano
autocolors_label: Automatyczne wykrywanie kolorów
livechat_configuration_channel_quote_label2: Wiadomości
action_import: Importuj
auth_description: "<h3>Uwierzytelnianie</h3>\n"
poll: Ankieta
poll_question: Pytanie
poll_anonymous_results: Anonimowe wyniki
poll_choice_n: 'Wybór {{N}}:'

View File

@ -1,8 +0,0 @@
online_help: "Online pomoc"
open_chat: "Otvoriť chat"
open_chat_new_window: "Otvoriť chat na novom okne"
close_chat: "Zavrieť čet"
use_chat: "Použite chat"
use_chat_help: "Ak je povolená, vedľa videa sa zobrazí chat."
share_chat_link: "Zdieľať odkaz na čet"
read_only: "Iba na čítanie"

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{
"name": "peertube-plugin-livechat",
"version": "10.2.0",
"version": "10.1.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "peertube-plugin-livechat",
"version": "10.2.0",
"version": "10.1.0",
"license": "AGPL-3.0",
"dependencies": {
"@xmpp/jid": "^0.13.1",

View File

@ -1,13 +1,13 @@
{
"name": "peertube-plugin-livechat",
"description": "PeerTube plugin livechat: create chat rooms for your Peertube lives! Comes with many features: federation, moderation tools, chat bot, chat persistence, OBS integration, ...",
"version": "10.2.0",
"description": "NCTV fork of the peertube-plugin-livechat plugin, containing styling and other shit. This will be maintained with upstream.",
"version": "10.1.0",
"license": "AGPL-3.0",
"author": {
"name": "John Livingston",
"url": "https://github.com/JohnXLivingston"
"name": "Matty Boombalatty",
"url": "https://gitea.nicecrew.digital/matty"
},
"bugs": "https://github.com/JohnXLivingston/peertube-plugin-livechat/issues",
"bugs": "https://gitea.nicecrew.digital/matty/peertube-plugin-livechat/issues",
"clientScripts": [
{
"script": "dist/client/common-client-plugin.js",
@ -82,8 +82,8 @@
"engines": {
"npm": ">=7"
},
"homepage": "https://livingston.frama.io/peertube-plugin-livechat/",
"repository": "github:JohnXLivingston/peertube-plugin-livechat",
"homepage": "https://nicecrew.tv",
"repository": "https://gitea.nicecrew.digital/matty/peertube-plugin-livechat",
"keywords": [
"peertube",
"plugin"

View File

@ -14,9 +14,6 @@ local get_room_from_jid = rawget(mod_muc, "get_room_from_jid");
module:depends"http";
local mod_muc_peertubelivechat_terms = module:depends"muc_peertubelivechat_terms";
local set_muc_terms = rawget(mod_muc_peertubelivechat_terms, "set_muc_terms");
function check_auth(routes)
local function check_request_auth(event)
local apikey = module:get_option_string("peertubelivechat_manage_rooms_apikey", "")
@ -97,12 +94,6 @@ local function update_room(event)
must104 = true;
end
end
if (type(config.livechat_muc_terms) == "string") then
-- to easily detect if the value is given or not, we consider that the caller passes "" when terms must be deleted.
if set_muc_terms then
set_muc_terms(room, config.livechat_muc_terms or nil);
end
end
if type(config.removeAffiliationsFor) == "table" then
-- array of jids
for _, jid in ipairs(config.removeAffiliationsFor) do

View File

@ -4,13 +4,9 @@
-- SPDX-License-Identifier: MIT
-- SPDX-License-Identifier: AGPL-3.0-only
--
-- This version contains a modification to take into account new config options:
-- * "slow_mode_duration"
-- * "mute_anonymous"
-- These options are introduced in the Peertube livechat plugin.
--
-- The "slow_mode_duration" comes with mod_muc_slow_mode.
-- There will be a XEP proposal for this one. When done, these modifications will be submitted to the mod_muc_http_defaults maintainer.
-- This version contains a modification to take into account new config option "slow_mode_duration".
-- This option is introduced in the Peertube livechat plugin, by mod_muc_slow_mode.
-- There will be a XEP proposal. When done, these modifications will be submitted to the mod_muc_http_defaults maintainer.
--
local http = require "net.http";
@ -118,14 +114,6 @@ local function apply_config(room, settings)
if (type(config.slow_mode_duration) == "number") and config.slow_mode_duration >= 0 then
room._data.slow_mode_duration = config.slow_mode_duration;
end
if (type(config.mute_anonymous) == "boolean") then
room._data.x_peertubelivechat_mute_anonymous = config.mute_anonymous;
end
if (type(config.livechat_muc_terms) == "string") then
-- we don't need to use set_muc_terms here, as this is called for a newly created room
-- (and thus we don't need to broadcast changes)
room._data.livechat_muc_terms = config.livechat_muc_terms;
end
elseif config ~= nil then
module:log("error", "Invalid config returned from API for %s: %q", room.jid, config);
return nil, "format", { field = "config" };

View File

@ -1,30 +0,0 @@
<!--
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only
-->
# mod_muc_peertubelivechat_roles
This module is a custom module that handles default roles for users.
This module is part of peertube-plugin-livechat, and is under the same LICENSE.
## Features
### Only registered users can talk
This feature will set default user roles to 'visitor' for anonymous users.
The feature is associated to a room configuration field (muc#roomconfig_x_peertubelivechat_mute_anonymous).
The default value for this field will be set by mod_muc_http_defaults (which is a custom version of the original module).
Note: currently, all anonymous users are joining the original Peertube instance.
This means we only have to handle anonymous users on the local "anon" virtualhost.
If anonymous users are muted, the room disco features will include "x_peertubelivechat_mute_anonymous".
This is used by the ConverseJs frontend to display a message explaining why the user is muted.
### Only Peertube channel followers can talk
This feature will come later.

View File

@ -1,84 +0,0 @@
-- mod_muc_peertubelivechat_roles
--
-- SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
-- SPDX-License-Identifier: AGPL-3.0-only
--
-- This file is AGPL-v3 licensed.
-- Please see the Peertube livechat plugin copyright information.
-- https://livingston.frama.io/peertube-plugin-livechat/credits/
--
-- To compute the anonymous host, we will simply replace "room." by "anon." in the current module host.
-- This part is very peertube-plugin-livechat specific, but that's okay :)
local anonymous_host = "@anon." .. module.host:sub(#"^room.");
local function get_peertubelivechat_mute_anonymous(room)
return room._data.x_peertubelivechat_mute_anonymous;
end
local function set_peertubelivechat_mute_anonymous(room, mute_anonymous)
mute_anonymous = mute_anonymous and true or nil;
if get_peertubelivechat_mute_anonymous(room) == mute_anonymous then return false; end
room._data.x_peertubelivechat_mute_anonymous = mute_anonymous;
local role_to_test;
local role_to_set;
if (mute_anonymous) then
-- mute all anonymous users (with "participant" role)
role_to_test = "participant";
role_to_set = "visitor";
else
-- voice all anonymous users (with "visitor" role).
role_to_test = "visitor";
role_to_set = "participant";
end
for occupant_jid, occupant in room:each_occupant() do
if (occupant.bare_jid:sub(-#anonymous_host) == anonymous_host) and occupant.role == role_to_test then
room:set_role(true, occupant_jid, role_to_set);
end
end
return true;
end
module:hook("muc-disco#info", function(event)
if get_peertubelivechat_mute_anonymous(event.room) then
event.reply:tag("feature", {var = "x_peertubelivechat_mute_anonymous"}):up();
end
end);
module:hook("muc-config-form", function(event)
table.insert(event.form, {
name = "muc#roomconfig_x_peertubelivechat_mute_anonymous";
type = "boolean";
label = "Mute anonymous users";
desc = "Anonymous users will be muted by default.";
value = get_peertubelivechat_mute_anonymous(event.room);
});
end, 121);
module:hook("muc-config-submitted/muc#roomconfig_x_peertubelivechat_mute_anonymous", function(event)
if set_peertubelivechat_mute_anonymous(event.room, event.value) then
event.status_codes["104"] = true;
end
end);
-- Note: muc-get-default-role does not get any occupant info.
-- So we want use this hook to set default roles.
-- We will do something a little hacky...: change the role in a high priority muc-occupant-pre-join hook!
module:hook("muc-occupant-pre-join", function(event)
local occupant = event.occupant;
if occupant.role == "participant" then
if get_peertubelivechat_mute_anonymous(event.room) and occupant.bare_jid ~= nil then
if (occupant.bare_jid:sub(-#anonymous_host) == anonymous_host) then
occupant.role = "visitor";
end
end
end
end, 1000);
return {
get = get_peertubelivechat_mute_anonymous;
set = set_peertubelivechat_mute_anonymous;
};

View File

@ -1,34 +0,0 @@
<!--
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only
-->
# mod_muc_peertubelivechat_terms
This module is a custom module to handle Terms&Conditions in the livechat Peertube plugin.
This module is part of peertube-plugin-livechat, and is under the same LICENSE.
## Features
When a new occupant session is created for a MUC, this module will send to the user the global terms,
and the MUC-specific terms (if defined).
This is done by sending groupchat messages.
These messages will contain a "x-livechat-terms" tag, so that livechat front-end can detect these messages, and display them differently.
For standard XMPP clients, these messages will show as standard MUC message coming from a specific nickname.
## Configuration
This modules take following options.
### muc_terms_service_nickname
The nickname that will be used by service messages.
This module reserves the nickname, so than nobody can use it in MUC rooms
(we don't want any user to spoof this nickname).
### muc_terms_global
The global terms.

View File

@ -1,128 +0,0 @@
-- mod_muc_peertubelivechat_terms
--
-- SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
-- SPDX-License-Identifier: AGPL-3.0-only
--
-- This file is AGPL-v3 licensed.
-- Please see the Peertube livechat plugin copyright information.
-- https://livingston.frama.io/peertube-plugin-livechat/credits/
--
-- Exposed functions:
-- get_muc_terms
-- set_muc_terms
local jid_escape = require "util.jid".escape;
local jid_resource = require "util.jid".resource;
local st = require "util.stanza";
local id = require "util.id";
local datetime = require "util.datetime";
local service_nickname = module:get_option_string("muc_terms_service_nickname", "Service");
local global_terms = module:get_option_string("muc_terms_global", "");
local function create_terms_message(room, type, terms)
-- Note: we can't send the message from "room.jid": XMPP clients such as Gajim would ignore them.
-- So we use a service_nickname.
local from = room.jid .. '/' .. jid_escape(service_nickname);
module:log("debug", "Creating %s terms message from %s (room %s)", type, from, room);
local msg = st.message({
type = "groupchat",
from = from,
id = id.medium()
}, terms)
:tag('x-livechat-terms', { type = type }):up() -- adding a custom tag to specify that it is a "terms" message, so that frontend can display it with a special template.
:tag("delay", { xmlns = "urn:xmpp:delay", from = from, stamp = datetime.datetime() }):up() -- adding a delay to trick the moderation bot (see below)
:tag("no-copy", { xmlns = "urn:xmpp:hints" }):up()
:tag("no-store", { xmlns = "urn:xmpp:hints" }):up()
:tag("no-permanent-store", { xmlns = "urn:xmpp:hints" }):up();
-- concerning the delay tag:
-- We are sending message to rooms from non-existant occupants.
-- If the message contains something that should be moderated by the livechat moderation bot,
-- it could generate some error logs (the bot will not find the user in the occupant list).
-- At time of writing, the xmppjs-chat-bot ignore delayed message... so we use this hack to trick the bot.
return msg;
end
-- MUC Getter/Setter
function get_muc_terms(room)
return room._data.livechat_muc_terms or nil;
end
function set_muc_terms(room, terms)
if terms == "" then
terms = nil;
end
if get_muc_terms(room) == terms then return false; end
room._data.livechat_muc_terms = terms;
if terms ~= nil then
-- we must send new terms to all occupants.
local msg = create_terms_message(room, "muc", terms);
module:log("debug", "Broadcasting terms message to room %s", room);
room:broadcast_message(msg);
end
return true;
end
-- send the terms when joining:
local function send_terms(event)
local origin = event.origin;
local room = event.room;
local occupant = event.occupant;
if global_terms then
module:log("debug", "Sending global terms to %s", occupant.jid);
local msg = create_terms_message(room, "global", global_terms);
msg.attr.to = occupant.jid;
origin.send(msg);
end
local muc_terms = get_muc_terms(room);
if muc_terms then
local from = room.jid .. '/' .. jid_escape(service_nickname);
module:log("debug", "Sending muc terms to %s", occupant.jid);
local msg = create_terms_message(room, "muc", muc_terms);
msg.attr.to = occupant.jid;
origin.send(msg);
end
end
-- Note: we could do that on muc-occupant-joined or muc-occupant-session-new.
-- The first will not send it to multiple clients, the second will.
-- After some reflexion, i will try muc-occupant-session-new, and see if it works as expected.
module:hook("muc-occupant-session-new", send_terms);
-- reserve the service_nickname:
local function enforce_nick_policy(event)
local origin, stanza = event.origin, event.stanza;
local requested_nick = jid_resource(stanza.attr.to);
local room = event.room;
if not room then return; end
if requested_nick == service_nickname then
module:log("debug", "Occupant tried to use the %s reserved nickname, blocking it.", service_nickname);
local reply = st.error_reply(stanza, "cancel", "conflict", nil, room.jid):up();
origin.send(reply);
return true;
end
end
module:hook("muc-occupant-pre-join", enforce_nick_policy);
module:hook("muc-occupant-pre-change", enforce_nick_policy);
-- security check: we must remove all "x-livechat-terms" tag, to be sure nobody tries to spoof terms!
module:hook("muc-occupant-groupchat", function(event)
event.stanza:maptags(function (child)
if child.name == 'x-livechat-terms' then
return nil;
end
return child;
end);
end, 100);
-- don't save terms messages in history
module:hook("muc-message-is-historic", function(event)
local stanza = event.stanza;
if (stanza:get_child("x-livechat-terms")) then
return false, "hint";
end
end, 1);

View File

@ -1,33 +0,0 @@
<!--
SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
SPDX-License-Identifier: AGPL-3.0-only
-->
# mod_muc_slow_pool
This module provide a way to create polls in MUC rooms.
This module is part of peertube-plugin-livechat, and is under the same LICENSE.
There will probably be a XEP proposal for this module behaviour. When done, this module will be published in the prosody-modules repository.
## Configuration
Just enable the module on your MUC component.
All above configurations are optional.
## poll_groupchat_votes_priority
The priority for the hook that will take into account votes.
You can change this, if you have some specific hook that should be done after/before counting votes (slow mode, firewall, ...).
Default: 40 (Prosody checks visitor role with priority of 50, we want this to be after).
## Strings
You can change some defaults strings, if you want for example to localize the poll messages.
Here are the existing strings and default values:
* poll_string_over: This poll is now over.
* poll_string_vote_instructions: Send a message with an exclamation mark followed by your choice number to vote. Example: !1
* poll_string_invalid_choice: This choice is not valid.
* poll_string_anonymous_vote_ok: Your vote is taken into account. Votes are anonymous, they will not be shown to other participants.

View File

@ -1,17 +0,0 @@
-- SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
-- SPDX-License-Identifier: AGPL-3.0-only
-- FIXME: create a XEP to standardize this, and remove the "x-".
local xmlns_poll = "http://jabber.org/protocol/muc#x-poll";
local xmlns_poll_message = "http://jabber.org/protocol/muc#x-poll-message";
local poll_message_tag = "x-poll";
local poll_question_tag = "x-poll-question";
local poll_choice_tag = "x-poll-choice";
return {
xmlns_poll = xmlns_poll;
xmlns_poll_message = xmlns_poll_message;
poll_message_tag = poll_message_tag;
poll_question_tag = poll_question_tag;
poll_choice_tag = poll_choice_tag;
};

View File

@ -1,153 +0,0 @@
-- SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
-- SPDX-License-Identifier: AGPL-3.0-only
local st = require "util.stanza";
local dataform = require "util.dataforms";
local get_form_type = require "util.dataforms".get_type;
local xmlns_poll = module:require("constants").xmlns_poll;
local end_current_poll = module:require("poll").end_current_poll;
local create_poll = module:require("poll").create_poll;
local function get_form_layout(room, stanza)
local form = dataform.new({
title = "New poll",
instructions = "Complete and submit this form to create a new poll. This will end and replace any existing poll.",
{
name = "FORM_TYPE";
type = "hidden";
value = xmlns_poll;
}
});
table.insert(form, {
name = "muc#roompoll_question";
type = "text-single";
label = "Question";
desc = "The poll question.";
value = "";
required = true;
});
table.insert(form, {
name = "muc#roompoll_duration";
type = "text-single";
datatype = "xs:integer";
range_min = 1;
label = "Poll duration (in minutes)";
desc = "The number of minutes to run the poll.";
value = "";
required = true;
});
table.insert(form, {
name = "muc#roompoll_anonymous";
type = "boolean";
label = "Anonymous results";
desc = "By enabling this, user's votes won't be publicly shown in the room.";
value = true;
});
table.insert(form, {
name = "muc#roompoll_choice1";
type = "text-single";
label = "Choice 1";
desc = "";
value = "";
required = true;
});
table.insert(form, {
name = "muc#roompoll_choice2";
type = "text-single";
label = "Choice 2";
desc = "";
value = "";
required = true;
});
table.insert(form, {
name = "muc#roompoll_choice3";
type = "text-single";
label = "Choice 3";
desc = "";
value = "";
});
table.insert(form, {
name = "muc#roompoll_choice4";
type = "text-single";
label = "Choice 4";
desc = "";
value = "";
});
table.insert(form, {
name = "muc#roompoll_choice5";
type = "text-single";
label = "Choice 5";
desc = "";
value = "";
});
return form;
end
local function send_form(room, origin, stanza)
module:log("debug", "Sending the poll form");
origin.send(st.reply(stanza):query(xmlns_poll)
:add_child(get_form_layout(room, stanza.attr.from):form())
) ;
end
local function dataform_error_message(err)
local out = {};
for field, errmsg in pairs(err) do
table.insert(out, ("%s: %s"):format(field, errmsg))
end
return table.concat(out, "; ");
end
local function process_form(room, origin, stanza, occupant)
if not stanza.tags[1] then
origin.send(st.error_reply(stanza, "modify", "bad-request"));
return true;
end
local form = stanza.tags[1]:get_child("x", "jabber:x:data");
if not form then
origin.send(st.error_reply(stanza, "modify", "bad-request"));
return true;
end
local form_type, err = get_form_type(form);
if not form_type then
origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid dataform: "..err));
return true;
elseif form_type ~= xmlns_poll then
origin.send(st.error_reply(stanza, "modify", "bad-request", "Unexpected FORM_TYPE, expected '"..xmlns_poll.."'"));
return true;
end
if form.attr.type == "cancel" then
origin.send(st.reply(stanza));
return true;
elseif form.attr.type ~= "submit" then
origin.send(st.error_reply(stanza, "cancel", "bad-request", "Not a submitted form"));
return true;
end
-- form submitted
local fields, errors, present = get_form_layout(room, stanza.attr.from):data(form);
if errors then
origin.send(st.error_reply(stanza, "modify", "bad-request", dataform_error_message(errors)));
return true;
end
-- stop any poll that is already here
end_current_poll(room);
-- create the new poll
create_poll(room, fields, occupant);
origin.send(st.reply(stanza));
return true;
end
return {
send_form = send_form;
process_form = process_form;
};

View File

@ -1,232 +0,0 @@
-- SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
-- SPDX-License-Identifier: AGPL-3.0-only
local id = require "util.id";
local st = require "util.stanza";
local timer = require "util.timer";
local xmlns_occupant_id = "urn:xmpp:occupant-id:0";
local xmlns_replace = "urn:xmpp:message-correct:0";
local xmlns_poll_message = module:require("constants").xmlns_poll_message;
local poll_message_tag = module:require("constants").poll_message_tag;
local poll_question_tag = module:require("constants").poll_question_tag;
local poll_choice_tag = module:require("constants").poll_choice_tag;
local mod_muc = module:depends"muc";
local get_room_from_jid = mod_muc.get_room_from_jid;
local debounce_delay = 5; -- number of seconds during which we must group votes to avoid flood.
local scheduled_updates = {};
local string_poll_over = module:get_option_string("poll_string_over") or "This poll is now over.";
local string_poll_vote_instructions = module:get_option_string("poll_string_vote_instructions") or "Send a message with an exclamation mark followed by your choice number to vote. Example: !1";
-- Build the content for poll start and end messages (that will go to the message <body>)
local function build_poll_message_content(room, is_end_message)
local current_poll = room._data.current_poll;
if not current_poll then
return nil;
end
local content = current_poll["muc#roompoll_question"] .. "\n";
if is_end_message then
content = content .. string_poll_over .. "\n";
end
local total = 0;
for choice, nb in pairs(current_poll.votes_by_choices) do
total = total + nb;
end
for _, choice_desc in ipairs(current_poll.choices_ordered) do
local choice, label = choice_desc.number, choice_desc.label;
content = content .. choice .. ': ' .. label;
-- if vote over, and at least 1 vote, we add the results.
if is_end_message and total > 0 then
local nb = current_poll.votes_by_choices[choice] or 0;
local percent = string.format("%.2f", nb * 100 / total);
content = content .. " (" .. nb .. "/" .. total .. " = " .. percent .. "%)";
end
content = content .. "\n";
end
if not is_end_message then
content = content .. string_poll_vote_instructions .. "\n";
end
return content;
end
-- construct the poll message stanza.
-- Note: content can be nil, for updates messages.
local function build_poll_message(room, content)
local current_poll = room._data.current_poll;
if not current_poll then
return nil;
end
local from = current_poll.occupant_nick; -- this is in fact room.jid/nickname
local msg = st.message({
type = "groupchat",
from = from,
id = id.long()
}, content);
msg:tag("occupant-id", {
xmlns = xmlns_occupant_id,
id = current_poll.occupant_id
}):up();
if content == nil then
-- No content, this is an update message.
-- Adding some hints (XEP-0334):
msg:tag("no-copy", { xmlns = "urn:xmpp:hints" }):up();
msg:tag("no-store", { xmlns = "urn:xmpp:hints" }):up();
msg:tag("no-permanent-store", { xmlns = "urn:xmpp:hints" }):up();
end
-- now we must add some custom XML data, so that compatible clients can display the poll as they want:
-- <x-poll xmlns="http://jabber.org/protocol/muc#x-poll-message" id="I9UWyoxsz4BN" votes="1" end="1719842224" over="">
-- <x-poll-question>Poll question</x-poll-question>
-- <x-poll-choice choice="1" votes="0">Choice 1 label</x-poll-choice>
-- <x-poll-choice choice="2" votes="1">Choice 2 label</x-poll-choice>
-- <x-poll-choice choice="3" votes="0">Choice 3 label</x-poll-choice>
-- <x-poll-choice choice="4" votes="0">Choice 4 label</x-poll-choice>
-- </x-poll>
local total = 0;
for choice, nb in pairs(current_poll.votes_by_choices) do
total = total + nb;
end
local message_attrs = {
xmlns = xmlns_poll_message,
id = current_poll.poll_id,
votes = "" .. total
};
message_attrs["end"] = string.format("%i", current_poll.end_timestamp);
if current_poll.already_ended then
message_attrs["over"] = "";
end
msg:tag(poll_message_tag, message_attrs):text_tag(poll_question_tag, current_poll["muc#roompoll_question"], {});
for _, choice_desc in ipairs(current_poll.choices_ordered) do
local choice, label = choice_desc.number, choice_desc.label;
local nb = current_poll.votes_by_choices[choice] or 0;
total = total + nb;
msg:text_tag(poll_choice_tag, label, {
votes = "" .. nb,
choice = choice
});
end
msg:up();
return msg;
end
-- sends a message when the poll starts.
local function poll_start_message(room)
if not room._data.current_poll then
return nil;
end
module:log("debug", "Sending the start message for room %s poll", room.jid);
local content = build_poll_message_content(room, false);
local msg = build_poll_message(room, content);
room:broadcast_message(msg);
end
-- Send the poll update message
local function send_poll_update_message(room)
if not room._data.current_poll then
return nil;
end
if room._data.current_poll.already_ended then
module:log("debug", "Cancelling the update message for room %s poll, because already_ended==true.", room.jid);
return nil;
end
module:log("debug", "Sending an update message for room %s poll", room.jid);
local msg = build_poll_message(room, nil);
room:broadcast_message(msg);
end
-- Schedule an update of the start message.
-- We do not send this update each time someone vote,
-- to avoid flooding.
local function schedule_poll_update_message(room_jid)
if scheduled_updates[room_jid] then
-- already a running timer, we can ignore to debounce.
return;
end
scheduled_updates[room_jid] = timer.add_task(debounce_delay, function()
scheduled_updates[room_jid] = nil;
-- We dont pass room, because here it could have been removed from memory.
-- So we must relad the room from the JID in any case.
local room = get_room_from_jid(room_jid);
if not room then
return;
end
send_poll_update_message(room);
end);
end
-- Send a new message when the poll is over, with the result.
local function poll_end_message(room)
if not room._data.current_poll then
return nil;
end
module:log("debug", "Sending the end message for room %s poll", room.jid);
if scheduled_updates[room.jid] then
module:log("debug", "Cancelling an update message for the poll %s", room.jid);
timer.stop(scheduled_updates[room.jid]);
scheduled_updates[room.jid] = nil;
end
local content = build_poll_message_content(room, true);
local msg = build_poll_message(room, content);
room:broadcast_message(msg);
end
-- security check: we must remove all specific tags, to be sure nobody tries to spoof polls!
local function remove_specific_tags_from_groupchat(event)
event.stanza:maptags(function (child)
if child.name == poll_message_tag then
return nil;
end
if child.name == poll_question_tag then
return nil;
end
if child.name == poll_choice_tag then
return nil;
end
return child;
end);
end
-- when a new session is opened, we must send the current poll to the client
local function handle_new_occupant_session(event)
local room = event.room;
local occupant = event.occupant;
local origin = event.origin;
if not occupant then
return;
end
if not room._data.current_poll then
return;
end
if room._data.current_poll.already_ended then
return;
end
-- Sending an update message to the new occupant.
module:log("debug", "Sending a poll update message to new occupant %s", occupant.jid);
local msg = build_poll_message(room, nil);
msg.attr.to = occupant.jid;
origin.send(msg);
end
return {
poll_start_message = poll_start_message;
poll_end_message = poll_end_message;
schedule_poll_update_message = schedule_poll_update_message;
remove_specific_tags_from_groupchat = remove_specific_tags_from_groupchat;
handle_new_occupant_session = handle_new_occupant_session;
};

View File

@ -1,99 +0,0 @@
-- mod_muc_poll
--
-- SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
-- SPDX-License-Identifier: AGPL-3.0-only
--
-- This file is AGPL-v3 licensed.
-- Please see the Peertube livechat plugin copyright information.
-- https://livingston.frama.io/peertube-plugin-livechat/credits/
--
-- Implements: XEP-????: MUC Poll (XEP to come).
local st = require "util.stanza";
local jid_bare = require "util.jid".bare;
local mod_muc = module:depends"muc";
local get_room_from_jid = mod_muc.get_room_from_jid;
local xmlns_poll = module:require("constants").xmlns_poll;
local send_form = module:require("form").send_form;
local process_form = module:require("form").process_form;
local handle_groupchat = module:require("poll").handle_groupchat;
local remove_specific_tags_from_groupchat = module:require("message").remove_specific_tags_from_groupchat;
local handle_new_occupant_session = module:require("message").handle_new_occupant_session;
local room_restored = module:require("poll").room_restored;
local poll_groupchat_votes_priority = module:get_option_number("poll_groupchat_votes_priority") or 40;
-- new poll creation, get form
module:hook("iq-get/bare/" .. xmlns_poll .. ":query", function (event)
local origin, stanza = event.origin, event.stanza;
local room_jid = stanza.attr.to;
module:log("debug", "Received a request for the poll form");
local room = get_room_from_jid(room_jid);
if not room then
origin.send(st.error_reply(stanza, "cancel", "item-not-found"));
return true;
end
local from = jid_bare(stanza.attr.from);
local from_affiliation = room:get_affiliation(from);
if (from_affiliation ~= "owner" and from_affiliation ~= "admin") then
origin.send(st.error_reply(stanza, "auth", "forbidden"))
return true;
end
send_form(room, origin, stanza);
return true;
end);
-- new poll creation, form submission
module:hook("iq-set/bare/" .. xmlns_poll .. ":query", function (event)
local origin, stanza = event.origin, event.stanza;
local room_jid = stanza.attr.to;
local from = stanza.attr.from;
module:log("debug", "Received a form submission for the poll form on %s from %s", room_jid, from);
local room = get_room_from_jid(room_jid);
if not room then
origin.send(st.error_reply(stanza, "cancel", "item-not-found"));
return true;
end
local occupant = room:get_occupant_by_real_jid(from);
if not occupant then
module:log("debug", "No occupant, ignoring...");
origin.send(st.error_reply(stanza, "auth", "forbidden"))
return true;
end
local from_bare = jid_bare(stanza.attr.from);
local from_affiliation = room:get_affiliation(from_bare);
if (from_affiliation ~= "owner" and from_affiliation ~= "admin") then
origin.send(st.error_reply(stanza, "auth", "forbidden"))
return true;
end
return process_form(room, origin, stanza, occupant);
end);
-- Discovering support
module:hook("muc-disco#info", function (event)
event.reply:tag("feature", { var = xmlns_poll }):up();
end);
-- On groupchat messages, we check if this is a vote for the current poll.
-- Note: we use a high priority, so it will be handled before the slow mode.
module:hook("muc-occupant-groupchat", handle_groupchat, poll_groupchat_votes_priority);
-- security check: we must remove all specific tags, to be sure nobody tries to spoof polls!
module:hook("muc-occupant-groupchat", remove_specific_tags_from_groupchat, 1000);
-- when a room is restored (after a server restart for example),
-- we must resume any current poll
module:hook("muc-room-restored", room_restored);
-- when a new session is opened, we must send the current poll to the client
-- Note: it should be in the MAM. But it is easier for clients to ignore delayed messages
-- when displaying polls (to ignore old polls).
module:hook("muc-occupant-session-new", handle_new_occupant_session, 10); -- must be after subject (20, see Prosody code)

View File

@ -1,247 +0,0 @@
-- SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
-- SPDX-License-Identifier: AGPL-3.0-only
local id = require "util.id";
local st = require "util.stanza";
local get_time = require "util.time".now;
local timer = require "util.timer";
local mod_muc = module:depends"muc";
local get_room_from_jid = mod_muc.get_room_from_jid;
local poll_start_message = module:require("message").poll_start_message;
local poll_end_message = module:require("message").poll_end_message;
local schedule_poll_update_message = module:require("message").schedule_poll_update_message;
local string_poll_invalid_choice = module:get_option_string("poll_string_invalid_choice") or "This choice is not valid.";
local string_poll_anonymous_vote_ok = module:get_option_string("poll_string_anonymous_vote_ok") or "Your vote is taken into account. Votes are anonymous, they will not be shown to other participants.";
local string_poll_over = module:get_option_string("poll_string_over") or "This poll is now over.";
local scheduled_end = {};
local function schedule_poll_purge(room_jid)
module:log("debug", "Scheduling a purge for poll %s", room_jid);
timer.add_task(30, function ()
module:log("info", "Must purge poll for room %s", room_jid);
-- We dont pass room, because here it could have been removed from memory.
-- So we must relad the room from the JID in any case.
local room = get_room_from_jid(room_jid);
if not room then
module:log("debug", "Room %s not found, was maybe destroyed", room_jid);
return;
end
-- we must check if the poll is ended (could be a new poll!)
if not room._data.current_poll then
module:log("debug", "Room %s has no current poll to purge", room_jid);
return;
end
if not room._data.current_poll.already_ended then
module:log("debug", "Room %s has has a poll that is not ended, must be a new one", room_jid);
return;
end
module:log("info", "Purging poll for room %s", room_jid);
room._data.current_poll = nil;
end);
end
local function end_current_poll (room)
if not room._data.current_poll then
return;
end
if room._data.current_poll.already_ended then
-- this can happen if the server was restarted before the purge
schedule_poll_purge(room.jid);
return;
end
module:log("debug", "Ending the current poll for room %s", room.jid);
room._data.current_poll.already_ended = true;
if scheduled_end[room.jid] then
module:log("debug", "Stopping the end timer for the poll");
timer.stop(scheduled_end[room_jid]);
scheduled_end[room_jid] = nil;
end
poll_end_message(room);
-- TODO: store the result somewhere, to keep track?
-- We don't remove the poll immediatly. Indeed, if the vote is anonymous,
-- we don't want to expose votes from late users.
schedule_poll_purge(room.jid);
end
local function schedule_poll_end (room_jid, timestamp)
local delay = timestamp - get_time();
if delay <= 0 then
delay = 1;
end
module:log("debug", "Must schedule a poll end in %i for room %s", delay, room_jid);
if scheduled_end[room_jid] then
module:log("debug", "There is already a timer for the %s poll end, rescheduling", room_jid);
timer.reschedule(scheduled_end[room_jid], delay);
return;
end
scheduled_end[room_jid] = timer.add_task(delay, function ()
module:log("debug", "Its time to end the poll for room %s", room_jid);
scheduled_end[room_jid] = nil;
-- We dont pass room, because here it could have been removed from memory.
-- So we must relad the room from the JID in any case.
local room = get_room_from_jid(room_jid);
if not room then
module:log("debug", "Room %s not found, was probably destroyed", room_jid);
return; -- room was probably destroyed
end
end_current_poll(room);
end);
end
local function create_poll(room, fields, occupant)
module:log("debug", "Creating a new poll for room %s, by %s", room.jid, occupant.bare_jid);
room._data.current_poll = fields;
room._data.current_poll.poll_id = id.short();
room._data.current_poll.end_timestamp = get_time() + (60 * fields["muc#roompoll_duration"]);
room._data.current_poll.votes_by_occupant = {};
room._data.current_poll.votes_by_choices = {};
room._data.current_poll.choices_ordered = {}; -- choices labels with numerical index, so we can have correct order
room._data.current_poll.already_ended = false;
room._data.current_poll.occupant_bare_jid = occupant.bare_jid;
room._data.current_poll.occupant_nick = occupant.nick;
room._data.current_poll.occupant_id = room:get_occupant_id(occupant);
for field, _ in pairs(fields) do
local c = field:match("^muc#roompoll_choice(%d+)$");
if c then
if fields["muc#roompoll_choice" .. c]:find("%S") then
room._data.current_poll.votes_by_choices[c] = 0;
table.insert(room._data.current_poll.choices_ordered, {
number = c;
label = fields["muc#roompoll_choice" .. c];
});
end
end
end
table.sort(room._data.current_poll.choices_ordered, function(a, b)
if a.number == b.number then
return 0;
end
return tonumber(a.number) < tonumber(b.number);
end);
poll_start_message(room);
schedule_poll_end(room.jid, room._data.current_poll.end_timestamp);
end
local function handle_groupchat(event)
local origin, stanza = event.origin, event.stanza;
local room = event.room;
if not room._data.current_poll then
return;
end
-- There is a current poll. Is this a vote?
local body = stanza:get_child_text("body")
if not body or #body < 1 then
return;
end
local choice = body:match("^%s*!(%d+)%s*$");
if not choice then
return;
end
-- Ok, seems it is a vote.
if get_time() >= room._data.current_poll.end_timestamp then
module:log("debug", "Got a vote for a finished poll, not counting it.");
-- Note: we keep bouncing messages a few seconds/minutes after the poll end
-- to be sure any user that send the vote too late won't expose his choice.
origin.send(st.error_reply(
stanza,
-- error_type = 'cancel' (see descriptions in RFC 6120 https://xmpp.org/rfcs/rfc6120.html#stanzas-error-syntax)
"cancel",
-- error_condition = 'not-allowed' (see RFC 6120 Defined Error Conditions https://xmpp.org/rfcs/rfc6120.html#stanzas-error-conditions)
"not-allowed",
string_poll_over
));
return true; -- stop!
end
-- We must check that the choice is valid:
if room._data.current_poll.votes_by_choices[choice] == nil then
module:log("debug", "Invalid vote, bouncing it.");
origin.send(st.error_reply(
stanza,
-- error_type = 'cancel' (see descriptions in RFC 6120 https://xmpp.org/rfcs/rfc6120.html#stanzas-error-syntax)
"cancel",
-- error_condition = 'not-allowed' (see RFC 6120 Defined Error Conditions https://xmpp.org/rfcs/rfc6120.html#stanzas-error-conditions)
"bad-request",
string_poll_invalid_choice
));
return true; -- stop!
end
-- Ok, we can count the vote.
local occupant = event.occupant;
if not occupant then
module:log("warn", "No occupant in the event, dont know how to count the vote");
return
end
local occupant_bare_id = occupant.bare_jid;
module:log("debug", "Counting a new vote for room %s: choice %i, voter %s", room.jid, choice, occupant_bare_id);
-- counting the vote:
if room._data.current_poll.votes_by_occupant[occupant_bare_id] ~= nil then
module:log("debug", "Occupant %s has already voted for current room %s vote, reassigning his vote.", occupant_bare_id, room.jid);
room._data.current_poll.votes_by_choices[room._data.current_poll.votes_by_occupant[occupant_bare_id]] = room._data.current_poll.votes_by_choices[room._data.current_poll.votes_by_occupant[occupant_bare_id]] - 1;
end
room._data.current_poll.votes_by_choices[choice] = room._data.current_poll.votes_by_choices[choice] + 1;
room._data.current_poll.votes_by_occupant[occupant_bare_id] = choice;
schedule_poll_update_message(room.jid);
-- When the poll is anonymous, we bounce the messages (but count the votes).
local must_bounce = room._data.current_poll["muc#roompoll_anonymous"] == true;
if must_bounce then
module:log("debug", "Anonymous votes, bouncing it.");
origin.send(st.error_reply(
stanza,
-- error_type
"continue",
-- error_condition
"undefined-condition",
string_poll_anonymous_vote_ok
));
return true; -- stop!
end
end
local function room_restored(event)
local room = event.room;
if not room._data.current_poll then
return;
end
module:log("info", "Restoring room %s with current ongoing poll.", room.jid);
local now = get_time();
if now >= room._data.current_poll.end_timestamp then
module:log("info", "Current poll is over for room %s, ending it", room.jid);
end_current_poll(room);
return;
end
if scheduled_end[room.jid] then
module:log("info", "Poll for room %s is not finished yet, the end is still scheduled", room.jid);
else
module:log("info", "Poll for room %s is not finished yet, rescheduling the end", room.jid);
schedule_poll_end(room.jid, room._data.current_poll.end_timestamp);
end
-- just in case, we can also reschedule an update message
schedule_poll_update_message(room.jid);
end
return {
end_current_poll = end_current_poll;
create_poll = create_poll;
handle_groupchat = handle_groupchat;
room_restored = room_restored;
};

View File

@ -119,7 +119,6 @@ async function initChannelConfiguration (options: RegisterServerOptions): Promis
// FIXME: this piece of code should not be in this file (nothing to do with initChannelConfiguration,
// but will be more efficient to add here, as we already tested hasChat).
// Note: no need to await here, would only degrade performances.
// FIXME: should also update livechat_muc_terms if channel has changed.
updateProsodyRoom(options, video.uuid, {
name: video.name
}).then(

View File

@ -4,7 +4,6 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import type { ChannelConfigurationOptions } from '../../../../shared/lib/types'
import { channelTermsMaxLength } from '../../../../shared/lib/constants'
/**
* Sanitize data so that they can safely be used/stored for channel configuration configuration.
@ -36,24 +35,6 @@ async function sanitizeChannelConfigurationOptions (
throw new Error('Invalid data.slowMode data type')
}
// mute not present in livechat <= 10.2.0
const mute = data.mute ?? {}
mute.anonymous ??= false
if (typeof mute !== 'object') {
throw new Error('Invalid data.mute data type')
}
// terms not present in livechat <= 10.2.0
let terms = data.terms
if (terms !== undefined && (typeof terms !== 'string')) {
throw new Error('Invalid data.terms data type')
}
if (terms && terms.length > channelTermsMaxLength) {
throw new Error('data.terms value too long')
}
if (terms === '') { terms = undefined }
const result: ChannelConfigurationOptions = {
bot: {
enabled: _readBoolean(botData, 'enabled'),
@ -65,14 +46,8 @@ async function sanitizeChannelConfigurationOptions (
},
slowMode: {
duration: _readInteger(slowModeData, 'duration', 0, 1000)
},
mute: {
anonymous: _readBoolean(mute, 'anonymous')
}
}
if (terms !== undefined) {
result.terms = terms
}
return result
}

View File

@ -49,11 +49,7 @@ function getDefaultChannelConfigurationOptions (_options: RegisterServerOptions)
},
slowMode: {
duration: 0
},
mute: {
anonymous: false
},
terms: undefined
}
}
}

View File

@ -141,7 +141,7 @@ export class Emojis {
* @param sn short name
*/
public validShortName (sn: any): boolean {
if ((typeof sn !== 'string') || !/^:?[\w-]+:?$/.test(sn)) {
if ((typeof sn !== 'string') || !/^:[\w-]+:$/.test(sn)) {
this.logger.debug('Short name invalid: ' + (typeof sn === 'string' ? sn : '???'))
return false
}

View File

@ -17,10 +17,6 @@ const locContent: Map<string, string> = new Map<string, string>()
* - We are using keys to identify strings
* - the `loc` function gets the english segment for the key
* - the build-languages.js script builds all needed files.
*
* The loc function is also used to customize some labels on Prosody backend.
* The front-end will then replace english strings by their translation.
* (see mod_muc_poll for example).
* @param key The key to translate
*/
function loc (key: string): string {

View File

@ -64,7 +64,6 @@ async function updateProsodyRoom (
data: {
name?: string
slow_mode_duration?: number
livechat_muc_terms?: string
addAffiliations?: Affiliations
removeAffiliationsFor?: string[]
}
@ -93,9 +92,6 @@ async function updateProsodyRoom (
if (('slow_mode_duration' in data) && data.slow_mode_duration !== undefined) {
apiData.slow_mode_duration = data.slow_mode_duration
}
if ('livechat_muc_terms' in data) {
apiData.livechat_muc_terms = data.livechat_muc_terms ?? ''
}
if (('addAffiliations' in data) && data.addAffiliations !== undefined) {
apiData.addAffiliations = data.addAffiliations
}

View File

@ -175,8 +175,7 @@ async function getProsodyConfig (options: RegisterServerOptionsV5): Promise<Pros
'chat-no-anonymous',
'auto-ban-anonymous-ip',
'federation-dont-publish-remotely',
'disable-channel-configuration',
'chat-terms'
'disable-channel-configuration'
])
const valuesToHideInDiagnostic = new Map<string, string>()
@ -200,9 +199,6 @@ async function getProsodyConfig (options: RegisterServerOptionsV5): Promise<Pros
let certificates: ProsodyConfigCertificates = false
const useBots = !settings['disable-channel-configuration']
const bots: ProsodyConfig['bots'] = {}
const chatTerms = (typeof settings['chat-terms'] === 'string') && settings['chat-terms']
? settings['chat-terms']
: undefined
let useExternal: boolean = false
try {
@ -264,7 +260,7 @@ async function getProsodyConfig (options: RegisterServerOptionsV5): Promise<Pros
const roomApiUrl = baseApiUrl + 'room?apikey=' + apikey + '&jid={room.jid|jid_node}'
const testApiUrl = baseApiUrl + 'test?apikey=' + apikey
const config = new ProsodyConfigContent(paths, prosodyDomain, chatTerms)
const config = new ProsodyConfigContent(paths, prosodyDomain)
if (!disableAnon) {
config.useAnonymous(autoBanIP)
}
@ -366,8 +362,6 @@ async function getProsodyConfig (options: RegisterServerOptionsV5): Promise<Pros
}
}
config.usePoll()
config.useTestModule(apikey, testApiUrl)
const debugMucAdminJids = debugMucAdmins(options)

View File

@ -5,33 +5,9 @@
import type { ProsodyFilePaths } from './paths'
import type { ExternalComponent } from './components'
import { BotConfiguration } from '../../configuration/bot'
import { loc } from '../../loc'
import { userInfo } from 'os'
/**
* Use this class to construct a string that will be writen as a multiline Lua string.
*/
class ConfigEntryValueMultiLineString extends String {
public serialize (): string {
const s = this.toString()
let i = 0
// Lua multiline strings can be escaped by [[ ]], or [==[ ]==] with any number of =
// http://lua-users.org/wiki/StringsTutorial
// So, to have a proper value, we will check if the string contains [[ or ]],
// and try again by adding "=" until we do not found the pattern.
while (true) {
const opening = '[' + '='.repeat(i) + '['
const closing = ']' + '='.repeat(i) + ']'
if (!s.includes(opening) && !s.includes(closing)) {
break
}
i++
}
return '[' + '='.repeat(i) + '[' + s + ']' + '='.repeat(i) + ']'
}
}
type ConfigEntryValue = boolean | number | string | ConfigEntryValueMultiLineString | ConfigEntryValue[]
type ConfigEntryValue = boolean | number | string | ConfigEntryValue[]
type ConfigEntries = Map<string, ConfigEntryValue>
@ -57,9 +33,6 @@ type ConfigLogExpiration =
ConfigLogExpirationNever | ConfigLogExpirationPeriod | ConfigLogExpirationSeconds | ConfigLogExpirationError
function writeValue (value: ConfigEntryValue): string {
if (value instanceof ConfigEntryValueMultiLineString) {
return value.serialize() + ';\n'
}
if (typeof value === 'boolean') {
return value.toString() + ';\n'
}
@ -178,7 +151,7 @@ class ProsodyConfigContent {
log: string
prosodyDomain: string
constructor (paths: ProsodyFilePaths, prosodyDomain: string, chatTerms?: string) {
constructor (paths: ProsodyFilePaths, prosodyDomain: string) {
this.paths = paths
this.global = new ProsodyConfigGlobal()
this.log = ''
@ -239,16 +212,8 @@ class ProsodyConfigContent {
this.muc.set('muc_room_default_history_length', 20)
this.muc.add('modules_enabled', 'muc_slow_mode')
this.muc.add('slow_mode_duration_form_position', 120)
this.muc.add('modules_enabled', 'pubsub_peertubelivechat')
this.muc.add('modules_enabled', 'muc_peertubelivechat_roles')
this.muc.add('modules_enabled', 'muc_peertubelivechat_terms')
this.muc.set('muc_terms_service_nickname', 'Peertube')
if (chatTerms) {
this.muc.set('muc_terms_global', new ConfigEntryValueMultiLineString(chatTerms))
}
this.muc.add('slow_mode_duration_form_position', 120)
}
useAnonymous (autoBanIP: boolean): void {
@ -531,17 +496,6 @@ class ProsodyConfigContent {
}
}
/**
* Enable the poll feature.
*/
usePoll (): void {
this.muc.add('modules_enabled', 'muc_poll')
this.muc.set('poll_string_over', loc('poll_is_over'))
this.muc.set('poll_string_invalid_choice', loc('poll_choice_invalid'))
this.muc.set('poll_string_anonymous_vote_ok', loc('poll_anonymous_vote_ok'))
this.muc.set('poll_string_vote_instructions', loc('poll_vote_instructions_xmpp'))
}
addMucAdmins (jids: string[]): void {
for (const jid of jids) {
this.muc.add('admins', jid)

View File

@ -5,7 +5,7 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import type { RoomConf } from 'xmppjs-chat-bot'
import { getProsodyDomain } from '../prosody/config/domain'
import { listProsodyRooms, updateProsodyRoom } from '../prosody/api/manage-rooms'
import { listProsodyRooms } from '../prosody/api/manage-rooms'
import { getChannelInfosById } from '../database/channel'
import { ChannelConfigurationOptions } from '../../../shared/lib/types'
import {
@ -108,7 +108,7 @@ class RoomChannel {
* @return Returns true if the data where found and valid. If there is no data (or no valid data), returns false.
*/
public async readData (): Promise<boolean> {
// Reading the data file (see https://livingston.frama.io/peertube-plugin-livechat/technical/data/)
// Reading the data file (see https://livingston.frama.io/peertube-plugin-livechat/fr/technical/data/)
let content: string
try {
@ -292,7 +292,10 @@ class RoomChannel {
this.logger.info('Syncing...')
this.isWriting = true
const prosodyRoomUpdates = new Map<string, Parameters<typeof updateProsodyRoom>[2]>()
// Note 2024-05-15: slow_mode_duration becomes a default value.
// We dont need prosodyRoomUpdates anymore. but keeping the code commented,
// if we want to enable again a similar sync.
// const prosodyRoomUpdates = new Map<string, Parameters<typeof updateProsodyRoom>[2]>()
try {
const data = this._serializeData() // must be atomic
@ -352,12 +355,12 @@ class RoomChannel {
await BotConfiguration.singleton().updateRoom(roomJID, botConf)
// Now we also must update some room metadata on Prosody side (livechat_muc_terms, ...)
// This can be done without waiting for the API call to finish, but we don't want to send thousands of
// API calls at the same time. So storing data in a map, and we well launch it sequentially at the end
prosodyRoomUpdates.set(roomJID, {
livechat_muc_terms: channelConfigurationOptions.terms ?? '' // must pass a string, else wont update
})
// // Now we also must update some room metadata (slow mode duration, ...)
// // This can be done without waiting for the API call to finish, but we don't want to send thousands of
// // API calls at the same time. So storing data in a map, and we well launch it sequentially at the end
// prosodyRoomUpdates.set(roomJID, {
// slow_mode_duration: channelConfigurationOptions.slowMode.duration
// })
this.roomConfToUpdate.delete(roomJID)
}
@ -371,22 +374,22 @@ class RoomChannel {
this.isWriting = false
}
if (prosodyRoomUpdates.size) {
// Here we don't have to wait.
// If it fails (for example because we are turning off prosody), it is not a big deal.
// Does not worth the cost to wait.
// eslint-disable-next-line @typescript-eslint/no-misused-promises
setTimeout(async () => {
this.logger.info('Syncing done, but still some data to send to Prosody')
for (const [roomJID, data] of prosodyRoomUpdates.entries()) {
try {
await updateProsodyRoom(this.options, roomJID, data)
} catch (err) {
this.logger.error(`Failed updating prosody room info: "${err as string}".`)
}
}
}, 0)
}
// if (prosodyRoomUpdates.size) {
// // Here we don't have to wait.
// // If it fails (for example because we are turning off prosody), it is not a big deal.
// // Does not worth the cost to wait.
// // eslint-disable-next-line @typescript-eslint/no-misused-promises
// setTimeout(async () => {
// this.logger.info('Syncing done, but still some data to send to Prosody')
// for (const [roomJID, data] of prosodyRoomUpdates.entries()) {
// try {
// await updateProsodyRoom(this.options, roomJID, data)
// } catch (err) {
// this.logger.error(`Failed updating prosody room info: "${err as string}".`)
// }
// }
// }, 0)
// }
}
/**

View File

@ -168,16 +168,7 @@ async function initConfigurationApiRouter (options: RegisterServerOptions, route
await emojis.saveChannelDefinition(channelInfos.id, emojisDefinitionSanitized, bufferInfos)
// Reloading data, to send them back to front:
const channelEmojis =
(await emojis.channelCustomEmojisDefinition(channelInfos.id)) ??
emojis.emptyChannelDefinition()
const result: ChannelEmojisConfiguration = {
channel: channelInfos,
emojis: channelEmojis
}
res.status(200)
res.json(result)
res.sendStatus(200)
} catch (err) {
logger.error(err)
res.sendStatus(500)

View File

@ -36,24 +36,14 @@ interface RoomDefaults {
// Following fields are specific to livechat (for now), and requires a customized version for mod_muc_http_defaults.
slow_mode_duration?: number
mute_anonymous?: boolean
livechat_muc_terms?: string
}
affiliations?: Affiliations
}
async function _getChannelSpecificOptions (
options: RegisterServerOptions,
channelId: number
): Promise<Partial<RoomDefaults['config']>> {
async function slowModeDuration (options: RegisterServerOptions, channelId: number): Promise<number> {
const channelOptions = await getChannelConfigurationOptions(options, channelId) ??
getDefaultChannelConfigurationOptions(options)
return {
slow_mode_duration: channelOptions.slowMode.duration,
mute_anonymous: channelOptions.mute.anonymous,
livechat_muc_terms: channelOptions.terms
}
return channelOptions.slowMode.duration
}
/**
@ -99,14 +89,12 @@ async function initRoomApiRouter (options: RegisterServerOptions, router: Router
}
const roomDefaults: RoomDefaults = {
config: Object.assign(
{
name: channelInfos.displayName,
description: ''
// subject: channelInfos.displayName
},
await _getChannelSpecificOptions(options, channelId)
),
config: {
name: channelInfos.displayName,
description: '',
// subject: channelInfos.displayName
slow_mode_duration: await slowModeDuration(options, channelId)
},
affiliations: affiliations
}
@ -153,15 +141,13 @@ async function initRoomApiRouter (options: RegisterServerOptions, router: Router
}
const roomDefaults: RoomDefaults = {
config: Object.assign(
{
name: video.name,
description: '',
language: video.language
// subject: video.name
},
await _getChannelSpecificOptions(options, video.channelId)
),
config: {
name: video.name,
description: '',
language: video.language,
// subject: video.name
slow_mode_duration: await slowModeDuration(options, video.channelId)
},
affiliations: affiliations
}

View File

@ -148,14 +148,6 @@ function initChatSettings ({ registerSetting }: RegisterServerOptions): void {
private: true,
descriptionHTML: loc('chat_title')
})
registerSetting({
name: 'chat-terms',
private: true,
label: loc('chat_terms_label'),
type: 'input-textarea',
default: '',
descriptionHTML: loc('chat_terms_description')
})
registerSetting({
name: 'prosody-list-rooms',
label: loc('list_rooms_label'),

View File

@ -1,5 +0,0 @@
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
export const channelTermsMaxLength = 400

View File

@ -2,9 +2,6 @@
//
// SPDX-License-Identifier: AGPL-3.0-only
// Note: API request body size is limited to 100Kb (expressjs body-parser defaut limit, and Peertube nginx config).
// So we must be sure to never send more than 100Kb. The front end sends new emojis by batch, but maxSize must remain
// as little as possible, so that we never reach 100Kb in JSON/base64 format.
export const maxSize: number = 30 * 1024
export const allowedExtensions = ['png', 'jpg', 'jpeg', 'gif']
export const inputFileAccept = ['image/jpg', 'image/png', 'image/gif']

View File

@ -101,12 +101,6 @@ interface ChannelConfigurationOptions {
slowMode: {
duration: number
}
mute: { // comes with Livechat 10.2.0
anonymous: boolean
// TODO: https://github.com/JohnXLivingston/peertube-plugin-livechat/issues/127
// nonFollowers: boolean (or a number of seconds?)
}
terms?: string // comes with Livechat 10.2.0
}
interface ChannelForbiddenWords {

View File

@ -30,7 +30,7 @@ To enable this feature, you will need to set up your server and DNS records, so
### Plugin settings
Start by going to the livechat plugin settings of your instance, then enable the setting "Enable connection to room using external XMPP accounts".
By checking this setting, new settings appear below.
By checking this settings, new settings appear below.
First of all, the "Prosody server to server port" field.
This one defaults to 5269, which is the standard port for this service.

View File

@ -7,16 +7,6 @@ chapter: false
This section describes the plugin settings page.
## {{% livechat_label livechat_configuration_channel_terms_label %}}
{{% livechat_label livechat_configuration_channel_terms_desc %}}
For more information on this feature, check the documentation for [channel's terms & conditions](/peertube-plugin-livechat/documentation/user/streamers/terms).
{{% notice info %}}
Changing this setting will restart the chat server, and all users will be disconnected for a short time.
{{% /notice %}}
## {{% livechat_label "list_rooms_label" %}}
When pressing the «List rooms» button, all existing chatrooms will be listed.
@ -76,7 +66,7 @@ The chat can be customized (readonly mode, use the current theme, ...).
You can for example generate a readonly URL and use it in OBS to integrate the chat in your live stream!
This setting allows you to choose who can access this modal.
This settings allows you to choose who can access this modal.
### {{% livechat_label per_live_video_label %}}
@ -167,7 +157,7 @@ You can choose which theme to use for ConverseJS:
The plugin comes with an AppImage that is used to run the [Prosody XMPP server](https://prosody.im).
If this AppImage is not working, you can fallback to the Prosody that is packaged for your server. Just install the `prosody` package.
This setting should only be used if the plugin is broken, and waiting for a patch.
This settings should only be used if the plugin is broken, and waiting for a patch.
### {{% livechat_label disable_websocket_label %}}
@ -181,7 +171,7 @@ This setting should only be used if the plugin is broken, and waiting for a patc
{{% livechat_label prosody_peertube_uri_description %}}
If this setting is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.
If this settings is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.
In last resort, it will use your Peertube public URI.
So, any API Call will go throught your Nginx server.
@ -231,7 +221,7 @@ As example, this option can allow an instance of Matterbridge (once it could use
### {{% livechat_label prosody_components_label %}}
This setting enable XMPP external components to connect to the server.
This settings enable XMPP external components to connect to the server.
By default, this option **only allows connections from localhost components**.
You have to change the "{{% livechat_label prosody_components_interfaces_label %}}" value to listen on other network interfaces.

View File

@ -29,7 +29,7 @@ In some case (like for some Docker Peertube installation), the diagnostic tools
In such case, try changing the "{{% livechat_label prosody_peertube_uri_label %}}" settings, by setting `http://127.0.0.1:9000` (assuming 9000 is the port on which Peertube listen, ask your instance administrators if you don't know).
Check the help for [this setting](/peertube-plugin-livechat/documentation/admin/settings/) for more information.
Check the help for [this settings](/peertube-plugin-livechat/documentation/admin/settings/) for more information.
### Websocket

View File

@ -53,7 +53,7 @@ This feature can be disabled by the instance's adminitrators.
You can use OBS "Custom browser docks" to integrate the chat in your OBS while you are streaming.
The livechat plugin offers a way to create long term token that can identify you automatically to join the chat, so you don't have to enter your password in OBS.
To do so, just use the "{{% livechat_label share_chat_link %}}" feature, and open the "{{% livechat_label share_chat_dock %}}" tab.
To do so, just use the "{{% livechat_label share_chat_link %}}", and open the "{{% livechat_label share_chat_dock %}}" tab.
From there, you can create a new token using the "+" button.
![Share link popup - dock tab](/peertube-plugin-livechat/images/share_dock.png?classes=shadow,border&height=200px)

View File

@ -1,7 +1,7 @@
---
title: "Channel configuration"
description: "Peertube channel chatrooms configuration"
weight: 20
weight: 30
chapter: false
---
@ -20,8 +20,6 @@ By clicking on a channel, you will then be able to setup some options for your c
Here you can configure:
* [{{% livechat_label livechat_configuration_channel_terms_label %}}](/peertube-plugin-livechat/documentation/user/streamers/terms)
* [{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}](/peertube-plugin-livechat/documentation/user/streamers/moderation) default value
* [The slow mode](/peertube-plugin-livechat/documentation/user/streamers/slow_mode)
* [The chat bot](/peertube-plugin-livechat/documentation/user/streamers/bot)
* [Custom emojis](/peertube-plugin-livechat/documentation/user/streamers/emojis)

View File

@ -1,7 +1,7 @@
---
title: "Custom emojis"
description: "Plugin peertube-plugin-livechat custom emojis"
weight: 33
weight: 32
chapter: false
---
@ -21,8 +21,6 @@ On the [channel configuration page](/peertube-plugin-livechat/documentation/user
![Channel configuration / Channel emojis](/peertube-plugin-livechat/images/channel_custom_emojis.png?classes=shadow,border&height=400px)
{{% livechat_label livechat_emojis_shortname_desc %}}
### Import / Export
On the channel configuration page, there are an "{{% livechat_label action_import %}}" and an "{{% livechat_label action_export %}}" button.
@ -34,7 +32,7 @@ The file must be a valid JSON file, using the following format:
```json
[
{
"sn": ":short_name:",
"sn": ":short_name",
"url": "https://example.com/image.png"
}
]

View File

@ -1,7 +1,7 @@
---
title: "Moderation"
description: "Plugin peertube-plugin-livechat advanced moderation features"
weight: 30
weight: 60
chapter: false
---
@ -39,30 +39,6 @@ Clicking this button will give them owner access on the room.
You can use [ConverseJS moderation commands](https://conversejs.org/docs/html/features.html#moderating-chatrooms) to moderate the room.
When you open the chat room in full screen, there will also be a menu with dedicated commands on the top right.
## {{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}
{{% notice info %}}
This feature comes with the livechat plugin version 10.2.0.
{{% /notice %}}
You can prevent anonymous users to send messages. In such case, only registered users will be able to talk in the chat.
To enable or disable this feature, use the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers), open the "configure" menu.
In the form, you will find a "{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}" checkbox.
![Room configuration / Mute anonymous users](/peertube-plugin-livechat/images/configure_mute_anonymous.png?classes=shadow,border&height=400px)
Anonymous users won't have the message field, and will see following prompt: "{{% livechat_label muted_anonymous_message %}}"
![Room configuration / Muted anonymous users](/peertube-plugin-livechat/images/anonymous_muted.png?classes=shadow,border&height=400px)
When this feature is enabled, anonymous users will be assigned the "visitor" role.
You can change their role to "participant" if you want to allow some of them to talk.
If you change the room configuration, all anonymous users will be muted or unmuted.
You can choose to enable or disable this feature for new chatrooms on the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel).
## Roles and affiliations
There are several roles that can be assignated to users in chat rooms: owner, moderators, member, ...

View File

@ -1,88 +0,0 @@
---
title: "Polls"
description: "You can create polls to ask viewers their opinion."
weight: 33
chapter: false
---
{{% notice info %}}
This feature comes with the livechat plugin version 10.2.0.
{{% /notice %}}
## Create a poll
You can create a new poll by using the "{{% livechat_label new_poll %}}" action in the chat top menu:
![Poll form](/peertube-plugin-livechat/images/polls_form.png?classes=shadow,border&height=200px)
{{% notice warning %}}
This poll feature should not be considered as a reliable voting system.
It is easy to cheat.
There is no mechanism to prevent anonymous users to vote multiple times by just reloading the chat.
Votes are never fully anonymous, someone having access to the server could see who voted for what choice.
{{% /notice %}}
### Poll form
Fill the form fields:
* "{{% livechat_label poll_question %}}": the question to ask to you viewers
* "{{% livechat_label poll_duration %}}": the duration for which viewers can vote
* "{{% livechat_label poll_anonymous_results %}}": if checked, votes won't be publicly visible in the chat
* "Choice N": choices that will be presented to viewers
You must at least fill the two first choices fields.
Once you submit the form, the poll will instantly start.
If there was a previous unfinished poll, it will end and its result will be shown.
### Access rights
Every room's admins can create a new poll.
When you promote someone as room admin or owner, they gets instant access to the "{{% livechat_label new_poll %}}" action.
When you remove admin or owner rights to someone, they can't create new poll. But any existing poll will continue until it ends.
Every user that is not muted can vote.
This means that you can prevent anonymous users to vote by using the ["{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}" feature](/peertube-plugin-livechat/documentation/user/streamers/moderation).
## Poll workflow
When the polls starts, a first message will be sent in the chat, from the account of the user creating the poll.
A banner will also appear to show the poll, and will be updated regularly with the current votes.
![Poll start](/peertube-plugin-livechat/images/polls_start.png?classes=shadow,border&height=200px)
Viewers can then vote by clicking on their choice, or by sending message like "!1" in the chat.
Votes counts will be updated regularly in the banner.
Viewers can change their vote at any time, just by making a new choice.
Their precedent choice will be replaced by the new one.
![Poll votes](/peertube-plugin-livechat/images/polls_votes.png?classes=shadow,border&height=200px)
{{% notice tip %}}
Anonymous viewers can only vote once they have choosen their nickname.
{{% /notice %}}
If "{{% livechat_label poll_anonymous_results %}}" is checked, votes won't be shown to other users.
If unchecked, votes will be publicly visible as you will see message like "!1" in the chat.
{{% notice info %}}
For viewers using XMPP clients or outdated livechat plugin versions, the banner will not be visible.
But they will see the message in the chat and will be able to vote by sending messages with their choices.
{{% /notice %}}
When the poll ends, a new message will be sent in the chat, with the results.
![Poll end](/peertube-plugin-livechat/images/polls_end.png?classes=shadow,border&height=200px)
{{% notice info %}}
The only way to get old polls results is to search for the poll end message in the chat.
For now, polls results are not saved by any other means.
So don't forget to note polls results if you want to keep them.
{{% /notice %}}

View File

@ -1,7 +1,7 @@
---
title: "Slow mode"
description: "Plugin peertube-plugin-livechat slow mode"
weight: 32
weight: 31
chapter: false
---

View File

@ -1,47 +0,0 @@
---
title: "Terms & conditions"
description: "Configure channel's chat terms & conditions"
weight: 31
chapter: false
---
{{% notice info %}}
This feature comes with the livechat plugin version 10.2.0.
{{% /notice %}}
## Configuration
You can add terms & conditions to your channel.
These terms will be shown to all users joining the chat.
To configure the terms & conditions, go to the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel):
![Channel configuration / Terms](/peertube-plugin-livechat/images/channel_terms_config.png?classes=shadow,border&height=400px)
URL in the message will be clickable.
You can also do some styling: [Message Styling](https://xmpp.org/extensions/xep-0393.html).
## Viewers
When joining the chat, viewers will see the terms:
![Terms](/peertube-plugin-livechat/images/terms.png?classes=shadow,border&height=400px)
{{% notice info %}}
Peertube instance's admin can also set global terms & conditions.
If so, these terms will be shown above your channel's terms.
{{% /notice %}}
{{% notice info %}}
Anonymous users will only see the terms & conditions once they have chosen their nickname (in other words: once they are able to talk).
{{% /notice %}}
You can change the terms content at any time, it will be instantly updated for all viewers.
Users can hide the terms & conditions.
When doing so, terms won't be shown again, unless you change the content.
{{% notice info %}}
If your Peertube instance allows joining chat with [XMPP clients](https://livingston.frama.io/peertube-plugin-livechat/documentation/admin/advanced/xmpp_clients/), users using such clients will see the terms as chat messages, comming from a "Peertube" account.
When you update terms, they will receive a new message with the update terms content.
{{% /notice %}}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

View File

@ -1,165 +0,0 @@
---
title: "Polls"
description: "Polls technical documentation"
weight: 65
chapter: false
livechatnotranslation: true
---
The poll system relies on two thinks:
* mod_muc_polls Prosody module on the backend
* polls Converse plugin on the frontend
## Backend
mod_muc_polls is a Prosody modules that implements polls in MUC.
This module could be used on any Prosody server, and has no code specific to the livechat plugin.
The way this module works could be standardized one day, by writing a XEP.
### Poll creation
This module adds the `http://jabber.org/protocol/muc#x-poll` disco features on `muc-disco#info`.
Room's owner and admin can retrieve a `http://jabber.org/protocol/muc#x-poll` form by sending the relevant iq query.
This forms contains relevant fields (the poll question, the duration, choices, ...).
Once the form submitted, a new poll is created.
Any previous existing poll will end (if not already ended).
The current poll is stored in `room._data.current_poll`.
For now, any ended poll is not kept.
### Poll starts
When a poll is started, a `groupchat` message is broadcasted in the MUC room.
This message is sent in the name of the poll creator (same `from`, same `occupant-id`).
This message contains the question, the different choices, and some instructions (in english).
This message also contains some specific XML tags.
These tags could be use by any compatible client to display the poll as they want.
Here an Example of this start message:
```xml
<message id='25Plgjj2TdemFuomNuKZ9bxRQFLbiVHwc8_4'
to='root@p1.localhost/converse.js-117702469' xmlns='jabber:client' from='5dd144b2-3c24-4cbc-a34e-143e951ecf50@room.p1.localhost/Root' type='groupchat'>
<body>The poll question
1: Choice 1 label
2: Choice 2 label
Send a message with an exclamation mark followed by your choice number to vote. Example: !1
</body>
<occupant-id id='yoXY0/DaHd03MpGsc+ayjEFZ5UIWt6JmrxC+6HPz4qM=' xmlns='urn:xmpp:occupant-id:0'/>
<x-poll id='_eZQ4j4YLHTK' xmlns='http://jabber.org/protocol/muc#x-poll-message' end='1720177157' votes='0'>
<x-poll-question>The poll question</x-poll-question>
<x-poll-choice choice='1' votes='0'>Choice 1 label</x-poll-choice>
<x-poll-choice choice='2' votes='0'>Choice 2 label</x-poll-choice>
</x-poll>
<stanza-id xmlns='urn:xmpp:sid:0' id='dOASuopT9kW5OgAKvhZo0Irm' by='5dd144b2-3c24-4cbc-a34e-143e951ecf50@room.p1.localhost'/>
</message>
```
Note: the `end` attribute is the poll end date timestamp. The `votes` attributes are the number of votes (total on `x-poll` and per choice on each `x-poll-choice` tag). The `choice` attribute is the key to use to vote for this choice (`choice='1'` can by voted by sending `!1`).
### Poll votes
Users can then vote by sending messages in the room, using the format "!1".
These groupchat messages will be intercepted by the module, and counted as votes.
If the "anonymous votes" feature is enabled, vote will be taken into account, but the message will be bounced with an error saying: "Your vote is taken into account. Votes are anonymous, they will not be shown to other participants."
This means that you can vote with any XMPP clients!
If an occupant votes multiple times, their vote will be updated.
If an occupant is muted (has visitor role), votes won't be counted.
When there are new votes, messages are broadcated so that compatible clients can update the current vote progress.
These messages are debounced: the module waits 5 seconds after a vote to send the update message, and only send one for all votes that were done in those 5 seconds.
These messages are `groupchat` message without `body`, and with some specific `urn:xmpp:hints`.
They contains the `x-poll` tag with same meta data as above.
The message is also sent as the poll creator (`from` and `occupant-id`).
Here is an example:
```xml
<message id='jm9dsXD73eXxlAP2M4dOhay7oXBlQb91LVBf'
to='root@p1.localhost/converse.js-117702469' xmlns='jabber:client'
from='5dd144b2-3c24-4cbc-a34e-143e951ecf50@room.p1.localhost/Root'
type='groupchat'>
<occupant-id id='yoXY0/DaHd03MpGsc+ayjEFZ5UIWt6JmrxC+6HPz4qM=' xmlns='urn:xmpp:occupant-id:0'/>
<no-copy xmlns='urn:xmpp:hints'/>
<no-store xmlns='urn:xmpp:hints'/>
<no-permanent-store xmlns='urn:xmpp:hints'/>
<x-poll id='06yCKW_hoZSx' xmlns='http://jabber.org/protocol/muc#x-poll-message' end='1720177925' votes='1'>
<x-poll-question>The poll question</x-poll-question>
<x-poll-choice choice='1' votes='1'>Choice 1 label</x-poll-choice>
<x-poll-choice choice='2' votes='0'>Choice 2 label</x-poll-choice>
</x-poll>
</message>
```
Note: Standards XMPP clients won't be able to show the progress.
When a user joins the MUC, a similar message will be sent to this user (and this user only, to the new occupant session to be more specific).
This is done so that any compatible client can immediatly show the poll.
Note: clients should ignored `x-poll` data from archived messages, and only consider data comming from unarchived messages.
Otherwise they could show some outdated data.
### Poll end
When the poll ends, a new groupchat message is broadcasted in the room.
Here is an example:
```xml
<message id='GVqv1YcwI0GZb0myKhmtEqRa9fvWlCbDdF7R'
to='root@p1.localhost/converse.js-117702469' xmlns='jabber:client'
from='5dd144b2-3c24-4cbc-a34e-143e951ecf50@room.p1.localhost/Root'
type='groupchat'>
<body>The poll question
This poll is now over.
1: Choice 1 label
2: Choice 2 label
</body>
<occupant-id id='yoXY0/DaHd03MpGsc+ayjEFZ5UIWt6JmrxC+6HPz4qM=' xmlns='urn:xmpp:occupant-id:0'/>
<x-poll id='_eZQ4j4YLHTK'
votes='5' xmlns='http://jabber.org/protocol/muc#x-poll-message'
end='1720177157'
over=''
>
<x-poll-question>The poll question</x-poll-question>
<x-poll-choice choice='1' votes='3'>Choice 1 label</x-poll-choice>
<x-poll-choice choice='2' votes='2'>Choice 2 label</x-poll-choice>
</x-poll>
<stanza-id xmlns='urn:xmpp:sid:0' id='CwiijSxawB8QOP4NN-Li6jP0' by='5dd144b2-3c24-4cbc-a34e-143e951ecf50@room.p1.localhost'/>
</message>
```
Please note the `over` attributes that indicated that the poll is over.
If users are voting just after the poll ends (less than 30 seconds after the poll end), and the vote is anonymous, their votes will be bounced, to avoid leaking votes for late users.
### Security
Following tags will be stripped of any incoming groupchat message: `x-poll`, `x-poll-question`, `x-poll-choice`.
This is to avoid any poll spoofing.
## Fronted
The poll Converse plugin does multiple things.
It checks for the `http://jabber.org/protocol/muc#x-poll` disco feature to show the "create poll" button.
It uses standards XMPP forms to get the poll creation form and submit it.
It uses the `parseMUCMessage` hook to check if messages have `x-poll` data.
If so, and if message are not archived, it creates or updates the poll banner.
When clicking on a choice in the banner, it just sends a message in the chat ("!1" for example).
As the backend does no localization, it also translate on the fly the english sentences comming from the backend (in the form definition, in poll start/end message, and in bounce/error messages).

View File

@ -1,82 +0,0 @@
---
title: "Terms&Conditions"
description: "Terms&Conditions implementation"
weight: 65
chapter: false
livechatnotranslation: true
---
You can set terms & conditions on the instance level (called "global terms"), or at the streamers' channels level (called "muc terms", as it is related to muc rooms).
## Backend
The `mod_muc_peertubelivechat_terms` prosody modules handles the terms configuration.
It has a configuration option for the global terms.
It also adds muc terms in the room data.
When a new occupant session is opened, this modules sends him messages containing the global and muc terms (if set).
Here is an example of sent messages:
```xml
<message xmlns="jabber:client" id="_iRSEs061gi5GBjF7zGh7f-M" type="groupchat" to="root@p1.localhost/QH1H89H1" from="8df24108-6e70-4fc8-b1cc-f2db7fcdd535@room.p1.localhost/Peertube">
<body>The global terms.</body>
<x-livechat-terms type="global" />
<delay xmlns="urn:xmpp:delay" stamp="2024-06-25T11:02:25Z" />
<stanza-id by="8df24108-6e70-4fc8-b1cc-f2db7fcdd535@room.p1.localhost" xmlns="urn:xmpp:sid:0" id="InoL5fonvOoR8X9gOlAYsz_N" />
<no-copy xmlns='urn:xmpp:hints'/>
<no-store xmlns='urn:xmpp:hints'/>
<no-permanent-store xmlns='urn:xmpp:hints'/>
</message>
<message xmlns="jabber:client" id="_iRSEs061gi5GBjF7zGh7f-M" type="groupchat" to="root@p1.localhost/QH1H89H1" from="8df24108-6e70-4fc8-b1cc-f2db7fcdd535@room.p1.localhost/Peertube">
<body>The muc terms.</body>
<x-livechat-terms type="muc" />
<delay xmlns="urn:xmpp:delay" stamp="2024-06-25T11:02:25Z" />
<stanza-id by="8df24108-6e70-4fc8-b1cc-f2db7fcdd535@room.p1.localhost" xmlns="urn:xmpp:sid:0" id="InoL5fonvOoR8X9gOlAYsz_N" />
<no-copy xmlns='urn:xmpp:hints'/>
<no-store xmlns='urn:xmpp:hints'/>
<no-permanent-store xmlns='urn:xmpp:hints'/>
</message>
```
Notice the `x-livechat-terms` tag.
Standard XMPP clients will show these messages as standard message.
Message are sent from a "service nickname": this occupant does not exist.
The service nickname is an option of the module (livechat use "Peertube", hard coded for now).
This nickname is reserved, no-one can spoof it (the module will bounce any request to use this nickname).
We must do so, because without nickname, some XMPP clients won't show the messages (tested with Gajim).
We also add a `delay` tag, to trick the moderation bot (see comments in code).
This also ensure clients will not drop the message because there is no occupant with this name.
We also add some `urn:xmpp:hints` to avoid storing or copying these messages.
When muc terms are updated, the new terms will be broadcasted.
To avoid anyone spoofing terms & conditions, incoming message stanza are filtered, and any `x-livechat-terms` tag will be removed.
Message history is disabled for message containing the `x-livechat-terms`, so that messages broadcasted when the terms change are not stored by muc_mam modume ("Message Archiving Management").
## Frontend
For standard XMPP clients, terms will be shown as delayed messages.
For the livechat frontend, there is a `livechat-converse-terms` Converse plugin that will intercept these messages, and prevent them to be shown in the chat history.
It will also create infobox at the top of the chat to display the terms content.
If muc terms are updated, the new terms will be shown.
Users can hide the terms.
To remember that a user has already hidden the terms, we store the content in localStorage.
We will only show terms again if the content in this localStorage changes.
We do so for both global terms and muc terms, in two separate localStorage keys.
The keys in localstorage does not depends on the room JID or the origin peertube instance.
This means that message will be shown again:
* if terms are modified
* if the user switch to another channel
* if the user switch to a video from a different peertube instance

View File

@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: peertube-plugin-livechat-documentation VERSION\n"
"POT-Creation-Date: 2024-07-05 13:36+0200\n"
"POT-Creation-Date: 2024-06-19 12:16+0200\n"
"PO-Revision-Date: 2024-01-17 11:38+0000\n"
"Last-Translator: ButterflyOfFire <butterflyoffire@protonmail.com>\n"
"Language-Team: Arabic <https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ar/>\n"
@ -1187,7 +1187,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/admin/advanced/xmpp_clients.md
msgid "Start by going to the livechat plugin settings of your instance, then enable the setting \"Enable connection to room using external XMPP accounts\". By checking this setting, new settings appear below."
msgid "Start by going to the livechat plugin settings of your instance, then enable the setting \"Enable connection to room using external XMPP accounts\". By checking this settings, new settings appear below."
msgstr ""
#. type: Plain text
@ -1876,16 +1876,6 @@ msgstr ""
msgid "This section describes the plugin settings page."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "For more information on this feature, check the documentation for [channel's terms & conditions](/peertube-plugin-livechat/documentation/user/streamers/terms)."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "Changing this setting will restart the chat server, and all users will be disconnected for a short time."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "When pressing the «List rooms» button, all existing chatrooms will be listed. You can then find them and moderated them."
@ -1959,7 +1949,7 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting allows you to choose who can access this modal."
msgid "This settings allows you to choose who can access this modal."
msgstr ""
#. type: Plain text
@ -2090,13 +2080,13 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting should only be used if the plugin is broken, and waiting for a patch."
msgid "This settings should only be used if the plugin is broken, and waiting for a patch."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
#, no-wrap
msgid "If this setting is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.\n"
msgid "If this settings is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.\n"
msgstr ""
#. type: Plain text
@ -2116,7 +2106,7 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting enable XMPP external components to connect to the server. By default, this option **only allows connections from localhost components**. You have to change the \"{{% livechat_label prosody_components_interfaces_label %}}\" value to listen on other network interfaces."
msgid "This settings enable XMPP external components to connect to the server. By default, this option **only allows connections from localhost components**. You have to change the \"{{% livechat_label prosody_components_interfaces_label %}}\" value to listen on other network interfaces."
msgstr ""
#. type: Plain text
@ -2356,7 +2346,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/installation/troubleshooting.md
msgid "Check the help for [this setting](/peertube-plugin-livechat/documentation/admin/settings/) for more information."
msgid "Check the help for [this settings](/peertube-plugin-livechat/documentation/admin/settings/) for more information."
msgstr ""
#. type: Title ###
@ -2536,7 +2526,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
msgid "To do so, just use the \"{{% livechat_label share_chat_link %}}\" feature, and open the \"{{% livechat_label share_chat_dock %}}\" tab. From there, you can create a new token using the \"+\" button."
msgid "To do so, just use the \"{{% livechat_label share_chat_link %}}\", and open the \"{{% livechat_label share_chat_dock %}}\" tab. From there, you can create a new token using the \"+\" button."
msgstr ""
#. type: Plain text
@ -2728,7 +2718,7 @@ msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/basics.md
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#: support/documentation/content/en/intro/_index.md
#, no-wrap
msgid "Moderation"
@ -2769,7 +2759,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/basics.md
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/viewers.md
msgid "![Chat menu](/peertube-plugin-livechat/images/top_menu.png?classes=shadow,border&height=200px)"
msgstr ""
@ -3005,16 +2995,6 @@ msgstr ""
msgid "Here you can configure:"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[{{% livechat_label livechat_configuration_channel_terms_label %}}](/peertube-plugin-livechat/documentation/user/streamers/terms)"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}](/peertube-plugin-livechat/documentation/user/streamers/moderation) default value"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[The slow mode](/peertube-plugin-livechat/documentation/user/streamers/slow_mode)"
@ -3095,7 +3075,7 @@ msgstr ""
msgid ""
"[\n"
" {\n"
" \"sn\": \":short_name:\",\n"
" \"sn\": \":short_name\",\n"
" \"url\": \"https://example.com/image.png\"\n"
" }\n"
"]\n"
@ -3119,18 +3099,18 @@ msgid "For streamers"
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Plugin peertube-plugin-livechat advanced moderation features"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "This section is still incomplete."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid ""
"This page describes the behaviour of livechat versions >= 10.0.0.\n"
@ -3138,314 +3118,90 @@ msgid ""
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "The chat bot"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can use a chat bot, that will help you for moderation. Check [the chat bot documentation](/peertube-plugin-livechat/documentation/user/streamers/bot) for more information."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Accessing moderation tools"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can access room settings and moderation tools using the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers) at the top of the chat."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "The video owner will be owner of the chat room. This means he can configure the room, delete it, promote other users as admins, ..."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "Starting with livechat v10.0.0, Peertube instance's admins and moderators have no special rights on rooms by default. However, they have a special button available on top of the chat: \"{{% livechat_label promote %}}\". Clicking this button will give them owner access on the room."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can use [ConverseJS moderation commands](https://conversejs.org/docs/html/features.html#moderating-chatrooms) to moderate the room. When you open the chat room in full screen, there will also be a menu with dedicated commands on the top right."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/polls.md
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "This feature comes with the livechat plugin version 10.2.0."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "You can prevent anonymous users to send messages. In such case, only registered users will be able to talk in the chat."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "To enable or disable this feature, use the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers), open the \"configure\" menu. In the form, you will find a \"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\" checkbox."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "![Room configuration / Mute anonymous users](/peertube-plugin-livechat/images/configure_mute_anonymous.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "Anonymous users won't have the message field, and will see following prompt: \"{{% livechat_label muted_anonymous_message %}}\""
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "![Room configuration / Muted anonymous users](/peertube-plugin-livechat/images/anonymous_muted.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "When this feature is enabled, anonymous users will be assigned the \"visitor\" role. You can change their role to \"participant\" if you want to allow some of them to talk."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "If you change the room configuration, all anonymous users will be muted or unmuted."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "You can choose to enable or disable this feature for new chatrooms on the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel)."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Roles and affiliations"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "There are several roles that can be assignated to users in chat rooms: owner, moderators, member, ..."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can promote users as moderators, if you need some help."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Delete room content"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can delete old rooms: join the room, and use the menu on the top to destroy the room."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Instance moderation"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "As Peertube instance moderator or administrator, you will probably need to check that your users are not behaving badly."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can list all existing chatrooms: in the plugin settings screen, there is a button «List rooms»."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "From there, you can also promote yourself as room moderator by using the \"{{% livechat_label promote %}}\" button on the right."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "You can create polls to ask viewers their opinion."
msgstr ""
#. type: Yaml Front Matter Hash Value: title
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Polls"
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Create a poll"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "You can create a new poll by using the \"{{% livechat_label new_poll %}}\" action in the chat top menu:"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll form](/peertube-plugin-livechat/images/polls_form.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "This poll feature should not be considered as a reliable voting system. It is easy to cheat. There is no mechanism to prevent anonymous users to vote multiple times by just reloading the chat. Votes are never fully anonymous, someone having access to the server could see who voted for what choice."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Poll form"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Fill the form fields:"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_question %}}\": the question to ask to you viewers"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_duration %}}\": the duration for which viewers can vote"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_anonymous_results %}}\": if checked, votes won't be publicly visible in the chat"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"Choice N\": choices that will be presented to viewers"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "You must at least fill the two first choices fields."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Once you submit the form, the poll will instantly start."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "If there was a previous unfinished poll, it will end and its result will be shown."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/polls.md
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, no-wrap
msgid "Access rights"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Every room's admins can create a new poll."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When you promote someone as room admin or owner, they gets instant access to the \"{{% livechat_label new_poll %}}\" action."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When you remove admin or owner rights to someone, they can't create new poll. But any existing poll will continue until it ends."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Every user that is not muted can vote. This means that you can prevent anonymous users to vote by using the [\"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\" feature](/peertube-plugin-livechat/documentation/user/streamers/moderation)."
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Poll workflow"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When the polls starts, a first message will be sent in the chat, from the account of the user creating the poll."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "A banner will also appear to show the poll, and will be updated regularly with the current votes."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll start](/peertube-plugin-livechat/images/polls_start.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Viewers can then vote by clicking on their choice, or by sending message like \"!1\" in the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Votes counts will be updated regularly in the banner."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Viewers can change their vote at any time, just by making a new choice. Their precedent choice will be replaced by the new one."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll votes](/peertube-plugin-livechat/images/polls_votes.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Anonymous viewers can only vote once they have choosen their nickname."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "If \"{{% livechat_label poll_anonymous_results %}}\" is checked, votes won't be shown to other users. If unchecked, votes will be publicly visible as you will see message like \"!1\" in the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "For viewers using XMPP clients or outdated livechat plugin versions, the banner will not be visible. But they will see the message in the chat and will be able to vote by sending messages with their choices."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When the poll ends, a new message will be sent in the chat, with the results."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll end](/peertube-plugin-livechat/images/polls_end.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "The only way to get old polls results is to search for the poll end message in the chat. For now, polls results are not saved by any other means. So don't forget to note polls results if you want to keep them."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/slow_mode.md
#, no-wrap
@ -3648,6 +3404,12 @@ msgstr ""
msgid "To have more space and better readability, open the chat in full-page mode."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, no-wrap
msgid "Access rights"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/tasks.md
msgid "Every room's admins have access to the Task Application (read and write access)."
@ -3789,87 +3551,6 @@ msgstr ""
msgid "Using this feature, for example, you can ask your moderators to highlight all chat questions, so you can see them at a glance during your livestream, and check them as answered."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, fuzzy, no-wrap
#| msgid "General information"
msgid "Configure channel's chat terms & conditions"
msgstr "معلومات عامة"
#. type: Yaml Front Matter Hash Value: title
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Terms & conditions"
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, fuzzy, no-wrap
#| msgid "General information"
msgid "Configuration"
msgstr "معلومات عامة"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "You can add terms & conditions to your channel. These terms will be shown to all users joining the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "To configure the terms & conditions, go to the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel):"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "![Channel configuration / Terms](/peertube-plugin-livechat/images/channel_terms_config.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "URL in the message will be clickable. You can also do some styling: [Message Styling](https://xmpp.org/extensions/xep-0393.html)."
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Viewers"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "When joining the chat, viewers will see the terms:"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "![Terms](/peertube-plugin-livechat/images/terms.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Peertube instance's admin can also set global terms & conditions. If so, these terms will be shown above your channel's terms."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Anonymous users will only see the terms & conditions once they have chosen their nickname (in other words: once they are able to talk)."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "You can change the terms content at any time, it will be instantly updated for all viewers."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Users can hide the terms & conditions. When doing so, terms won't be shown again, unless you change the content."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "If your Peertube instance allows joining chat with [XMPP clients](https://livingston.frama.io/peertube-plugin-livechat/documentation/admin/advanced/xmpp_clients/), users using such clients will see the terms as chat messages, comming from a \"Peertube\" account. When you update terms, they will receive a new message with the update terms content."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/viewers.md
#, no-wrap

View File

@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: peertube-plugin-livechat-documentation VERSION\n"
"POT-Creation-Date: 2024-07-05 13:36+0200\n"
"POT-Creation-Date: 2024-06-19 12:16+0200\n"
"PO-Revision-Date: 2023-07-17 10:52+0000\n"
"Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language-Team: Catalan <https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/ca/>\n"
@ -1185,7 +1185,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/admin/advanced/xmpp_clients.md
msgid "Start by going to the livechat plugin settings of your instance, then enable the setting \"Enable connection to room using external XMPP accounts\". By checking this setting, new settings appear below."
msgid "Start by going to the livechat plugin settings of your instance, then enable the setting \"Enable connection to room using external XMPP accounts\". By checking this settings, new settings appear below."
msgstr ""
#. type: Plain text
@ -1873,16 +1873,6 @@ msgstr ""
msgid "This section describes the plugin settings page."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "For more information on this feature, check the documentation for [channel's terms & conditions](/peertube-plugin-livechat/documentation/user/streamers/terms)."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "Changing this setting will restart the chat server, and all users will be disconnected for a short time."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "When pressing the «List rooms» button, all existing chatrooms will be listed. You can then find them and moderated them."
@ -1955,7 +1945,7 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting allows you to choose who can access this modal."
msgid "This settings allows you to choose who can access this modal."
msgstr ""
#. type: Plain text
@ -2086,13 +2076,13 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting should only be used if the plugin is broken, and waiting for a patch."
msgid "This settings should only be used if the plugin is broken, and waiting for a patch."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
#, no-wrap
msgid "If this setting is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.\n"
msgid "If this settings is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.\n"
msgstr ""
#. type: Plain text
@ -2112,7 +2102,7 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting enable XMPP external components to connect to the server. By default, this option **only allows connections from localhost components**. You have to change the \"{{% livechat_label prosody_components_interfaces_label %}}\" value to listen on other network interfaces."
msgid "This settings enable XMPP external components to connect to the server. By default, this option **only allows connections from localhost components**. You have to change the \"{{% livechat_label prosody_components_interfaces_label %}}\" value to listen on other network interfaces."
msgstr ""
#. type: Plain text
@ -2351,7 +2341,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/installation/troubleshooting.md
msgid "Check the help for [this setting](/peertube-plugin-livechat/documentation/admin/settings/) for more information."
msgid "Check the help for [this settings](/peertube-plugin-livechat/documentation/admin/settings/) for more information."
msgstr ""
#. type: Title ###
@ -2530,7 +2520,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
msgid "To do so, just use the \"{{% livechat_label share_chat_link %}}\" feature, and open the \"{{% livechat_label share_chat_dock %}}\" tab. From there, you can create a new token using the \"+\" button."
msgid "To do so, just use the \"{{% livechat_label share_chat_link %}}\", and open the \"{{% livechat_label share_chat_dock %}}\" tab. From there, you can create a new token using the \"+\" button."
msgstr ""
#. type: Plain text
@ -2722,7 +2712,7 @@ msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/basics.md
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#: support/documentation/content/en/intro/_index.md
#, no-wrap
msgid "Moderation"
@ -2763,7 +2753,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/basics.md
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/viewers.md
msgid "![Chat menu](/peertube-plugin-livechat/images/top_menu.png?classes=shadow,border&height=200px)"
msgstr ""
@ -2997,16 +2987,6 @@ msgstr ""
msgid "Here you can configure:"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[{{% livechat_label livechat_configuration_channel_terms_label %}}](/peertube-plugin-livechat/documentation/user/streamers/terms)"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}](/peertube-plugin-livechat/documentation/user/streamers/moderation) default value"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[The slow mode](/peertube-plugin-livechat/documentation/user/streamers/slow_mode)"
@ -3087,7 +3067,7 @@ msgstr ""
msgid ""
"[\n"
" {\n"
" \"sn\": \":short_name:\",\n"
" \"sn\": \":short_name\",\n"
" \"url\": \"https://example.com/image.png\"\n"
" }\n"
"]\n"
@ -3111,18 +3091,18 @@ msgid "For streamers"
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Plugin peertube-plugin-livechat advanced moderation features"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "This section is still incomplete."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid ""
"This page describes the behaviour of livechat versions >= 10.0.0.\n"
@ -3130,314 +3110,90 @@ msgid ""
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "The chat bot"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can use a chat bot, that will help you for moderation. Check [the chat bot documentation](/peertube-plugin-livechat/documentation/user/streamers/bot) for more information."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Accessing moderation tools"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can access room settings and moderation tools using the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers) at the top of the chat."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "The video owner will be owner of the chat room. This means he can configure the room, delete it, promote other users as admins, ..."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "Starting with livechat v10.0.0, Peertube instance's admins and moderators have no special rights on rooms by default. However, they have a special button available on top of the chat: \"{{% livechat_label promote %}}\". Clicking this button will give them owner access on the room."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can use [ConverseJS moderation commands](https://conversejs.org/docs/html/features.html#moderating-chatrooms) to moderate the room. When you open the chat room in full screen, there will also be a menu with dedicated commands on the top right."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/polls.md
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "This feature comes with the livechat plugin version 10.2.0."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "You can prevent anonymous users to send messages. In such case, only registered users will be able to talk in the chat."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "To enable or disable this feature, use the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers), open the \"configure\" menu. In the form, you will find a \"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\" checkbox."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "![Room configuration / Mute anonymous users](/peertube-plugin-livechat/images/configure_mute_anonymous.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "Anonymous users won't have the message field, and will see following prompt: \"{{% livechat_label muted_anonymous_message %}}\""
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "![Room configuration / Muted anonymous users](/peertube-plugin-livechat/images/anonymous_muted.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "When this feature is enabled, anonymous users will be assigned the \"visitor\" role. You can change their role to \"participant\" if you want to allow some of them to talk."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "If you change the room configuration, all anonymous users will be muted or unmuted."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "You can choose to enable or disable this feature for new chatrooms on the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel)."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Roles and affiliations"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "There are several roles that can be assignated to users in chat rooms: owner, moderators, member, ..."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can promote users as moderators, if you need some help."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Delete room content"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can delete old rooms: join the room, and use the menu on the top to destroy the room."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Instance moderation"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "As Peertube instance moderator or administrator, you will probably need to check that your users are not behaving badly."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can list all existing chatrooms: in the plugin settings screen, there is a button «List rooms»."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "From there, you can also promote yourself as room moderator by using the \"{{% livechat_label promote %}}\" button on the right."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "You can create polls to ask viewers their opinion."
msgstr ""
#. type: Yaml Front Matter Hash Value: title
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Polls"
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Create a poll"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "You can create a new poll by using the \"{{% livechat_label new_poll %}}\" action in the chat top menu:"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll form](/peertube-plugin-livechat/images/polls_form.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "This poll feature should not be considered as a reliable voting system. It is easy to cheat. There is no mechanism to prevent anonymous users to vote multiple times by just reloading the chat. Votes are never fully anonymous, someone having access to the server could see who voted for what choice."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Poll form"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Fill the form fields:"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_question %}}\": the question to ask to you viewers"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_duration %}}\": the duration for which viewers can vote"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_anonymous_results %}}\": if checked, votes won't be publicly visible in the chat"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"Choice N\": choices that will be presented to viewers"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "You must at least fill the two first choices fields."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Once you submit the form, the poll will instantly start."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "If there was a previous unfinished poll, it will end and its result will be shown."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/polls.md
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, no-wrap
msgid "Access rights"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Every room's admins can create a new poll."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When you promote someone as room admin or owner, they gets instant access to the \"{{% livechat_label new_poll %}}\" action."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When you remove admin or owner rights to someone, they can't create new poll. But any existing poll will continue until it ends."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Every user that is not muted can vote. This means that you can prevent anonymous users to vote by using the [\"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\" feature](/peertube-plugin-livechat/documentation/user/streamers/moderation)."
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Poll workflow"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When the polls starts, a first message will be sent in the chat, from the account of the user creating the poll."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "A banner will also appear to show the poll, and will be updated regularly with the current votes."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll start](/peertube-plugin-livechat/images/polls_start.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Viewers can then vote by clicking on their choice, or by sending message like \"!1\" in the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Votes counts will be updated regularly in the banner."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Viewers can change their vote at any time, just by making a new choice. Their precedent choice will be replaced by the new one."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll votes](/peertube-plugin-livechat/images/polls_votes.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Anonymous viewers can only vote once they have choosen their nickname."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "If \"{{% livechat_label poll_anonymous_results %}}\" is checked, votes won't be shown to other users. If unchecked, votes will be publicly visible as you will see message like \"!1\" in the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "For viewers using XMPP clients or outdated livechat plugin versions, the banner will not be visible. But they will see the message in the chat and will be able to vote by sending messages with their choices."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When the poll ends, a new message will be sent in the chat, with the results."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll end](/peertube-plugin-livechat/images/polls_end.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "The only way to get old polls results is to search for the poll end message in the chat. For now, polls results are not saved by any other means. So don't forget to note polls results if you want to keep them."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/slow_mode.md
#, no-wrap
@ -3640,6 +3396,12 @@ msgstr ""
msgid "To have more space and better readability, open the chat in full-page mode."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, no-wrap
msgid "Access rights"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/tasks.md
msgid "Every room's admins have access to the Task Application (read and write access)."
@ -3781,85 +3543,6 @@ msgstr ""
msgid "Using this feature, for example, you can ask your moderators to highlight all chat questions, so you can see them at a glance during your livestream, and check them as answered."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Configure channel's chat terms & conditions"
msgstr ""
#. type: Yaml Front Matter Hash Value: title
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Terms & conditions"
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Configuration"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "You can add terms & conditions to your channel. These terms will be shown to all users joining the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "To configure the terms & conditions, go to the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel):"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "![Channel configuration / Terms](/peertube-plugin-livechat/images/channel_terms_config.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "URL in the message will be clickable. You can also do some styling: [Message Styling](https://xmpp.org/extensions/xep-0393.html)."
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Viewers"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "When joining the chat, viewers will see the terms:"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "![Terms](/peertube-plugin-livechat/images/terms.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Peertube instance's admin can also set global terms & conditions. If so, these terms will be shown above your channel's terms."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Anonymous users will only see the terms & conditions once they have chosen their nickname (in other words: once they are able to talk)."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "You can change the terms content at any time, it will be instantly updated for all viewers."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Users can hide the terms & conditions. When doing so, terms won't be shown again, unless you change the content."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "If your Peertube instance allows joining chat with [XMPP clients](https://livingston.frama.io/peertube-plugin-livechat/documentation/admin/advanced/xmpp_clients/), users using such clients will see the terms as chat messages, comming from a \"Peertube\" account. When you update terms, they will receive a new message with the update terms content."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/viewers.md
#, no-wrap

View File

@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: peertube-plugin-livechat-documentation VERSION\n"
"POT-Creation-Date: 2024-07-05 13:36+0200\n"
"POT-Creation-Date: 2024-06-19 12:16+0200\n"
"PO-Revision-Date: 2023-07-17 10:52+0000\n"
"Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language-Team: Czech <https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/cs/>\n"
@ -1185,7 +1185,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/admin/advanced/xmpp_clients.md
msgid "Start by going to the livechat plugin settings of your instance, then enable the setting \"Enable connection to room using external XMPP accounts\". By checking this setting, new settings appear below."
msgid "Start by going to the livechat plugin settings of your instance, then enable the setting \"Enable connection to room using external XMPP accounts\". By checking this settings, new settings appear below."
msgstr ""
#. type: Plain text
@ -1873,16 +1873,6 @@ msgstr ""
msgid "This section describes the plugin settings page."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "For more information on this feature, check the documentation for [channel's terms & conditions](/peertube-plugin-livechat/documentation/user/streamers/terms)."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "Changing this setting will restart the chat server, and all users will be disconnected for a short time."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "When pressing the «List rooms» button, all existing chatrooms will be listed. You can then find them and moderated them."
@ -1955,7 +1945,7 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting allows you to choose who can access this modal."
msgid "This settings allows you to choose who can access this modal."
msgstr ""
#. type: Plain text
@ -2086,13 +2076,13 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting should only be used if the plugin is broken, and waiting for a patch."
msgid "This settings should only be used if the plugin is broken, and waiting for a patch."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
#, no-wrap
msgid "If this setting is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.\n"
msgid "If this settings is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.\n"
msgstr ""
#. type: Plain text
@ -2112,7 +2102,7 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting enable XMPP external components to connect to the server. By default, this option **only allows connections from localhost components**. You have to change the \"{{% livechat_label prosody_components_interfaces_label %}}\" value to listen on other network interfaces."
msgid "This settings enable XMPP external components to connect to the server. By default, this option **only allows connections from localhost components**. You have to change the \"{{% livechat_label prosody_components_interfaces_label %}}\" value to listen on other network interfaces."
msgstr ""
#. type: Plain text
@ -2351,7 +2341,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/installation/troubleshooting.md
msgid "Check the help for [this setting](/peertube-plugin-livechat/documentation/admin/settings/) for more information."
msgid "Check the help for [this settings](/peertube-plugin-livechat/documentation/admin/settings/) for more information."
msgstr ""
#. type: Title ###
@ -2530,7 +2520,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
msgid "To do so, just use the \"{{% livechat_label share_chat_link %}}\" feature, and open the \"{{% livechat_label share_chat_dock %}}\" tab. From there, you can create a new token using the \"+\" button."
msgid "To do so, just use the \"{{% livechat_label share_chat_link %}}\", and open the \"{{% livechat_label share_chat_dock %}}\" tab. From there, you can create a new token using the \"+\" button."
msgstr ""
#. type: Plain text
@ -2722,7 +2712,7 @@ msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/basics.md
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#: support/documentation/content/en/intro/_index.md
#, no-wrap
msgid "Moderation"
@ -2763,7 +2753,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/basics.md
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/viewers.md
msgid "![Chat menu](/peertube-plugin-livechat/images/top_menu.png?classes=shadow,border&height=200px)"
msgstr ""
@ -2997,16 +2987,6 @@ msgstr ""
msgid "Here you can configure:"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[{{% livechat_label livechat_configuration_channel_terms_label %}}](/peertube-plugin-livechat/documentation/user/streamers/terms)"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}](/peertube-plugin-livechat/documentation/user/streamers/moderation) default value"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[The slow mode](/peertube-plugin-livechat/documentation/user/streamers/slow_mode)"
@ -3087,7 +3067,7 @@ msgstr ""
msgid ""
"[\n"
" {\n"
" \"sn\": \":short_name:\",\n"
" \"sn\": \":short_name\",\n"
" \"url\": \"https://example.com/image.png\"\n"
" }\n"
"]\n"
@ -3111,18 +3091,18 @@ msgid "For streamers"
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Plugin peertube-plugin-livechat advanced moderation features"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "This section is still incomplete."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid ""
"This page describes the behaviour of livechat versions >= 10.0.0.\n"
@ -3130,314 +3110,90 @@ msgid ""
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "The chat bot"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can use a chat bot, that will help you for moderation. Check [the chat bot documentation](/peertube-plugin-livechat/documentation/user/streamers/bot) for more information."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Accessing moderation tools"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can access room settings and moderation tools using the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers) at the top of the chat."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "The video owner will be owner of the chat room. This means he can configure the room, delete it, promote other users as admins, ..."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "Starting with livechat v10.0.0, Peertube instance's admins and moderators have no special rights on rooms by default. However, they have a special button available on top of the chat: \"{{% livechat_label promote %}}\". Clicking this button will give them owner access on the room."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can use [ConverseJS moderation commands](https://conversejs.org/docs/html/features.html#moderating-chatrooms) to moderate the room. When you open the chat room in full screen, there will also be a menu with dedicated commands on the top right."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/polls.md
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "This feature comes with the livechat plugin version 10.2.0."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "You can prevent anonymous users to send messages. In such case, only registered users will be able to talk in the chat."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "To enable or disable this feature, use the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers), open the \"configure\" menu. In the form, you will find a \"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\" checkbox."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "![Room configuration / Mute anonymous users](/peertube-plugin-livechat/images/configure_mute_anonymous.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "Anonymous users won't have the message field, and will see following prompt: \"{{% livechat_label muted_anonymous_message %}}\""
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "![Room configuration / Muted anonymous users](/peertube-plugin-livechat/images/anonymous_muted.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "When this feature is enabled, anonymous users will be assigned the \"visitor\" role. You can change their role to \"participant\" if you want to allow some of them to talk."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "If you change the room configuration, all anonymous users will be muted or unmuted."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "You can choose to enable or disable this feature for new chatrooms on the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel)."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Roles and affiliations"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "There are several roles that can be assignated to users in chat rooms: owner, moderators, member, ..."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can promote users as moderators, if you need some help."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Delete room content"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can delete old rooms: join the room, and use the menu on the top to destroy the room."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Instance moderation"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "As Peertube instance moderator or administrator, you will probably need to check that your users are not behaving badly."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can list all existing chatrooms: in the plugin settings screen, there is a button «List rooms»."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "From there, you can also promote yourself as room moderator by using the \"{{% livechat_label promote %}}\" button on the right."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "You can create polls to ask viewers their opinion."
msgstr ""
#. type: Yaml Front Matter Hash Value: title
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Polls"
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Create a poll"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "You can create a new poll by using the \"{{% livechat_label new_poll %}}\" action in the chat top menu:"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll form](/peertube-plugin-livechat/images/polls_form.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "This poll feature should not be considered as a reliable voting system. It is easy to cheat. There is no mechanism to prevent anonymous users to vote multiple times by just reloading the chat. Votes are never fully anonymous, someone having access to the server could see who voted for what choice."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Poll form"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Fill the form fields:"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_question %}}\": the question to ask to you viewers"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_duration %}}\": the duration for which viewers can vote"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_anonymous_results %}}\": if checked, votes won't be publicly visible in the chat"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"Choice N\": choices that will be presented to viewers"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "You must at least fill the two first choices fields."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Once you submit the form, the poll will instantly start."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "If there was a previous unfinished poll, it will end and its result will be shown."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/polls.md
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, no-wrap
msgid "Access rights"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Every room's admins can create a new poll."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When you promote someone as room admin or owner, they gets instant access to the \"{{% livechat_label new_poll %}}\" action."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When you remove admin or owner rights to someone, they can't create new poll. But any existing poll will continue until it ends."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Every user that is not muted can vote. This means that you can prevent anonymous users to vote by using the [\"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\" feature](/peertube-plugin-livechat/documentation/user/streamers/moderation)."
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Poll workflow"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When the polls starts, a first message will be sent in the chat, from the account of the user creating the poll."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "A banner will also appear to show the poll, and will be updated regularly with the current votes."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll start](/peertube-plugin-livechat/images/polls_start.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Viewers can then vote by clicking on their choice, or by sending message like \"!1\" in the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Votes counts will be updated regularly in the banner."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Viewers can change their vote at any time, just by making a new choice. Their precedent choice will be replaced by the new one."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll votes](/peertube-plugin-livechat/images/polls_votes.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Anonymous viewers can only vote once they have choosen their nickname."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "If \"{{% livechat_label poll_anonymous_results %}}\" is checked, votes won't be shown to other users. If unchecked, votes will be publicly visible as you will see message like \"!1\" in the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "For viewers using XMPP clients or outdated livechat plugin versions, the banner will not be visible. But they will see the message in the chat and will be able to vote by sending messages with their choices."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When the poll ends, a new message will be sent in the chat, with the results."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll end](/peertube-plugin-livechat/images/polls_end.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "The only way to get old polls results is to search for the poll end message in the chat. For now, polls results are not saved by any other means. So don't forget to note polls results if you want to keep them."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/slow_mode.md
#, no-wrap
@ -3640,6 +3396,12 @@ msgstr ""
msgid "To have more space and better readability, open the chat in full-page mode."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, no-wrap
msgid "Access rights"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/tasks.md
msgid "Every room's admins have access to the Task Application (read and write access)."
@ -3781,85 +3543,6 @@ msgstr ""
msgid "Using this feature, for example, you can ask your moderators to highlight all chat questions, so you can see them at a glance during your livestream, and check them as answered."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Configure channel's chat terms & conditions"
msgstr ""
#. type: Yaml Front Matter Hash Value: title
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Terms & conditions"
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Configuration"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "You can add terms & conditions to your channel. These terms will be shown to all users joining the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "To configure the terms & conditions, go to the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel):"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "![Channel configuration / Terms](/peertube-plugin-livechat/images/channel_terms_config.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "URL in the message will be clickable. You can also do some styling: [Message Styling](https://xmpp.org/extensions/xep-0393.html)."
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Viewers"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "When joining the chat, viewers will see the terms:"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "![Terms](/peertube-plugin-livechat/images/terms.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Peertube instance's admin can also set global terms & conditions. If so, these terms will be shown above your channel's terms."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Anonymous users will only see the terms & conditions once they have chosen their nickname (in other words: once they are able to talk)."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "You can change the terms content at any time, it will be instantly updated for all viewers."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Users can hide the terms & conditions. When doing so, terms won't be shown again, unless you change the content."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "If your Peertube instance allows joining chat with [XMPP clients](https://livingston.frama.io/peertube-plugin-livechat/documentation/admin/advanced/xmpp_clients/), users using such clients will see the terms as chat messages, comming from a \"Peertube\" account. When you update terms, they will receive a new message with the update terms content."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/viewers.md
#, no-wrap

View File

@ -7,18 +7,16 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2024-07-05 13:36+0200\n"
"PO-Revision-Date: 2024-07-05 19:12+0000\n"
"Last-Translator: Victor Hampel <v.hampel@users.noreply.weblate.framasoft.org>"
"\n"
"Language-Team: German <https://weblate.framasoft.org/projects/"
"peertube-livechat/peertube-plugin-livechat-documentation/de/>\n"
"POT-Creation-Date: 2024-06-19 12:16+0200\n"
"PO-Revision-Date: 2024-06-18 20:10+0000\n"
"Last-Translator: Victor Hampel <v.hampel@users.noreply.weblate.framasoft.org>\n"
"Language-Team: German <https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/de/>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Weblate 5.6.2\n"
"X-Generator: Weblate 5.5.5\n"
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/contact/_index.md
@ -1166,7 +1164,7 @@ msgstr "Jetzt können Sie dieses Konto zu Gateways hinzufügen und bestimmte Liv
#. type: Plain text
#: support/documentation/content/en/documentation/admin/advanced/matterbridge.md
msgid "This documentation use an anonymous account to connect the bridge to the chat. But since the livechat v10.1.0, there is a new way to generate long term authentication token, that allows to connect using your account. This is used for [OBS docks](/peertube-plugin-livechat/documentation/user/obs). Using this feature for other purposes is not documented and not officially supported yet. If you want to use it anyway, you can request a token by calling then `/plugins/livechat/router/api/auth/tokens` endpoint. To get needed headers and request body, just check what happens when you generate a new token for OBS docks."
msgstr "In dieser Dokumentation wird ein anonymes Konto verwendet, um die Brücke mit dem Chat zu verbinden. Aber seit dem Livechat v10.1.0 gibt es eine neue Möglichkeit, ein langfristiges Authentifizierungs-Token zu generieren, das es erlaubt, sich mit dem eigenen Konto zu verbinden. Dies wird für [OBS docks](/peertube-plugin-livechat/de/documentation/user/obs) verwendet. Die Verwendung dieser Funktion für andere Zwecke ist nicht dokumentiert und wird noch nicht offiziell unterstützt. Wenn Sie es trotzdem benutzen wollen, können Sie ein Token anfordern, indem Sie den Endpunkt `/plugins/livechat/router/api/auth/tokens` aufrufen. Um die benötigten Header und den Request Body zu erhalten, prüfe einfach, was passiert, wenn du ein neues Token für OBS Docks generierst."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/admin/advanced/xmpp_clients.md
@ -1228,7 +1226,7 @@ msgstr "Plugin Einstellungen"
#. type: Plain text
#: support/documentation/content/en/documentation/admin/advanced/xmpp_clients.md
msgid "Start by going to the livechat plugin settings of your instance, then enable the setting \"Enable connection to room using external XMPP accounts\". By checking this setting, new settings appear below."
msgid "Start by going to the livechat plugin settings of your instance, then enable the setting \"Enable connection to room using external XMPP accounts\". By checking this settings, new settings appear below."
msgstr "Beginne mit den Einstellungen des Livechat-Plugins deiner Instanz und aktiviere die Einstellung \"Verbindung zum Raum über externe XMPP-Konten aktivieren\". Wenn Sie diese Einstellung aktivieren, erscheinen unterhalb neue Einstellungen."
#. type: Plain text
@ -1940,16 +1938,6 @@ msgstr "Einstellungen"
msgid "This section describes the plugin settings page."
msgstr "Dieser Abschnitt beschreibt die Seite mit den Plugin Einstellungen."
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "For more information on this feature, check the documentation for [channel's terms & conditions](/peertube-plugin-livechat/documentation/user/streamers/terms)."
msgstr "Weitere Informationen zu dieser Funktion finden Sie in der Dokumentation zu den [Kanal-Nutzungsbedingungen](/peertube-plugin-livechat/de/documentation/user/streamers/terms)."
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "Changing this setting will restart the chat server, and all users will be disconnected for a short time."
msgstr "Wenn Sie diese Einstellung ändern, wird der Chatserver neu gestartet, und alle Benutzer werden für kurze Zeit getrennt."
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "When pressing the «List rooms» button, all existing chatrooms will be listed. You can then find them and moderated them."
@ -2022,8 +2010,8 @@ msgstr "Sie können zum Beispiel eine schreibgeschützte URL generieren und dies
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting allows you to choose who can access this modal."
msgstr "Mit dieser Einstellung können Sie festlegen, wer auf diese Schaltfläche zugreifen kann."
msgid "This settings allows you to choose who can access this modal."
msgstr "Mit diesen Einstellungen können Sie festlegen, wer auf diese Schaltfläche zugreifen kann."
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
@ -2156,13 +2144,13 @@ msgstr "Das Plugin wird mit einem AppImage geliefert, das zum Ausführen des [Pr
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting should only be used if the plugin is broken, and waiting for a patch."
msgid "This settings should only be used if the plugin is broken, and waiting for a patch."
msgstr "Diese Einstellung sollte nur verwendet werden, wenn das Plugin defekt ist und auf einen Patch wartet."
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
#, no-wrap
msgid "If this setting is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.\n"
msgid "If this settings is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.\n"
msgstr "Wenn diese Einstellung leer gelassen wird und Sie Peertube >= 5.1 oder später verwenden, wird das Plugin die Werte aus Ihrer Peertube-Konfigurationsdatei verwenden, um zu erraten, auf welcher Schnittstelle und welchem Port die Anfrage erfolgen muss.\n"
#. type: Plain text
@ -2182,7 +2170,7 @@ msgstr "Zum Beispiel kann diese Option einer Instanz von Matterbridge (sobald si
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting enable XMPP external components to connect to the server. By default, this option **only allows connections from localhost components**. You have to change the \"{{% livechat_label prosody_components_interfaces_label %}}\" value to listen on other network interfaces."
msgid "This settings enable XMPP external components to connect to the server. By default, this option **only allows connections from localhost components**. You have to change the \"{{% livechat_label prosody_components_interfaces_label %}}\" value to listen on other network interfaces."
msgstr "Diese Einstellung ermöglicht es externen XMPP-Komponenten, sich mit dem Server zu verbinden. Standardmäßig erlaubt diese Option **nur Verbindungen von localhost-Komponenten**. Sie müssen den Wert \"{{% livechat_label prosody_components_interfaces_label %}}\" ändern, um an anderen Netzwerkschnittstellen zu lauschen."
#. type: Plain text
@ -2426,8 +2414,8 @@ msgstr "Versuchen Sie in diesem Fall, die \"{{% livechat_label prosody_peertube_
#. type: Plain text
#: support/documentation/content/en/documentation/installation/troubleshooting.md
msgid "Check the help for [this setting](/peertube-plugin-livechat/documentation/admin/settings/) for more information."
msgstr "Weitere Informationen finden Sie in der Hilfe für [diese Einstellung](/peertube-plugin-livechat/de/documentation/admin/settings/)."
msgid "Check the help for [this settings](/peertube-plugin-livechat/documentation/admin/settings/) for more information."
msgstr "Weitere Informationen finden Sie in der Hilfe für [diese Einstellungen](/peertube-plugin-livechat/de/documentation/admin/settings/)."
#. type: Title ###
#: support/documentation/content/en/documentation/installation/troubleshooting.md
@ -2520,8 +2508,10 @@ msgstr "OBS Overlay"
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
#, fuzzy
#| msgid "You can easily include the chat in your stream."
msgid "You can easily include the chat in your video stream."
msgstr "Sie können den Chat ganz einfach in Ihren Videostream integrieren."
msgstr "Sie können den Chat ganz einfach in Ihren Stream integrieren."
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
@ -2584,7 +2574,7 @@ msgstr "Hinweis: Sie können vollständig die Chat-Farben anpassen. Dies ist noc
#: support/documentation/content/en/documentation/user/obs.md
#, no-wrap
msgid "OBS Dock"
msgstr "OBS Dock"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
@ -2601,63 +2591,71 @@ msgstr "Diese Funktion kann von den Administratoren der Instanz deaktiviert werd
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
msgid "You can use OBS \"Custom browser docks\" to integrate the chat in your OBS while you are streaming. The livechat plugin offers a way to create long term token that can identify you automatically to join the chat, so you don't have to enter your password in OBS."
msgstr "Sie können OBS \"Benutzerdefinierte Browser-Docks\" verwenden, um den Chat in OBS zu integrieren, während Sie streamen. Das Livechat-Plugin bietet eine Möglichkeit, ein langfristiges Token zu erstellen, das Sie automatisch identifiziert, um dem Chat beizutreten, so dass Sie Ihr Passwort nicht in OBS eingeben müssen."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
msgid "To do so, just use the \"{{% livechat_label share_chat_link %}}\" feature, and open the \"{{% livechat_label share_chat_dock %}}\" tab. From there, you can create a new token using the \"+\" button."
msgstr "Verwenden Sie dazu einfach die \"{{% livechat_label share_chat_link %}}\" Funktion, und öffnen Sie die Registerkarte \"{{% livechat_label share_chat_dock %}}\". Von dort aus können Sie mit der Schaltfläche \"+\" ein neuen Token erstellen."
msgid "To do so, just use the \"{{% livechat_label share_chat_link %}}\", and open the \"{{% livechat_label share_chat_dock %}}\" tab. From there, you can create a new token using the \"+\" button."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
#: support/documentation/content/en/documentation/user/streamers/basics.md
#, fuzzy
#| msgid "![Share link popup](/peertube-plugin-livechat/images/share_readonly.png?classes=shadow,border&height=200px)"
msgid "![Share link popup - dock tab](/peertube-plugin-livechat/images/share_dock.png?classes=shadow,border&height=200px)"
msgstr "![Link teilen Fenster - Dock Reiter](/peertube-plugin-livechat/images/share_dock.png?classes=shadow,border&height=200px)"
msgstr "![Link Teilen Popup](/peertube-plugin-livechat/images/share_readonly.png?classes=shadow,border&height=200px)"
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
msgid "Then, copy the url, and use the \"Docks / Custom browser docks\" menu from your OBS to add a dock with this URL."
msgstr "Kopieren Sie dann die URL und verwenden Sie das Menü \"Docks / Benutzerdefinierte Browser-Docks\" in Ihrem OBS, um ein Dock mit dieser URL hinzuzufügen."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
#, fuzzy
#| msgid "![Chat menu](/peertube-plugin-livechat/images/top_menu.png?classes=shadow,border&height=200px)"
msgid "![OBS - Dock menu](/peertube-plugin-livechat/images/obs_dock_menu.png?classes=shadow,border&height=200px)"
msgstr "![OBS - Dock Menü](/peertube-plugin-livechat/images/obs_dock_menu.png?classes=shadow,border&height=200px)"
msgstr "![Chat Menü](/peertube-plugin-livechat/images/top_menu.png?classes=shadow,border&height=200px)"
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
#, fuzzy
#| msgid "![External login dialog](/peertube-plugin-livechat/images/external_login_dialog.png?classes=shadow,border&height=200px)"
msgid "![OBS - Dock dialog](/peertube-plugin-livechat/images/obs_dock_dialog.png?classes=shadow,border&height=200px)"
msgstr "![OBS - Dock-Dialog](/peertube-plugin-livechat/images/obs_dock_dialog.png?classes=shadow,border&height=200px)"
msgstr "![Externer Anmeldedialog](/peertube-plugin-livechat/images/external_login_dialog.png?classes=shadow,border&height=200px)"
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
msgid "Once you have done, you will have a new dock connected to the chat with your account."
msgstr "Danach haben Sie ein neues Dock, das mit dem Chat und Ihrem Konto verbunden ist."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
#, fuzzy
#| msgid "![Share button](/peertube-plugin-livechat/images/share_button.png?classes=shadow,border&height=200px)"
msgid "![OBS - Dock](/peertube-plugin-livechat/images/obs_dock.png?classes=shadow,border&height=200px)"
msgstr "![OBS - Dock](/peertube-plugin-livechat/images/obs_dock.png?classes=shadow,border&height=200px)"
msgstr "![Teilen Schaltfläche](/peertube-plugin-livechat/images/share_button.png?classes=shadow,border&height=200px)"
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
msgid "Tokens are valid to join any chat room. You don't have to generate separate tokens for each of your rooms. You can also customize the nickame that will be used by changing the `n` parameter in the url."
msgstr "Die Token sind für die Teilnahme an jedem Chatraum gültig. Sie müssen nicht für jeden Ihrer Räume ein eigenes Token erstellen. Sie können auch den Spitznamen, der verwendet wird, anpassen, indem Sie den Parameter `n` in der URL ändern."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
msgid "Don't share these links to anyone, as it would allow them to connect as yourself."
msgstr "Geben Sie diese Links nicht weiter, da sie es anderen Personen ermöglichen würden, eine Verbindung mit Ihrem Konto herzustellen."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
msgid "If a token is compromised, or no more needed, you can revoke them."
msgstr "Wenn ein Token kompromittiert ist oder nicht mehr benötigt wird, können Sie ihn widerrufen."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
msgid "These tokens can be used for other purposes, as connecting to your account with XMPP bots or clients. This feature is not documented yet, and not officially supported. So use with care."
msgstr "Diese Token können für andere Zwecke verwendet werden, z. B. für die Verbindung mit XMPP-Bots oder -Clients zu Ihrem Konto. Diese Funktion ist noch nicht dokumentiert und wird offiziell nicht unterstützt. Verwenden Sie sie also mit Vorsicht."
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/obs.md
@ -2748,7 +2746,7 @@ msgstr "Diese Schaltfläche öffnet ein Popup-Fenster, in dem Sie eine URL erhal
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/basics.md
msgid "The \"{{% livechat_label share_chat_embed %}}\" tab provide some links to embed the chat in websites, or in your live stream."
msgstr "Auf der Registerkarte \"{{% livechat_label share_chat_embed %}}\" finden Sie einige Links zum Einbetten des Chats in Websites oder in Ihre Livestream."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/basics.md
@ -2772,18 +2770,22 @@ msgstr "{{% livechat_label generate_iframe %}}: Anstelle einer URL erhalten Sie
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/basics.md
#, fuzzy
#| msgid "Please refer to the [OBS documentation](/peertube-plugin-livechat/documentation/user/obs)."
msgid "For more information on the \"{{% livechat_label share_chat_dock %}}\" tab, check the [OBS documentation](/peertube-plugin-livechat/documentation/user/obs)."
msgstr "Weitere Informationen über die Registerkarte \"{{% livechat_label share_chat_dock %}}\" finden Sie in der [OBS-Dokumentation](/peertube-plugin-livechat/de/documentation/user/obs)."
msgstr "Bitte lesen Sie die [OBS-Dokumentation](/peertube-plugin-livechat/de/documentation/user/obs)."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/basics.md
msgid "In the \"{{% livechat_label web %}}\" tab, the provided url opens the chat in the Peertube interface. You can share this link to other users to invite them to join the chat."
msgstr "Auf der Registerkarte \"{{% livechat_label web %}}\" öffnet die angegebene URL den Chat in der Peertube-Oberfläche. Sie können diesen Link an andere Benutzer weitergeben, um sie zum Chat einzuladen."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/basics.md
#, fuzzy
#| msgid "![Share link popup](/peertube-plugin-livechat/images/share_readonly.png?classes=shadow,border&height=200px)"
msgid "![Share link popup - web tab](/peertube-plugin-livechat/images/share_web.png?classes=shadow,border&height=200px)"
msgstr "![Link teilen Fenster - Web Reiter](/peertube-plugin-livechat/images/share_web.png?classes=shadow,border&height=200px)"
msgstr "![Link Teilen Popup](/peertube-plugin-livechat/images/share_readonly.png?classes=shadow,border&height=200px)"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/basics.md
@ -2792,12 +2794,14 @@ msgstr "Das \"{{% livechat_label share_chat_link %}}\" Popup-Fenster kann auch e
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/basics.md
#, fuzzy
#| msgid "![Share XMPP](/peertube-plugin-livechat/images/share_xmpp_dialog.png?classes=shadow,border&height=200px)"
msgid "![Share link popup - xmpp tab](/peertube-plugin-livechat/images/share_xmpp_dialog.png?classes=shadow,border&height=200px)"
msgstr "![Link teilen Fenster - xmpp Reiter](/peertube-plugin-livechat/images/share_xmpp_dialog.png?classes=shadow,border&height=200px)"
msgstr "![XMPP Link teilen](/peertube-plugin-livechat/images/share_xmpp_dialog.png?classes=shadow,border&height=200px)"
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/basics.md
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#: support/documentation/content/en/intro/_index.md
#, no-wrap
msgid "Moderation"
@ -2838,7 +2842,7 @@ msgstr "Sie können das Dauerhaftigkeitsverhalten ändern. [Öffnen Sie das Cha
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/basics.md
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/viewers.md
msgid "![Chat menu](/peertube-plugin-livechat/images/top_menu.png?classes=shadow,border&height=200px)"
msgstr "![Chat Menü](/peertube-plugin-livechat/images/top_menu.png?classes=shadow,border&height=200px)"
@ -3072,16 +3076,6 @@ msgstr "Dieser \"{{% livechat_label menu_configuration_label %}}\" Link führt S
msgid "Here you can configure:"
msgstr "Hier können Sie konfigurieren:"
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[{{% livechat_label livechat_configuration_channel_terms_label %}}](/peertube-plugin-livechat/documentation/user/streamers/terms)"
msgstr "[{{% livechat_label livechat_configuration_channel_terms_label %}}](/peertube-plugin-livechat/de/documentation/user/streamers/terms)"
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}](/peertube-plugin-livechat/documentation/user/streamers/moderation) default value"
msgstr "[{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}](/peertube-plugin-livechat/de/documentation/user/streamers/moderation) Standardwert"
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[The slow mode](/peertube-plugin-livechat/documentation/user/streamers/slow_mode)"
@ -3162,14 +3156,14 @@ msgstr "Sie können auch eine Datei generieren, die Sie aus einer anderen Quelle
msgid ""
"[\n"
" {\n"
" \"sn\": \":short_name:\",\n"
" \"sn\": \":short_name\",\n"
" \"url\": \"https://example.com/image.png\"\n"
" }\n"
"]\n"
msgstr ""
"[\n"
" {\n"
" \"sn\": \":short_name:\",\n"
" \"sn\": \":short_name\",\n"
" \"url\": \"https://example.com/image.png\"\n"
" }\n"
"]\n"
@ -3192,18 +3186,18 @@ msgid "For streamers"
msgstr "Für Streamer"
#. type: Yaml Front Matter Hash Value: description
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Plugin peertube-plugin-livechat advanced moderation features"
msgstr "Plugin peertube-plugin-livechat Erweiterte Moderationsfunktionen"
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "This section is still incomplete."
msgstr "Dieser Abschnitt ist noch unvollständig."
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid ""
"This page describes the behaviour of livechat versions >= 10.0.0.\n"
@ -3213,373 +3207,90 @@ msgstr ""
"Es gab einige Änderungen in der Art und Weise, wie wir die Zugriffsrechte für Peertube-Administratoren und -Moderatoren verwalten.\n"
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "The chat bot"
msgstr "Der Chatbot"
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can use a chat bot, that will help you for moderation. Check [the chat bot documentation](/peertube-plugin-livechat/documentation/user/streamers/bot) for more information."
msgstr "Sie können einen Chatbot verwenden, der Sie bei der Moderation unterstützt. Weitere Informationen finden Sie in der [Chatbot Dokumentation](/peertube-plugin-livechat/de/documentation/user/streamers/bot)."
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Accessing moderation tools"
msgstr "Zugang zu den Moderationswerkzeugen"
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can access room settings and moderation tools using the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers) at the top of the chat."
msgstr "Über das [Chat Dropdown Menü](/peertube-plugin-livechat/de/documentation/user/viewers) am oberen Rand des Chats haben Sie Zugriff auf die Raumeinstellungen und Moderationswerkzeuge."
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "The video owner will be owner of the chat room. This means he can configure the room, delete it, promote other users as admins, ..."
msgstr "Der Videobesitzer ist der Besitzer des Chatraums. Das bedeutet, er kann den Raum konfigurieren, löschen, andere Benutzer als Administratoren befördern, ..."
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "Starting with livechat v10.0.0, Peertube instance's admins and moderators have no special rights on rooms by default. However, they have a special button available on top of the chat: \"{{% livechat_label promote %}}\". Clicking this button will give them owner access on the room."
msgstr "Ab livechat v10.0.0 haben Admins und Moderatoren der Peertube-Instanz standardmäßig keine besonderen Rechte für Räume. Sie haben jedoch einen speziellen Button oben im Chat zur Verfügung: \"{{% livechat_label promote %}}\". Wenn sie auf diese Schaltfläche klicken, erhalten sie Besitzerrechte für den Raum."
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can use [ConverseJS moderation commands](https://conversejs.org/docs/html/features.html#moderating-chatrooms) to moderate the room. When you open the chat room in full screen, there will also be a menu with dedicated commands on the top right."
msgstr "Sie können [ConverseJS Moderationsbefehle](https://conversejs.org/docs/html/features.html#moderating-chatrooms) verwenden, um den Raum zu moderieren. Wenn Sie den Chat-Raum im Vollbildmodus öffnen, finden Sie oben rechts ein Menü mit speziellen Befehlen."
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/polls.md
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "This feature comes with the livechat plugin version 10.2.0."
msgstr "Diese Funktion wird mit dem Livechatplugin Version 10.2.0 verfügbar sein."
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "You can prevent anonymous users to send messages. In such case, only registered users will be able to talk in the chat."
msgstr "Sie können anonyme Benutzer daran hindern, Nachrichten zu senden. In diesem Fall können nur registrierte Benutzer im Chat schreiben."
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "To enable or disable this feature, use the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers), open the \"configure\" menu. In the form, you will find a \"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\" checkbox."
msgstr "Um diese Funktion zu aktivieren oder zu deaktivieren, verwenden Sie das [Chat-Dropdown-Menü](/peertube-plugin-livechat/de/documentation/user/viewers), öffnen Sie das Menü \"Konfigurieren\". In dem Formular finden Sie eine Checkbox \"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\"."
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "![Room configuration / Mute anonymous users](/peertube-plugin-livechat/images/configure_mute_anonymous.png?classes=shadow,border&height=400px)"
msgstr "![Raumkonfiguration / Anonyme Benutzer stummschalten](/peertube-plugin-livechat/images/configure_mute_anonymous.png?classes=shadow,border&height=400px)"
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "Anonymous users won't have the message field, and will see following prompt: \"{{% livechat_label muted_anonymous_message %}}\""
msgstr "Anonyme Benutzer haben das Nachrichtenfeld nicht und sehen folgende Aufforderung: \"{{% livechat_label muted_anonymous_message %}}\""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "![Room configuration / Muted anonymous users](/peertube-plugin-livechat/images/anonymous_muted.png?classes=shadow,border&height=400px)"
msgstr "![Raumkonfiguration / Stummgeschaltete anonyme Benutzer](/peertube-plugin-livechat/images/anonymous_muted.png?classes=shadow,border&height=400px)"
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "When this feature is enabled, anonymous users will be assigned the \"visitor\" role. You can change their role to \"participant\" if you want to allow some of them to talk."
msgstr "Wenn diese Funktion aktiviert ist, wird anonymen Benutzern die Rolle \"Besucher\" zugewiesen. Sie können deren Rolle in \"Teilnehmer\" ändern, wenn Sie einigen von ihnen erlauben wollen, zu schreiben."
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "If you change the room configuration, all anonymous users will be muted or unmuted."
msgstr "Wenn Sie die Raumkonfiguration ändern, werden alle anonymen Benutzer stummgeschaltet oder die Stummschaltung aufgehoben."
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "You can choose to enable or disable this feature for new chatrooms on the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel)."
msgstr "Sie können diese Funktion für neue Chaträume auf der [Kanal-Konfigurationsseite](/peertube-plugin-livechat/de/documentation/user/streamers/channel) aktivieren oder deaktivieren."
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Roles and affiliations"
msgstr "Rollen und Zugehörigkeiten"
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "There are several roles that can be assignated to users in chat rooms: owner, moderators, member, ..."
msgstr "Es gibt verschiedene Rollen, die Benutzern in Chaträumen zugewiesen werden können: Eigentümer, Moderatoren, Mitglieder, ..."
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can promote users as moderators, if you need some help."
msgstr "Sie können Benutzer zu Moderatoren befördern, wenn Sie Hilfe benötigen."
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Delete room content"
msgstr "Rauminhalt löschen"
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can delete old rooms: join the room, and use the menu on the top to destroy the room."
msgstr "Sie können alte Räume löschen: Treten Sie dem Raum bei, und verwenden Sie das Menü oben, um den Raum zu löschen."
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Instance moderation"
msgstr "Instanz-Moderation"
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "As Peertube instance moderator or administrator, you will probably need to check that your users are not behaving badly."
msgstr "Als Moderator oder Administrator einer Peertube-Instanz müssen Sie wahrscheinlich überprüfen, dass sich Ihre Benutzer nicht schlecht benehmen."
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can list all existing chatrooms: in the plugin settings screen, there is a button «List rooms»."
msgstr "Sie können alle bestehenden Chaträume auflisten: in den Einstellungen des Plugins gibt es eine Schaltfläche «Räume auflisten»."
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "From there, you can also promote yourself as room moderator by using the \"{{% livechat_label promote %}}\" button on the right."
msgstr "Von dort aus kannst du dich auch als Moderator des Raums bewerben, indem du die Schaltfläche \"{{% livechat_label promote %}}\" auf der rechten Seite benutzt."
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "You can create polls to ask viewers their opinion."
msgstr ""
"Sie können Umfragen erstellen, um die Zuschauer nach ihrer Meinung zu fragen."
#. type: Yaml Front Matter Hash Value: title
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Polls"
msgstr "Umfragen"
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Create a poll"
msgstr "Eine Umfrage erstellen"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "You can create a new poll by using the \"{{% livechat_label new_poll %}}\" action in the chat top menu:"
msgstr ""
"Sie können eine neue Umfrage erstellen, indem Sie die Aktion \"{{% "
"livechat_label new_poll %}}\" im oberen Menü des Chats verwenden:"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll form](/peertube-plugin-livechat/images/polls_form.png?classes=shadow,border&height=200px)"
msgstr ""
"![Umfrageformular](/peertube-plugin-livechat/images/polls_form."
"png?classes=shadow,border&height=200px)"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "This poll feature should not be considered as a reliable voting system. It is easy to cheat. There is no mechanism to prevent anonymous users to vote multiple times by just reloading the chat. Votes are never fully anonymous, someone having access to the server could see who voted for what choice."
msgstr ""
"Diese Abstimmungsfunktion sollte nicht als zuverlässiges Abstimmungssystem "
"betrachtet werden. Es ist leicht zu betrügen. Es gibt keinen Mechanismus, "
"der anonyme Benutzer daran hindert, mehrfach abzustimmen, indem sie einfach "
"den Chat neu laden. Abstimmungen sind nie vollständig anonym, jemand mit "
"Zugang zum Server könnte sehen, wer für welche Wahl gestimmt hat."
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Poll form"
msgstr "Umfrageformular"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Fill the form fields:"
msgstr "Füllen Sie die Formularfelder aus:"
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_question %}}\": the question to ask to you viewers"
msgstr ""
"\"{{% livechat_label poll_question %}}\": die Frage, die den Zuschauern "
"gestellt werden soll"
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_duration %}}\": the duration for which viewers can vote"
msgstr ""
"\"{{% livechat_label poll_duration %}}\": die Dauer, in der die Zuschauer "
"abstimmen können"
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_anonymous_results %}}\": if checked, votes won't be publicly visible in the chat"
msgstr ""
"\"{{% livechat_label poll_anonymous_results %}}\": wenn ausgewählt, werden "
"Abstimmungen im Chat nicht öffentlich sichtbar sein"
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"Choice N\": choices that will be presented to viewers"
msgstr ""
"\"Auswahl N\": Auswahlmöglichkeiten, die den Zuschauern präsentiert werden"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "You must at least fill the two first choices fields."
msgstr "Sie müssen mindestens die ersten beiden Auswahlfelder ausfüllen."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Once you submit the form, the poll will instantly start."
msgstr "Sobald Sie das Formular abschicken, wird die Umfrage sofort gestartet."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "If there was a previous unfinished poll, it will end and its result will be shown."
msgstr ""
"Wenn es eine vorherige, noch nicht beendete Umfrage gab, wird diese beendet "
"und ihr Ergebnis angezeigt."
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/polls.md
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, no-wrap
msgid "Access rights"
msgstr "Zugriffsrechte"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Every room's admins can create a new poll."
msgstr ""
"Die Administratoren eines jeden Raums können eine neue Umfrage erstellen."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When you promote someone as room admin or owner, they gets instant access to the \"{{% livechat_label new_poll %}}\" action."
msgstr ""
"Wenn Sie jemanden zum Raumadministrator oder -besitzer befördern, erhält er "
"sofortigen Zugriff auf die Aktion \"{{% livechat_label new_poll %}}\"."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When you remove admin or owner rights to someone, they can't create new poll. But any existing poll will continue until it ends."
msgstr ""
"Wenn Sie jemandem die Administrator- oder Eigentümerrechte entziehen, kann "
"er keine neue Umfrage mehr erstellen. Bestehende Umfragen werden jedoch "
"fortgesetzt, bis sie beendet werden."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Every user that is not muted can vote. This means that you can prevent anonymous users to vote by using the [\"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\" feature](/peertube-plugin-livechat/documentation/user/streamers/moderation)."
msgstr ""
"Jeder Benutzer, der nicht stummgeschaltet ist, kann abstimmen. Das "
"bedeutet, dass Sie anonyme Benutzer an der Abstimmung hindern können, indem "
"Sie die Funktion [\"{{% livechat_label "
"livechat_configuration_channel_mute_anonymous_label %}}\"](/peertube-"
"plugin-livechat/de/documentation/user/streamers/moderation) verwenden."
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Poll workflow"
msgstr "Umfrageablauf"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When the polls starts, a first message will be sent in the chat, from the account of the user creating the poll."
msgstr ""
"Wenn die Umfrage beginnt, wird eine erste Nachricht im Chat vom Konto des "
"Benutzers, der die Umfrage erstellt, gesendet."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "A banner will also appear to show the poll, and will be updated regularly with the current votes."
msgstr ""
"Außerdem wird ein Banner erscheinen, das die Umfrage anzeigt und regelmäßig "
"mit den aktuellen Stimmen aktualisiert wird."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll start](/peertube-plugin-livechat/images/polls_start.png?classes=shadow,border&height=200px)"
msgstr ""
"![Umfrage Start](/peertube-plugin-livechat/images/polls_start."
"png?classes=shadow,border&height=200px)"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Viewers can then vote by clicking on their choice, or by sending message like \"!1\" in the chat."
msgstr ""
"Die Zuschauer können dann abstimmen, indem sie auf ihre Wahl klicken oder "
"eine Nachricht wie \"!1\" in den Chat schicken."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Votes counts will be updated regularly in the banner."
msgstr "Die Anzahl der Stimmen wird regelmäßig im Banner aktualisiert."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Viewers can change their vote at any time, just by making a new choice. Their precedent choice will be replaced by the new one."
msgstr ""
"Die Zuschauer können ihre Wahl jederzeit ändern, indem sie einfach eine neue "
"Wahl treffen. Die vorherige Wahl wird dann durch die neue ersetzt."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll votes](/peertube-plugin-livechat/images/polls_votes.png?classes=shadow,border&height=200px)"
msgstr ""
"![Abstimmungen](/peertube-plugin-livechat/images/polls_votes."
"png?classes=shadow,border&height=200px)"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Anonymous viewers can only vote once they have choosen their nickname."
msgstr ""
"Anonyme Nutzer können nur abstimmen, wenn sie ihren Nicknamen gewählt haben."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "If \"{{% livechat_label poll_anonymous_results %}}\" is checked, votes won't be shown to other users. If unchecked, votes will be publicly visible as you will see message like \"!1\" in the chat."
msgstr ""
"Wenn \"{{% livechat_label poll_anonymous_results %}}\" aktiviert ist, werden "
"die Stimmen anderen Benutzern nicht angezeigt. Wenn diese Option nicht "
"aktiviert ist, sind die Abstimmungen öffentlich sichtbar, da Ihnen Meldungen "
"wie \"!1\" im Chat angezeigt werden."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "For viewers using XMPP clients or outdated livechat plugin versions, the banner will not be visible. But they will see the message in the chat and will be able to vote by sending messages with their choices."
msgstr ""
"Für Nutzer, die XMPP-Clients oder veraltete Livechat-Plugin-Versionen "
"verwenden, wird das Banner nicht sichtbar sein. Sie sehen jedoch die "
"Nachricht im Chat und können ihre Stimme abgeben, indem sie Nachrichten mit "
"ihrer Wahl senden."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When the poll ends, a new message will be sent in the chat, with the results."
msgstr ""
"Wenn die Umfrage beendet ist, wird im Chat eine neue Nachricht mit den "
"Ergebnissen gesendet."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll end](/peertube-plugin-livechat/images/polls_end.png?classes=shadow,border&height=200px)"
msgstr ""
"![Umfrageende](/peertube-plugin-livechat/images/polls_end."
"png?classes=shadow,border&height=200px)"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "The only way to get old polls results is to search for the poll end message in the chat. For now, polls results are not saved by any other means. So don't forget to note polls results if you want to keep them."
msgstr ""
"Die einzige Möglichkeit, alte Umfrageergebnisse zu erhalten, ist die Suche "
"nach der Nachricht über das Ende der Umfrage im Chat. Im Moment werden die "
"Umfrageergebnisse nicht auf andere Weise gespeichert. Vergessen Sie also "
"nicht, die Umfrageergebnisse zu notieren, wenn Sie sie behalten wollen."
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/slow_mode.md
#, no-wrap
@ -3782,6 +3493,12 @@ msgstr "![Aufgabenanwendung](/peertube-plugin-livechat/images/task_app_fullpage_
msgid "To have more space and better readability, open the chat in full-page mode."
msgstr "Um mehr Platz und eine bessere Lesbarkeit zu erhalten, öffnen Sie den Chat im neuen Fenster."
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, no-wrap
msgid "Access rights"
msgstr "Zugriffsrechte"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/tasks.md
msgid "Every room's admins have access to the Task Application (read and write access)."
@ -3923,85 +3640,6 @@ msgstr "![Aufgabe erstellt](/peertube-plugin-livechat/images/task_from_message_3
msgid "Using this feature, for example, you can ask your moderators to highlight all chat questions, so you can see them at a glance during your livestream, and check them as answered."
msgstr "Mit dieser Funktion können Sie z. B. Ihre Moderatoren bitten, alle Chat-Fragen zu markieren, damit Sie sie während Ihres Livestreams auf einen Blick sehen und als beantwortet markieren können."
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Configure channel's chat terms & conditions"
msgstr "Konfigurieren Sie die Chat-Nutzungsbedingungen für den Kanal"
#. type: Yaml Front Matter Hash Value: title
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Terms & conditions"
msgstr "Nutzungsbedingungen"
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Configuration"
msgstr "Konfiguration"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "You can add terms & conditions to your channel. These terms will be shown to all users joining the chat."
msgstr "Sie können Ihrem Kanal Nutzungsbedingungen hinzufügen. Diese Nutzungsbedingungen werden allen Benutzern angezeigt, die den Chat betreten."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "To configure the terms & conditions, go to the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel):"
msgstr "Um die Nutzungsbedingungen zu konfigurieren, gehen Sie auf die [Kanal-Konfigurationsseite](/peertube-plugin-livechat/de/documentation/user/streamers/channel):"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "![Channel configuration / Terms](/peertube-plugin-livechat/images/channel_terms_config.png?classes=shadow,border&height=400px)"
msgstr "![Kanalkonfiguration / Nutzungsbedingungen](/peertube-plugin-livechat/images/channel_terms_config.png?classes=shadow,border&height=400px)"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "URL in the message will be clickable. You can also do some styling: [Message Styling](https://xmpp.org/extensions/xep-0393.html)."
msgstr "Die URL in der Nachricht wird anklickbar sein. Sie können die Nachricht auch etwas gestalten: [Message Styling](https://xmpp.org/extensions/xep-0393.html)."
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Viewers"
msgstr "Zuschauer"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "When joining the chat, viewers will see the terms:"
msgstr "Wenn Sie dem Chat beitreten, sehen die Zuschauer die Bedingungen:"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "![Terms](/peertube-plugin-livechat/images/terms.png?classes=shadow,border&height=400px)"
msgstr "![Bedingungen](/peertube-plugin-livechat/images/terms.png?classes=shadow,border&height=400px)"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Peertube instance's admin can also set global terms & conditions. If so, these terms will be shown above your channel's terms."
msgstr "Der Administrator der Peertube-Instanz kann auch globale Nutzungsbedingungen festlegen. Wenn dies der Fall ist, werden diese Bedingungen über den Bedingungen Ihres Kanals angezeigt."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Anonymous users will only see the terms & conditions once they have chosen their nickname (in other words: once they are able to talk)."
msgstr "Anonyme Nutzer sehen die Nutzungsbedingungen erst, wenn sie ihren Nickname gewählt haben (mit anderen Worten: wenn sie schreiben können)."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "You can change the terms content at any time, it will be instantly updated for all viewers."
msgstr "Sie können den Inhalt der Nutzungsbedingungen jederzeit ändern, er wird dann sofort für alle Betrachter aktualisiert."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Users can hide the terms & conditions. When doing so, terms won't be shown again, unless you change the content."
msgstr "Benutzer können die Nutzungsbedingungen ausblenden. Wenn Sie dies tun, werden die Bedingungen nicht mehr angezeigt, es sei denn, Sie ändern den Inhalt."
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "If your Peertube instance allows joining chat with [XMPP clients](https://livingston.frama.io/peertube-plugin-livechat/documentation/admin/advanced/xmpp_clients/), users using such clients will see the terms as chat messages, comming from a \"Peertube\" account. When you update terms, they will receive a new message with the update terms content."
msgstr "Wenn Ihre Peertube-Instanz die Teilnahme am Chat mit [XMPP-Clients] (https://livingston.frama.io/peertube-plugin-livechat/de/documentation/admin/advanced/xmpp_clients/) erlaubt, sehen die Benutzer, die solche Clients verwenden, die Bedingungen als Chat-Nachrichten, die von einem \"Peertube\"-Konto kommen. Wenn Sie die Bedingungen aktualisieren, erhalten sie eine neue Nachricht mit dem Inhalt der aktualisierten Bedingungen."
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/viewers.md
#, no-wrap

View File

@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: peertube-plugin-livechat-documentation VERSION\n"
"POT-Creation-Date: 2024-07-05 13:36+0200\n"
"POT-Creation-Date: 2024-06-19 12:16+0200\n"
"PO-Revision-Date: 2023-07-17 10:52+0000\n"
"Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language-Team: Greek <https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/el/>\n"
@ -1185,7 +1185,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/admin/advanced/xmpp_clients.md
msgid "Start by going to the livechat plugin settings of your instance, then enable the setting \"Enable connection to room using external XMPP accounts\". By checking this setting, new settings appear below."
msgid "Start by going to the livechat plugin settings of your instance, then enable the setting \"Enable connection to room using external XMPP accounts\". By checking this settings, new settings appear below."
msgstr ""
#. type: Plain text
@ -1873,16 +1873,6 @@ msgstr ""
msgid "This section describes the plugin settings page."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "For more information on this feature, check the documentation for [channel's terms & conditions](/peertube-plugin-livechat/documentation/user/streamers/terms)."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "Changing this setting will restart the chat server, and all users will be disconnected for a short time."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "When pressing the «List rooms» button, all existing chatrooms will be listed. You can then find them and moderated them."
@ -1955,7 +1945,7 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting allows you to choose who can access this modal."
msgid "This settings allows you to choose who can access this modal."
msgstr ""
#. type: Plain text
@ -2086,13 +2076,13 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting should only be used if the plugin is broken, and waiting for a patch."
msgid "This settings should only be used if the plugin is broken, and waiting for a patch."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
#, no-wrap
msgid "If this setting is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.\n"
msgid "If this settings is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.\n"
msgstr ""
#. type: Plain text
@ -2112,7 +2102,7 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting enable XMPP external components to connect to the server. By default, this option **only allows connections from localhost components**. You have to change the \"{{% livechat_label prosody_components_interfaces_label %}}\" value to listen on other network interfaces."
msgid "This settings enable XMPP external components to connect to the server. By default, this option **only allows connections from localhost components**. You have to change the \"{{% livechat_label prosody_components_interfaces_label %}}\" value to listen on other network interfaces."
msgstr ""
#. type: Plain text
@ -2351,7 +2341,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/installation/troubleshooting.md
msgid "Check the help for [this setting](/peertube-plugin-livechat/documentation/admin/settings/) for more information."
msgid "Check the help for [this settings](/peertube-plugin-livechat/documentation/admin/settings/) for more information."
msgstr ""
#. type: Title ###
@ -2530,7 +2520,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
msgid "To do so, just use the \"{{% livechat_label share_chat_link %}}\" feature, and open the \"{{% livechat_label share_chat_dock %}}\" tab. From there, you can create a new token using the \"+\" button."
msgid "To do so, just use the \"{{% livechat_label share_chat_link %}}\", and open the \"{{% livechat_label share_chat_dock %}}\" tab. From there, you can create a new token using the \"+\" button."
msgstr ""
#. type: Plain text
@ -2722,7 +2712,7 @@ msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/basics.md
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#: support/documentation/content/en/intro/_index.md
#, no-wrap
msgid "Moderation"
@ -2763,7 +2753,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/basics.md
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/viewers.md
msgid "![Chat menu](/peertube-plugin-livechat/images/top_menu.png?classes=shadow,border&height=200px)"
msgstr ""
@ -2997,16 +2987,6 @@ msgstr ""
msgid "Here you can configure:"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[{{% livechat_label livechat_configuration_channel_terms_label %}}](/peertube-plugin-livechat/documentation/user/streamers/terms)"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}](/peertube-plugin-livechat/documentation/user/streamers/moderation) default value"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[The slow mode](/peertube-plugin-livechat/documentation/user/streamers/slow_mode)"
@ -3087,7 +3067,7 @@ msgstr ""
msgid ""
"[\n"
" {\n"
" \"sn\": \":short_name:\",\n"
" \"sn\": \":short_name\",\n"
" \"url\": \"https://example.com/image.png\"\n"
" }\n"
"]\n"
@ -3111,18 +3091,18 @@ msgid "For streamers"
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Plugin peertube-plugin-livechat advanced moderation features"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "This section is still incomplete."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid ""
"This page describes the behaviour of livechat versions >= 10.0.0.\n"
@ -3130,314 +3110,90 @@ msgid ""
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "The chat bot"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can use a chat bot, that will help you for moderation. Check [the chat bot documentation](/peertube-plugin-livechat/documentation/user/streamers/bot) for more information."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Accessing moderation tools"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can access room settings and moderation tools using the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers) at the top of the chat."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "The video owner will be owner of the chat room. This means he can configure the room, delete it, promote other users as admins, ..."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "Starting with livechat v10.0.0, Peertube instance's admins and moderators have no special rights on rooms by default. However, they have a special button available on top of the chat: \"{{% livechat_label promote %}}\". Clicking this button will give them owner access on the room."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can use [ConverseJS moderation commands](https://conversejs.org/docs/html/features.html#moderating-chatrooms) to moderate the room. When you open the chat room in full screen, there will also be a menu with dedicated commands on the top right."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/polls.md
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "This feature comes with the livechat plugin version 10.2.0."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "You can prevent anonymous users to send messages. In such case, only registered users will be able to talk in the chat."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "To enable or disable this feature, use the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers), open the \"configure\" menu. In the form, you will find a \"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\" checkbox."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "![Room configuration / Mute anonymous users](/peertube-plugin-livechat/images/configure_mute_anonymous.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "Anonymous users won't have the message field, and will see following prompt: \"{{% livechat_label muted_anonymous_message %}}\""
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "![Room configuration / Muted anonymous users](/peertube-plugin-livechat/images/anonymous_muted.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "When this feature is enabled, anonymous users will be assigned the \"visitor\" role. You can change their role to \"participant\" if you want to allow some of them to talk."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "If you change the room configuration, all anonymous users will be muted or unmuted."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "You can choose to enable or disable this feature for new chatrooms on the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel)."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Roles and affiliations"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "There are several roles that can be assignated to users in chat rooms: owner, moderators, member, ..."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can promote users as moderators, if you need some help."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Delete room content"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can delete old rooms: join the room, and use the menu on the top to destroy the room."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Instance moderation"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "As Peertube instance moderator or administrator, you will probably need to check that your users are not behaving badly."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can list all existing chatrooms: in the plugin settings screen, there is a button «List rooms»."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "From there, you can also promote yourself as room moderator by using the \"{{% livechat_label promote %}}\" button on the right."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "You can create polls to ask viewers their opinion."
msgstr ""
#. type: Yaml Front Matter Hash Value: title
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Polls"
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Create a poll"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "You can create a new poll by using the \"{{% livechat_label new_poll %}}\" action in the chat top menu:"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll form](/peertube-plugin-livechat/images/polls_form.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "This poll feature should not be considered as a reliable voting system. It is easy to cheat. There is no mechanism to prevent anonymous users to vote multiple times by just reloading the chat. Votes are never fully anonymous, someone having access to the server could see who voted for what choice."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Poll form"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Fill the form fields:"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_question %}}\": the question to ask to you viewers"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_duration %}}\": the duration for which viewers can vote"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_anonymous_results %}}\": if checked, votes won't be publicly visible in the chat"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"Choice N\": choices that will be presented to viewers"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "You must at least fill the two first choices fields."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Once you submit the form, the poll will instantly start."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "If there was a previous unfinished poll, it will end and its result will be shown."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/polls.md
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, no-wrap
msgid "Access rights"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Every room's admins can create a new poll."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When you promote someone as room admin or owner, they gets instant access to the \"{{% livechat_label new_poll %}}\" action."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When you remove admin or owner rights to someone, they can't create new poll. But any existing poll will continue until it ends."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Every user that is not muted can vote. This means that you can prevent anonymous users to vote by using the [\"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\" feature](/peertube-plugin-livechat/documentation/user/streamers/moderation)."
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Poll workflow"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When the polls starts, a first message will be sent in the chat, from the account of the user creating the poll."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "A banner will also appear to show the poll, and will be updated regularly with the current votes."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll start](/peertube-plugin-livechat/images/polls_start.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Viewers can then vote by clicking on their choice, or by sending message like \"!1\" in the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Votes counts will be updated regularly in the banner."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Viewers can change their vote at any time, just by making a new choice. Their precedent choice will be replaced by the new one."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll votes](/peertube-plugin-livechat/images/polls_votes.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Anonymous viewers can only vote once they have choosen their nickname."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "If \"{{% livechat_label poll_anonymous_results %}}\" is checked, votes won't be shown to other users. If unchecked, votes will be publicly visible as you will see message like \"!1\" in the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "For viewers using XMPP clients or outdated livechat plugin versions, the banner will not be visible. But they will see the message in the chat and will be able to vote by sending messages with their choices."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When the poll ends, a new message will be sent in the chat, with the results."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll end](/peertube-plugin-livechat/images/polls_end.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "The only way to get old polls results is to search for the poll end message in the chat. For now, polls results are not saved by any other means. So don't forget to note polls results if you want to keep them."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/slow_mode.md
#, no-wrap
@ -3640,6 +3396,12 @@ msgstr ""
msgid "To have more space and better readability, open the chat in full-page mode."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, no-wrap
msgid "Access rights"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/tasks.md
msgid "Every room's admins have access to the Task Application (read and write access)."
@ -3781,85 +3543,6 @@ msgstr ""
msgid "Using this feature, for example, you can ask your moderators to highlight all chat questions, so you can see them at a glance during your livestream, and check them as answered."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Configure channel's chat terms & conditions"
msgstr ""
#. type: Yaml Front Matter Hash Value: title
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Terms & conditions"
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Configuration"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "You can add terms & conditions to your channel. These terms will be shown to all users joining the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "To configure the terms & conditions, go to the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel):"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "![Channel configuration / Terms](/peertube-plugin-livechat/images/channel_terms_config.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "URL in the message will be clickable. You can also do some styling: [Message Styling](https://xmpp.org/extensions/xep-0393.html)."
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Viewers"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "When joining the chat, viewers will see the terms:"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "![Terms](/peertube-plugin-livechat/images/terms.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Peertube instance's admin can also set global terms & conditions. If so, these terms will be shown above your channel's terms."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Anonymous users will only see the terms & conditions once they have chosen their nickname (in other words: once they are able to talk)."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "You can change the terms content at any time, it will be instantly updated for all viewers."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Users can hide the terms & conditions. When doing so, terms won't be shown again, unless you change the content."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "If your Peertube instance allows joining chat with [XMPP clients](https://livingston.frama.io/peertube-plugin-livechat/documentation/admin/advanced/xmpp_clients/), users using such clients will see the terms as chat messages, comming from a \"Peertube\" account. When you update terms, they will receive a new message with the update terms content."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/viewers.md
#, no-wrap

View File

@ -7,7 +7,7 @@
msgid ""
msgstr ""
"Project-Id-Version: peertube-plugin-livechat-documentation VERSION\n"
"POT-Creation-Date: 2024-07-05 13:36+0200\n"
"POT-Creation-Date: 2024-06-19 12:16+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -1335,7 +1335,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/admin/advanced/xmpp_clients.md
#, markdown-text
msgid "Start by going to the livechat plugin settings of your instance, then enable the setting \"Enable connection to room using external XMPP accounts\". By checking this setting, new settings appear below."
msgid "Start by going to the livechat plugin settings of your instance, then enable the setting \"Enable connection to room using external XMPP accounts\". By checking this settings, new settings appear below."
msgstr ""
#. type: Plain text
@ -2107,18 +2107,6 @@ msgstr ""
msgid "This section describes the plugin settings page."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
#, markdown-text
msgid "For more information on this feature, check the documentation for [channel's terms & conditions](/peertube-plugin-livechat/documentation/user/streamers/terms)."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
#, markdown-text
msgid "Changing this setting will restart the chat server, and all users will be disconnected for a short time."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
#, markdown-text
@ -2201,7 +2189,7 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
#, markdown-text
msgid "This setting allows you to choose who can access this modal."
msgid "This settings allows you to choose who can access this modal."
msgstr ""
#. type: Plain text
@ -2354,13 +2342,13 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
#, markdown-text
msgid "This setting should only be used if the plugin is broken, and waiting for a patch."
msgid "This settings should only be used if the plugin is broken, and waiting for a patch."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
#, markdown-text, no-wrap
msgid "If this setting is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.\n"
msgid "If this settings is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.\n"
msgstr ""
#. type: Plain text
@ -2384,7 +2372,7 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
#, markdown-text
msgid "This setting enable XMPP external components to connect to the server. By default, this option **only allows connections from localhost components**. You have to change the \"{{% livechat_label prosody_components_interfaces_label %}}\" value to listen on other network interfaces."
msgid "This settings enable XMPP external components to connect to the server. By default, this option **only allows connections from localhost components**. You have to change the \"{{% livechat_label prosody_components_interfaces_label %}}\" value to listen on other network interfaces."
msgstr ""
#. type: Plain text
@ -2648,7 +2636,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/installation/troubleshooting.md
#, markdown-text
msgid "Check the help for [this setting](/peertube-plugin-livechat/documentation/admin/settings/) for more information."
msgid "Check the help for [this settings](/peertube-plugin-livechat/documentation/admin/settings/) for more information."
msgstr ""
#. type: Title ###
@ -2848,7 +2836,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
#, markdown-text
msgid "To do so, just use the \"{{% livechat_label share_chat_link %}}\" feature, and open the \"{{% livechat_label share_chat_dock %}}\" tab. From there, you can create a new token using the \"+\" button."
msgid "To do so, just use the \"{{% livechat_label share_chat_link %}}\", and open the \"{{% livechat_label share_chat_dock %}}\" tab. From there, you can create a new token using the \"+\" button."
msgstr ""
#. type: Plain text
@ -3070,7 +3058,7 @@ msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/basics.md
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#: support/documentation/content/en/intro/_index.md
#, markdown-text, no-wrap
msgid "Moderation"
@ -3115,7 +3103,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/basics.md
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/viewers.md
#, markdown-text
msgid "![Chat menu](/peertube-plugin-livechat/images/top_menu.png?classes=shadow,border&height=200px)"
@ -3382,18 +3370,6 @@ msgstr ""
msgid "Here you can configure:"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
#, markdown-text
msgid "[{{% livechat_label livechat_configuration_channel_terms_label %}}](/peertube-plugin-livechat/documentation/user/streamers/terms)"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
#, markdown-text
msgid "[{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}](/peertube-plugin-livechat/documentation/user/streamers/moderation) default value"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
#, markdown-text
@ -3484,7 +3460,7 @@ msgstr ""
msgid ""
"[\n"
" {\n"
" \"sn\": \":short_name:\",\n"
" \"sn\": \":short_name\",\n"
" \"url\": \"https://example.com/image.png\"\n"
" }\n"
"]\n"
@ -3509,19 +3485,19 @@ msgid "For streamers"
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Plugin peertube-plugin-livechat advanced moderation features"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, markdown-text
msgid "This section is still incomplete."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, markdown-text, no-wrap
msgid ""
"This page describes the behaviour of livechat versions >= 10.0.0.\n"
@ -3529,362 +3505,101 @@ msgid ""
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, markdown-text, no-wrap
msgid "The chat bot"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, markdown-text
msgid "You can use a chat bot, that will help you for moderation. Check [the chat bot documentation](/peertube-plugin-livechat/documentation/user/streamers/bot) for more information."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, markdown-text, no-wrap
msgid "Accessing moderation tools"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, markdown-text
msgid "You can access room settings and moderation tools using the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers) at the top of the chat."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, markdown-text
msgid "The video owner will be owner of the chat room. This means he can configure the room, delete it, promote other users as admins, ..."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, markdown-text
msgid "Starting with livechat v10.0.0, Peertube instance's admins and moderators have no special rights on rooms by default. However, they have a special button available on top of the chat: \"{{% livechat_label promote %}}\". Clicking this button will give them owner access on the room."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, markdown-text
msgid "You can use [ConverseJS moderation commands](https://conversejs.org/docs/html/features.html#moderating-chatrooms) to moderate the room. When you open the chat room in full screen, there will also be a menu with dedicated commands on the top right."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/polls.md
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, markdown-text
msgid "This feature comes with the livechat plugin version 10.2.0."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#, markdown-text
msgid "You can prevent anonymous users to send messages. In such case, only registered users will be able to talk in the chat."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#, markdown-text
msgid "To enable or disable this feature, use the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers), open the \"configure\" menu. In the form, you will find a \"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\" checkbox."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#, markdown-text
msgid "![Room configuration / Mute anonymous users](/peertube-plugin-livechat/images/configure_mute_anonymous.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#, markdown-text
msgid "Anonymous users won't have the message field, and will see following prompt: \"{{% livechat_label muted_anonymous_message %}}\""
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#, markdown-text
msgid "![Room configuration / Muted anonymous users](/peertube-plugin-livechat/images/anonymous_muted.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#, markdown-text
msgid "When this feature is enabled, anonymous users will be assigned the \"visitor\" role. You can change their role to \"participant\" if you want to allow some of them to talk."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#, markdown-text
msgid "If you change the room configuration, all anonymous users will be muted or unmuted."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#, markdown-text
msgid "You can choose to enable or disable this feature for new chatrooms on the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel)."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, markdown-text, no-wrap
msgid "Roles and affiliations"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, markdown-text
msgid "There are several roles that can be assignated to users in chat rooms: owner, moderators, member, ..."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, markdown-text
msgid "You can promote users as moderators, if you need some help."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, markdown-text, no-wrap
msgid "Delete room content"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, markdown-text
msgid "You can delete old rooms: join the room, and use the menu on the top to destroy the room."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, markdown-text, no-wrap
msgid "Instance moderation"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, markdown-text
msgid "As Peertube instance moderator or administrator, you will probably need to check that your users are not behaving badly."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, markdown-text
msgid "You can list all existing chatrooms: in the plugin settings screen, there is a button «List rooms»."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, markdown-text
msgid "From there, you can also promote yourself as room moderator by using the \"{{% livechat_label promote %}}\" button on the right."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "You can create polls to ask viewers their opinion."
msgstr ""
#. type: Yaml Front Matter Hash Value: title
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Polls"
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text, no-wrap
msgid "Create a poll"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "You can create a new poll by using the \"{{% livechat_label new_poll %}}\" action in the chat top menu:"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "![Poll form](/peertube-plugin-livechat/images/polls_form.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "This poll feature should not be considered as a reliable voting system. It is easy to cheat. There is no mechanism to prevent anonymous users to vote multiple times by just reloading the chat. Votes are never fully anonymous, someone having access to the server could see who voted for what choice."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text, no-wrap
msgid "Poll form"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "Fill the form fields:"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "\"{{% livechat_label poll_question %}}\": the question to ask to you viewers"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "\"{{% livechat_label poll_duration %}}\": the duration for which viewers can vote"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "\"{{% livechat_label poll_anonymous_results %}}\": if checked, votes won't be publicly visible in the chat"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "\"Choice N\": choices that will be presented to viewers"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "You must at least fill the two first choices fields."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "Once you submit the form, the poll will instantly start."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "If there was a previous unfinished poll, it will end and its result will be shown."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/polls.md
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, markdown-text, no-wrap
msgid "Access rights"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "Every room's admins can create a new poll."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "When you promote someone as room admin or owner, they gets instant access to the \"{{% livechat_label new_poll %}}\" action."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "When you remove admin or owner rights to someone, they can't create new poll. But any existing poll will continue until it ends."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "Every user that is not muted can vote. This means that you can prevent anonymous users to vote by using the [\"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\" feature](/peertube-plugin-livechat/documentation/user/streamers/moderation)."
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text, no-wrap
msgid "Poll workflow"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "When the polls starts, a first message will be sent in the chat, from the account of the user creating the poll."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "A banner will also appear to show the poll, and will be updated regularly with the current votes."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "![Poll start](/peertube-plugin-livechat/images/polls_start.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "Viewers can then vote by clicking on their choice, or by sending message like \"!1\" in the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "Votes counts will be updated regularly in the banner."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "Viewers can change their vote at any time, just by making a new choice. Their precedent choice will be replaced by the new one."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "![Poll votes](/peertube-plugin-livechat/images/polls_votes.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "Anonymous viewers can only vote once they have choosen their nickname."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "If \"{{% livechat_label poll_anonymous_results %}}\" is checked, votes won't be shown to other users. If unchecked, votes will be publicly visible as you will see message like \"!1\" in the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "For viewers using XMPP clients or outdated livechat plugin versions, the banner will not be visible. But they will see the message in the chat and will be able to vote by sending messages with their choices."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "When the poll ends, a new message will be sent in the chat, with the results."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "![Poll end](/peertube-plugin-livechat/images/polls_end.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, markdown-text
msgid "The only way to get old polls results is to search for the poll end message in the chat. For now, polls results are not saved by any other means. So don't forget to note polls results if you want to keep them."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/slow_mode.md
#, no-wrap
@ -4116,6 +3831,12 @@ msgstr ""
msgid "To have more space and better readability, open the chat in full-page mode."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, markdown-text, no-wrap
msgid "Access rights"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, markdown-text
@ -4278,96 +3999,6 @@ msgstr ""
msgid "Using this feature, for example, you can ask your moderators to highlight all chat questions, so you can see them at a glance during your livestream, and check them as answered."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Configure channel's chat terms & conditions"
msgstr ""
#. type: Yaml Front Matter Hash Value: title
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Terms & conditions"
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, markdown-text, no-wrap
msgid "Configuration"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, markdown-text
msgid "You can add terms & conditions to your channel. These terms will be shown to all users joining the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, markdown-text
msgid "To configure the terms & conditions, go to the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel):"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, markdown-text
msgid "![Channel configuration / Terms](/peertube-plugin-livechat/images/channel_terms_config.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, markdown-text
msgid "URL in the message will be clickable. You can also do some styling: [Message Styling](https://xmpp.org/extensions/xep-0393.html)."
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, markdown-text, no-wrap
msgid "Viewers"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, markdown-text
msgid "When joining the chat, viewers will see the terms:"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, markdown-text
msgid "![Terms](/peertube-plugin-livechat/images/terms.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, markdown-text
msgid "Peertube instance's admin can also set global terms & conditions. If so, these terms will be shown above your channel's terms."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, markdown-text
msgid "Anonymous users will only see the terms & conditions once they have chosen their nickname (in other words: once they are able to talk)."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, markdown-text
msgid "You can change the terms content at any time, it will be instantly updated for all viewers."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, markdown-text
msgid "Users can hide the terms & conditions. When doing so, terms won't be shown again, unless you change the content."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, markdown-text
msgid "If your Peertube instance allows joining chat with [XMPP clients](https://livingston.frama.io/peertube-plugin-livechat/documentation/admin/advanced/xmpp_clients/), users using such clients will see the terms as chat messages, comming from a \"Peertube\" account. When you update terms, they will receive a new message with the update terms content."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/viewers.md
#, no-wrap

View File

@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: peertube-plugin-livechat-documentation VERSION\n"
"POT-Creation-Date: 2024-07-05 13:36+0200\n"
"POT-Creation-Date: 2024-06-19 12:16+0200\n"
"PO-Revision-Date: 2023-07-17 10:52+0000\n"
"Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language-Team: Esperanto <https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/eo/>\n"
@ -1185,7 +1185,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/admin/advanced/xmpp_clients.md
msgid "Start by going to the livechat plugin settings of your instance, then enable the setting \"Enable connection to room using external XMPP accounts\". By checking this setting, new settings appear below."
msgid "Start by going to the livechat plugin settings of your instance, then enable the setting \"Enable connection to room using external XMPP accounts\". By checking this settings, new settings appear below."
msgstr ""
#. type: Plain text
@ -1873,16 +1873,6 @@ msgstr ""
msgid "This section describes the plugin settings page."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "For more information on this feature, check the documentation for [channel's terms & conditions](/peertube-plugin-livechat/documentation/user/streamers/terms)."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "Changing this setting will restart the chat server, and all users will be disconnected for a short time."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "When pressing the «List rooms» button, all existing chatrooms will be listed. You can then find them and moderated them."
@ -1955,7 +1945,7 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting allows you to choose who can access this modal."
msgid "This settings allows you to choose who can access this modal."
msgstr ""
#. type: Plain text
@ -2086,13 +2076,13 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting should only be used if the plugin is broken, and waiting for a patch."
msgid "This settings should only be used if the plugin is broken, and waiting for a patch."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
#, no-wrap
msgid "If this setting is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.\n"
msgid "If this settings is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.\n"
msgstr ""
#. type: Plain text
@ -2112,7 +2102,7 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting enable XMPP external components to connect to the server. By default, this option **only allows connections from localhost components**. You have to change the \"{{% livechat_label prosody_components_interfaces_label %}}\" value to listen on other network interfaces."
msgid "This settings enable XMPP external components to connect to the server. By default, this option **only allows connections from localhost components**. You have to change the \"{{% livechat_label prosody_components_interfaces_label %}}\" value to listen on other network interfaces."
msgstr ""
#. type: Plain text
@ -2351,7 +2341,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/installation/troubleshooting.md
msgid "Check the help for [this setting](/peertube-plugin-livechat/documentation/admin/settings/) for more information."
msgid "Check the help for [this settings](/peertube-plugin-livechat/documentation/admin/settings/) for more information."
msgstr ""
#. type: Title ###
@ -2530,7 +2520,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
msgid "To do so, just use the \"{{% livechat_label share_chat_link %}}\" feature, and open the \"{{% livechat_label share_chat_dock %}}\" tab. From there, you can create a new token using the \"+\" button."
msgid "To do so, just use the \"{{% livechat_label share_chat_link %}}\", and open the \"{{% livechat_label share_chat_dock %}}\" tab. From there, you can create a new token using the \"+\" button."
msgstr ""
#. type: Plain text
@ -2722,7 +2712,7 @@ msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/basics.md
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#: support/documentation/content/en/intro/_index.md
#, no-wrap
msgid "Moderation"
@ -2763,7 +2753,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/basics.md
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/viewers.md
msgid "![Chat menu](/peertube-plugin-livechat/images/top_menu.png?classes=shadow,border&height=200px)"
msgstr ""
@ -2997,16 +2987,6 @@ msgstr ""
msgid "Here you can configure:"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[{{% livechat_label livechat_configuration_channel_terms_label %}}](/peertube-plugin-livechat/documentation/user/streamers/terms)"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}](/peertube-plugin-livechat/documentation/user/streamers/moderation) default value"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[The slow mode](/peertube-plugin-livechat/documentation/user/streamers/slow_mode)"
@ -3087,7 +3067,7 @@ msgstr ""
msgid ""
"[\n"
" {\n"
" \"sn\": \":short_name:\",\n"
" \"sn\": \":short_name\",\n"
" \"url\": \"https://example.com/image.png\"\n"
" }\n"
"]\n"
@ -3111,18 +3091,18 @@ msgid "For streamers"
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Plugin peertube-plugin-livechat advanced moderation features"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "This section is still incomplete."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid ""
"This page describes the behaviour of livechat versions >= 10.0.0.\n"
@ -3130,314 +3110,90 @@ msgid ""
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "The chat bot"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can use a chat bot, that will help you for moderation. Check [the chat bot documentation](/peertube-plugin-livechat/documentation/user/streamers/bot) for more information."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Accessing moderation tools"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can access room settings and moderation tools using the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers) at the top of the chat."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "The video owner will be owner of the chat room. This means he can configure the room, delete it, promote other users as admins, ..."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "Starting with livechat v10.0.0, Peertube instance's admins and moderators have no special rights on rooms by default. However, they have a special button available on top of the chat: \"{{% livechat_label promote %}}\". Clicking this button will give them owner access on the room."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can use [ConverseJS moderation commands](https://conversejs.org/docs/html/features.html#moderating-chatrooms) to moderate the room. When you open the chat room in full screen, there will also be a menu with dedicated commands on the top right."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/polls.md
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "This feature comes with the livechat plugin version 10.2.0."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "You can prevent anonymous users to send messages. In such case, only registered users will be able to talk in the chat."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "To enable or disable this feature, use the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers), open the \"configure\" menu. In the form, you will find a \"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\" checkbox."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "![Room configuration / Mute anonymous users](/peertube-plugin-livechat/images/configure_mute_anonymous.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "Anonymous users won't have the message field, and will see following prompt: \"{{% livechat_label muted_anonymous_message %}}\""
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "![Room configuration / Muted anonymous users](/peertube-plugin-livechat/images/anonymous_muted.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "When this feature is enabled, anonymous users will be assigned the \"visitor\" role. You can change their role to \"participant\" if you want to allow some of them to talk."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "If you change the room configuration, all anonymous users will be muted or unmuted."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "You can choose to enable or disable this feature for new chatrooms on the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel)."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Roles and affiliations"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "There are several roles that can be assignated to users in chat rooms: owner, moderators, member, ..."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can promote users as moderators, if you need some help."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Delete room content"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can delete old rooms: join the room, and use the menu on the top to destroy the room."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Instance moderation"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "As Peertube instance moderator or administrator, you will probably need to check that your users are not behaving badly."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can list all existing chatrooms: in the plugin settings screen, there is a button «List rooms»."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "From there, you can also promote yourself as room moderator by using the \"{{% livechat_label promote %}}\" button on the right."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "You can create polls to ask viewers their opinion."
msgstr ""
#. type: Yaml Front Matter Hash Value: title
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Polls"
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Create a poll"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "You can create a new poll by using the \"{{% livechat_label new_poll %}}\" action in the chat top menu:"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll form](/peertube-plugin-livechat/images/polls_form.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "This poll feature should not be considered as a reliable voting system. It is easy to cheat. There is no mechanism to prevent anonymous users to vote multiple times by just reloading the chat. Votes are never fully anonymous, someone having access to the server could see who voted for what choice."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Poll form"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Fill the form fields:"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_question %}}\": the question to ask to you viewers"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_duration %}}\": the duration for which viewers can vote"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_anonymous_results %}}\": if checked, votes won't be publicly visible in the chat"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"Choice N\": choices that will be presented to viewers"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "You must at least fill the two first choices fields."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Once you submit the form, the poll will instantly start."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "If there was a previous unfinished poll, it will end and its result will be shown."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/polls.md
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, no-wrap
msgid "Access rights"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Every room's admins can create a new poll."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When you promote someone as room admin or owner, they gets instant access to the \"{{% livechat_label new_poll %}}\" action."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When you remove admin or owner rights to someone, they can't create new poll. But any existing poll will continue until it ends."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Every user that is not muted can vote. This means that you can prevent anonymous users to vote by using the [\"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\" feature](/peertube-plugin-livechat/documentation/user/streamers/moderation)."
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Poll workflow"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When the polls starts, a first message will be sent in the chat, from the account of the user creating the poll."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "A banner will also appear to show the poll, and will be updated regularly with the current votes."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll start](/peertube-plugin-livechat/images/polls_start.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Viewers can then vote by clicking on their choice, or by sending message like \"!1\" in the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Votes counts will be updated regularly in the banner."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Viewers can change their vote at any time, just by making a new choice. Their precedent choice will be replaced by the new one."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll votes](/peertube-plugin-livechat/images/polls_votes.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Anonymous viewers can only vote once they have choosen their nickname."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "If \"{{% livechat_label poll_anonymous_results %}}\" is checked, votes won't be shown to other users. If unchecked, votes will be publicly visible as you will see message like \"!1\" in the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "For viewers using XMPP clients or outdated livechat plugin versions, the banner will not be visible. But they will see the message in the chat and will be able to vote by sending messages with their choices."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When the poll ends, a new message will be sent in the chat, with the results."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll end](/peertube-plugin-livechat/images/polls_end.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "The only way to get old polls results is to search for the poll end message in the chat. For now, polls results are not saved by any other means. So don't forget to note polls results if you want to keep them."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/slow_mode.md
#, no-wrap
@ -3640,6 +3396,12 @@ msgstr ""
msgid "To have more space and better readability, open the chat in full-page mode."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, no-wrap
msgid "Access rights"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/tasks.md
msgid "Every room's admins have access to the Task Application (read and write access)."
@ -3781,85 +3543,6 @@ msgstr ""
msgid "Using this feature, for example, you can ask your moderators to highlight all chat questions, so you can see them at a glance during your livestream, and check them as answered."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Configure channel's chat terms & conditions"
msgstr ""
#. type: Yaml Front Matter Hash Value: title
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Terms & conditions"
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Configuration"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "You can add terms & conditions to your channel. These terms will be shown to all users joining the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "To configure the terms & conditions, go to the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel):"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "![Channel configuration / Terms](/peertube-plugin-livechat/images/channel_terms_config.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "URL in the message will be clickable. You can also do some styling: [Message Styling](https://xmpp.org/extensions/xep-0393.html)."
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Viewers"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "When joining the chat, viewers will see the terms:"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "![Terms](/peertube-plugin-livechat/images/terms.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Peertube instance's admin can also set global terms & conditions. If so, these terms will be shown above your channel's terms."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Anonymous users will only see the terms & conditions once they have chosen their nickname (in other words: once they are able to talk)."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "You can change the terms content at any time, it will be instantly updated for all viewers."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Users can hide the terms & conditions. When doing so, terms won't be shown again, unless you change the content."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "If your Peertube instance allows joining chat with [XMPP clients](https://livingston.frama.io/peertube-plugin-livechat/documentation/admin/advanced/xmpp_clients/), users using such clients will see the terms as chat messages, comming from a \"Peertube\" account. When you update terms, they will receive a new message with the update terms content."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/viewers.md
#, no-wrap

View File

@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: peertube-plugin-livechat-documentation VERSION\n"
"POT-Creation-Date: 2024-07-05 13:36+0200\n"
"POT-Creation-Date: 2024-06-19 12:16+0200\n"
"PO-Revision-Date: 2024-04-16 21:38+0000\n"
"Last-Translator: rnek0 <rnek0@users.noreply.weblate.framasoft.org>\n"
"Language-Team: Spanish <https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/es/>\n"
@ -1213,7 +1213,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/admin/advanced/xmpp_clients.md
msgid "Start by going to the livechat plugin settings of your instance, then enable the setting \"Enable connection to room using external XMPP accounts\". By checking this setting, new settings appear below."
msgid "Start by going to the livechat plugin settings of your instance, then enable the setting \"Enable connection to room using external XMPP accounts\". By checking this settings, new settings appear below."
msgstr ""
#. type: Plain text
@ -1906,16 +1906,6 @@ msgstr ""
msgid "This section describes the plugin settings page."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "For more information on this feature, check the documentation for [channel's terms & conditions](/peertube-plugin-livechat/documentation/user/streamers/terms)."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "Changing this setting will restart the chat server, and all users will be disconnected for a short time."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "When pressing the «List rooms» button, all existing chatrooms will be listed. You can then find them and moderated them."
@ -1989,7 +1979,7 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting allows you to choose who can access this modal."
msgid "This settings allows you to choose who can access this modal."
msgstr ""
#. type: Plain text
@ -2120,13 +2110,13 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting should only be used if the plugin is broken, and waiting for a patch."
msgid "This settings should only be used if the plugin is broken, and waiting for a patch."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
#, no-wrap
msgid "If this setting is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.\n"
msgid "If this settings is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.\n"
msgstr ""
#. type: Plain text
@ -2146,7 +2136,7 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting enable XMPP external components to connect to the server. By default, this option **only allows connections from localhost components**. You have to change the \"{{% livechat_label prosody_components_interfaces_label %}}\" value to listen on other network interfaces."
msgid "This settings enable XMPP external components to connect to the server. By default, this option **only allows connections from localhost components**. You have to change the \"{{% livechat_label prosody_components_interfaces_label %}}\" value to listen on other network interfaces."
msgstr ""
#. type: Plain text
@ -2387,7 +2377,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/installation/troubleshooting.md
msgid "Check the help for [this setting](/peertube-plugin-livechat/documentation/admin/settings/) for more information."
msgid "Check the help for [this settings](/peertube-plugin-livechat/documentation/admin/settings/) for more information."
msgstr ""
#. type: Title ###
@ -2567,7 +2557,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
msgid "To do so, just use the \"{{% livechat_label share_chat_link %}}\" feature, and open the \"{{% livechat_label share_chat_dock %}}\" tab. From there, you can create a new token using the \"+\" button."
msgid "To do so, just use the \"{{% livechat_label share_chat_link %}}\", and open the \"{{% livechat_label share_chat_dock %}}\" tab. From there, you can create a new token using the \"+\" button."
msgstr ""
#. type: Plain text
@ -2759,7 +2749,7 @@ msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/basics.md
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#: support/documentation/content/en/intro/_index.md
#, no-wrap
msgid "Moderation"
@ -2800,7 +2790,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/basics.md
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/viewers.md
msgid "![Chat menu](/peertube-plugin-livechat/images/top_menu.png?classes=shadow,border&height=200px)"
msgstr ""
@ -3036,16 +3026,6 @@ msgstr ""
msgid "Here you can configure:"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[{{% livechat_label livechat_configuration_channel_terms_label %}}](/peertube-plugin-livechat/documentation/user/streamers/terms)"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}](/peertube-plugin-livechat/documentation/user/streamers/moderation) default value"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[The slow mode](/peertube-plugin-livechat/documentation/user/streamers/slow_mode)"
@ -3126,7 +3106,7 @@ msgstr ""
msgid ""
"[\n"
" {\n"
" \"sn\": \":short_name:\",\n"
" \"sn\": \":short_name\",\n"
" \"url\": \"https://example.com/image.png\"\n"
" }\n"
"]\n"
@ -3150,18 +3130,18 @@ msgid "For streamers"
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Plugin peertube-plugin-livechat advanced moderation features"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "This section is still incomplete."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid ""
"This page describes the behaviour of livechat versions >= 10.0.0.\n"
@ -3169,314 +3149,90 @@ msgid ""
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "The chat bot"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can use a chat bot, that will help you for moderation. Check [the chat bot documentation](/peertube-plugin-livechat/documentation/user/streamers/bot) for more information."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Accessing moderation tools"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can access room settings and moderation tools using the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers) at the top of the chat."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "The video owner will be owner of the chat room. This means he can configure the room, delete it, promote other users as admins, ..."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "Starting with livechat v10.0.0, Peertube instance's admins and moderators have no special rights on rooms by default. However, they have a special button available on top of the chat: \"{{% livechat_label promote %}}\". Clicking this button will give them owner access on the room."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can use [ConverseJS moderation commands](https://conversejs.org/docs/html/features.html#moderating-chatrooms) to moderate the room. When you open the chat room in full screen, there will also be a menu with dedicated commands on the top right."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/polls.md
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "This feature comes with the livechat plugin version 10.2.0."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "You can prevent anonymous users to send messages. In such case, only registered users will be able to talk in the chat."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "To enable or disable this feature, use the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers), open the \"configure\" menu. In the form, you will find a \"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\" checkbox."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "![Room configuration / Mute anonymous users](/peertube-plugin-livechat/images/configure_mute_anonymous.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "Anonymous users won't have the message field, and will see following prompt: \"{{% livechat_label muted_anonymous_message %}}\""
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "![Room configuration / Muted anonymous users](/peertube-plugin-livechat/images/anonymous_muted.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "When this feature is enabled, anonymous users will be assigned the \"visitor\" role. You can change their role to \"participant\" if you want to allow some of them to talk."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "If you change the room configuration, all anonymous users will be muted or unmuted."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "You can choose to enable or disable this feature for new chatrooms on the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel)."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Roles and affiliations"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "There are several roles that can be assignated to users in chat rooms: owner, moderators, member, ..."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can promote users as moderators, if you need some help."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Delete room content"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can delete old rooms: join the room, and use the menu on the top to destroy the room."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Instance moderation"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "As Peertube instance moderator or administrator, you will probably need to check that your users are not behaving badly."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can list all existing chatrooms: in the plugin settings screen, there is a button «List rooms»."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "From there, you can also promote yourself as room moderator by using the \"{{% livechat_label promote %}}\" button on the right."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "You can create polls to ask viewers their opinion."
msgstr ""
#. type: Yaml Front Matter Hash Value: title
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Polls"
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Create a poll"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "You can create a new poll by using the \"{{% livechat_label new_poll %}}\" action in the chat top menu:"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll form](/peertube-plugin-livechat/images/polls_form.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "This poll feature should not be considered as a reliable voting system. It is easy to cheat. There is no mechanism to prevent anonymous users to vote multiple times by just reloading the chat. Votes are never fully anonymous, someone having access to the server could see who voted for what choice."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Poll form"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Fill the form fields:"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_question %}}\": the question to ask to you viewers"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_duration %}}\": the duration for which viewers can vote"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_anonymous_results %}}\": if checked, votes won't be publicly visible in the chat"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"Choice N\": choices that will be presented to viewers"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "You must at least fill the two first choices fields."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Once you submit the form, the poll will instantly start."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "If there was a previous unfinished poll, it will end and its result will be shown."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/polls.md
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, no-wrap
msgid "Access rights"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Every room's admins can create a new poll."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When you promote someone as room admin or owner, they gets instant access to the \"{{% livechat_label new_poll %}}\" action."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When you remove admin or owner rights to someone, they can't create new poll. But any existing poll will continue until it ends."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Every user that is not muted can vote. This means that you can prevent anonymous users to vote by using the [\"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\" feature](/peertube-plugin-livechat/documentation/user/streamers/moderation)."
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Poll workflow"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When the polls starts, a first message will be sent in the chat, from the account of the user creating the poll."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "A banner will also appear to show the poll, and will be updated regularly with the current votes."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll start](/peertube-plugin-livechat/images/polls_start.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Viewers can then vote by clicking on their choice, or by sending message like \"!1\" in the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Votes counts will be updated regularly in the banner."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Viewers can change their vote at any time, just by making a new choice. Their precedent choice will be replaced by the new one."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll votes](/peertube-plugin-livechat/images/polls_votes.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Anonymous viewers can only vote once they have choosen their nickname."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "If \"{{% livechat_label poll_anonymous_results %}}\" is checked, votes won't be shown to other users. If unchecked, votes will be publicly visible as you will see message like \"!1\" in the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "For viewers using XMPP clients or outdated livechat plugin versions, the banner will not be visible. But they will see the message in the chat and will be able to vote by sending messages with their choices."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When the poll ends, a new message will be sent in the chat, with the results."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll end](/peertube-plugin-livechat/images/polls_end.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "The only way to get old polls results is to search for the poll end message in the chat. For now, polls results are not saved by any other means. So don't forget to note polls results if you want to keep them."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/slow_mode.md
#, no-wrap
@ -3679,6 +3435,12 @@ msgstr ""
msgid "To have more space and better readability, open the chat in full-page mode."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, no-wrap
msgid "Access rights"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/tasks.md
msgid "Every room's admins have access to the Task Application (read and write access)."
@ -3820,87 +3582,6 @@ msgstr ""
msgid "Using this feature, for example, you can ask your moderators to highlight all chat questions, so you can see them at a glance during your livestream, and check them as answered."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, fuzzy, no-wrap
#| msgid "General information"
msgid "Configure channel's chat terms & conditions"
msgstr "Información general"
#. type: Yaml Front Matter Hash Value: title
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Terms & conditions"
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, fuzzy, no-wrap
#| msgid "General information"
msgid "Configuration"
msgstr "Información general"
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "You can add terms & conditions to your channel. These terms will be shown to all users joining the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "To configure the terms & conditions, go to the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel):"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "![Channel configuration / Terms](/peertube-plugin-livechat/images/channel_terms_config.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "URL in the message will be clickable. You can also do some styling: [Message Styling](https://xmpp.org/extensions/xep-0393.html)."
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Viewers"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "When joining the chat, viewers will see the terms:"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "![Terms](/peertube-plugin-livechat/images/terms.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Peertube instance's admin can also set global terms & conditions. If so, these terms will be shown above your channel's terms."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Anonymous users will only see the terms & conditions once they have chosen their nickname (in other words: once they are able to talk)."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "You can change the terms content at any time, it will be instantly updated for all viewers."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Users can hide the terms & conditions. When doing so, terms won't be shown again, unless you change the content."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "If your Peertube instance allows joining chat with [XMPP clients](https://livingston.frama.io/peertube-plugin-livechat/documentation/admin/advanced/xmpp_clients/), users using such clients will see the terms as chat messages, comming from a \"Peertube\" account. When you update terms, they will receive a new message with the update terms content."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/viewers.md
#, no-wrap

View File

@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: peertube-plugin-livechat-documentation VERSION\n"
"POT-Creation-Date: 2024-07-05 13:36+0200\n"
"POT-Creation-Date: 2024-06-19 12:16+0200\n"
"PO-Revision-Date: 2023-07-17 10:52+0000\n"
"Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language-Team: Basque <https://weblate.framasoft.org/projects/peertube-livechat/peertube-plugin-livechat-documentation/eu/>\n"
@ -1185,7 +1185,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/admin/advanced/xmpp_clients.md
msgid "Start by going to the livechat plugin settings of your instance, then enable the setting \"Enable connection to room using external XMPP accounts\". By checking this setting, new settings appear below."
msgid "Start by going to the livechat plugin settings of your instance, then enable the setting \"Enable connection to room using external XMPP accounts\". By checking this settings, new settings appear below."
msgstr ""
#. type: Plain text
@ -1873,16 +1873,6 @@ msgstr ""
msgid "This section describes the plugin settings page."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "For more information on this feature, check the documentation for [channel's terms & conditions](/peertube-plugin-livechat/documentation/user/streamers/terms)."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "Changing this setting will restart the chat server, and all users will be disconnected for a short time."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "When pressing the «List rooms» button, all existing chatrooms will be listed. You can then find them and moderated them."
@ -1955,7 +1945,7 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting allows you to choose who can access this modal."
msgid "This settings allows you to choose who can access this modal."
msgstr ""
#. type: Plain text
@ -2086,13 +2076,13 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting should only be used if the plugin is broken, and waiting for a patch."
msgid "This settings should only be used if the plugin is broken, and waiting for a patch."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
#, no-wrap
msgid "If this setting is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.\n"
msgid "If this settings is left empty, and you are using Peertube >= 5.1 or later, the plugin will use values from your Peertube configuration file to guess on which interface and port request have to be done.\n"
msgstr ""
#. type: Plain text
@ -2112,7 +2102,7 @@ msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/admin/settings.md
msgid "This setting enable XMPP external components to connect to the server. By default, this option **only allows connections from localhost components**. You have to change the \"{{% livechat_label prosody_components_interfaces_label %}}\" value to listen on other network interfaces."
msgid "This settings enable XMPP external components to connect to the server. By default, this option **only allows connections from localhost components**. You have to change the \"{{% livechat_label prosody_components_interfaces_label %}}\" value to listen on other network interfaces."
msgstr ""
#. type: Plain text
@ -2351,7 +2341,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/installation/troubleshooting.md
msgid "Check the help for [this setting](/peertube-plugin-livechat/documentation/admin/settings/) for more information."
msgid "Check the help for [this settings](/peertube-plugin-livechat/documentation/admin/settings/) for more information."
msgstr ""
#. type: Title ###
@ -2530,7 +2520,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/obs.md
msgid "To do so, just use the \"{{% livechat_label share_chat_link %}}\" feature, and open the \"{{% livechat_label share_chat_dock %}}\" tab. From there, you can create a new token using the \"+\" button."
msgid "To do so, just use the \"{{% livechat_label share_chat_link %}}\", and open the \"{{% livechat_label share_chat_dock %}}\" tab. From there, you can create a new token using the \"+\" button."
msgstr ""
#. type: Plain text
@ -2722,7 +2712,7 @@ msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/basics.md
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#: support/documentation/content/en/intro/_index.md
#, no-wrap
msgid "Moderation"
@ -2763,7 +2753,7 @@ msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/basics.md
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/viewers.md
msgid "![Chat menu](/peertube-plugin-livechat/images/top_menu.png?classes=shadow,border&height=200px)"
msgstr ""
@ -2997,16 +2987,6 @@ msgstr ""
msgid "Here you can configure:"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[{{% livechat_label livechat_configuration_channel_terms_label %}}](/peertube-plugin-livechat/documentation/user/streamers/terms)"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}](/peertube-plugin-livechat/documentation/user/streamers/moderation) default value"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/channel.md
msgid "[The slow mode](/peertube-plugin-livechat/documentation/user/streamers/slow_mode)"
@ -3087,7 +3067,7 @@ msgstr ""
msgid ""
"[\n"
" {\n"
" \"sn\": \":short_name:\",\n"
" \"sn\": \":short_name\",\n"
" \"url\": \"https://example.com/image.png\"\n"
" }\n"
"]\n"
@ -3111,18 +3091,18 @@ msgid "For streamers"
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Plugin peertube-plugin-livechat advanced moderation features"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "This section is still incomplete."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid ""
"This page describes the behaviour of livechat versions >= 10.0.0.\n"
@ -3130,314 +3110,90 @@ msgid ""
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "The chat bot"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can use a chat bot, that will help you for moderation. Check [the chat bot documentation](/peertube-plugin-livechat/documentation/user/streamers/bot) for more information."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Accessing moderation tools"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can access room settings and moderation tools using the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers) at the top of the chat."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "The video owner will be owner of the chat room. This means he can configure the room, delete it, promote other users as admins, ..."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "Starting with livechat v10.0.0, Peertube instance's admins and moderators have no special rights on rooms by default. However, they have a special button available on top of the chat: \"{{% livechat_label promote %}}\". Clicking this button will give them owner access on the room."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can use [ConverseJS moderation commands](https://conversejs.org/docs/html/features.html#moderating-chatrooms) to moderate the room. When you open the chat room in full screen, there will also be a menu with dedicated commands on the top right."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/polls.md
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "This feature comes with the livechat plugin version 10.2.0."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "You can prevent anonymous users to send messages. In such case, only registered users will be able to talk in the chat."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "To enable or disable this feature, use the [chat dropdown menu](/peertube-plugin-livechat/documentation/user/viewers), open the \"configure\" menu. In the form, you will find a \"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\" checkbox."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "![Room configuration / Mute anonymous users](/peertube-plugin-livechat/images/configure_mute_anonymous.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "Anonymous users won't have the message field, and will see following prompt: \"{{% livechat_label muted_anonymous_message %}}\""
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "![Room configuration / Muted anonymous users](/peertube-plugin-livechat/images/anonymous_muted.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "When this feature is enabled, anonymous users will be assigned the \"visitor\" role. You can change their role to \"participant\" if you want to allow some of them to talk."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "If you change the room configuration, all anonymous users will be muted or unmuted."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
msgid "You can choose to enable or disable this feature for new chatrooms on the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel)."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Roles and affiliations"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "There are several roles that can be assignated to users in chat rooms: owner, moderators, member, ..."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can promote users as moderators, if you need some help."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Delete room content"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can delete old rooms: join the room, and use the menu on the top to destroy the room."
msgstr ""
#. type: Title ##
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
#, no-wrap
msgid "Instance moderation"
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "As Peertube instance moderator or administrator, you will probably need to check that your users are not behaving badly."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "You can list all existing chatrooms: in the plugin settings screen, there is a button «List rooms»."
msgstr ""
#. type: Plain text
#: build/documentation/pot_in/documentation/user/streamers/moderation.md
#: support/documentation/content/en/documentation/user/streamers/moderation.md
msgid "From there, you can also promote yourself as room moderator by using the \"{{% livechat_label promote %}}\" button on the right."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "You can create polls to ask viewers their opinion."
msgstr ""
#. type: Yaml Front Matter Hash Value: title
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Polls"
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Create a poll"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "You can create a new poll by using the \"{{% livechat_label new_poll %}}\" action in the chat top menu:"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll form](/peertube-plugin-livechat/images/polls_form.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "This poll feature should not be considered as a reliable voting system. It is easy to cheat. There is no mechanism to prevent anonymous users to vote multiple times by just reloading the chat. Votes are never fully anonymous, someone having access to the server could see who voted for what choice."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Poll form"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Fill the form fields:"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_question %}}\": the question to ask to you viewers"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_duration %}}\": the duration for which viewers can vote"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"{{% livechat_label poll_anonymous_results %}}\": if checked, votes won't be publicly visible in the chat"
msgstr ""
#. type: Bullet: '* '
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "\"Choice N\": choices that will be presented to viewers"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "You must at least fill the two first choices fields."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Once you submit the form, the poll will instantly start."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "If there was a previous unfinished poll, it will end and its result will be shown."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/polls.md
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, no-wrap
msgid "Access rights"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Every room's admins can create a new poll."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When you promote someone as room admin or owner, they gets instant access to the \"{{% livechat_label new_poll %}}\" action."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When you remove admin or owner rights to someone, they can't create new poll. But any existing poll will continue until it ends."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Every user that is not muted can vote. This means that you can prevent anonymous users to vote by using the [\"{{% livechat_label livechat_configuration_channel_mute_anonymous_label %}}\" feature](/peertube-plugin-livechat/documentation/user/streamers/moderation)."
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/polls.md
#, no-wrap
msgid "Poll workflow"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When the polls starts, a first message will be sent in the chat, from the account of the user creating the poll."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "A banner will also appear to show the poll, and will be updated regularly with the current votes."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll start](/peertube-plugin-livechat/images/polls_start.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Viewers can then vote by clicking on their choice, or by sending message like \"!1\" in the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Votes counts will be updated regularly in the banner."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Viewers can change their vote at any time, just by making a new choice. Their precedent choice will be replaced by the new one."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll votes](/peertube-plugin-livechat/images/polls_votes.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "Anonymous viewers can only vote once they have choosen their nickname."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "If \"{{% livechat_label poll_anonymous_results %}}\" is checked, votes won't be shown to other users. If unchecked, votes will be publicly visible as you will see message like \"!1\" in the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "For viewers using XMPP clients or outdated livechat plugin versions, the banner will not be visible. But they will see the message in the chat and will be able to vote by sending messages with their choices."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "When the poll ends, a new message will be sent in the chat, with the results."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "![Poll end](/peertube-plugin-livechat/images/polls_end.png?classes=shadow,border&height=200px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/polls.md
msgid "The only way to get old polls results is to search for the poll end message in the chat. For now, polls results are not saved by any other means. So don't forget to note polls results if you want to keep them."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/slow_mode.md
#, no-wrap
@ -3640,6 +3396,12 @@ msgstr ""
msgid "To have more space and better readability, open the chat in full-page mode."
msgstr ""
#. type: Title ###
#: support/documentation/content/en/documentation/user/streamers/tasks.md
#, no-wrap
msgid "Access rights"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/tasks.md
msgid "Every room's admins have access to the Task Application (read and write access)."
@ -3781,85 +3543,6 @@ msgstr ""
msgid "Using this feature, for example, you can ask your moderators to highlight all chat questions, so you can see them at a glance during your livestream, and check them as answered."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Configure channel's chat terms & conditions"
msgstr ""
#. type: Yaml Front Matter Hash Value: title
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Terms & conditions"
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Configuration"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "You can add terms & conditions to your channel. These terms will be shown to all users joining the chat."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "To configure the terms & conditions, go to the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel):"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "![Channel configuration / Terms](/peertube-plugin-livechat/images/channel_terms_config.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "URL in the message will be clickable. You can also do some styling: [Message Styling](https://xmpp.org/extensions/xep-0393.html)."
msgstr ""
#. type: Title ##
#: support/documentation/content/en/documentation/user/streamers/terms.md
#, no-wrap
msgid "Viewers"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "When joining the chat, viewers will see the terms:"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "![Terms](/peertube-plugin-livechat/images/terms.png?classes=shadow,border&height=400px)"
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Peertube instance's admin can also set global terms & conditions. If so, these terms will be shown above your channel's terms."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Anonymous users will only see the terms & conditions once they have chosen their nickname (in other words: once they are able to talk)."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "You can change the terms content at any time, it will be instantly updated for all viewers."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "Users can hide the terms & conditions. When doing so, terms won't be shown again, unless you change the content."
msgstr ""
#. type: Plain text
#: support/documentation/content/en/documentation/user/streamers/terms.md
msgid "If your Peertube instance allows joining chat with [XMPP clients](https://livingston.frama.io/peertube-plugin-livechat/documentation/admin/advanced/xmpp_clients/), users using such clients will see the terms as chat messages, comming from a \"Peertube\" account. When you update terms, they will receive a new message with the update terms content."
msgstr ""
#. type: Yaml Front Matter Hash Value: description
#: support/documentation/content/en/documentation/user/viewers.md
#, no-wrap

Some files were not shown because too many files have changed in this diff Show More