Explorar o código

muc_fetch_members now accepts an array of affiliations

JC Brand %!s(int64=5) %!d(string=hai) anos
pai
achega
62ef18a027
Modificáronse 5 ficheiros con 43 adicións e 16 borrados
  1. 1 0
      CHANGES.md
  2. 3 2
      docs/source/configuration.rst
  3. 25 4
      spec/muc.js
  4. 7 7
      src/headless/converse-muc.js
  5. 7 3
      tests/utils.js

+ 1 - 0
CHANGES.md

@@ -3,6 +3,7 @@
 
 
 ## 7.0.0 (Unreleased)
 ## 7.0.0 (Unreleased)
 
 
+- [muc_fetch_members](https://conversejs.org/docs/html/configuration.html#muc-fetch-members) now also accepts an array of affiliations to fetch.
 - Replace Backbone with [Skeletor](https://github.com/skeletorjs/skeletor)
 - Replace Backbone with [Skeletor](https://github.com/skeletorjs/skeletor)
 - Start using [lit-html](https://lit-html.polymer-project.org/) instead of lodash for templating.
 - Start using [lit-html](https://lit-html.polymer-project.org/) instead of lodash for templating.
 - Bugfix. Handle stanza that clears the MUC subject
 - Bugfix. Handle stanza that clears the MUC subject

+ 3 - 2
docs/source/configuration.rst

@@ -1079,6 +1079,8 @@ muc_fetch_members
 
 
 * Default:  ``true``
 * Default:  ``true``
 
 
+* Possible values: Array containing any of the following: ``['member', 'admin', 'owner']``
+
 Determines whether Converse.js will fetch the member lists for a MUC
 Determines whether Converse.js will fetch the member lists for a MUC
 (multi-user chat) when the user first enters it.
 (multi-user chat) when the user first enters it.
 
 
@@ -1091,8 +1093,7 @@ The member lists consists of three lists of users who have the affiliations
 ``member``, ``admin`` and ``owner`` respectively.
 ``member``, ``admin`` and ``owner`` respectively.
 
 
 By fetching member lists, Converse.js will always show these users as
 By fetching member lists, Converse.js will always show these users as
-participants of the MUC, which makes it behave a bit more like modern chat
-apps.
+participants of the MUC, giving them a permanent "presence" in the MUC.
 
 
 
 
 muc_history_max_stanzas
 muc_history_max_stanzas

+ 25 - 4
spec/muc.js

@@ -362,12 +362,11 @@
                         ['rosterGroupsFetched'], {'muc_fetch_members': true},
                         ['rosterGroupsFetched'], {'muc_fetch_members': true},
                         async function (done, _converse) {
                         async function (done, _converse) {
 
 
-                    const sent_IQs = _converse.connection.IQ_stanzas;
+                    let sent_IQs = _converse.connection.IQ_stanzas;
                     const muc_jid = 'lounge@montague.lit';
                     const muc_jid = 'lounge@montague.lit';
-                    spyOn(_converse.ChatRoomOccupants.prototype, 'fetchMembers').and.callThrough();
                     await test_utils.openAndEnterChatRoom(_converse, muc_jid, 'romeo');
                     await test_utils.openAndEnterChatRoom(_converse, muc_jid, 'romeo');
                     let view = _converse.chatboxviews.get(muc_jid);
                     let view = _converse.chatboxviews.get(muc_jid);
-                    expect(view.model.occupants.fetchMembers).toHaveBeenCalled();
+                    expect(sent_IQs.filter(iq => iq.querySelector('query item[affiliation]')).length).toBe(3);
 
 
                     // Check in reverse order that we requested all three lists
                     // Check in reverse order that we requested all three lists
                     const owner_iq = sent_IQs.pop();
                     const owner_iq = sent_IQs.pop();
@@ -387,11 +386,33 @@
                         `<iq id="${member_iq.getAttribute('id')}" to="${muc_jid}" type="get" xmlns="jabber:client">`+
                         `<iq id="${member_iq.getAttribute('id')}" to="${muc_jid}" type="get" xmlns="jabber:client">`+
                             `<query xmlns="http://jabber.org/protocol/muc#admin"><item affiliation="member"/></query>`+
                             `<query xmlns="http://jabber.org/protocol/muc#admin"><item affiliation="member"/></query>`+
                         `</iq>`);
                         `</iq>`);
+                    view.close();
 
 
+                    _converse.connection.IQ_stanzas = [];
+                    sent_IQs = _converse.connection.IQ_stanzas;
                     _converse.muc_fetch_members = false;
                     _converse.muc_fetch_members = false;
                     await test_utils.openAndEnterChatRoom(_converse, 'orchard@montague.lit', 'romeo');
                     await test_utils.openAndEnterChatRoom(_converse, 'orchard@montague.lit', 'romeo');
                     view = _converse.chatboxviews.get('orchard@montague.lit');
                     view = _converse.chatboxviews.get('orchard@montague.lit');
-                    expect(view.model.occupants.fetchMembers.calls.count()).toBe(1);
+                    expect(sent_IQs.filter(iq => iq.querySelector('query item[affiliation]')).length).toBe(0);
+                    await view.close();
+
+                    _converse.connection.IQ_stanzas = [];
+                    sent_IQs = _converse.connection.IQ_stanzas;
+                    _converse.muc_fetch_members = ['admin'];
+                    await test_utils.openAndEnterChatRoom(_converse, 'courtyard@montague.lit', 'romeo');
+                    view = _converse.chatboxviews.get('courtyard@montague.lit');
+                    expect(sent_IQs.filter(iq => iq.querySelector('query item[affiliation]')).length).toBe(1);
+                    expect(sent_IQs.filter(iq => iq.querySelector('query item[affiliation="admin"]')).length).toBe(1);
+                    view.close();
+
+                    _converse.connection.IQ_stanzas = [];
+                    sent_IQs = _converse.connection.IQ_stanzas;
+                    _converse.muc_fetch_members = ['owner'];
+                    await test_utils.openAndEnterChatRoom(_converse, 'garden@montague.lit', 'romeo');
+                    view = _converse.chatboxviews.get('garden@montague.lit');
+                    expect(sent_IQs.filter(iq => iq.querySelector('query item[affiliation]')).length).toBe(1);
+                    expect(sent_IQs.filter(iq => iq.querySelector('query item[affiliation="owner"]')).length).toBe(1);
+                    view.close();
                     done();
                     done();
                 }));
                 }));
 
 

