Software / code / prosody
Comparison
plugins/mod_mam/mod_mam.lua @ 8201:a0ad62a269df
Merge 0.10->trunk
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Mon, 28 Aug 2017 21:05:12 +0200 |
| parent | 8193:bb0118e46c45 |
| child | 8206:6de741ada3cd |
comparison
equal
deleted
inserted
replaced
| 8185:e89320b8a789 | 8201:a0ad62a269df |
|---|---|
| 241 local store_user = c2s and origin.username or jid_split(orig_to); | 241 local store_user = c2s and origin.username or jid_split(orig_to); |
| 242 -- And who are they chatting with? | 242 -- And who are they chatting with? |
| 243 local with = jid_bare(c2s and orig_to or orig_from); | 243 local with = jid_bare(c2s and orig_to or orig_from); |
| 244 | 244 |
| 245 -- Filter out <stanza-id> that claim to be from us | 245 -- Filter out <stanza-id> that claim to be from us |
| 246 stanza:maptags(function (tag) | 246 if stanza:get_child("stanza-id", xmlns_st_id) then |
| 247 if tag.name == "stanza-id" and tag.attr.xmlns == xmlns_st_id then | 247 stanza = st.clone(stanza); |
| 248 local by_user, by_host, res = jid_prepped_split(tag.attr.by); | 248 stanza:maptags(function (tag) |
| 249 if not res and by_host == module.host and by_user == store_user then | 249 if tag.name == "stanza-id" and tag.attr.xmlns == xmlns_st_id then |
| 250 return nil; | 250 local by_user, by_host, res = jid_prepped_split(tag.attr.by); |
| 251 if not res and by_host == module.host and by_user == store_user then | |
| 252 return nil; | |
| 253 end | |
| 251 end | 254 end |
| 252 end | 255 return tag; |
| 253 return tag; | 256 end); |
| 254 end); | 257 event.stanza = stanza; |
| 258 end | |
| 255 | 259 |
| 256 -- We store chat messages or normal messages that have a body | 260 -- We store chat messages or normal messages that have a body |
| 257 if not(orig_type == "chat" or (orig_type == "normal" and stanza:get_child("body")) ) then | 261 if not(orig_type == "chat" or (orig_type == "normal" and stanza:get_child("body")) ) then |
| 258 log("debug", "Not archiving stanza: %s (type)", stanza:top_tag()); | 262 log("debug", "Not archiving stanza: %s (type)", stanza:top_tag()); |
| 259 return; | 263 return; |
| 266 log("debug", "Not archiving stanza: %s (hint)", stanza:top_tag()); | 270 log("debug", "Not archiving stanza: %s (hint)", stanza:top_tag()); |
| 267 return; | 271 return; |
| 268 end | 272 end |
| 269 end | 273 end |
| 270 | 274 |
| 275 local clone_for_storage; | |
| 271 if not strip_tags:empty() then | 276 if not strip_tags:empty() then |
| 272 stanza = st.clone(stanza); | 277 clone_for_storage = st.clone(stanza); |
| 273 stanza:maptags(function (tag) | 278 clone_for_storage:maptags(function (tag) |
| 274 if strip_tags:contains(tag.attr.xmlns) then | 279 if strip_tags:contains(tag.attr.xmlns) then |
| 275 return nil; | 280 return nil; |
| 276 else | 281 else |
| 277 return tag; | 282 return tag; |
| 278 end | 283 end |
| 279 end); | 284 end); |
| 280 if #stanza.tags == 0 then | 285 if #clone_for_storage.tags == 0 then |
| 281 return; | 286 return; |
| 282 end | 287 end |
| 288 else | |
| 289 clone_for_storage = stanza; | |
| 283 end | 290 end |
| 284 | 291 |
| 285 -- Check with the users preferences | 292 -- Check with the users preferences |
| 286 if shall_store(store_user, with) then | 293 if shall_store(store_user, with) then |
| 287 log("debug", "Archiving stanza: %s", stanza:top_tag()); | 294 log("debug", "Archiving stanza: %s", stanza:top_tag()); |
| 288 | 295 |
| 289 -- And stash it | 296 -- And stash it |
| 290 local ok = archive:append(store_user, nil, stanza, time_now(), with); | 297 local ok = archive:append(store_user, nil, clone_for_storage, time_now(), with); |
| 291 if ok then | 298 if ok then |
| 299 local clone_for_other_handlers = st.clone(stanza); | |
| 292 local id = ok; | 300 local id = ok; |
| 293 event.stanza:tag("stanza-id", { xmlns = xmlns_st_id, by = store_user.."@"..host, id = id }):up(); | 301 clone_for_other_handlers:tag("stanza-id", { xmlns = xmlns_st_id, by = store_user.."@"..host, id = id }):up(); |
| 302 event.stanza = clone_for_other_handlers; | |
| 294 if cleanup then cleanup[store_user] = true; end | 303 if cleanup then cleanup[store_user] = true; end |
| 295 module:fire_event("archive-message-added", { origin = origin, stanza = stanza, for_user = store_user, id = id }); | 304 module:fire_event("archive-message-added", { origin = origin, stanza = clone_for_storage, for_user = store_user, id = id }); |
| 296 end | 305 end |
| 297 else | 306 else |
| 298 log("debug", "Not archiving stanza: %s (prefs)", stanza:top_tag()); | 307 log("debug", "Not archiving stanza: %s (prefs)", stanza:top_tag()); |
| 299 end | 308 end |
| 300 end | 309 end |