Mercurial > prosody-modules
comparison mod_http_muc_log/mod_http_muc_log.lua @ 5656:c20b77e5e032
mod_http_muc_log: Correctly handle changed or retracted reactions
Since per XEP-0444 each reaction should overwrite all previous reactions
on a particular message from a particular occupant.
Previously repeated reactions would be counted again and retractions
were not handled.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Tue, 19 Sep 2023 13:22:00 +0200 |
| parents | b681948a01f1 |
| children | 0ee77be396b9 |
comparison
equal
deleted
inserted
replaced
| 5655:1cae6133e315 | 5656:c20b77e5e032 |
|---|---|
| 405 if reactions then | 405 if reactions then |
| 406 -- COMPAT Movim uses an @to attribute instead of the correct @id | 406 -- COMPAT Movim uses an @to attribute instead of the correct @id |
| 407 local target_id = reactions.attr.id or reactions.attr.to; | 407 local target_id = reactions.attr.id or reactions.attr.to; |
| 408 for n = i - 1, 1, -1 do | 408 for n = i - 1, 1, -1 do |
| 409 if logs[n].archive_id == target_id then | 409 if logs[n].archive_id == target_id then |
| 410 local react_map = logs[n].reactions; -- { string : integer } | 410 local react_map = logs[n].reactions; -- [occupant_id][emoji]boolean |
| 411 if not react_map then | 411 if not react_map then |
| 412 react_map = {}; | 412 react_map = {}; |
| 413 logs[n].reactions = react_map; | 413 logs[n].reactions = react_map; |
| 414 end | 414 end |
| 415 local reacts = {}; | |
| 415 for reaction_tag in reactions:childtags("reaction") do | 416 for reaction_tag in reactions:childtags("reaction") do |
| 416 -- FIXME This doesn't replace previous reactions by the same user | |
| 417 -- on the same message. | |
| 418 local reaction_text = reaction_tag:get_text() or "�"; | 417 local reaction_text = reaction_tag:get_text() or "�"; |
| 419 react_map[reaction_text] = (react_map[reaction_text] or 0) + 1; | 418 reacts[reaction_text] = true; |
| 420 end | 419 end |
| 420 react_map[occupant_id] = reacts; | |
| 421 break | 421 break |
| 422 end | 422 end |
| 423 end | 423 end |
| 424 end | 424 end |
| 425 | 425 |
| 456 first = first or archive_id; | 456 first = first or archive_id; |
| 457 last = archive_id; | 457 last = archive_id; |
| 458 end | 458 end |
| 459 if i == 1 and not lazy then return end -- No items | 459 if i == 1 and not lazy then return end -- No items |
| 460 | 460 |
| 461 -- collapse reactions[occupant-id][reaction]boolean into reactions[reaction]integer | |
| 462 for n = 1, #logs do | |
| 463 local reactions = logs[n].reactions; | |
| 464 if reactions then | |
| 465 local collated = {}; | |
| 466 for _, reacts in pairs(reactions) do | |
| 467 for reaction_text in pairs(reacts) do | |
| 468 collated[reaction_text] = (collated[reaction_text] or 0) + 1; | |
| 469 end | |
| 470 end | |
| 471 logs[n].reactions = collated; | |
| 472 end | |
| 473 end | |
| 474 | |
| 461 local next_when, prev_when = "", ""; | 475 local next_when, prev_when = "", ""; |
| 462 local date_list = archive.dates and archive:dates(room); | 476 local date_list = archive.dates and archive:dates(room); |
| 463 if date_list then | 477 if date_list then |
| 464 for j = 1, #date_list do | 478 for j = 1, #date_list do |
| 465 if date_list[j] == date then | 479 if date_list[j] == date then |
