comparison mod_muc_cloud_notify/mod_muc_cloud_notify.lua @ 3570:8a93af85f319

mod_muc_cloud_notify: Count codepoints instead of bytes Still marked as a 'TODO' in XEP-0372, but Converse.js is counting codepoints, and rough consensus is that this is the easiest approach in the widest range of environments.
author Matthew Wild <mwild1@gmail.com>
date Thu, 02 May 2019 20:43:05 +0100
parents 408f92149774
children 3b8f4f3b1718
comparison
equal deleted inserted replaced
3569:cc4f7361dac7 3570:8a93af85f319
438 end 438 end
439 end 439 end
440 return pushes; 440 return pushes;
441 end 441 end
442 442
443 local function extract_reference(text, i, j)
444 -- COMPAT w/ pre-Lua 5.3
445 local c, pos, p1 = 0, 0, nil;
446 for char in text:gmatch("([%z\1-\127\194-\244][\128-\191]*)") do
447 c, pos = c + 1, pos + #char;
448 if not p1 and i < c then
449 p1 = pos;
450 end
451 if c == j then
452 return text:sub(p1, pos);
453 end
454 end
455 end
443 456
444 -- archive message added 457 -- archive message added
445 local function archive_message_added(event) 458 local function archive_message_added(event)
446 -- event is: { origin = origin, stanza = stanza, for_user = store_user, id = id } 459 -- event is: { origin = origin, stanza = stanza, for_user = store_user, id = id }
447 -- only notify for new mam messages when at least one device is online 460 -- only notify for new mam messages when at least one device is online
449 local stanza = event.stanza; 462 local stanza = event.stanza;
450 local body = stanza:get_child_text('body'); 463 local body = stanza:get_child_text('body');
451 464
452 for reference in stanza:childtags("reference", "urn:xmpp:reference:0") do 465 for reference in stanza:childtags("reference", "urn:xmpp:reference:0") do
453 if reference.attr['type'] == 'mention' and reference.attr['begin'] and reference.attr['end'] then 466 if reference.attr['type'] == 'mention' and reference.attr['begin'] and reference.attr['end'] then
454 local nick = body:sub(tonumber(reference.attr['begin'])+1, tonumber(reference.attr['end'])); 467 local nick = extract_reference(body, reference.attr['begin'], reference.attr['end']);
455 local jid = room:get_registered_jid(nick); 468 local jid = room:get_registered_jid(nick);
456 469
457 if room._occupants[room.jid..'/'..nick] then 470 if room._occupants[room.jid..'/'..nick] then
458 -- We only notify for members not currently in the room 471 -- We only notify for members not currently in the room
459 module:log("debug", "Not notifying %s, because he's currently in the room", jid); 472 module:log("debug", "Not notifying %s, because he's currently in the room", jid);