+ 7 - 7
src/headless/converse-muc.js

@@ -460,9 +460,7 @@ converse.plugins.add('converse-muc', {
 
 
             async onConnectionStatusChanged () {
             async onConnectionStatusChanged () {
                 if (this.session.get('connection_status') === converse.ROOMSTATUS.ENTERED) {
                 if (this.session.get('connection_status') === converse.ROOMSTATUS.ENTERED) {
-                    if (_converse.muc_fetch_members) {
-                        await this.occupants.fetchMembers();
-                    }
+                    await this.occupants.fetchMembers();
                     await this.fetchMessages();
                     await this.fetchMessages();
                     await this.clearMessageQueue();
                     await this.clearMessageQueue();
                     /**
                     /**
@@ -1339,9 +1337,7 @@ converse.plugins.add('converse-muc', {
                 const aff_lists = await Promise.all(all_affiliations.map(a => this.getAffiliationList(a)));
                 const aff_lists = await Promise.all(all_affiliations.map(a => this.getAffiliationList(a)));
                 const old_members = aff_lists.reduce((acc, val) => (u.isErrorObject(val) ? acc: [...val, ...acc]), []);
                 const old_members = aff_lists.reduce((acc, val) => (u.isErrorObject(val) ? acc: [...val, ...acc]), []);
                 await this.setAffiliations(muc_utils.computeAffiliationsDelta(true, false, members, old_members));
                 await this.setAffiliations(muc_utils.computeAffiliationsDelta(true, false, members, old_members));
-                if (_converse.muc_fetch_members) {
-                    return this.occupants.fetchMembers();
-                }
+                await this.occupants.fetchMembers();
             },
             },
 
 
             /**
             /**
@@ -2228,7 +2224,11 @@ converse.plugins.add('converse-muc', {
             },
             },
 
 
             async fetchMembers () {
             async fetchMembers () {
-                const all_affiliations = ['member', 'admin', 'owner'];
+                const affs = _converse.muc_fetch_members;
+                const all_affiliations = Array.isArray(affs) ? affs :  (affs ? ['member', 'admin', 'owner'] : []);
+                if (affs.length === 0) {
+                    return;
+                }
                 const aff_lists = await Promise.all(all_affiliations.map(a => this.chatroom.getAffiliationList(a)));
                 const aff_lists = await Promise.all(all_affiliations.map(a => this.chatroom.getAffiliationList(a)));
                 const new_members = aff_lists.reduce((acc, val) => (u.isErrorObject(val) ? acc : [...val, ...acc]), []);
                 const new_members = aff_lists.reduce((acc, val) => (u.isErrorObject(val) ? acc : [...val, ...acc]), []);
                 const known_affiliations = all_affiliations.filter(a => !u.isErrorObject(aff_lists[all_affiliations.indexOf(a)]));
                 const known_affiliations = all_affiliations.filter(a => !u.isErrorObject(aff_lists[all_affiliations.indexOf(a)]));

+ 7 - 3
tests/utils.js

@@ -204,6 +204,9 @@
 
 
 
 
     utils.returnMemberLists = async function (_converse, muc_jid, members=[], affiliations=['member', 'owner', 'admin']) {
     utils.returnMemberLists = async function (_converse, muc_jid, members=[], affiliations=['member', 'owner', 'admin']) {
+        if (affiliations.length === 0) {
+            return;
+        }
         const stanzas = _converse.connection.IQ_stanzas;
         const stanzas = _converse.connection.IQ_stanzas;
 
 
         if (affiliations.includes('member')) {
         if (affiliations.includes('member')) {
@@ -302,9 +305,10 @@
         await room_creation_promise;
         await room_creation_promise;
         const view = _converse.chatboxviews.get(muc_jid);
         const view = _converse.chatboxviews.get(muc_jid);
         await u.waitUntil(() => (view.model.session.get('connection_status') === converse.ROOMSTATUS.ENTERED));
         await u.waitUntil(() => (view.model.session.get('connection_status') === converse.ROOMSTATUS.ENTERED));
-        if (_converse.muc_fetch_members) {
-            await utils.returnMemberLists(_converse, muc_jid, members);
-        }
+
+        const affs = _converse.muc_fetch_members;
+        const all_affiliations = Array.isArray(affs) ? affs :  (affs ? ['member', 'admin', 'owner'] : []);
+        await utils.returnMemberLists(_converse, muc_jid, members, all_affiliations);
         await view.model.messages.fetched;
         await view.model.messages.fetched;
     };
     };