Software / code / prosody
Comparison
plugins/mod_mam/mod_mam.lua @ 12306:81fc7fc77e68
mod_mam: Allow plugging into archive decision
Similar procedure as mod_csi_simple
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Fri, 10 Dec 2021 22:37:32 +0100 |
| parent | 12234:1c47162dd965 |
| child | 12307:dcad3a207915 |
comparison
equal
deleted
inserted
replaced
| 12305:f8b8061461e3 | 12306:81fc7fc77e68 |
|---|---|
| 309 end); | 309 end); |
| 310 end | 310 end |
| 311 return stanza; | 311 return stanza; |
| 312 end | 312 end |
| 313 | 313 |
| 314 local function should_store(stanza, c2s) --> boolean, reason: string | 314 local function should_store(stanza) --> boolean, reason: string |
| 315 local st_type = stanza.attr.type or "normal"; | 315 local st_type = stanza.attr.type or "normal"; |
| 316 -- FIXME pass direction of stanza and use that along with bare/full JID addressing | 316 -- FIXME pass direction of stanza and use that along with bare/full JID addressing |
| 317 -- for more accurate MUC / type=groupchat check | 317 -- for more accurate MUC / type=groupchat check |
| 318 | 318 |
| 319 if st_type == "headline" then | 319 if st_type == "headline" then |
| 320 -- Headline messages are ephemeral by definition | 320 -- Headline messages are ephemeral by definition |
| 321 return false, "headline"; | 321 return false, "headline"; |
| 322 end | 322 end |
| 323 if st_type == "error" and not c2s then | 323 if st_type == "error" then |
| 324 -- Errors not sent sent from a local client | 324 -- Errors not sent sent from a local client |
| 325 -- Why would a client send an error anyway? | 325 -- Why would a client send an error anyway? |
| 326 if jid_resource(stanza.attr.to) then | 326 if jid_resource(stanza.attr.to) then |
| 327 -- Store delivery failure notifications so you know if your own messages | 327 -- Store delivery failure notifications so you know if your own messages |
| 328 -- were not delivered. | 328 -- were not delivered. |
| 378 -- The IM-NG thing to do here would be to return `not st_to_full` | 378 -- The IM-NG thing to do here would be to return `not st_to_full` |
| 379 -- One day ... | 379 -- One day ... |
| 380 return false, "default"; | 380 return false, "default"; |
| 381 end | 381 end |
| 382 | 382 |
| 383 module:hook("archive-should-store", function (event) | |
| 384 local should, why = should_store(event.stanza); | |
| 385 event.reason = why; | |
| 386 return should; | |
| 387 end, -1) | |
| 388 | |
| 383 -- Handle messages | 389 -- Handle messages |
| 384 local function message_handler(event, c2s) | 390 local function message_handler(event, c2s) |
| 385 local origin, stanza = event.origin, event.stanza; | 391 local origin, stanza = event.origin, event.stanza; |
| 386 local log = c2s and origin.log or module._log; | 392 local log = c2s and origin.log or module._log; |
| 387 local orig_from = stanza.attr.from; | 393 local orig_from = stanza.attr.from; |
| 394 local with = jid_bare(c2s and orig_to or orig_from); | 400 local with = jid_bare(c2s and orig_to or orig_from); |
| 395 | 401 |
| 396 -- Filter out <stanza-id> that claim to be from us | 402 -- Filter out <stanza-id> that claim to be from us |
| 397 event.stanza = strip_stanza_id(stanza, store_user); | 403 event.stanza = strip_stanza_id(stanza, store_user); |
| 398 | 404 |
| 399 local should, why = should_store(stanza, c2s); | 405 local event_payload = { stanza = stanza; session = origin }; |
| 406 local should = module:fire_event("archive-should-store", event_payload); | |
| 407 local why = event_payload.reason; | |
| 408 | |
| 400 if not should then | 409 if not should then |
| 401 log("debug", "Not archiving stanza: %s (%s)", stanza:top_tag(), why); | 410 log("debug", "Not archiving stanza: %s (%s)", stanza:top_tag(), event_payload.reason); |
| 402 return; | 411 return; |
| 403 end | 412 end |
| 404 | 413 |
| 405 local clone_for_storage; | 414 local clone_for_storage; |
| 406 if not strip_tags:empty() then | 415 if not strip_tags:empty() then |