Przeglądaj źródła

After reconnection, fetch new messages for private chats

JC Brand 7 lat temu
rodzic
commit
4df61cc496
2 zmienionych plików z 53 dodań i 0 usunięć
  1. 48 0
      src/converse-mam.js
  2. 5 0
      src/utils.js

+ 48 - 0
src/converse-mam.js

@@ -11,6 +11,7 @@
 (function (root, factory) {
     define(["sizzle",
             "converse-core",
+            "utils",
             "converse-disco",
             "converse-chatview", // Could be made a soft dependency
             "converse-muc", // Could be made a soft dependency
@@ -18,6 +19,7 @@
     ], factory);
 }(this, function (sizzle, converse, utils) {
     "use strict";
+    const CHATROOMS_TYPE = 'chatroom';
     const { Promise, Strophe, $iq, _, moment } = converse.env;
 
     const RSM_ATTRIBUTES = ['max', 'first', 'last', 'after', 'before', 'index', 'count'];
@@ -53,6 +55,45 @@
                     return result;
                 },
 
+                fetchNewestMessages () {
+                    /* Fetches messages that might have been archived *after*
+                     * the last archived message in our local cache.
+                     */
+                    if (this.disable_mam) { return; }
+                    const { _converse } = this.__super__;
+                    this.addSpinner();
+
+                    _converse.api.disco.supports(Strophe.NS.MAM, _converse.bare_jid).then(
+                        (result) => { // Success
+                            if (result.supported) {
+                                const most_recent_msg = utils.getMostRecentMessage(this.model);
+                                const archive_id = most_recent_msg.get('archive_id');
+                                if (archive_id) {
+                                    this.fetchArchivedMessages({
+                                        'after': most_recent_msg.get('archive_id')
+                                    });
+                                } else {
+                                    this.fetchArchivedMessages({
+                                        'start': most_recent_msg.get('time')
+                                    });
+                                }
+                            } else {
+                                this.clearSpinner();
+                            }
+                        },
+                        () => { // Error
+                            this.clearSpinner();
+                            _converse.log(
+                                "Error or timeout while checking for MAM support",
+                                Strophe.LogLevel.ERROR
+                            );
+                        }
+                    ).catch((msg) => {
+                        this.clearSpinner();
+                        _converse.log(msg, Strophe.LogLevel.FATAL);
+                    });
+                },
+
                 fetchArchivedMessagesIfNecessary () {
                     /* Check if archived messages should be fetched, and if so, do so. */
                     if (this.disable_mam || this.model.get('mam_initialized')) {
@@ -385,6 +426,13 @@
                 chatboxview.fetchArchivedMessagesIfNecessary();
             });
 
+            _converse.on('reconnected', () => {
+                const private_chats = _converse.chatboxviews.filter(
+                    (view) => _.at(view, 'model.attributes.type')[0] === 'chatbox'
+                );
+                _.each(private_chats, (view) => view.fetchNewestMessages())
+            });
+
             _.extend(_converse.api, {
                 /* Extend default converse.js API to add methods specific to MAM
                  */

+ 5 - 0
src/utils.js

@@ -275,6 +275,11 @@
                 Strophe.getBareJidFromJid(jid2).toLowerCase();
     };
 
+    u.getMostRecentMessage = function (model) {
+        const messages = model.messages.filter('message');
+        return messages[messages.length-1];
+    }
+
     u.isNewMessage = function (message) {
         /* Given a stanza, determine whether it's a new
          * message, i.e. not a MAM archived one.