From 4168b2ce417bc2050727c5623ca9021a2770fa6a Mon Sep 17 00:00:00 2001 From: John Livingston Date: Thu, 4 Jul 2024 14:04:33 +0200 Subject: [PATCH] Poll WIP (#231): * various fix and improvements --- conversejs/custom/plugins/poll/index.js | 16 +++++++++++++--- prosody-modules/mod_muc_poll/README.md | 16 ++++++++++++++++ prosody-modules/mod_muc_poll/message.lib.lua | 9 ++++++--- prosody-modules/mod_muc_poll/mod_muc_poll.lua | 5 ++++- server/lib/prosody/config.ts | 2 ++ server/lib/prosody/config/content.ts | 10 ++++++++-- 6 files changed, 49 insertions(+), 9 deletions(-) diff --git a/conversejs/custom/plugins/poll/index.js b/conversejs/custom/plugins/poll/index.js index d5daebcc..fae612a3 100644 --- a/conversejs/custom/plugins/poll/index.js +++ b/conversejs/custom/plugins/poll/index.js @@ -69,9 +69,14 @@ converse.plugins.add('livechat-converse-poll', { if (!attrs.current_poll) { return this.__super__.onMessage(attrs) } - // We intercept poll messages, so they won't show up in the chat as classic messages. - if (attrs.is_delayed) { - console.info('Got a delayed poll message, just dropping') + // We intercept poll messages, to show the banner. + // Note: we also show the message in the chat. + if (attrs.is_delayed || attrs.is_archived) { + if (attrs.current_poll.over) { + console.info('Got a delayed/archived poll message for an poll that is over, just displaying in the chat') + return this.__super__.onMessage(attrs) + } + console.info('Got a delayed/archived poll message, just dropping') return } @@ -79,6 +84,11 @@ converse.plugins.add('livechat-converse-poll', { this.set('current_poll', attrs.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. + if (attrs.current_poll.over) { + console.info('The poll is over, displaying the message in the chat') + return this.__super__.onMessage(attrs) + } + // Dropping the message. } } } diff --git a/prosody-modules/mod_muc_poll/README.md b/prosody-modules/mod_muc_poll/README.md index f29d7621..49f6f025 100644 --- a/prosody-modules/mod_muc_poll/README.md +++ b/prosody-modules/mod_muc_poll/README.md @@ -13,3 +13,19 @@ There will probably be a XEP proposal for this module behaviour. When done, this ## 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: 500 + +## 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 diff --git a/prosody-modules/mod_muc_poll/message.lib.lua b/prosody-modules/mod_muc_poll/message.lib.lua index 601ce217..ce282328 100644 --- a/prosody-modules/mod_muc_poll/message.lib.lua +++ b/prosody-modules/mod_muc_poll/message.lib.lua @@ -17,18 +17,21 @@ 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"; + -- construct the poll message stanza local function build_poll_message(room, message_id, is_end_message) local current_poll = room._data.current_poll; if not current_poll then return nil; end - local from = room.jid .. '/' .. current_poll.occupant_nick; + local from = current_poll.occupant_nick; -- this is in fact room.jid/nickname local content = current_poll["muc#roompoll_question"] .. "\n"; if is_end_message then - content = content .. "This poll is now over.\n"; + content = content .. string_poll_over .. "\n"; end local total = 0; @@ -47,7 +50,7 @@ local function build_poll_message(room, message_id, is_end_message) end if not is_end_message then - content = content .. "Send a message with an exclamation mark followed by your choice number to vote. Example: !1\n"; + content = content .. string_poll_vote_instructions .. "\n"; end local msg = st.message({ diff --git a/prosody-modules/mod_muc_poll/mod_muc_poll.lua b/prosody-modules/mod_muc_poll/mod_muc_poll.lua index a8c8600c..44e376fd 100644 --- a/prosody-modules/mod_muc_poll/mod_muc_poll.lua +++ b/prosody-modules/mod_muc_poll/mod_muc_poll.lua @@ -23,6 +23,9 @@ local remove_specific_tags_from_groupchat = module:require("message").remove_spe 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 500; + + -- new poll creation, get form module:hook("iq-get/bare/" .. xmlns_poll .. ":query", function (event) local origin, stanza = event.origin, event.stanza; @@ -81,7 +84,7 @@ 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, 1000); +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); diff --git a/server/lib/prosody/config.ts b/server/lib/prosody/config.ts index d8f8bd54..8b2d49b9 100644 --- a/server/lib/prosody/config.ts +++ b/server/lib/prosody/config.ts @@ -366,6 +366,8 @@ async function getProsodyConfig (options: RegisterServerOptionsV5): Promise