Commit be6a5d9c authored by JC Brand's avatar JC Brand

Reuse XEP-359 unique and stable stanza ids for Message `id`.

This helps us to avoid duplicates by relying on the fact that Backbone
models have unique ids.
parent 49da3424
...@@ -49782,9 +49782,12 @@ _converse_headless_converse_core__WEBPACK_IMPORTED_MODULE_5__["default"].plugins ...@@ -49782,9 +49782,12 @@ _converse_headless_converse_core__WEBPACK_IMPORTED_MODULE_5__["default"].plugins
}, },
onDrop(evt) { onDrop(evt) {
if (evt.dataTransfer.files.length == 0) // There are no files to be dropped, so this isn’t a file if (evt.dataTransfer.files.length == 0) {
// There are no files to be dropped, so this isn’t a file
// transfer operation. // transfer operation.
return; return;
}
evt.preventDefault(); evt.preventDefault();
this.model.sendFiles(evt.dataTransfer.files); this.model.sendFiles(evt.dataTransfer.files);
}, },
...@@ -62018,7 +62021,7 @@ _converse_core__WEBPACK_IMPORTED_MODULE_2__["default"].plugins.add('converse-cha ...@@ -62018,7 +62021,7 @@ _converse_core__WEBPACK_IMPORTED_MODULE_2__["default"].plugins.add('converse-cha
if (markers.length === 0) { if (markers.length === 0) {
return false; return false;
} else if (markers.length > 1) { } else if (markers.length > 1) {
_converse.log('onMessage: Ignoring incoming stanza with multiple message markers', Strophe.LogLevel.ERROR); _converse.log('handleChatMarker: Ignoring incoming stanza with multiple message markers', Strophe.LogLevel.ERROR);
_converse.log(stanza, Strophe.LogLevel.ERROR); _converse.log(stanza, Strophe.LogLevel.ERROR);
...@@ -62187,10 +62190,12 @@ _converse_core__WEBPACK_IMPORTED_MODULE_2__["default"].plugins.add('converse-cha ...@@ -62187,10 +62190,12 @@ _converse_core__WEBPACK_IMPORTED_MODULE_2__["default"].plugins.add('converse-cha
}, },
getOutgoingMessageAttributes(text, spoiler_hint) { getOutgoingMessageAttributes(text, spoiler_hint) {
const is_spoiler = this.get('composing_spoiler'); const is_spoiler = this.get('composing_spoiler'),
origin_id = _converse.connection.getUniqueId();
return _.extend(this.toJSON(), { return _.extend(this.toJSON(), {
'id': _converse.connection.getUniqueId(), 'id': origin_id,
'origin_id': _converse.connection.getUniqueId(), 'origin_id': origin_id,
'fullname': _converse.xmppstatus.get('fullname'), 'fullname': _converse.xmppstatus.get('fullname'),
'from': _converse.bare_jid, 'from': _converse.bare_jid,
'sender': 'me', 'sender': 'me',
...@@ -62315,6 +62320,12 @@ _converse_core__WEBPACK_IMPORTED_MODULE_2__["default"].plugins.add('converse-cha ...@@ -62315,6 +62320,12 @@ _converse_core__WEBPACK_IMPORTED_MODULE_2__["default"].plugins.add('converse-cha
}, },
getStanzaIDs(stanza) { getStanzaIDs(stanza) {
/* Extract the XEP-0359 stanza IDs from the passed in stanza
* and return a map containing them.
*
* Parameters:
* (XMLElement) stanza - The message stanza
*/
const attrs = {}; const attrs = {};
const stanza_ids = sizzle(`stanza-id[xmlns="${Strophe.NS.SID}"]`, stanza); const stanza_ids = sizzle(`stanza-id[xmlns="${Strophe.NS.SID}"]`, stanza);
...@@ -62329,6 +62340,12 @@ _converse_core__WEBPACK_IMPORTED_MODULE_2__["default"].plugins.add('converse-cha ...@@ -62329,6 +62340,12 @@ _converse_core__WEBPACK_IMPORTED_MODULE_2__["default"].plugins.add('converse-cha
attrs[`stanza_id ${by_jid}`] = result.getAttribute('id'); attrs[`stanza_id ${by_jid}`] = result.getAttribute('id');
} }
const origin_id = sizzle(`origin-id[xmlns="${Strophe.NS.SID}"]`, stanza).pop();
if (origin_id) {
attrs['origin_id'] = origin_id.getAttribute('id');
}
return attrs; return attrs;
}, },
...@@ -62388,8 +62405,10 @@ _converse_core__WEBPACK_IMPORTED_MODULE_2__["default"].plugins.add('converse-cha ...@@ -62388,8 +62405,10 @@ _converse_core__WEBPACK_IMPORTED_MODULE_2__["default"].plugins.add('converse-cha
if (spoiler) { if (spoiler) {
attrs.spoiler_hint = spoiler.textContent.length > 0 ? spoiler.textContent : ''; attrs.spoiler_hint = spoiler.textContent.length > 0 ? spoiler.textContent : '';
} } // We prefer to use one of the XEP-0359 unique and stable stanza IDs as the Model id, to avoid duplicates.
attrs['id'] = attrs['origin_id'] || attrs[`stanza_id ${attrs.from}`] || _converse.connection.getUniqueId();
return attrs; return attrs;
}, },
...@@ -405,10 +405,11 @@ converse.plugins.add('converse-chatview', { ...@@ -405,10 +405,11 @@ converse.plugins.add('converse-chatview', {
}, },
onDrop (evt) { onDrop (evt) {
if (evt.dataTransfer.files.length == 0) if (evt.dataTransfer.files.length == 0) {
// There are no files to be dropped, so this isn’t a file // There are no files to be dropped, so this isn’t a file
// transfer operation. // transfer operation.
return; return;
}
evt.preventDefault(); evt.preventDefault();
this.model.sendFiles(evt.dataTransfer.files); this.model.sendFiles(evt.dataTransfer.files);
}, },
......
...@@ -380,7 +380,7 @@ converse.plugins.add('converse-chatboxes', { ...@@ -380,7 +380,7 @@ converse.plugins.add('converse-chatboxes', {
return false; return false;
} else if (markers.length > 1) { } else if (markers.length > 1) {
_converse.log( _converse.log(
'onMessage: Ignoring incoming stanza with multiple message markers', 'handleChatMarker: Ignoring incoming stanza with multiple message markers',
Strophe.LogLevel.ERROR Strophe.LogLevel.ERROR
); );
_converse.log(stanza, Strophe.LogLevel.ERROR); _converse.log(stanza, Strophe.LogLevel.ERROR);
...@@ -508,10 +508,12 @@ converse.plugins.add('converse-chatboxes', { ...@@ -508,10 +508,12 @@ converse.plugins.add('converse-chatboxes', {
}, },
getOutgoingMessageAttributes (text, spoiler_hint) { getOutgoingMessageAttributes (text, spoiler_hint) {
const is_spoiler = this.get('composing_spoiler'); const is_spoiler = this.get('composing_spoiler'),
origin_id = _converse.connection.getUniqueId();
return _.extend(this.toJSON(), { return _.extend(this.toJSON(), {
'id': _converse.connection.getUniqueId(), 'id': origin_id,
'origin_id': _converse.connection.getUniqueId(), 'origin_id': origin_id,
'fullname': _converse.xmppstatus.get('fullname'), 'fullname': _converse.xmppstatus.get('fullname'),
'from': _converse.bare_jid, 'from': _converse.bare_jid,
'sender': 'me', 'sender': 'me',
...@@ -628,6 +630,12 @@ converse.plugins.add('converse-chatboxes', { ...@@ -628,6 +630,12 @@ converse.plugins.add('converse-chatboxes', {
}, },
getStanzaIDs (stanza) { getStanzaIDs (stanza) {
/* Extract the XEP-0359 stanza IDs from the passed in stanza
* and return a map containing them.
*
* Parameters:
* (XMLElement) stanza - The message stanza
*/
const attrs = {}; const attrs = {};
const stanza_ids = sizzle(`stanza-id[xmlns="${Strophe.NS.SID}"]`, stanza); const stanza_ids = sizzle(`stanza-id[xmlns="${Strophe.NS.SID}"]`, stanza);
if (stanza_ids.length) { if (stanza_ids.length) {
...@@ -638,6 +646,11 @@ converse.plugins.add('converse-chatboxes', { ...@@ -638,6 +646,11 @@ converse.plugins.add('converse-chatboxes', {
const by_jid = stanza.getAttribute('from'); const by_jid = stanza.getAttribute('from');
attrs[`stanza_id ${by_jid}`] = result.getAttribute('id'); attrs[`stanza_id ${by_jid}`] = result.getAttribute('id');
} }
const origin_id = sizzle(`origin-id[xmlns="${Strophe.NS.SID}"]`, stanza).pop();
if (origin_id) {
attrs['origin_id'] = origin_id.getAttribute('id');
}
return attrs; return attrs;
}, },
...@@ -678,6 +691,7 @@ converse.plugins.add('converse-chatboxes', { ...@@ -678,6 +691,7 @@ converse.plugins.add('converse-chatboxes', {
'type': stanza.getAttribute('type') 'type': stanza.getAttribute('type')
}, this.getStanzaIDs(original_stanza)); }, this.getStanzaIDs(original_stanza));
if (attrs.type === 'groupchat') { if (attrs.type === 'groupchat') {
attrs.from = stanza.getAttribute('from'); attrs.from = stanza.getAttribute('from');
attrs.nick = Strophe.unescapeNode(Strophe.getResourceFromJid(attrs.from)); attrs.nick = Strophe.unescapeNode(Strophe.getResourceFromJid(attrs.from));
...@@ -699,6 +713,8 @@ converse.plugins.add('converse-chatboxes', { ...@@ -699,6 +713,8 @@ converse.plugins.add('converse-chatboxes', {
if (spoiler) { if (spoiler) {
attrs.spoiler_hint = spoiler.textContent.length > 0 ? spoiler.textContent : ''; attrs.spoiler_hint = spoiler.textContent.length > 0 ? spoiler.textContent : '';
} }
// We prefer to use one of the XEP-0359 unique and stable stanza IDs as the Model id, to avoid duplicates.
attrs['id'] = attrs['origin_id'] || attrs[`stanza_id ${attrs.from}`] || _converse.connection.getUniqueId();
return attrs; return attrs;
}, },
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment