diff --git a/CHANGELOG.md b/CHANGELOG.md index 73e93acf..bc064151 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## 10.3.0 + +### New features + +* #132: [moderation delay](https://livingston.frama.io/peertube-plugin-livechat/documentation/user/streamers/moderation_delay/). + +### Minor changes and fixes + +* Translations updates: german. +* Performance: don't send markers, even if requested by the sender. + ## 10.2.0 ### New features @@ -749,7 +760,7 @@ Moreover, they don't seem to be used much. ### Features * Builtin prosody use a working dir provided by Peertube (needs Peertube >= 3.2.0) -* Starting with Peertube 3.2.0, builtin prosody save room history on server. So when a user connects, he can get previously send messages. +* Starting with Peertube 3.2.0, builtin prosody save room history on server. So when a user connects, they can get previously send messages. * Starting with Peertube 3.2.0, builtin prosody also activate mod_muc_moderation, enabling moderators to moderate messages. * Prosody log level will be the same as the Peertube's one. * Prosody log rotation every 24 hour. @@ -786,7 +797,7 @@ Moreover, they don't seem to be used much. ## v2.1.3 * Fix: 2.1.0 was in fact correct... Did not work on my preprod env because of... a Livebox bug... -* Fix: if the video owner is already owner of the chatroom, he should not be downgraded to admin. +* Fix: if the video owner is already owner of the chatroom, they should not be downgraded to admin. ## v2.1.2 diff --git a/build-avatars.js b/build-avatars.js index 6fc8cc77..8cee4898 100755 --- a/build-avatars.js +++ b/build-avatars.js @@ -171,7 +171,7 @@ async function generateAvatars (part) { async function generateBotsAvatars () { { - // Moderation bot avatar: choosing some parts, and turning it so he is facing left. + // Moderation bot avatar: choosing some parts, and turning it so it is facing left. const inputDir = path.join('./assets/images/avatars/', 'sepia') const botOutputDir = './dist/server/bot_avatars/sepia/' fs.mkdirSync(botOutputDir, { recursive: true }) @@ -196,7 +196,7 @@ async function generateBotsAvatars () { } { - // Moderation bot avatar: choosing some parts, and turning it so he is facing left. + // Moderation bot avatar: choosing some parts, and turning it so it is facing left. const inputDir = path.join('./assets/images/avatars/', 'cat') const botOutputDir = './dist/server/bot_avatars/cat/' fs.mkdirSync(botOutputDir, { recursive: true }) @@ -220,7 +220,7 @@ async function generateBotsAvatars () { } { - // Moderation bot avatar: choosing some parts, and turning it so he is facing left. + // Moderation bot avatar: choosing some parts, and turning it so it is facing left. const inputDir = path.join('./assets/images/avatars/', 'bird') const botOutputDir = './dist/server/bot_avatars/bird/' fs.mkdirSync(botOutputDir, { recursive: true }) @@ -246,7 +246,7 @@ async function generateBotsAvatars () { } { - // Moderation bot avatar: choosing some parts, and turning it so he is facing left. + // Moderation bot avatar: choosing some parts, and turning it so it is facing left. const inputDir = './assets/images/avatars/fenec' const botOutputDir = './dist/server/bot_avatars/fenec/' fs.mkdirSync(botOutputDir, { recursive: true }) @@ -273,7 +273,7 @@ async function generateBotsAvatars () { } { - // Moderation bot avatar: choosing some parts, and turning it so he is facing left. + // Moderation bot avatar: choosing some parts, and turning it so it is facing left. const inputDir = './assets/images/avatars/abstract' const botOutputDir = './dist/server/bot_avatars/abstract/' fs.mkdirSync(botOutputDir, { recursive: true }) diff --git a/client/@types/global.d.ts b/client/@types/global.d.ts index 890ad8ab..ecc2d9be 100644 --- a/client/@types/global.d.ts +++ b/client/@types/global.d.ts @@ -130,3 +130,6 @@ declare const LOC_TOKEN_DEFAULT_LABEL: string declare const LOC_TOKEN_ACTION_REVOKE_CONFIRM: string declare const LOC_POLL_VOTE_OK: string + +declare const LOC_MODERATION_DELAY: string +declare const LOC_LIVECHAT_CONFIGURATION_CHANNEL_MODERATION_DELAY_DESC: string diff --git a/client/common/configuration/elements/templates/channel-configuration.ts b/client/common/configuration/elements/templates/channel-configuration.ts index 23dcee40..69878f95 100644 --- a/client/common/configuration/elements/templates/channel-configuration.ts +++ b/client/common/configuration/elements/templates/channel-configuration.ts @@ -219,6 +219,41 @@ export function tplChannelConfiguration (el: ChannelConfigurationElement): Templ ${el.renderFeedback('peertube-livechat-slowmode-duration-feedback', 'slowMode.duration')} + + +
+ + ${el.renderFeedback('peertube-livechat-moderation-delay-feedback', 'moderation.delay')} +
+ 60 + ) { + propertiesError['moderation.delay'].push(ValidationErrorType.NotInRange) + } + // If !bot.enabled, we don't have to validate these fields: // The backend will ignore those values. if (botConf.enabled) { diff --git a/conversejs/builtin.ts b/conversejs/builtin.ts index 2a4216ca..3165f871 100644 --- a/conversejs/builtin.ts +++ b/conversejs/builtin.ts @@ -20,6 +20,7 @@ import { livechatSpecificsPlugin } from './lib/plugins/livechat-specific' import { livechatViewerModePlugin } from './lib/plugins/livechat-viewer-mode' import { livechatMiniMucHeadPlugin } from './lib/plugins/livechat-mini-muc-head' import { livechatEmojisPlugin } from './lib/plugins/livechat-emojis' +import { moderationDelayPlugin } from './lib/plugins/moderation-delay' declare global { interface Window { @@ -30,6 +31,10 @@ declare global { } emojis: any livechatDisconnect?: Function + env: { + html: Function + sizzle: Function + } } initConversePlugins: typeof initConversePlugins initConverse: typeof initConverse @@ -66,6 +71,8 @@ function initConversePlugins (peertubeEmbedded: boolean): void { // Viewer mode (anonymous accounts, before they have chosen their nickname). converse.plugins.add('livechatViewerModePlugin', livechatViewerModePlugin) + + converse.plugins.add('converse-moderation-delay', moderationDelayPlugin) } window.initConversePlugins = initConversePlugins diff --git a/conversejs/lib/converse-params.ts b/conversejs/lib/converse-params.ts index 545d6f18..e7ef1c06 100644 --- a/conversejs/lib/converse-params.ts +++ b/conversejs/lib/converse-params.ts @@ -86,7 +86,8 @@ function defaultConverseParams ( 'livechatViewerModePlugin', 'livechatDisconnectOnUnloadPlugin', 'converse-slow-mode', - 'livechatEmojis' + 'livechatEmojis', + 'converse-moderation-delay' ], show_retraction_warning: false, // No need to use this warning (except if we open to external clients?) muc_show_info_messages: mucShowInfoMessages, @@ -95,6 +96,7 @@ function defaultConverseParams ( prune_messages_above: 100, // only keep 100 message in history. pruning_behavior: 'unscrolled', colorize_username: true, + send_chat_markers: [], // This is a specific settings, that is used in ConverseJS customization, to force avatars loading in readonly mode. livechat_load_all_vcards: !!forceReadonly, diff --git a/conversejs/lib/plugins/moderation-delay.ts b/conversejs/lib/plugins/moderation-delay.ts new file mode 100644 index 00000000..70945adc --- /dev/null +++ b/conversejs/lib/plugins/moderation-delay.ts @@ -0,0 +1,70 @@ +// SPDX-FileCopyrightText: 2024 John Livingston +// +// SPDX-License-Identifier: AGPL-3.0-only + +const MODERATION_DELAY_TAG = 'moderation-delay' + +/** + * Moderation delay plugin definition. + * This module adds a time counter for moderators, so they now how many time remains before message is broadcasted. + */ +export const moderationDelayPlugin = { + dependencies: ['converse-muc', 'converse-muc-views'], + async initialize (this: any) { + const _converse = this._converse + + _converse.api.listen.on('parseMUCMessage', (stanza: any, attrs: any) => { + // Checking if there is any moderation delay in the message. + const waiting = window.converse.env.sizzle(MODERATION_DELAY_TAG, stanza)?.[0]?.getAttribute('waiting') + if (!waiting) { return attrs } + return Object.assign( + attrs, + { + moderation_delay_waiting: waiting + } + ) + }) + + const Message = _converse.api.elements.registry['converse-chat-message'] + if (Message) { + class MessageOverloaded extends Message { + getDerivedMessageProps (): ReturnType { + const r = super.getDerivedMessageProps() + const waiting = this.model.get('moderation_delay_waiting') + if (!waiting) { + return r + } + const remains = waiting - (Date.now() / 1000) + if (remains < 0) { + // Message already broadcasted + return r + } + + // Ok... We will add some info about how many remains... + r.pretty_time = window.converse.env.html` + ${r.pretty_time} - ${Math.round(remains)}⏱ + ` + // and we must update in 1 second... + setTimeout(() => this.requestUpdate(), 1000) + return r + } + } + _converse.api.elements.define('converse-chat-message', MessageOverloaded) + } else { + console.error('Cannot find converse-chat-message custom elements, moderation delay will not be properly shown.') + } + }, + overrides: { + ChatRoom: { + getUpdatedMessageAttributes: function getUpdatedMessageAttributes (this: any, message: any, attrs: any) { + const newAttrs = this.__super__.getUpdatedMessageAttributes(message, attrs) + if (attrs.moderation_delay_waiting) { + Object.assign(newAttrs, { + moderation_delay_waiting: attrs.moderation_delay_waiting + }) + } + return newAttrs + } + } + } +} diff --git a/languages/de.yml b/languages/de.yml index b0eb6a74..3d209a22 100644 --- a/languages/de.yml +++ b/languages/de.yml @@ -531,3 +531,29 @@ livechat_configuration_channel_terms_label: Chat Nutzungsbedingungen und Konditi des Kanals livechat_configuration_channel_terms_desc: "Sie können eine \"Nutzungsbedingungen\"\ -Nachricht konfigurieren, die Benutzern angezeigt wird, die Ihren Chaträumen beitreten.\n" +poll_vote_instructions_xmpp: 'Senden Sie eine Nachricht mit einem Ausrufezeichen, + gefolgt von Ihrer Wahlnummer, um abzustimmen. Beispiel: !1' +new_poll: Eine neue Umfrage erstellen +poll_instructions: Füllen Sie dieses Formular aus und senden Sie es ab, um eine neue + Umfrage zu erstellen. Damit wird eine bestehende Umfrage beendet und ersetzt. +poll_vote_instructions: 'Um abzustimmen, klicken Sie auf Ihre Wahl oder senden Sie + eine Nachricht mit einem Ausrufezeichen gefolgt von der Nummer Ihrer Wahl (Beispiel: + !1).' +poll_anonymous_vote_ok: Ihre Stimme wird berücksichtigt. Die Stimmen sind anonym, + sie werden den anderen Teilnehmern nicht angezeigt. +poll: Umfrage +poll_title: Neue Umfrage +poll_is_over: Diese Umfrage ist nun beendet. +poll_question: Frage +poll_duration: Umfragezeit (in Minuten) +poll_anonymous_results: Anonyme Ergebnisse +poll_choice_n: 'Wahl {{N}}:' +poll_end: 'Die Umfrage endet am:' +poll_choice_invalid: Diese Wahl ist nicht gültig. +poll_vote_ok: Ihre Stimme wurde berücksichtigt, die Zähler werden in Kürze aktualisiert. +moderation_delay: Moderationsverzögerung +livechat_configuration_channel_moderation_delay_desc: "Standardwert der Moderationsverzögerung:\n\ +
    \n
  • 0: Moderationsverzögerung deaktiviert
  • \n
  • Beliebige positive + ganze Zahl: Nachrichten werden für Nicht-Moderator-Teilnehmer um X Sekunden verzögert, + so dass Moderatoren die Nachricht löschen können, bevor ein anderer Benutzer sie + lesen kann.
  • \n
