Poll WIP (#231):

* front end poll WIP
* backend fix
This commit is contained in:
John Livingston
2024-07-01 17:45:11 +02:00
parent 3ef0541886
commit 4591633400
10 changed files with 281 additions and 5 deletions

View File

@ -62,7 +62,7 @@ local function build_poll_message(room, message_id, is_end_message)
}):up();
-- now we must add some custom XML data, so that compatible clients can display the poll as they want:
-- <x-poll xmlns="http://jabber.org/protocol/muc#x-poll-message" id="I9UWyoxsz4BN" votes="1" over="">
-- <x-poll xmlns="http://jabber.org/protocol/muc#x-poll-message" id="I9UWyoxsz4BN" votes="1" end="1719842224" over="">
-- <x-poll-question>Poll question</x-poll-question>
-- <x-poll-choice choice="1" votes="0">Choice 1 label</x-poll-choice>
-- <x-poll-choice choice="2" votes="1">Choice 2 label</x-poll-choice>
@ -74,6 +74,7 @@ local function build_poll_message(room, message_id, is_end_message)
id = current_poll.poll_id,
votes = "" .. total
};
message_attrs["end"] = string.format("%i", current_poll.end_timestamp);
if current_poll.already_ended then
message_attrs["over"] = "";
end
@ -175,9 +176,23 @@ local function remove_specific_tags_from_groupchat(event)
end);
end
-- when a new session is opened, we must send the current poll to the client
local function handle_new_occupant_session(event)
local room = event.room;
if not room._data.current_poll then
return;
end
if room._data.current_poll.already_ended then
return;
end
schedule_poll_update_message(room.jid);
-- FIXME: for now we just schedule a new poll update. But we should only send a message to the new occupant.
end
return {
poll_start_message = poll_start_message;
poll_end_message = poll_end_message;
schedule_poll_update_message = schedule_poll_update_message;
remove_specific_tags_from_groupchat = remove_specific_tags_from_groupchat;
handle_new_occupant_session = handle_new_occupant_session;
};

View File

@ -19,7 +19,8 @@ local xmlns_poll = module:require("constants").xmlns_poll;
local send_form = module:require("form").send_form;
local process_form = module:require("form").process_form;
local handle_groupchat = module:require("poll").handle_groupchat;
local remove_specific_tags_from_groupchat = module:require("message").remove_specific_tags_from_groupchat
local remove_specific_tags_from_groupchat = module:require("message").remove_specific_tags_from_groupchat;
local handle_new_occupant_session = module:require("message").handle_new_occupant_session;
local room_restored = module:require("poll").room_restored;
-- new poll creation, get form
@ -85,7 +86,11 @@ module:hook("muc-occupant-groupchat", handle_groupchat, 1000);
-- security check: we must remove all specific tags, to be sure nobody tries to spoof polls!
module:hook("muc-occupant-groupchat", remove_specific_tags_from_groupchat, 1000);
-- when a room is restored (after a server restart for example),
-- we must resume any current poll
module:hook("muc-room-restored", room_restored);
-- when a new session is opened, we must send the current poll to the client
-- Note: it should be in the MAM. But it is easier for clients to ignore delayed messages
-- when displaying polls (to ignore old polls).
module:hook("muc-occupant-session-new", handle_new_occupant_session);