Mercurial > prosody-modules
comparison mod_smacks/mod_smacks.lua @ 3983:effe2d93a59c
mod_smacks: Fix mam handling
author | tmolitor <thilo@eightysoft.de> |
---|---|
date | Mon, 20 Apr 2020 14:40:09 +0200 |
parents | bf5d91769f99 |
children | 4e5fde519116 |
comparison
equal
deleted
inserted
replaced
3982:ab065ff4628b | 3983:effe2d93a59c |
---|---|
418 end | 418 end |
419 end | 419 end |
420 end | 420 end |
421 | 421 |
422 -- don't send delivery errors for messages which will be delivered by mam later on | 422 -- don't send delivery errors for messages which will be delivered by mam later on |
423 local function has_stanza_id(stanza, by_jid) | |
424 for tag in stanza:childtags("stanza-id", "urn:xmpp:sid:0") do | |
425 if tag.attr.by == by_jid and tag.attr.id then | |
426 return true | |
427 end | |
428 end | |
429 return false; | |
430 | |
431 end | |
423 module:hook("delivery/failure", function(event) | 432 module:hook("delivery/failure", function(event) |
424 local session, stanza = event.session, event.stanza; | 433 local session, stanza = event.session, event.stanza; |
425 -- Only deal with authenticated (c2s) sessions | 434 -- Only deal with authenticated (c2s) sessions |
426 if session.username then | 435 if session.username then |
427 if stanza.name == "message" and stanza.attr.xmlns == nil and | 436 if stanza.name == "message" and stanza.attr.xmlns == nil and |
428 ( stanza.attr.type == "chat" or ( stanza.attr.type or "normal" ) == "normal" ) then | 437 ( stanza.attr.type == "chat" or ( stanza.attr.type or "normal" ) == "normal" ) then |
429 -- do nothing here for normal messages and don't send out "message delivery errors", | 438 -- do nothing here for normal messages and don't send out "message delivery errors", |
430 -- because messages are already in MAM at this point (no need to frighten users) | 439 -- because messages are already in MAM at this point (no need to frighten users) |
431 if session.mam_requested and stanza._was_archived then | 440 if session.mam_requested and has_stanza_id(stanza, jid.bare(session.full_jid) then |
441 session.log("debug", "mod_smacks delivery/failuere returning true for mam-handled stanza"); | |
432 return true; -- stanza handled, don't send an error | 442 return true; -- stanza handled, don't send an error |
433 end | 443 end |
434 -- store message in offline store, if this client does not use mam *and* was the last client online | 444 -- store message in offline store, if this client does not use mam *and* was the last client online |
435 local sessions = prosody.hosts[module.host].sessions[session.username] and | 445 local sessions = prosody.hosts[module.host].sessions[session.username] and |
436 prosody.hosts[module.host].sessions[session.username].sessions or nil; | 446 prosody.hosts[module.host].sessions[session.username].sessions or nil; |
437 if sessions and next(sessions) == session.resource and next(sessions, session.resource) == nil then | 447 if sessions and next(sessions) == session.resource and next(sessions, session.resource) == nil then |
438 module:fire_event("message/offline/handle", { origin = session, stanza = stanza } ); | 448 local ok = module:fire_event("message/offline/handle", { origin = session, stanza = stanza } ); |
439 return true; -- stanza handled, don't send an error | 449 session.log("debug", "mod_smacks delivery/failuere returning %s for offline-handled stanza", tostring(ok)); |
450 return ok; -- if stanza was handled, don't send an error | |
440 end | 451 end |
441 end | 452 end |
442 end | 453 end |
443 end); | 454 end); |
444 | 455 |