\n" diff --git a/languages/en.yml b/languages/en.yml index 08e9aaab..35c2d624 100644 --- a/languages/en.yml +++ b/languages/en.yml @@ -243,7 +243,7 @@ prosody_peertube_uri_description: | prosody_muc_log_by_default_label: "Log rooms content by default" prosody_muc_log_by_default_description: | If checked, room contents will be saved by default. - Any user who joins a room will see what was written before he joins.
+ Any user who joins a room will see what was written before they joins.
Please note that it is always possible to enable/disable the content archiving for a specific room, by editing its properties. @@ -579,3 +579,11 @@ 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. + +moderation_delay: Moderation delay +livechat_configuration_channel_moderation_delay_desc: | + Moderation delay default value: +
    +
  • 0: moderation delay disabled
  • +
  • Any positive integer: messages will be delayed for X seconds for non-moderator participants, allowing moderators to delete message before any user can read it.
  • +
diff --git a/languages/fr.yml b/languages/fr.yml index f791c538..fc444fe5 100644 --- a/languages/fr.yml +++ b/languages/fr.yml @@ -567,3 +567,9 @@ poll_vote_ok: Votre vote a été pris en compte, les compteurs seront mis à jou 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 +livechat_configuration_channel_moderation_delay_desc: "Valeur par défaut du délai + de modération :\n
    \n
  • 0 : délai de modération désactivé
  • \n
  • Tout + nombre entier positif : les messages seront retardés de X secondes pour les participant⋅es + non modérateur⋅rices, ce qui permet à ces derniers de supprimer les messages avant + qu'un utilisateur⋅rice ne puisse le lire.
  • \n
