Moderation delay (#132):
* displaying the remaining time for moderators.
This commit is contained in:
@ -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,
|
||||
|
70
conversejs/lib/plugins/moderation-delay.ts
Normal file
70
conversejs/lib/plugins/moderation-delay.ts
Normal file
@ -0,0 +1,70 @@
|
||||
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
|
||||
//
|
||||
// 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<typeof Message.getDerivedMessageProps> {
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user