瀏覽代碼

Only set and register nick once we've received a confirmation presence

JC Brand 7 月之前
父節點
當前提交
fdc548914c
共有 1 個文件被更改,包括 20 次插入26 次删除
  1. 20 26
      src/headless/plugins/muc/muc.js

+ 20 - 26
src/headless/plugins/muc/muc.js

@@ -37,7 +37,7 @@ import ChatBoxBase from '../../shared/chatbox';
 import { shouldCreateGroupchatMessage, isInfoVisible } from './utils.js';
 import MUCSession from './session';
 
-const { u } = converse.env;
+const { u, stx } = converse.env;
 
 /**
  * Represents a groupchat conversation.
@@ -1503,34 +1503,15 @@ class MUC extends ModelWithMessages(ColorAwareModel(ChatBoxBase)) {
 
     /**
      * Send a presence stanza to update the user's nickname in this MUC.
-     * @param { String } nick
+     * @param {String} nick
      */
     async setNickname (nick) {
-        if (
-            api.settings.get('auto_register_muc_nickname') &&
-            (await api.disco.supports(Strophe.NS.MUC_REGISTER, this.get('jid')))
-        ) {
-            const old_nick = this.get('nick');
-            this.set({ nick });
-            try {
-                await this.registerNickname();
-            } catch (e) {
-                const { __ } = _converse;
-                log.error(e);
-                const message = __("Error: couldn't register new nickname in members only room");
-                this.createMessage({ message, 'type': 'error', 'is_ephemeral': true });
-                this.set({ 'nick': old_nick });
-                return;
-            }
-        }
         const jid = Strophe.getBareJidFromJid(this.get('jid'));
         api.send(
-            $pres({
-                'from': api.connection.get().jid,
-                'to': `${jid}/${nick}`,
-                'id': getUniqueId()
-            }).tree()
-        )
+            stx`<presence xmlns="jabber:client"
+                    id="${getUniqueId()}"
+                    from="${api.connection.get().jid}"
+                    to="${jid}/${nick}"></presence>`);
     }
 
     /**
@@ -2709,11 +2690,24 @@ class MUC extends ModelWithMessages(ColorAwareModel(ChatBoxBase)) {
         }
 
         const attrs = parseMUCPresence(stanza, this);
-        attrs.codes.forEach((code) => {
+        attrs.codes.forEach(async (code) => {
             this.createInfoMessageFromPresence(code, attrs);
 
             if (attrs.is_self && NEW_NICK_CODES.includes(code)) {
                 this.save('nick', attrs.nick);
+
+                if (
+                    code === '303' &&
+                    api.settings.get('auto_register_muc_nickname') &&
+                    (await api.disco.supports(Strophe.NS.MUC_REGISTER, this.get('jid')))
+                ) {
+                    try {
+                        await this.registerNickname();
+                    } catch (e) {
+                        log.error(e);
+                        log.error("Error: could not register new nickname");
+                    }
+                }
             }
         });