\n" +moderation_delay: Délai de modération diff --git a/package-lock.json b/package-lock.json index b67b0e44..165ec12c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "peertube-plugin-livechat", - "version": "10.2.0", + "version": "10.3.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "peertube-plugin-livechat", - "version": "10.2.0", + "version": "10.3.0", "license": "AGPL-3.0", "dependencies": { "@xmpp/jid": "^0.13.1", diff --git a/package.json b/package.json index cd9f3991..ad699854 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "peertube-plugin-livechat", "description": "NCTV fork of the peertube-plugin-livechat plugin, containing styling and other shit. This will be maintained with upstream.", - "version": "10.2.0", + "version": "10.3.0", "license": "AGPL-3.0", "author": { "name": "Matty Boombalatty", diff --git a/prosody-modules/mod_http_peertubelivechat_manage_rooms/mod_http_peertubelivechat_manage_rooms.lua b/prosody-modules/mod_http_peertubelivechat_manage_rooms/mod_http_peertubelivechat_manage_rooms.lua index ae3f1e18..86eeae15 100644 --- a/prosody-modules/mod_http_peertubelivechat_manage_rooms/mod_http_peertubelivechat_manage_rooms.lua +++ b/prosody-modules/mod_http_peertubelivechat_manage_rooms/mod_http_peertubelivechat_manage_rooms.lua @@ -97,6 +97,11 @@ local function update_room(event) must104 = true; end end + if type(config.moderation_delay) == "number" then + if room._data.moderation_delay ~= config.moderation_delay then + room._data.moderation_delay = config.moderation_delay; + 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 diff --git a/prosody-modules/mod_muc_http_defaults/mod_muc_http_defaults.lua b/prosody-modules/mod_muc_http_defaults/mod_muc_http_defaults.lua index cbb94992..1a217671 100644 --- a/prosody-modules/mod_muc_http_defaults/mod_muc_http_defaults.lua +++ b/prosody-modules/mod_muc_http_defaults/mod_muc_http_defaults.lua @@ -7,10 +7,13 @@ -- This version contains a modification to take into account new config options: -- * "slow_mode_duration" -- * "mute_anonymous" +-- * "moderation_delay" -- 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. +-- +-- The "moderation_delay" comes with mod_muc_moderation_delay -- local http = require "net.http"; @@ -116,7 +119,10 @@ local function apply_config(room, settings) -- specific to peertube-plugin-livechat: if (type(config.slow_mode_duration) == "number") and config.slow_mode_duration >= 0 then - room._data.slow_mode_duration = config.slow_mode_duration; + room._data.slow_mode_duration = config.slow_mode_duration; + end + if (type(config.moderation_delay) == "number") and config.moderation_delay >= 0 then + room._data.moderation_delay = config.moderation_delay; end if (type(config.mute_anonymous) == "boolean") then room._data.x_peertubelivechat_mute_anonymous = config.mute_anonymous; diff --git a/prosody-modules/mod_muc_moderation_delay/README.md b/prosody-modules/mod_muc_moderation_delay/README.md new file mode 100644 index 00000000..7c831885 --- /dev/null +++ b/prosody-modules/mod_muc_moderation_delay/README.md @@ -0,0 +1,44 @@ + +# mod_muc_moderation_delay + +With this module, you can apply a delay to groupchat messages delivery, so that room moderators can moderate them before other participants receives them. + +This module is part of peertube-plugin-livechat, and is under the same LICENSE. +This module can work on any Prosody server (version >= 0.12.x). + +## Configuration + +Just enable the module on your MUC component. +The feature will be accessible throught the room configuration form. + +The position in the room config form can be changed be setting the option `moderation_delay_form_position`. +This value will be passed as priority for the "muc-config-form" hook. +By default, the field will be between muc#roomconfig_changesubject and muc#roomconfig_moderatedroom. + +``` lua +VirtualHost "muc.example.com" + modules_enabled = { "muc_moderation_delay" } + moderation_delay_form_position = 96 +``` + +## Additional notes + +For moderators, messages that are delayed will contain an extra `moderation-delay` xml tag, with `delay` and `waiting` attribute: + +```xml + + Hello world + + + + + + +``` + +Note: the `waiting` attribute is the timestamp at which the message will be broadcasted. + +So compatible xmpp clients can display some information. diff --git a/prosody-modules/mod_muc_moderation_delay/config.lib.lua b/prosody-modules/mod_muc_moderation_delay/config.lib.lua new file mode 100644 index 00000000..7fbb1af2 --- /dev/null +++ b/prosody-modules/mod_muc_moderation_delay/config.lib.lua @@ -0,0 +1,61 @@ +-- SPDX-FileCopyrightText: 2024 John Livingston +-- SPDX-License-Identifier: AGPL-3.0-only + +-- Getter/Setter +local function get_moderation_delay(room) + return room._data.moderation_delay or nil; +end + +local function set_moderation_delay(room, delay) + if delay == 0 then + delay = nil; + end + if delay ~= nil then + delay = assert(tonumber(delay), "Moderation delay is not a valid number"); + if delay < 0 then + delay = nil; + end + end + + if get_moderation_delay(room) == delay then return false; end + + room._data.moderation_delay = delay; + return true; +end + +-- Discovering support +local function add_disco_form(event) + table.insert(event.form, { + name = "muc#roominfo_moderation_delay"; + value = ""; + }); + event.formdata["muc#roominfo_moderation_delay"] = get_moderation_delay(event.room); +end + + +-- Config form declaration +local function add_form_option(event) + table.insert(event.form, { + name = "muc#roomconfig_moderation_delay"; + type = "text-single"; + datatype = "xs:integer"; + range_min = 0; + range_max = 60; -- do not allow too big values, it does not make sense. + label = "Moderation delay (0=disabled, any positive integer= messages will be delayed for X seconds for non-moderator participants.)"; + -- desc = ""; + value = get_moderation_delay(event.room); + }); +end + +local function config_submitted(event) + set_moderation_delay(event.room, event.value); + -- no need to 104 status, this feature is invisible for regular participants. +end + +return { + set_moderation_delay = set_moderation_delay; + get_moderation_delay = get_moderation_delay; + add_disco_form = add_disco_form; + add_form_option = add_form_option; + config_submitted = config_submitted; +} diff --git a/prosody-modules/mod_muc_moderation_delay/delay.lib.lua b/prosody-modules/mod_muc_moderation_delay/delay.lib.lua new file mode 100644 index 00000000..f5e2631b --- /dev/null +++ b/prosody-modules/mod_muc_moderation_delay/delay.lib.lua @@ -0,0 +1,151 @@ +-- SPDX-FileCopyrightText: 2024 John Livingston +-- SPDX-License-Identifier: AGPL-3.0-only +local st = require "util.stanza"; +local timer = require "util.timer"; +local get_time = require "util.time".now; +local get_moderation_delay = module:require("config").get_moderation_delay; + +local muc_util = module:require "muc/util"; +local valid_roles = muc_util.valid_roles; + +local moderation_delay_tag = "moderation-delay"; +local xmlns_fasten = "urn:xmpp:fasten:0"; +local xmlns_moderated_0 = "urn:xmpp:message-moderate:0"; +local xmlns_retract_0 = "urn:xmpp:message-retract:0"; +local xmlns_moderated_1 = "urn:xmpp:message-moderate:1"; +local xmlns_retract_1 = "urn:xmpp:message-retract:1"; +local xmlns_st_id = "urn:xmpp:sid:0"; + +local queued_stanza_id_timers = {}; + +-- tests if a stanza is a retractation message. +local function is_retractation_for_stanza_id(stanza) + -- XEP 0425 was revised in 2023. For now, mod_muc_moderation uses the previous version. + -- But we will make the code compatible with both. + local apply_to = stanza:get_child("apply-to", xmlns_fasten); + if apply_to and apply_to.attr.id then + local moderated = apply_to:get_child("moderated", xmlns_moderated_0); + if moderated then + local retract = moderated:get_child("retract", xmlns_retract_0); + if retract then + return apply_to.attr.id; + end + end + end + + local moderated = stanza:get_child("moderated", xmlns_moderated_1); + if moderated then + if moderated:get_child("retract", xmlns_retract_1) then + return moderated.attr.id; + end + end + + return nil; +end + +-- handler for muc-broadcast-message +local function handle_broadcast_message(event) + local room, stanza = event.room, event.stanza; + local delay = get_moderation_delay(room); + if delay == nil then + -- feature disabled on the room, go for it. + return; + end + + -- only delay groupchat messages with body. + if stanza.attr.type ~= "groupchat" then + return; + end + + -- detect retractations: + local retracted_stanza_id = is_retractation_for_stanza_id(stanza); + if retracted_stanza_id then + module:log("debug", "Got a retractation message for %s", retracted_stanza_id); + if queued_stanza_id_timers[retracted_stanza_id] then + module:log("info", "Got a retractation message, for message %s that is currently waiting for broadcast. Cancelling.", retracted_stanza_id); + timer.stop(queued_stanza_id_timers[retracted_stanza_id]); + queued_stanza_id_timers[retracted_stanza_id] = nil; + -- and we continue... + end + end + + if not stanza:get_child("body") then + -- Dont want to delay message without body. + -- This is usually messages like "xxx is typing", or any other service message. + -- This also should concern retractation messages. + -- Clients that will receive retractation messages for message they never got, should just drop them. And that's ok. + return; + end + + local stanza_id = nil; -- message stanza id... can be nil! + local stanza_id_child = stanza:get_child("stanza-id", xmlns_st_id); + if not stanza_id_child then + -- this can happen when muc is not archived! + -- in such case, message retractation is not possible. + -- so, this is a normal use case, and we should handle it properly. + else + stanza_id = stanza_id_child.attr.id; + end + local id = stanza.attr.id; + if not id then + -- message should alway have an id, but just in case... + module:log("warn", "Message has no id, wont delay it."); + return; + end + + -- Message must be delayed, except for: + -- * room moderators + -- * the user that sent the message (if they don't get the echo quickly, their clients could have weird behaviours) + module:log("debug", "Message %s / %s must be delayed by %i seconds, sending first broadcast wave.", id, stanza_id, delay); + local moderator_role_value = valid_roles["moderator"]; + + local cloned_stanza = st.clone(stanza); -- we must clone, to send a copy for the second wave. + + -- first of all, if the initiator occupant is not moderator, me must send to them. + -- (delaying the echo message could have some quircks in some xmpp clients) + if stanza.attr.from then + local from_occupant = room:get_occupant_by_nick(stanza.attr.from); + if from_occupant and valid_roles[from_occupant.role or "none"] < moderator_role_value then + module:log("debug", "Message %s / %s must be sent separatly to it initialior %s.", id, stanza_id, delay, stanza.attr.from); + room:route_to_occupant(from_occupant, stanza); + end + end + + -- adding a tag, so that moderators can know that this message is delayed. + stanza:tag(moderation_delay_tag, { + delay = "" .. delay; + waiting = string.format("%i", get_time() + delay); + }):up(); + + -- then, sending to moderators (and only moderators): + room:broadcast(stanza, function (nick, occupant) + if valid_roles[occupant.role or "none"] >= moderator_role_value then + return true; + end + return false; + end); + + local task = timer.add_task(delay, function () + module:log("debug", "Message %s has been delayed, sending to remaining participants.", id); + room:broadcast(cloned_stanza, function (nick, occupant) + if valid_roles[occupant.role or "none"] >= moderator_role_value then + return false; + end + if nick == stanza.attr.from then + -- we already sent it to them (because they are moderator, or because we sent them separately) + return false; + end + return true; + end); + end); + if stanza_id then + -- store it, so we can stop timer if there is a retractation. + queued_stanza_id_timers[stanza_id] = task; + end + + return true; -- stop the default broadcast_message processing. +end + +return { + handle_broadcast_message = handle_broadcast_message; +}; diff --git a/prosody-modules/mod_muc_moderation_delay/mod_muc_moderation_delay.lua b/prosody-modules/mod_muc_moderation_delay/mod_muc_moderation_delay.lua new file mode 100644 index 00000000..61d9abc1 --- /dev/null +++ b/prosody-modules/mod_muc_moderation_delay/mod_muc_moderation_delay.lua @@ -0,0 +1,30 @@ +-- mod_muc_moderation_delay +-- +-- SPDX-FileCopyrightText: 2024 John Livingston +-- 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/ +-- + +local add_disco_form = module:require("config").add_disco_form; +local config_submitted = module:require("config").config_submitted; +local add_form_option = module:require("config").add_form_option; +local handle_broadcast_message = module:require("delay").handle_broadcast_message; + +-- form_position: the position in the room config form (this value will be passed as priority for the "muc-config-form" hook). +-- By default, field will be between muc#roomconfig_changesubject and muc#roomconfig_moderatedroom +local form_position = module:get_option_number("moderation_delay_form_position") or 80-2; + +-- Plugin dependencies +local mod_muc = module:depends "muc"; + +-- muc-disco and muc-config to configure the feature: +module:hook("muc-disco#info", add_disco_form); +module:hook("muc-config-submitted/muc#roomconfig_moderation_delay", config_submitted); +module:hook("muc-config-form", add_form_option, form_position); + +-- intercept muc-broadcast-message, and broadcast with delay if required. +-- Priority is negative, as we want it to be the last handler. +module:hook("muc-broadcast-message", handle_broadcast_message, -1000); diff --git a/prosody-modules/mod_pubsub_peertubelivechat/mod_pubsub_peertubelivechat.lua b/prosody-modules/mod_pubsub_peertubelivechat/mod_pubsub_peertubelivechat.lua index 5dd041f3..95465bf1 100644 --- a/prosody-modules/mod_pubsub_peertubelivechat/mod_pubsub_peertubelivechat.lua +++ b/prosody-modules/mod_pubsub_peertubelivechat/mod_pubsub_peertubelivechat.lua @@ -329,7 +329,7 @@ module:hook("muc-room-destroyed", function(event) end); -- When a user lose its admin/owner affilation, and is still subscribed to the node, --- we must unsubscribe him. +-- we must unsubscribe them. module:hook("muc-set-affiliation", function(event) local previous_affiliation = event.previous_affiliation; local new_affiliation = event.affiliation; @@ -374,7 +374,7 @@ module:hook("muc-occupant-left", function (event) module:log( "debug", - "Occupant %q has left room %q, we must unsubscribe him/her for pubsub nodes.", + "Occupant %q has left room %q, we must unsubscribe them for pubsub nodes.", occupant.bare_jid, room_jid ); for node in pairs(service.nodes) do diff --git a/server/lib/configuration/channel/sanitize.ts b/server/lib/configuration/channel/sanitize.ts index 1167263f..3aa45480 100644 --- a/server/lib/configuration/channel/sanitize.ts +++ b/server/lib/configuration/channel/sanitize.ts @@ -36,6 +36,9 @@ async function sanitizeChannelConfigurationOptions ( throw new Error('Invalid data.slowMode data type') } + const moderationData = data.moderation ?? {} // comes with livechat 10.3.0 + moderationData.delay ??= 0 + // mute not present in livechat <= 10.2.0 const mute = data.mute ?? {} mute.anonymous ??= false @@ -68,6 +71,9 @@ async function sanitizeChannelConfigurationOptions ( }, mute: { anonymous: _readBoolean(mute, 'anonymous') + }, + moderation: { + delay: _readInteger(moderationData, 'delay', 0, 60) } } if (terms !== undefined) { diff --git a/server/lib/configuration/channel/storage.ts b/server/lib/configuration/channel/storage.ts index 1c6c4ce3..d5dbdf90 100644 --- a/server/lib/configuration/channel/storage.ts +++ b/server/lib/configuration/channel/storage.ts @@ -53,6 +53,9 @@ function getDefaultChannelConfigurationOptions (_options: RegisterServerOptions) mute: { anonymous: false }, + moderation: { + delay: 0 + }, terms: undefined } } diff --git a/server/lib/federation/fetch-infos.ts b/server/lib/federation/fetch-infos.ts index 39fdf50a..f29ec051 100644 --- a/server/lib/federation/fetch-infos.ts +++ b/server/lib/federation/fetch-infos.ts @@ -28,7 +28,7 @@ const got = require('got') * - server B: server that follows ours (or used to watch V, without following A) * - user from B connect to the B XMPP server * - server B has server A connection informations (got it using ActivityPub) - * - but, when using Websocket S2S, server A needs information from B, that he never receives + * - but, when using Websocket S2S, server A needs information from B, that it never receives * * Indeed, the XMPP S2S dialback mecanism will try to connect back to * server A, and transmit a secret key, to ensure that all incomming connection diff --git a/server/lib/middlewares/configuration/channel.ts b/server/lib/middlewares/configuration/channel.ts index 7f400750..9284b909 100644 --- a/server/lib/middlewares/configuration/channel.ts +++ b/server/lib/middlewares/configuration/channel.ts @@ -41,7 +41,7 @@ function getCheckConfigurationChannelMiddleware (options: RegisterServerOptions) } else if (await isUserAdminOrModerator(options, res)) { logger.debug('Current user is an instance moderator or admin') } else { - logger.warn('Current user tries to access a channel for which he has no right.') + logger.warn('Current user tries to access a channel for which they has no right.') res.sendStatus(403) return } diff --git a/server/lib/prosody/api/manage-rooms.ts b/server/lib/prosody/api/manage-rooms.ts index 61e65bd8..064608d5 100644 --- a/server/lib/prosody/api/manage-rooms.ts +++ b/server/lib/prosody/api/manage-rooms.ts @@ -64,6 +64,7 @@ async function updateProsodyRoom ( data: { name?: string slow_mode_duration?: number + moderation_delay?: number livechat_muc_terms?: string addAffiliations?: Affiliations removeAffiliationsFor?: string[] @@ -93,6 +94,9 @@ async function updateProsodyRoom ( if (('slow_mode_duration' in data) && data.slow_mode_duration !== undefined) { apiData.slow_mode_duration = data.slow_mode_duration } + if (('moderation_delay' in data) && data.moderation_delay !== undefined) { + apiData.moderation_delay = data.moderation_delay + } if ('livechat_muc_terms' in data) { apiData.livechat_muc_terms = data.livechat_muc_terms ?? '' } diff --git a/server/lib/prosody/auth.ts b/server/lib/prosody/auth.ts index 98636228..dfd47ab8 100644 --- a/server/lib/prosody/auth.ts +++ b/server/lib/prosody/auth.ts @@ -57,7 +57,7 @@ let singleton: LivechatProsodyAuth | undefined * * The livechat tokens password are encrypted in data files. * The associated secret key is in the database. - * This is to ensure an additional security level: if an attacker has access to file system, he also must have access + * This is to ensure an additional security level: if an attacker has access to file system, they also must have access * to DB to get the secret key and decrypt passwords. */ export class LivechatProsodyAuth { diff --git a/server/lib/prosody/config.ts b/server/lib/prosody/config.ts index 8b2d49b9..97cd17d0 100644 --- a/server/lib/prosody/config.ts +++ b/server/lib/prosody/config.ts @@ -85,7 +85,7 @@ async function getProsodyFilePaths (options: RegisterServerOptions): Promise\n" "Language-Team: Arabic \n" @@ -3118,6 +3118,106 @@ msgstr "" msgid "For streamers" msgstr "" +#. type: Yaml Front Matter Hash Value: description +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#, no-wrap +msgid "Plugin peertube-plugin-livechat moderation delay" +msgstr "" + +#. type: Yaml Front Matter Hash Value: title +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#, no-wrap +msgid "Moderation delay" +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "This feature comes with the livechat plugin version 10.3.0." +msgstr "" + +#. type: Yaml Front Matter Hash Value: title +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#: support/documentation/content/en/documentation/user/streamers/slow_mode.md +#: support/documentation/content/en/documentation/user/streamers/tasks.md +#: support/documentation/content/en/intro/_index.md +#, no-wrap +msgid "Introduction" +msgstr "مقدمة" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "As a streamer, you can choose to delay messages in the chat, to let some time to moderators to delete messages before they can even be read by other participants." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "When this feature is enabled, moderators will see all messages without any delay. Chat participants won't see that their own messages are delayed." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "Please note that messages sent by moderators will also be delayed, to avoid them to respond to messages that are not even visible by other participants." +msgstr "" + +#. type: Title ## +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#, no-wrap +msgid "Moderation delay option" +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "On the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel), you can set the \"{{% livechat_label moderation_delay %}}\" option:" +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "![Channel configuration / Moderation delay](/peertube-plugin-livechat/images/moderation_delay_channel_option.png?classes=shadow,border&height=400px)" +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#: support/documentation/content/en/documentation/user/streamers/slow_mode.md +msgid "This value will apply as a default value for all your channel's chatrooms." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#: support/documentation/content/en/documentation/user/streamers/slow_mode.md +msgid "Setting the value to `0` will disable the feature." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "Setting the value to a positive integer will set the delay, in seconds, to apply to messages. Please avoid setting the value too high. Ideally it should not exceed a few seconds (4 or 5 seconds for example)." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "To modify the value for an already existing room, just open the room \"configuration\" menu (on top of the chat window), and change the moderation delay value in the configuration form." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "Currently, this feature has one known bug: users that join the chat will get all messages, even messages that are still pending for other participants. However, messages sent after they joined will be delayed correctly." +msgstr "" + +#. type: Title ## +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#, no-wrap +msgid "In the chat" +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "As a moderator, you will see the remaining time (in seconds) before the message is broadcasted, just besides the message datetime." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "![Moderation delay timer](/peertube-plugin-livechat/images/moderation_delay_timer.png?classes=shadow,border)" +msgstr "" + #. type: Yaml Front Matter Hash Value: description #: build/documentation/pot_in/documentation/user/streamers/moderation.md #, no-wrap @@ -3161,7 +3261,7 @@ msgstr "" #. type: Plain text #: build/documentation/pot_in/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, ..." +msgid "The video owner will be owner of the chat room. This means they can configure the room, delete it, promote other users as admins, ..." msgstr "" #. type: Plain text @@ -3463,14 +3563,6 @@ msgstr "" msgid "This feature comes with the livechat plugin version 8.3.0." msgstr "" -#. type: Yaml Front Matter Hash Value: title -#: support/documentation/content/en/documentation/user/streamers/slow_mode.md -#: support/documentation/content/en/documentation/user/streamers/tasks.md -#: support/documentation/content/en/intro/_index.md -#, no-wrap -msgid "Introduction" -msgstr "مقدمة" - #. type: Plain text #: support/documentation/content/en/documentation/user/streamers/slow_mode.md msgid "As a streamer, you can choose to rate limit your viewers messages in the chat." @@ -3517,16 +3609,6 @@ msgstr "" msgid "![Channel configuration / Slow Mode](/peertube-plugin-livechat/images/slow_mode_channel_option.png?classes=shadow,border&height=400px)" msgstr "" -#. type: Plain text -#: support/documentation/content/en/documentation/user/streamers/slow_mode.md -msgid "This value will apply as a default value for all your channel's chatrooms." -msgstr "" - -#. type: Plain text -#: support/documentation/content/en/documentation/user/streamers/slow_mode.md -msgid "Setting the value to `0` will disable the feature." -msgstr "" - #. type: Plain text #: support/documentation/content/en/documentation/user/streamers/slow_mode.md msgid "Setting the value to a positive integer will set the period during which users will not be able to post additional messages." @@ -3867,7 +3949,7 @@ 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." +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, coming 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 diff --git a/support/documentation/po/livechat.ca.po b/support/documentation/po/livechat.ca.po index dcbb25b3..a721daee 100644 --- a/support/documentation/po/livechat.ca.po +++ b/support/documentation/po/livechat.ca.po @@ -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-07-10 16:54+0200\n" "PO-Revision-Date: 2023-07-17 10:52+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Catalan \n" @@ -3110,6 +3110,106 @@ msgstr "" msgid "For streamers" msgstr "" +#. type: Yaml Front Matter Hash Value: description +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#, no-wrap +msgid "Plugin peertube-plugin-livechat moderation delay" +msgstr "" + +#. type: Yaml Front Matter Hash Value: title +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#, no-wrap +msgid "Moderation delay" +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "This feature comes with the livechat plugin version 10.3.0." +msgstr "" + +#. type: Yaml Front Matter Hash Value: title +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#: support/documentation/content/en/documentation/user/streamers/slow_mode.md +#: support/documentation/content/en/documentation/user/streamers/tasks.md +#: support/documentation/content/en/intro/_index.md +#, no-wrap +msgid "Introduction" +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "As a streamer, you can choose to delay messages in the chat, to let some time to moderators to delete messages before they can even be read by other participants." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "When this feature is enabled, moderators will see all messages without any delay. Chat participants won't see that their own messages are delayed." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "Please note that messages sent by moderators will also be delayed, to avoid them to respond to messages that are not even visible by other participants." +msgstr "" + +#. type: Title ## +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#, no-wrap +msgid "Moderation delay option" +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "On the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel), you can set the \"{{% livechat_label moderation_delay %}}\" option:" +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "![Channel configuration / Moderation delay](/peertube-plugin-livechat/images/moderation_delay_channel_option.png?classes=shadow,border&height=400px)" +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#: support/documentation/content/en/documentation/user/streamers/slow_mode.md +msgid "This value will apply as a default value for all your channel's chatrooms." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#: support/documentation/content/en/documentation/user/streamers/slow_mode.md +msgid "Setting the value to `0` will disable the feature." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "Setting the value to a positive integer will set the delay, in seconds, to apply to messages. Please avoid setting the value too high. Ideally it should not exceed a few seconds (4 or 5 seconds for example)." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "To modify the value for an already existing room, just open the room \"configuration\" menu (on top of the chat window), and change the moderation delay value in the configuration form." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "Currently, this feature has one known bug: users that join the chat will get all messages, even messages that are still pending for other participants. However, messages sent after they joined will be delayed correctly." +msgstr "" + +#. type: Title ## +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#, no-wrap +msgid "In the chat" +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "As a moderator, you will see the remaining time (in seconds) before the message is broadcasted, just besides the message datetime." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "![Moderation delay timer](/peertube-plugin-livechat/images/moderation_delay_timer.png?classes=shadow,border)" +msgstr "" + #. type: Yaml Front Matter Hash Value: description #: build/documentation/pot_in/documentation/user/streamers/moderation.md #, no-wrap @@ -3153,7 +3253,7 @@ msgstr "" #. type: Plain text #: build/documentation/pot_in/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, ..." +msgid "The video owner will be owner of the chat room. This means they can configure the room, delete it, promote other users as admins, ..." msgstr "" #. type: Plain text @@ -3455,14 +3555,6 @@ msgstr "" msgid "This feature comes with the livechat plugin version 8.3.0." msgstr "" -#. type: Yaml Front Matter Hash Value: title -#: support/documentation/content/en/documentation/user/streamers/slow_mode.md -#: support/documentation/content/en/documentation/user/streamers/tasks.md -#: support/documentation/content/en/intro/_index.md -#, no-wrap -msgid "Introduction" -msgstr "" - #. type: Plain text #: support/documentation/content/en/documentation/user/streamers/slow_mode.md msgid "As a streamer, you can choose to rate limit your viewers messages in the chat." @@ -3509,16 +3601,6 @@ msgstr "" msgid "![Channel configuration / Slow Mode](/peertube-plugin-livechat/images/slow_mode_channel_option.png?classes=shadow,border&height=400px)" msgstr "" -#. type: Plain text -#: support/documentation/content/en/documentation/user/streamers/slow_mode.md -msgid "This value will apply as a default value for all your channel's chatrooms." -msgstr "" - -#. type: Plain text -#: support/documentation/content/en/documentation/user/streamers/slow_mode.md -msgid "Setting the value to `0` will disable the feature." -msgstr "" - #. type: Plain text #: support/documentation/content/en/documentation/user/streamers/slow_mode.md msgid "Setting the value to a positive integer will set the period during which users will not be able to post additional messages." @@ -3857,7 +3939,7 @@ 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." +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, coming 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 diff --git a/support/documentation/po/livechat.cs.po b/support/documentation/po/livechat.cs.po index 818ba8e3..55c06eb1 100644 --- a/support/documentation/po/livechat.cs.po +++ b/support/documentation/po/livechat.cs.po @@ -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-07-10 16:54+0200\n" "PO-Revision-Date: 2023-07-17 10:52+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Czech \n" @@ -3110,6 +3110,106 @@ msgstr "" msgid "For streamers" msgstr "" +#. type: Yaml Front Matter Hash Value: description +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#, no-wrap +msgid "Plugin peertube-plugin-livechat moderation delay" +msgstr "" + +#. type: Yaml Front Matter Hash Value: title +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#, no-wrap +msgid "Moderation delay" +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "This feature comes with the livechat plugin version 10.3.0." +msgstr "" + +#. type: Yaml Front Matter Hash Value: title +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#: support/documentation/content/en/documentation/user/streamers/slow_mode.md +#: support/documentation/content/en/documentation/user/streamers/tasks.md +#: support/documentation/content/en/intro/_index.md +#, no-wrap +msgid "Introduction" +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "As a streamer, you can choose to delay messages in the chat, to let some time to moderators to delete messages before they can even be read by other participants." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "When this feature is enabled, moderators will see all messages without any delay. Chat participants won't see that their own messages are delayed." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "Please note that messages sent by moderators will also be delayed, to avoid them to respond to messages that are not even visible by other participants." +msgstr "" + +#. type: Title ## +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#, no-wrap +msgid "Moderation delay option" +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "On the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel), you can set the \"{{% livechat_label moderation_delay %}}\" option:" +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "![Channel configuration / Moderation delay](/peertube-plugin-livechat/images/moderation_delay_channel_option.png?classes=shadow,border&height=400px)" +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#: support/documentation/content/en/documentation/user/streamers/slow_mode.md +msgid "This value will apply as a default value for all your channel's chatrooms." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#: support/documentation/content/en/documentation/user/streamers/slow_mode.md +msgid "Setting the value to `0` will disable the feature." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "Setting the value to a positive integer will set the delay, in seconds, to apply to messages. Please avoid setting the value too high. Ideally it should not exceed a few seconds (4 or 5 seconds for example)." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "To modify the value for an already existing room, just open the room \"configuration\" menu (on top of the chat window), and change the moderation delay value in the configuration form." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "Currently, this feature has one known bug: users that join the chat will get all messages, even messages that are still pending for other participants. However, messages sent after they joined will be delayed correctly." +msgstr "" + +#. type: Title ## +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#, no-wrap +msgid "In the chat" +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "As a moderator, you will see the remaining time (in seconds) before the message is broadcasted, just besides the message datetime." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "![Moderation delay timer](/peertube-plugin-livechat/images/moderation_delay_timer.png?classes=shadow,border)" +msgstr "" + #. type: Yaml Front Matter Hash Value: description #: build/documentation/pot_in/documentation/user/streamers/moderation.md #, no-wrap @@ -3153,7 +3253,7 @@ msgstr "" #. type: Plain text #: build/documentation/pot_in/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, ..." +msgid "The video owner will be owner of the chat room. This means they can configure the room, delete it, promote other users as admins, ..." msgstr "" #. type: Plain text @@ -3455,14 +3555,6 @@ msgstr "" msgid "This feature comes with the livechat plugin version 8.3.0." msgstr "" -#. type: Yaml Front Matter Hash Value: title -#: support/documentation/content/en/documentation/user/streamers/slow_mode.md -#: support/documentation/content/en/documentation/user/streamers/tasks.md -#: support/documentation/content/en/intro/_index.md -#, no-wrap -msgid "Introduction" -msgstr "" - #. type: Plain text #: support/documentation/content/en/documentation/user/streamers/slow_mode.md msgid "As a streamer, you can choose to rate limit your viewers messages in the chat." @@ -3509,16 +3601,6 @@ msgstr "" msgid "![Channel configuration / Slow Mode](/peertube-plugin-livechat/images/slow_mode_channel_option.png?classes=shadow,border&height=400px)" msgstr "" -#. type: Plain text -#: support/documentation/content/en/documentation/user/streamers/slow_mode.md -msgid "This value will apply as a default value for all your channel's chatrooms." -msgstr "" - -#. type: Plain text -#: support/documentation/content/en/documentation/user/streamers/slow_mode.md -msgid "Setting the value to `0` will disable the feature." -msgstr "" - #. type: Plain text #: support/documentation/content/en/documentation/user/streamers/slow_mode.md msgid "Setting the value to a positive integer will set the period during which users will not be able to post additional messages." @@ -3857,7 +3939,7 @@ 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." +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, coming 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 diff --git a/support/documentation/po/livechat.de.po b/support/documentation/po/livechat.de.po index 88adc38e..b14f8ae4 100644 --- a/support/documentation/po/livechat.de.po +++ b/support/documentation/po/livechat.de.po @@ -7,12 +7,10 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2024-07-05 13:36+0200\n" +"POT-Creation-Date: 2024-07-10 16:54+0200\n" "PO-Revision-Date: 2024-07-05 19:12+0000\n" -"Last-Translator: Victor Hampel " -"\n" -"Language-Team: German \n" +"Last-Translator: Victor Hampel \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -3191,6 +3189,109 @@ msgstr "So richten Sie den Chat für Ihren Live-Stream ein" msgid "For streamers" msgstr "Für Streamer" +#. type: Yaml Front Matter Hash Value: description +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#, no-wrap +msgid "Plugin peertube-plugin-livechat moderation delay" +msgstr "Plugin peertube-plugin-livechat Moderationsverzögerung" + +#. type: Yaml Front Matter Hash Value: title +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#, no-wrap +msgid "Moderation delay" +msgstr "Moderationsverzögerung" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "This feature comes with the livechat plugin version 10.3.0." +msgstr "Diese Funktion wird mit dem Livechatplugin Version 10.3.0 verfügbar sein." + +#. type: Yaml Front Matter Hash Value: title +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#: support/documentation/content/en/documentation/user/streamers/slow_mode.md +#: support/documentation/content/en/documentation/user/streamers/tasks.md +#: support/documentation/content/en/intro/_index.md +#, no-wrap +msgid "Introduction" +msgstr "Einführung" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "As a streamer, you can choose to delay messages in the chat, to let some time to moderators to delete messages before they can even be read by other participants." +msgstr "Als Streamer können Sie Nachrichten im Chat verzögern, um Moderatoren etwas Zeit zu geben, Nachrichten zu löschen, bevor sie von anderen Teilnehmern gelesen werden können." + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "When this feature is enabled, moderators will see all messages without any delay. Chat participants won't see that their own messages are delayed." +msgstr "Wenn diese Funktion aktiviert ist, sehen die Moderatoren alle Nachrichten ohne Verzögerung. Die Chat-Teilnehmer sehen nicht, dass ihre eigenen Nachrichten verzögert sind." + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "Please note that messages sent by moderators will also be delayed, to avoid them to respond to messages that are not even visible by other participants." +msgstr "Bitte beachten Sie, dass Nachrichten, die von Moderatoren gesendet werden, ebenfalls verzögert werden, um zu vermeiden, dass sie auf Nachrichten antworten, die für andere Teilnehmer gar nicht sichtbar sind." + +#. type: Title ## +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#, no-wrap +msgid "Moderation delay option" +msgstr "Moderationverzögerungs-Optionen" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "On the [channel configuration page](/peertube-plugin-livechat/documentation/user/streamers/channel), you can set the \"{{% livechat_label moderation_delay %}}\" option:" +msgstr "Auf der [Kanal Konfigurationsseite](/peertube-plugin-livechat/de/documentation/user/streamers/channel) können Sie die Option \"{{% livechat_label moderation_delay %}}\" einstellen:" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "![Channel configuration / Moderation delay](/peertube-plugin-livechat/images/moderation_delay_channel_option.png?classes=shadow,border&height=400px)" +msgstr "![Kanalkonfiguration / Moderationsverzögerung](/peertube-plugin-livechat/images/moderation_delay_channel_option.png?classes=shadow,border&height=400px)" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#: support/documentation/content/en/documentation/user/streamers/slow_mode.md +msgid "This value will apply as a default value for all your channel's chatrooms." +msgstr "Dieser Wert gilt als Standardwert für alle Chaträume deines Kanals." + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#: support/documentation/content/en/documentation/user/streamers/slow_mode.md +msgid "Setting the value to `0` will disable the feature." +msgstr "Wird der Wert auf \"0\" gesetzt, wird die Funktion deaktiviert." + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "Setting the value to a positive integer will set the delay, in seconds, to apply to messages. Please avoid setting the value too high. Ideally it should not exceed a few seconds (4 or 5 seconds for example)." +msgstr "Wenn Sie den Wert auf eine positive ganze Zahl setzen, wird die Verzögerung in Sekunden festgelegt, die für die Nachrichten gelten soll. Der Wert sollte nicht zu hoch angesetzt werden. Idealerweise sollte er nicht mehr als ein paar Sekunden betragen (z. B. 4 oder 5 Sekunden)." + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "To modify the value for an already existing room, just open the room \"configuration\" menu (on top of the chat window), and change the moderation delay value in the configuration form." +msgstr "Um den Wert für einen bereits bestehenden Raum zu ändern, öffnen Sie einfach das Raum-Konfigurationsmenü (oben im Chat-Fenster) und ändern Sie den Wert für die Moderationsverzögerung im Konfigurationsformular." + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "Currently, this feature has one known bug: users that join the chat will get all messages, even messages that are still pending for other participants. However, messages sent after they joined will be delayed correctly." +msgstr "" + +#. type: Title ## +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#, fuzzy, no-wrap +#| msgid "Share the chat" +msgid "In the chat" +msgstr "Teilen Sie den Chat" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +msgid "As a moderator, you will see the remaining time (in seconds) before the message is broadcasted, just besides the message datetime." +msgstr "" + +#. type: Plain text +#: support/documentation/content/en/documentation/user/streamers/moderation_delay.md +#, fuzzy +#| msgid "![Channel configuration / Moderation delay](/peertube-plugin-livechat/images/moderation_delay_channel_option.png?classes=shadow,border&height=400px)" +msgid "![Moderation delay timer](/peertube-plugin-livechat/images/moderation_delay_timer.png?classes=shadow,border)" +msgstr "![Kanalkonfiguration / Moderationsverzögerung](/peertube-plugin-livechat/images/moderation_delay_channel_option.png?classes=shadow,border&height=400px)" + #. type: Yaml Front Matter Hash Value: description #: build/documentation/pot_in/documentation/user/streamers/moderation.md #, no-wrap @@ -3236,7 +3337,9 @@ msgstr "Über das [Chat Dropdown Menü](/peertube-plugin-livechat/de/documentati #. type: Plain text #: build/documentation/pot_in/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, ..." +#, fuzzy +#| 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, ..." +msgid "The video owner will be owner of the chat room. This means they 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 @@ -3348,8 +3451,7 @@ msgstr "Von dort aus kannst du dich auch als Moderator des Raums bewerben, indem #: 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." +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 @@ -3366,26 +3468,17 @@ 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:" +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)" +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." +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 @@ -3401,29 +3494,22 @@ 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" +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" +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" +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" +msgstr "\"Auswahl N\": Auswahlmöglichkeiten, die den Zuschauern präsentiert werden" #. type: Plain text #: support/documentation/content/en/documentation/user/streamers/polls.md @@ -3438,9 +3524,7 @@ 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." +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 @@ -3452,33 +3536,22 @@ 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." +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 %}}\"." +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." +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." +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 @@ -3489,30 +3562,22 @@ 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." +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." +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)" +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." +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 @@ -3522,63 +3587,42 @@ 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." +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)" +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." +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." +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." +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." +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)" +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." +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 @@ -3597,14 +3641,6 @@ msgstr "Langsamer Modus" msgid "This feature comes with the livechat plugin version 8.3.0." msgstr "Diese Funktion wird mit dem Livechatplugin Version 8.3.0 verfügbar sein." -#. type: Yaml Front Matter Hash Value: title -#: support/documentation/content/en/documentation/user/streamers/slow_mode.md -#: support/documentation/content/en/documentation/user/streamers/tasks.md -#: support/documentation/content/en/intro/_index.md -#, no-wrap -msgid "Introduction" -msgstr "Einführung" - #. type: Plain text #: support/documentation/content/en/documentation/user/streamers/slow_mode.md msgid "As a streamer, you can choose to rate limit your viewers messages in the chat." @@ -3651,16 +3687,6 @@ msgstr "Auf der [Kanal Konfigurations Seite](/peertube-plugin-livechat/de/docume msgid "![Channel configuration / Slow Mode](/peertube-plugin-livechat/images/slow_mode_channel_option.png?classes=shadow,border&height=400px)" msgstr "![Kanalkonfiguration / Langsamer Modus](/peertube-plugin-livechat/images/slow_mode_channel_option.png?classes=shadow,border&height=400px)" -#. type: Plain text -#: support/documentation/content/en/documentation/user/streamers/slow_mode.md -msgid "This value will apply as a default value for all your channel's chatrooms." -msgstr "Dieser Wert gilt als Standardwert für alle Chaträume deines Kanals." - -#. type: Plain text -#: support/documentation/content/en/documentation/user/streamers/slow_mode.md -msgid "Setting the value to `0` will disable the feature." -msgstr "Wird der Wert auf \"0\" gesetzt, wird die Funktion deaktiviert." - #. type: Plain text #: support/documentation/content/en/documentation/user/streamers/slow_mode.md msgid "Setting the value to a positive integer will set the period during which users will not be able to post additional messages." @@ -3999,7 +4025,7 @@ msgstr "Benutzer können die Nutzungsbedingungen ausblenden. Wenn Sie dies tun, #. 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." +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, coming 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 @@ -4477,34 +4503,28 @@ msgid "If you are a webdesigner or a ConverseJS/Prosody/XMPP expert, and want to msgstr "Wenn Sie ein Webdesigner oder ein ConverseJS/Prosody/XMPP-Experte sind und helfen wollen, dieses Plugin zu verbessern, sind Sie gerne willkommen." #, fuzzy, no-wrap -#~| msgid "The plugin is maintained by [John Livingston](https://www.john-livingston.fr/)." #~ msgid "" #~ "