Refactored MUC plugin to not have to override ChatBoxes collection.
Instead we use event handlers.
This commit is contained in:
parent
1f2840035b
commit
fc7f50887a
@ -163,7 +163,7 @@
|
|||||||
)[0];
|
)[0];
|
||||||
expect(converse.chatboxes.models.length).toBe(1);
|
expect(converse.chatboxes.models.length).toBe(1);
|
||||||
expect(converse.chatboxes.models[0].id).toBe("controlbox");
|
expect(converse.chatboxes.models[0].id).toBe("controlbox");
|
||||||
converse.chatboxes.onInvite(message);
|
converse.onDirectMUCInvitation(message);
|
||||||
expect(window.confirm).toHaveBeenCalledWith(
|
expect(window.confirm).toHaveBeenCalledWith(
|
||||||
name + ' has invited you to join a chat room: '+ room_jid +
|
name + ' has invited you to join a chat room: '+ room_jid +
|
||||||
', and left the following reason: "'+reason+'"');
|
', and left the following reason: "'+reason+'"');
|
||||||
|
@ -97,6 +97,8 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
onConnected: function () {
|
onConnected: function () {
|
||||||
|
// TODO: This can probably be refactored to be an event
|
||||||
|
// handler (and therefore removed from overrides)
|
||||||
var converse = this._super.converse;
|
var converse = this._super.converse;
|
||||||
this._super.onConnected.apply(this, arguments);
|
this._super.onConnected.apply(this, arguments);
|
||||||
|
|
||||||
@ -126,65 +128,6 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
ChatBoxes: {
|
|
||||||
registerMessageHandler: function () {
|
|
||||||
/* Override so that we can register a handler
|
|
||||||
* for chat room invites.
|
|
||||||
*/
|
|
||||||
this._super.registerMessageHandler.apply(this, arguments); // First call the original
|
|
||||||
this._super.converse.connection.addHandler(
|
|
||||||
function (message) {
|
|
||||||
this.onInvite(message);
|
|
||||||
return true;
|
|
||||||
}.bind(this), 'jabber:x:conference', 'message');
|
|
||||||
},
|
|
||||||
|
|
||||||
onInvite: function (message) {
|
|
||||||
/* An invitation to join a chat room has been received */
|
|
||||||
var converse = this._super.converse,
|
|
||||||
$message = $(message),
|
|
||||||
$x = $message.children('x[xmlns="jabber:x:conference"]'),
|
|
||||||
from = Strophe.getBareJidFromJid($message.attr('from')),
|
|
||||||
room_jid = $x.attr('jid'),
|
|
||||||
reason = $x.attr('reason'),
|
|
||||||
contact = converse.roster.get(from),
|
|
||||||
result;
|
|
||||||
|
|
||||||
if (converse.auto_join_on_invite) {
|
|
||||||
result = true;
|
|
||||||
} else {
|
|
||||||
contact = contact? contact.get('fullname'): Strophe.getNodeFromJid(from); // Invite request might come from someone not your roster list
|
|
||||||
if (!reason) {
|
|
||||||
result = confirm(
|
|
||||||
__(___("%1$s has invited you to join a chat room: %2$s"), contact, room_jid)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
result = confirm(
|
|
||||||
__(___('%1$s has invited you to join a chat room: %2$s, and left the following reason: "%3$s"'), contact, room_jid, reason)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (result === true) {
|
|
||||||
var chatroom = converse.chatboxviews.showChat({
|
|
||||||
'id': room_jid,
|
|
||||||
'jid': room_jid,
|
|
||||||
'name': Strophe.unescapeNode(Strophe.getNodeFromJid(room_jid)),
|
|
||||||
'nick': Strophe.unescapeNode(Strophe.getNodeFromJid(converse.connection.jid)),
|
|
||||||
'type': 'chatroom',
|
|
||||||
'box_id': b64_sha1(room_jid),
|
|
||||||
'password': $x.attr('password')
|
|
||||||
});
|
|
||||||
if (!_.contains(
|
|
||||||
[Strophe.Status.CONNECTING, Strophe.Status.CONNECTED],
|
|
||||||
chatroom.get('connection_status'))
|
|
||||||
) {
|
|
||||||
converse.chatboxviews.get(room_jid).join(null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
ChatBoxViews: {
|
ChatBoxViews: {
|
||||||
onChatBoxAdded: function (item) {
|
onChatBoxAdded: function (item) {
|
||||||
var view = this.get(item.get('id'));
|
var view = this.get(item.get('id'));
|
||||||
@ -207,6 +150,7 @@
|
|||||||
this.updateSettings({
|
this.updateSettings({
|
||||||
allow_muc: true,
|
allow_muc: true,
|
||||||
auto_join_on_invite: false, // Auto-join chatroom on invite
|
auto_join_on_invite: false, // Auto-join chatroom on invite
|
||||||
|
auto_join_rooms: [], // List of JIDs of rooms to be joined upon login
|
||||||
auto_list_rooms: false,
|
auto_list_rooms: false,
|
||||||
hide_muc_server: false,
|
hide_muc_server: false,
|
||||||
muc_history_max_stanzas: undefined, // Takes an integer, limits the amount of messages to fetch from chat room's history
|
muc_history_max_stanzas: undefined, // Takes an integer, limits the amount of messages to fetch from chat room's history
|
||||||
@ -1336,10 +1280,69 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/* Support for XEP-0249: Direct MUC invitations */
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
converse.onDirectMUCInvitation = function (message) {
|
||||||
|
/* A direct MUC invitation to join a room has been received */
|
||||||
|
var $message = $(message),
|
||||||
|
$x = $message.children('x[xmlns="jabber:x:conference"]'),
|
||||||
|
from = Strophe.getBareJidFromJid($message.attr('from')),
|
||||||
|
room_jid = $x.attr('jid'),
|
||||||
|
reason = $x.attr('reason'),
|
||||||
|
contact = converse.roster.get(from),
|
||||||
|
result;
|
||||||
|
|
||||||
|
if (converse.auto_join_on_invite) {
|
||||||
|
result = true;
|
||||||
|
} else {
|
||||||
|
// Invite request might come from someone not your roster list
|
||||||
|
contact = contact? contact.get('fullname'): Strophe.getNodeFromJid(from);
|
||||||
|
if (!reason) {
|
||||||
|
result = confirm(
|
||||||
|
__(___("%1$s has invited you to join a chat room: %2$s"),
|
||||||
|
contact, room_jid)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
result = confirm(
|
||||||
|
__(___('%1$s has invited you to join a chat room: %2$s, and left the following reason: "%3$s"'),
|
||||||
|
contact, room_jid, reason)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (result === true) {
|
||||||
|
var chatroom = converse.chatboxviews.showChat({
|
||||||
|
'id': room_jid,
|
||||||
|
'jid': room_jid,
|
||||||
|
'name': Strophe.unescapeNode(Strophe.getNodeFromJid(room_jid)),
|
||||||
|
'nick': Strophe.unescapeNode(Strophe.getNodeFromJid(converse.connection.jid)),
|
||||||
|
'type': 'chatroom',
|
||||||
|
'box_id': b64_sha1(room_jid),
|
||||||
|
'password': $x.attr('password')
|
||||||
|
});
|
||||||
|
if (!_.contains(
|
||||||
|
[Strophe.Status.CONNECTING, Strophe.Status.CONNECTED],
|
||||||
|
chatroom.get('connection_status'))
|
||||||
|
) {
|
||||||
|
converse.chatboxviews.get(room_jid).join(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var registerInviteHandler = function () {
|
||||||
|
converse.connection.addHandler(
|
||||||
|
function (message) {
|
||||||
|
converse.onDirectMUCInvitation(message);
|
||||||
|
return true;
|
||||||
|
}, 'jabber:x:conference', 'message');
|
||||||
|
};
|
||||||
|
converse.on('connected', registerInviteHandler);
|
||||||
|
converse.on('reconnected', registerInviteHandler);
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
|
||||||
|
|
||||||
|
/* We extend the default converse.js API to add methods specific to MUC
|
||||||
|
* chat rooms.
|
||||||
|
*/
|
||||||
_.extend(converse_api, {
|
_.extend(converse_api, {
|
||||||
/* We extend the default converse.js API to add methods specific to MUC
|
|
||||||
* chat rooms.
|
|
||||||
*/
|
|
||||||
'rooms': {
|
'rooms': {
|
||||||
'open': function (jids, nick) {
|
'open': function (jids, nick) {
|
||||||
if (!nick) {
|
if (!nick) {
|
||||||
@ -1378,7 +1381,6 @@
|
|||||||
return converse.wrappedChatBox(converse.chatboxes.getChatBox(jids, true));
|
return converse.wrappedChatBox(converse.chatboxes.getChatBox(jids, true));
|
||||||
}
|
}
|
||||||
return _.map(jids, _.partial(converse.wrappedChatBox, _.bind(converse.chatboxes.getChatBox, converse.chatboxes, _, true)));
|
return _.map(jids, _.partial(converse.wrappedChatBox, _.bind(converse.chatboxes.getChatBox, converse.chatboxes, _, true)));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user