Use api shortcut instead of _converse.api

This commit is contained in:
JC Brand 2020-03-31 13:15:57 +02:00
parent d057177f1b
commit 030c26a8ab
33 changed files with 801 additions and 767 deletions

View File

@ -65,14 +65,14 @@ converse.plugins.add('converse-bookmark-views', {
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
// Configuration values for this plugin
// ====================================
// Refer to docs/source/configuration.rst for explanations of these
// configuration settings.
_converse.api.settings.update({
api.settings.update({
hide_open_bookmarks: true,
muc_respect_autojoin: true
});
@ -96,7 +96,7 @@ converse.plugins.add('converse-bookmark-views', {
*/
ev.preventDefault();
const jid = ev.target.getAttribute('data-room-jid');
_converse.api.rooms.open(jid, {'bring_to_foreground': true});
api.rooms.open(jid, {'bring_to_foreground': true});
_converse.chatboxviews.get(jid).renderBookmarkForm();
},
});
@ -203,7 +203,7 @@ converse.plugins.add('converse-bookmark-views', {
},
toHTML () {
const is_hidden = b => !!(_converse.api.settings.get('hide_open_bookmarks') && _converse.chatboxes.get(b.get('jid')));
const is_hidden = b => !!(api.settings.get('hide_open_bookmarks') && _converse.chatboxes.get(b.get('jid')));
return tpl_bookmarks_list({
'_converse': _converse,
'bookmarks': this.model,
@ -231,7 +231,7 @@ converse.plugins.add('converse-bookmark-views', {
const data = {
'name': name || Strophe.unescapeNode(Strophe.getNodeFromJid(jid)) || jid
}
_converse.api.rooms.open(jid, data, true);
api.rooms.open(jid, data, true);
},
removeBookmark: _converse.removeBookmarkViaEvent,
@ -255,7 +255,7 @@ converse.plugins.add('converse-bookmark-views', {
/************************ BEGIN Event Handlers ************************/
const initBookmarkViews = async function () {
await _converse.api.waitUntil('roomsPanelRendered');
await api.waitUntil('roomsPanelRendered');
_converse.bookmarksview = new _converse.BookmarksView({'model': _converse.bookmarks});
/**
* Triggered once the _converse.Bookmarks collection and _converse.BookmarksView view
@ -263,11 +263,11 @@ converse.plugins.add('converse-bookmark-views', {
* @event _converse#bookmarkViewsInitialized
* @example _converse.api.listen.on('bookmarkViewsInitialized', () => { ... });
*/
_converse.api.trigger('bookmarkViewsInitialized');
api.trigger('bookmarkViewsInitialized');
}
_converse.api.listen.on('bookmarksInitialized', initBookmarkViews);
_converse.api.listen.on('chatRoomViewInitialized', view => view.setBookmarkState());
api.listen.on('bookmarksInitialized', initBookmarkViews);
api.listen.on('chatRoomViewInitialized', view => view.setBookmarkState());
/************************ END Event Handlers ************************/
}
});

View File

@ -48,14 +48,15 @@ converse.plugins.add('converse-chatboxviews', {
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
_converse.api.promises.add(['chatBoxViewsInitialized']);
api.promises.add(['chatBoxViewsInitialized']);
// Configuration values for this plugin
// ====================================
// Refer to docs/source/configuration.rst for explanations of these
// configuration settings.
_converse.api.settings.update({
api.settings.update({
'animate': true,
'theme': 'default'
});
@ -74,7 +75,7 @@ converse.plugins.add('converse-chatboxviews', {
if (el === null) {
el = document.createElement('div');
el.setAttribute('id', 'conversejs');
u.addClass(`theme-${_converse.api.settings.get('theme')}`, el);
u.addClass(`theme-${api.settings.get('theme')}`, el);
const body = _converse.root.querySelector('body');
if (body) {
body.appendChild(el);
@ -97,9 +98,9 @@ converse.plugins.add('converse-chatboxviews', {
bg.innerHTML = tpl_background_logo();
}
const body = document.querySelector('body');
body.classList.add(`converse-${_converse.api.settings.get("view_mode")}`);
this.el.classList.add(`converse-${_converse.api.settings.get("view_mode")}`);
if (_converse.api.settings.get("singleton")) {
body.classList.add(`converse-${api.settings.get("view_mode")}`);
this.el.classList.add(`converse-${api.settings.get("view_mode")}`);
if (api.settings.get("singleton")) {
this.el.classList.add(`converse-singleton`);
}
this.render();
@ -133,7 +134,7 @@ converse.plugins.add('converse-chatboxviews', {
/************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('chatBoxesInitialized', () => {
api.listen.on('chatBoxesInitialized', () => {
_converse.chatboxviews = new _converse.ChatBoxViews({
'model': _converse.chatboxes
});
@ -142,17 +143,17 @@ converse.plugins.add('converse-chatboxviews', {
* @event _converse#chatBoxViewsInitialized
* @example _converse.api.listen.on('chatBoxViewsInitialized', () => { ... });
*/
_converse.api.trigger('chatBoxViewsInitialized');
api.trigger('chatBoxViewsInitialized');
});
_converse.api.listen.on('clearSession', () => _converse.chatboxviews.closeAllChatBoxes());
api.listen.on('clearSession', () => _converse.chatboxviews.closeAllChatBoxes());
function calculateViewportHeightUnit () {
const vh = window.innerHeight * 0.01;
document.documentElement.style.setProperty('--vh', `${vh}px`);
}
_converse.api.listen.on('chatBoxViewsInitialized', () => calculateViewportHeightUnit());
api.listen.on('chatBoxViewsInitialized', () => calculateViewportHeightUnit());
window.addEventListener('resize', () => calculateViewportHeightUnit());
/************************ END Event Handlers ************************/
}

View File

@ -56,9 +56,10 @@ converse.plugins.add('converse-chatview', {
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
const { __ } = _converse;
_converse.api.settings.update({
api.settings.update({
'auto_focus': true,
'message_limit': 0,
'show_send_button': false,
@ -91,7 +92,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.ChatBox }
* @example _converse.api.listen.on('userDetailsModalInitialized', chatbox => { ... });
*/
_converse.api.trigger('userDetailsModalInitialized', this.model);
api.trigger('userDetailsModalInitialized', this.model);
},
toHTML () {
@ -126,7 +127,7 @@ converse.plugins.add('converse-chatview', {
const refresh_icon = this.el.querySelector('.fa-refresh');
u.addClass('fa-spin', refresh_icon);
try {
await _converse.api.vcard.update(this.model.contact.vcard, true);
await api.vcard.update(this.model.contact.vcard, true);
} catch (e) {
log.fatal(e);
this.alert(__('Sorry, something went wrong while trying to refresh'), 'danger');
@ -149,7 +150,7 @@ converse.plugins.add('converse-chatview', {
() => this.model.contact.destroy(),
(err) => {
log.error(err);
_converse.api.alert('error', __('Error'), [
api.alert('error', __('Error'), [
__('Sorry, there was an error while trying to remove %1$s as a contact.',
this.model.contact.getDisplayName())
]);
@ -229,7 +230,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.HeadlinesBoxView }
* @example _converse.api.listen.on('chatBoxViewInitialized', view => { ... });
*/
_converse.api.trigger('chatBoxViewInitialized', this);
api.trigger('chatBoxViewInitialized', this);
},
initDebounced () {
@ -269,7 +270,7 @@ converse.plugins.add('converse-chatview', {
},
renderToolbar () {
if (!_converse.api.settings.get('show_toolbar')) {
if (!api.settings.get('show_toolbar')) {
return this;
}
const options = Object.assign(
@ -285,7 +286,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.ChatBoxView }
* @example _converse.api.listen.on('renderToolbar', view => { ... });
*/
_converse.api.trigger('renderToolbar', this);
api.trigger('renderToolbar', this);
return this;
},
@ -294,13 +295,13 @@ converse.plugins.add('converse-chatview', {
form_container.innerHTML = tpl_chatbox_message_form(
Object.assign(this.model.toJSON(), {
'__': __,
'message_limit': _converse.api.settings.get('message_limit'),
'message_limit': api.settings.get('message_limit'),
'hint_value': this.el.querySelector('.spoiler-hint')?.value,
'label_message': this.model.get('composing_spoiler') ? __('Hidden message') : __('Message'),
'label_spoiler_hint': __('Optional hint'),
'message_value': this.el.querySelector('.chat-textarea')?.value,
'show_send_button': _converse.api.settings.get('show_send_button'),
'show_toolbar': _converse.api.settings.get('show_toolbar'),
'show_send_button': api.settings.get('show_send_button'),
'show_toolbar': api.settings.get('show_toolbar'),
'unread_msgs': __('You have unread messages')
}));
this.el.addEventListener('focusin', ev => this.emitFocused(ev));
@ -346,7 +347,7 @@ converse.plugins.add('converse-chatview', {
},
async addFileUploadButton () {
if (await _converse.api.disco.supports(Strophe.NS.HTTPUPLOAD, _converse.domain)) {
if (await api.disco.supports(Strophe.NS.HTTPUPLOAD, _converse.domain)) {
if (this.el.querySelector('.chat-toolbar .upload-file')) {
return;
}
@ -372,7 +373,7 @@ converse.plugins.add('converse-chatview', {
}
const results = await Promise.all(
this.model.presence.resources.map(
r => _converse.api.disco.supports(Strophe.NS.SPOILER, `${contact_jid}/${r.get('name')}`)
r => api.disco.supports(Strophe.NS.SPOILER, `${contact_jid}/${r.get('name')}`)
)
);
const all_resources_support_spolers = results.reduce((acc, val) => (acc && val), true);
@ -429,9 +430,9 @@ converse.plugins.add('converse-chatview', {
'i18n_title': __('See more information about this person'),
'icon_class': 'fa-id-card',
'name': 'details',
'standalone': _converse.api.settings.get("view_mode") === 'overlayed',
'standalone': api.settings.get("view_mode") === 'overlayed',
}];
if (!_converse.api.settings.get("singleton")) {
if (!api.settings.get("singleton")) {
buttons.push({
'a_class': 'close-chatbox-button',
'handler': ev => this.close(ev),
@ -439,7 +440,7 @@ converse.plugins.add('converse-chatview', {
'i18n_title': __('Close and end this conversation'),
'icon_class': 'fa-times',
'name': 'close',
'standalone': _converse.api.settings.get("view_mode") === 'overlayed',
'standalone': api.settings.get("view_mode") === 'overlayed',
});
}
return buttons;
@ -456,9 +457,9 @@ converse.plugins.add('converse-chatview', {
'label_clear': __('Clear all messages'),
'label_message_limit': __('Message characters remaining'),
'label_toggle_spoiler': label_toggle_spoiler,
'message_limit': _converse.api.settings.get('message_limit'),
'show_call_button': _converse.api.settings.get('visible_toolbar_buttons').call,
'show_spoiler_button': _converse.api.settings.get('visible_toolbar_buttons').spoiler,
'message_limit': api.settings.get('message_limit'),
'show_call_button': api.settings.get('visible_toolbar_buttons').call,
'show_spoiler_button': api.settings.get('visible_toolbar_buttons').spoiler,
'tooltip_start_call': __('Start a call')
}
},
@ -476,7 +477,7 @@ converse.plugins.add('converse-chatview', {
* @type {_converse.ChatBoxView | _converse.ChatRoomView}
* @example _converse.api.listen.on('afterMessagesFetched', view => { ... });
*/
_converse.api.trigger('afterMessagesFetched', this);
api.trigger('afterMessagesFetched', this);
},
insertIntoDOM () {
@ -487,7 +488,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.ChatBoxView | _converse.HeadlinesBoxView }
* @example _converse.api.listen.on('chatBoxInsertedIntoDOM', view => { ... });
*/
_converse.api.trigger('chatBoxInsertedIntoDOM', this);
api.trigger('chatBoxInsertedIntoDOM', this);
return this;
},
@ -631,7 +632,7 @@ converse.plugins.add('converse-chatview', {
* @property { string } message - The message text
* @example _converse.api.listen.on('contactStatusMessageChanged', obj => { ... });
*/
_converse.api.trigger('contactStatusMessageChanged', {
api.trigger('contactStatusMessageChanged', {
'contact': item.attributes,
'message': item.get('status')
});
@ -792,7 +793,7 @@ converse.plugins.add('converse-chatview', {
* @property { _converse.ChatBox | _converse.ChatRoom } chatbox - The chat model
* @example _converse.api.listen.on('messageAdded', data => { ... });
*/
_converse.api.trigger('messageAdded', {
api.trigger('messageAdded', {
'message': message,
'chatbox': this.model
});
@ -824,7 +825,7 @@ converse.plugins.add('converse-chatview', {
ev.preventDefault();
const textarea = this.el.querySelector('.chat-textarea');
const message_text = textarea.value.trim();
if (_converse.api.settings.get('message_limit') && message_text.length > _converse.api.settings.get('message_limit') ||
if (api.settings.get('message_limit') && message_text.length > api.settings.get('message_limit') ||
!message_text.replace(/\s/g, '').length) {
return;
}
@ -833,7 +834,7 @@ converse.plugins.add('converse-chatview', {
['Sorry, the connection has been lost, and your message could not be sent'],
'error'
);
_converse.api.connection.reconnect();
api.connection.reconnect();
return;
}
let spoiler_hint, hint_el = {};
@ -860,9 +861,9 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.Message }
* @example _converse.api.listen.on('messageSend', message => { ... });
*/
_converse.api.trigger('messageSend', message);
api.trigger('messageSend', message);
}
if (_converse.api.settings.get("view_mode") === 'overlayed') {
if (api.settings.get("view_mode") === 'overlayed') {
// XXX: Chrome flexbug workaround. The .chat-content area
// doesn't resize when the textarea is resized to its original size.
this.msgs_container.parentElement.style.display = 'none';
@ -870,7 +871,7 @@ converse.plugins.add('converse-chatview', {
textarea.removeAttribute('disabled');
u.removeClass('disabled', textarea);
if (_converse.api.settings.get("view_mode") === 'overlayed') {
if (api.settings.get("view_mode") === 'overlayed') {
// XXX: Chrome flexbug workaround.
this.msgs_container.parentElement.style.display = '';
}
@ -881,9 +882,9 @@ converse.plugins.add('converse-chatview', {
},
updateCharCounter (chars) {
if (_converse.api.settings.get('message_limit')) {
if (api.settings.get('message_limit')) {
const message_limit = this.el.querySelector('.message-limit');
const counter = _converse.api.settings.get('message_limit') - chars.length;
const counter = api.settings.get('message_limit') - chars.length;
message_limit.textContent = counter;
if (counter < 1) {
u.addClass('error', message_limit);
@ -992,10 +993,10 @@ converse.plugins.add('converse-chatview', {
"be removed everywhere.");
const messages = [__('Are you sure you want to retract this message?')];
if (_converse.api.settings.get('show_retraction_warning')) {
if (api.settings.get('show_retraction_warning')) {
messages[1] = retraction_warning;
}
const result = await _converse.api.confirm(__('Confirm'), messages);
const result = await api.confirm(__('Confirm'), messages);
if (result) {
this.model.retractOwnMessage(message);
}
@ -1138,7 +1139,7 @@ converse.plugins.add('converse-chatview', {
* @property { _converse.ChatBox | _converse.ChatRoom } _converse.connection - The XMPP Connection object
* @example _converse.api.listen.on('callButtonClicked', (connection, model) => { ... });
*/
_converse.api.trigger('callButtonClicked', {
api.trigger('callButtonClicked', {
connection: _converse.connection,
model: this.model
});
@ -1207,7 +1208,7 @@ converse.plugins.add('converse-chatview', {
if (_converse.router.history.getFragment() === "converse/chat?jid="+this.model.get('jid')) {
_converse.router.navigate('');
}
if (_converse.api.connection.connected()) {
if (api.connection.connected()) {
// Immediately sending the chat state, because the
// model is going to be destroyed afterwards.
this.model.setChatState(_converse.INACTIVE);
@ -1221,7 +1222,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.ChatBoxView | _converse.ChatRoomView }
* @example _converse.api.listen.on('chatBoxClosed', view => { ... });
*/
_converse.api.trigger('chatBoxClosed', this);
api.trigger('chatBoxClosed', this);
return this;
},
@ -1236,7 +1237,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.ChatBoxView | _converse.ChatRoomView }
* @example _converse.api.listen.on('chatBoxBlurred', (view, event) => { ... });
*/
_converse.api.trigger('chatBoxBlurred', this, ev);
api.trigger('chatBoxBlurred', this, ev);
},
emitFocused (ev) {
@ -1250,7 +1251,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.ChatBoxView | _converse.ChatRoomView }
* @example _converse.api.listen.on('chatBoxFocused', (view, event) => { ... });
*/
_converse.api.trigger('chatBoxFocused', this, ev);
api.trigger('chatBoxFocused', this, ev);
},
focus () {
@ -1262,7 +1263,7 @@ converse.plugins.add('converse-chatview', {
},
maybeFocus () {
_converse.api.settings.get('auto_focus') && this.focus();
api.settings.get('auto_focus') && this.focus();
},
hide () {
@ -1289,9 +1290,9 @@ converse.plugins.add('converse-chatview', {
* @type {object}
* @property { _converse.ChatBoxView | _converse.ChatRoomView } view
*/
_converse.api.trigger('beforeShowingChatView', this);
api.trigger('beforeShowingChatView', this);
if (_converse.api.settings.get('animate')) {
if (api.settings.get('animate')) {
u.fadeIn(this.el, () => this.afterShown());
} else {
u.showElement(this.el);
@ -1363,7 +1364,7 @@ converse.plugins.add('converse-chatview', {
* @property { _converse.ChatBox | _converse.ChatRoom } chatbox - The chat model
* @example _converse.api.listen.on('chatBoxScrolledDown', obj => { ... });
*/
_converse.api.trigger('chatBoxScrolledDown', {'chatbox': this.model}); // TODO: clean up
api.trigger('chatBoxScrolledDown', {'chatbox': this.model}); // TODO: clean up
},
onWindowStateChanged (state) {
@ -1381,7 +1382,7 @@ converse.plugins.add('converse-chatview', {
}
});
_converse.api.listen.on('chatBoxViewsInitialized', () => {
api.listen.on('chatBoxViewsInitialized', () => {
const views = _converse.chatboxviews;
_converse.chatboxes.on('add', async item => {
if (!views.get(item.get('id')) && item.get('type') === _converse.PRIVATE_CHAT_TYPE) {
@ -1402,13 +1403,13 @@ converse.plugins.add('converse-chatview', {
});
}
}
_converse.api.listen.on('windowStateChanged', onWindowStateChanged);
_converse.api.listen.on('connected', () => _converse.api.disco.own.features.add(Strophe.NS.SPOILER));
api.listen.on('windowStateChanged', onWindowStateChanged);
api.listen.on('connected', () => api.disco.own.features.add(Strophe.NS.SPOILER));
/************************ END Event Handlers ************************/
/************************ BEGIN API ************************/
Object.assign(_converse.api, {
Object.assign(api, {
/**
* The "chatview" namespace groups methods pertaining to views
* for one-on-one chats.

View File

@ -98,10 +98,11 @@ converse.plugins.add('converse-controlbox', {
/* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this,
{ __ } = _converse;
const { _converse } = this;
const { api } = _converse;
const { __ } = _converse;
_converse.api.settings.update({
api.settings.update({
allow_logout: true,
default_domain: undefined,
locked_domain: undefined,
@ -109,7 +110,7 @@ converse.plugins.add('converse-controlbox', {
sticky_controlbox: false
});
_converse.api.promises.add('controlBoxInitialized');
api.promises.add('controlBoxInitialized');
_converse.ControlBox = _converse.ChatBox.extend({
@ -119,7 +120,7 @@ converse.plugins.add('converse-controlbox', {
'bookmarked': false,
'box_id': 'controlbox',
'chat_state': undefined,
'closed': !_converse.api.settings.get('show_controlbox_by_default'),
'closed': !api.settings.get('show_controlbox_by_default'),
'num_unread': 0,
'time_opened': this.get('time_opened') || (new Date()).getTime(),
'type': _converse.CONTROLBOX_TYPE,
@ -137,7 +138,7 @@ converse.plugins.add('converse-controlbox', {
validate (attrs) {
if (attrs.type === _converse.CONTROLBOX_TYPE) {
if (_converse.api.settings.get("view_mode") === 'embedded' && _converse.api.settings.get("singleton")) {
if (api.settings.get("view_mode") === 'embedded' && api.settings.get("singleton")) {
return 'Controlbox not relevant in embedded view mode';
}
return;
@ -191,13 +192,13 @@ converse.plugins.add('converse-controlbox', {
* @type { _converse.ControlBoxView }
* @example _converse.api.listen.on('controlBoxInitialized', view => { ... });
*/
_converse.api.trigger('controlBoxInitialized', this);
api.trigger('controlBoxInitialized', this);
},
render () {
if (this.model.get('connected')) {
if (this.model.get('closed') === undefined) {
this.model.set('closed', !_converse.api.settings.get('show_controlbox_by_default'));
this.model.set('closed', !api.settings.get('show_controlbox_by_default'));
}
}
this.el.innerHTML = tpl_controlbox(Object.assign(this.model.toJSON()));
@ -225,7 +226,7 @@ converse.plugins.add('converse-controlbox', {
createBrandHeadingHTML () {
return tpl_brand_heading({
'sticky_controlbox': _converse.api.settings.get('sticky_controlbox')
'sticky_controlbox': api.settings.get('sticky_controlbox')
});
},
@ -285,10 +286,10 @@ converse.plugins.add('converse-controlbox', {
if (ev && ev.preventDefault) { ev.preventDefault(); }
if (ev?.name === 'closeAllChatBoxes' &&
(_converse.disconnection_cause !== _converse.LOGOUT ||
_converse.api.settings.get('show_controlbox_by_default'))) {
api.settings.get('show_controlbox_by_default'))) {
return;
}
if (_converse.api.settings.get('sticky_controlbox')) {
if (api.settings.get('sticky_controlbox')) {
return;
}
const connection = _converse?.connection || {};
@ -302,7 +303,7 @@ converse.plugins.add('converse-controlbox', {
} else {
this.model.trigger('hide');
}
_converse.api.trigger('controlBoxClosed', this);
api.trigger('controlBoxClosed', this);
return this;
},
@ -315,13 +316,13 @@ converse.plugins.add('converse-controlbox', {
},
hide (callback) {
if (_converse.api.settings.get('sticky_controlbox')) {
if (api.settings.get('sticky_controlbox')) {
return;
}
u.addClass('hidden', this.el);
_converse.api.trigger('chatBoxClosed', this);
api.trigger('chatBoxClosed', this);
if (!_converse.api.connection.connected()) {
if (!api.connection.connected()) {
_converse.controlboxtoggle.render();
}
_converse.controlboxtoggle.show(callback);
@ -336,7 +337,7 @@ converse.plugins.add('converse-controlbox', {
* @event _converse#controlBoxOpened
* @type {_converse.ControlBox}
*/
_converse.api.trigger('controlBoxOpened', this);
api.trigger('controlBoxOpened', this);
},
show () {
@ -387,12 +388,12 @@ converse.plugins.add('converse-controlbox', {
'LOGIN': _converse.LOGIN,
'PREBIND': _converse.PREBIND,
'auto_login': _converse.auto_login,
'authentication': _converse.api.settings.get("authentication"),
'authentication': api.settings.get("authentication"),
'connection_status': connection_status,
'conn_feedback_class': feedback_class,
'conn_feedback_subject': pretty_status,
'conn_feedback_message': _converse.connfeedback.get('message'),
'placeholder_username': (_converse.api.settings.get('locked_domain') || _converse.api.settings.get('default_domain')) &&
'placeholder_username': (api.settings.get('locked_domain') || api.settings.get('default_domain')) &&
__('Username') || __('user@domain'),
'show_trust_checkbox': _converse.trusted !== 'on' && _converse.trusted !== 'off'
})
@ -402,8 +403,8 @@ converse.plugins.add('converse-controlbox', {
initPopovers () {
Array.from(this.el.querySelectorAll('[data-title]')).forEach(el => {
new bootstrap.Popover(el, {
'trigger': _converse.api.settings.get("view_mode") === 'mobile' && 'click' || 'hover',
'dismissible': _converse.api.settings.get("view_mode") === 'mobile' && true || false,
'trigger': api.settings.get("view_mode") === 'mobile' && 'click' || 'hover',
'dismissible': api.settings.get("view_mode") === 'mobile' && true || false,
'container': this.el.parentElement.parentElement.parentElement
})
});
@ -413,8 +414,8 @@ converse.plugins.add('converse-controlbox', {
const form = this.el.querySelector('form');
const jid_element = form.querySelector('input[name=jid]');
if (jid_element.value &&
!_converse.api.settings.get('locked_domain') &&
!_converse.api.settings.get('default_domain') &&
!api.settings.get('locked_domain') &&
!api.settings.get('default_domain') &&
!u.isValidJID(jid_element.value)) {
jid_element.setCustomValidity(__('Please enter a valid XMPP address'));
return false;
@ -427,7 +428,7 @@ converse.plugins.add('converse-controlbox', {
/* Authenticate the user based on a form submission event.
*/
if (ev && ev.preventDefault) { ev.preventDefault(); }
if (_converse.api.settings.get("authentication") === _converse.ANONYMOUS) {
if (api.settings.get("authentication") === _converse.ANONYMOUS) {
return this.connect(_converse.jid, null);
}
if (!this.validate()) { return; }
@ -447,14 +448,14 @@ converse.plugins.add('converse-controlbox', {
}
let jid = form_data.get('jid');
if (_converse.api.settings.get('locked_domain')) {
const last_part = '@' + _converse.api.settings.get('locked_domain');
if (api.settings.get('locked_domain')) {
const last_part = '@' + api.settings.get('locked_domain');
if (jid.endsWith(last_part)) {
jid = jid.substr(0, jid.length - last_part.length);
}
jid = Strophe.escapeNode(jid) + last_part;
} else if (_converse.api.settings.get('default_domain') && !jid.includes('@')) {
jid = jid + '@' + _converse.api.settings.get('default_domain');
} else if (api.settings.get('default_domain') && !jid.includes('@')) {
jid = jid + '@' + api.settings.get('default_domain');
}
this.connect(jid, form_data.get('password'));
},
@ -464,7 +465,7 @@ converse.plugins.add('converse-controlbox', {
_converse.router.navigate('', {'replace': true});
}
_converse.connection && _converse.connection.reset();
_converse.api.user.login(jid, password);
api.user.login(jid, password);
}
});
@ -480,7 +481,7 @@ converse.plugins.add('converse-controlbox', {
* @type { _converse.ControlBoxPane }
* @example _converse.api.listen.on('controlBoxPaneInitialized', view => { ... });
*/
_converse.api.trigger('controlBoxPaneInitialized', this);
api.trigger('controlBoxPaneInitialized', this);
}
});
@ -498,7 +499,7 @@ converse.plugins.add('converse-controlbox', {
initialize () {
_converse.chatboxviews.insertRowColumn(this.render().el);
_converse.api.waitUntil('initialized')
api.waitUntil('initialized')
.then(this.render.bind(this))
.catch(e => log.fatal(e));
},
@ -509,7 +510,7 @@ converse.plugins.add('converse-controlbox', {
// artifacts (i.e. on page load the toggle is shown only to then
// seconds later be hidden in favor of the controlbox).
this.el.innerHTML = tpl_controlbox_toggle({
'label_toggle': _converse.api.connection.connected() ? __('Chat Contacts') : __('Toggle chat')
'label_toggle': api.connection.connected() ? __('Chat Contacts') : __('Toggle chat')
})
return this;
},
@ -532,7 +533,7 @@ converse.plugins.add('converse-controlbox', {
if (!controlbox) {
controlbox = addControlBox();
}
if (_converse.api.connection.connected()) {
if (api.connection.connected()) {
controlbox.save({'closed': false});
} else {
controlbox.trigger('show');
@ -543,7 +544,7 @@ converse.plugins.add('converse-controlbox', {
e.preventDefault();
if (u.isVisible(_converse.root.querySelector("#controlbox"))) {
const controlbox = _converse.chatboxes.get('controlbox');
if (_converse.api.connection.connected) {
if (api.connection.connected) {
controlbox.save({closed: true});
} else {
controlbox.trigger('hide');
@ -557,7 +558,7 @@ converse.plugins.add('converse-controlbox', {
/******************** Event Handlers ********************/
_converse.api.listen.on('chatBoxViewsInitialized', () => {
api.listen.on('chatBoxViewsInitialized', () => {
_converse.chatboxes.on('add', item => {
if (item.get('type') === _converse.CONTROLBOX_TYPE) {
const views = _converse.chatboxviews;
@ -572,7 +573,7 @@ converse.plugins.add('converse-controlbox', {
});
});
_converse.api.listen.on('clearSession', () => {
api.listen.on('clearSession', () => {
const chatboxviews = _converse?.chatboxviews;
const view = chatboxviews && chatboxviews.get('controlbox');
if (view) {
@ -585,11 +586,11 @@ converse.plugins.add('converse-controlbox', {
});
_converse.api.waitUntil('chatBoxViewsInitialized')
api.waitUntil('chatBoxViewsInitialized')
.then(addControlBox)
.catch(e => log.fatal(e));
_converse.api.listen.on('chatBoxesFetched', () => {
api.listen.on('chatBoxesFetched', () => {
const controlbox = _converse.chatboxes.get('controlbox') || addControlBox();
controlbox.save({'connected': true});
});
@ -603,12 +604,12 @@ converse.plugins.add('converse-controlbox', {
view.model.set({'connected': false});
return view;
};
_converse.api.listen.on('disconnected', () => disconnect().renderLoginPanel());
_converse.api.listen.on('will-reconnect', disconnect);
api.listen.on('disconnected', () => disconnect().renderLoginPanel());
api.listen.on('will-reconnect', disconnect);
/************************ API ************************/
Object.assign(_converse.api, {
Object.assign(api, {
/**
* The "controlbox" namespace groups methods pertaining to the
* controlbox view
@ -623,9 +624,9 @@ converse.plugins.add('converse-controlbox', {
* @returns { Promise<_converse.ControlBox> }
*/
async open () {
await _converse.api.waitUntil('chatBoxesFetched');
const model = await _converse.api.chatboxes.get('controlbox') ||
_converse.api.chatboxes.create('controlbox', {}, _converse.Controlbox);
await api.waitUntil('chatBoxesFetched');
const model = await api.chatboxes.get('controlbox') ||
api.chatboxes.create('controlbox', {}, _converse.Controlbox);
model.trigger('show');
return model;
},

View File

@ -134,8 +134,9 @@ converse.plugins.add('converse-dragresize', {
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
_converse.api.settings.update({
api.settings.update({
'allow_dragresize': true,
});
@ -252,7 +253,7 @@ converse.plugins.add('converse-dragresize', {
},
onStartVerticalResize (ev, trigger=true) {
if (!_converse.api.settings.get('allow_dragresize')) {
if (!api.settings.get('allow_dragresize')) {
return true;
}
// Record element attributes for mouseMove().
@ -270,12 +271,12 @@ converse.plugins.add('converse-dragresize', {
* @event _converse#startVerticalResize
* @example _converse.api.listen.on('startVerticalResize', (view) => { ... });
*/
_converse.api.trigger('startVerticalResize', this);
api.trigger('startVerticalResize', this);
}
},
onStartHorizontalResize (ev, trigger=true) {
if (!_converse.api.settings.get('allow_dragresize')) {
if (!api.settings.get('allow_dragresize')) {
return true;
}
const flyout = this.el.querySelector('.box-flyout'),
@ -292,7 +293,7 @@ converse.plugins.add('converse-dragresize', {
* @event _converse#startHorizontalResize
* @example _converse.api.listen.on('startHorizontalResize', (view) => { ... });
*/
_converse.api.trigger('startHorizontalResize', this);
api.trigger('startHorizontalResize', this);
}
},
@ -306,7 +307,7 @@ converse.plugins.add('converse-dragresize', {
* @event _converse#startDiagonalResize
* @example _converse.api.listen.on('startDiagonalResize', (view) => { ... });
*/
_converse.api.trigger('startDiagonalResize', this);
api.trigger('startDiagonalResize', this);
},
};
Object.assign(_converse.ChatBoxView.prototype, dragResizable);
@ -332,7 +333,7 @@ converse.plugins.add('converse-dragresize', {
function onMouseMove (ev) {
if (!_converse.resizing || !_converse.api.settings.get('allow_dragresize')) {
if (!_converse.resizing || !api.settings.get('allow_dragresize')) {
return true;
}
ev.preventDefault();
@ -341,7 +342,7 @@ converse.plugins.add('converse-dragresize', {
function onMouseUp (ev) {
if (!_converse.resizing || !_converse.api.settings.get('allow_dragresize')) {
if (!_converse.resizing || !api.settings.get('allow_dragresize')) {
return true;
}
ev.preventDefault();
@ -353,7 +354,7 @@ converse.plugins.add('converse-dragresize', {
_converse.resizing.chatbox.width,
_converse.resizing.chatbox.model.get('default_width')
);
if (_converse.api.connection.connected()) {
if (api.connection.connected()) {
_converse.resizing.chatbox.model.save({'height': height});
_converse.resizing.chatbox.model.save({'width': width});
} else {
@ -374,9 +375,9 @@ converse.plugins.add('converse-dragresize', {
document.removeEventListener('mouseup', onMouseUp);
}
_converse.api.listen.on('registeredGlobalEventHandlers', registerGlobalEventHandlers);
_converse.api.listen.on('unregisteredGlobalEventHandlers', unregisterGlobalEventHandlers);
_converse.api.listen.on('beforeShowingChatView', view => view.initDragResize().setDimensions());
api.listen.on('registeredGlobalEventHandlers', registerGlobalEventHandlers);
api.listen.on('unregisteredGlobalEventHandlers', unregisterGlobalEventHandlers);
api.listen.on('beforeShowingChatView', view => view.initDragResize().setDimensions());
/************************ END Event Handlers ************************/
}
});

View File

@ -68,9 +68,10 @@ converse.plugins.add('converse-emoji-views', {
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
const { __ } = _converse;
_converse.api.settings.update({
api.settings.update({
'use_system_emojis': true,
'visible_toolbar_buttons': {
'emoji': true
@ -91,7 +92,7 @@ converse.plugins.add('converse-emoji-views', {
},
async createEmojiPicker () {
await _converse.api.emojis.initialize()
await api.emojis.initialize()
const id = `converse.emoji-${_converse.bare_jid}-${this.model.get('jid')}`;
const emojipicker = new _converse.EmojiPicker({'id': id});
@ -151,7 +152,7 @@ converse.plugins.add('converse-emoji-views', {
Object.assign(
this.model.toJSON(), {
'_converse': _converse,
'emoji_categories': _converse.api.settings.get('emoji_categories'),
'emoji_categories': api.settings.get('emoji_categories'),
'emojis_by_category': _converse.emojis.json,
'onSkintonePicked': ev => this.chooseSkinTone(ev),
'onEmojiPicked': ev => this.insertEmoji(ev),
@ -415,18 +416,18 @@ converse.plugins.add('converse-emoji-views', {
/************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('chatBoxClosed', view => view.emoji_picker_view && view.emoji_picker_view.remove());
api.listen.on('chatBoxClosed', view => view.emoji_picker_view && view.emoji_picker_view.remove());
_converse.api.listen.on('renderToolbar', view => {
if (_converse.api.settings.get('visible_toolbar_buttons').emoji) {
api.listen.on('renderToolbar', view => {
if (api.settings.get('visible_toolbar_buttons').emoji) {
const html = tpl_emoji_button({'tooltip_insert_smiley': __('Insert emojis')});
view.el.querySelector('.chat-toolbar').insertAdjacentHTML('afterBegin', html);
}
});
_converse.api.listen.on('headlinesBoxInitialized', () => _converse.api.emojis.initialize());
_converse.api.listen.on('chatRoomInitialized', () => _converse.api.emojis.initialize());
_converse.api.listen.on('chatBoxInitialized', () => _converse.api.emojis.initialize());
api.listen.on('headlinesBoxInitialized', () => api.emojis.initialize());
api.listen.on('chatRoomInitialized', () => api.emojis.initialize());
api.listen.on('chatBoxInitialized', () => api.emojis.initialize());
/************************ END Event Handlers ************************/
}

View File

@ -48,6 +48,7 @@ converse.plugins.add('converse-headlines-view', {
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
const viewWithHeadlinesPanel = {
@ -62,7 +63,7 @@ converse.plugins.add('converse-headlines-view', {
* @event _converse#headlinesPanelRendered
* @example _converse.api.listen.on('headlinesPanelRendered', () => { ... });
*/
_converse.api.trigger('headlinesPanelRendered');
api.trigger('headlinesPanelRendered');
return this.headlinepanel;
}
}
@ -150,7 +151,7 @@ converse.plugins.add('converse-headlines-view', {
* @type { _converse.HeadlinesBoxView }
* @example _converse.api.listen.on('headlinesBoxViewInitialized', view => { ... });
*/
_converse.api.trigger('headlinesBoxViewInitialized', this);
api.trigger('headlinesBoxViewInitialized', this);
},
render () {
@ -177,7 +178,7 @@ converse.plugins.add('converse-headlines-view', {
/************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('chatBoxViewsInitialized', () => {
api.listen.on('chatBoxViewsInitialized', () => {
const views = _converse.chatboxviews;
_converse.chatboxes.on('add', item => {
if (!views.get(item.get('id')) && item.get('type') === _converse.HEADLINES_TYPE) {

View File

@ -32,6 +32,7 @@ converse.plugins.add('converse-message-view', {
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
const { __ } = _converse;
@ -65,7 +66,7 @@ converse.plugins.add('converse-message-view', {
}
_converse.api.settings.update({
api.settings.update({
'show_images_inline': true,
'time_format': 'HH:mm',
});
@ -153,7 +154,7 @@ converse.plugins.add('converse-message-view', {
},
fadeOut () {
if (_converse.api.settings.get('animate')) {
if (api.settings.get('animate')) {
setTimeout(() => this.remove(), 600);
u.addClass('fade-out', this.el);
} else {
@ -204,10 +205,10 @@ converse.plugins.add('converse-message-view', {
* @param { string } text - The message text
* @example _converse.api.listen.on('beforeMessageBodyTransformed', (view, text) => { ... });
*/
await _converse.api.trigger('beforeMessageBodyTransformed', this, text, {'Synchronous': true});
await api.trigger('beforeMessageBodyTransformed', this, text, {'Synchronous': true});
text = this.model.isMeCommand() ? text.substring(4) : text;
text = xss.filterXSS(text, {'whiteList': {}, 'onTag': onTagFoundDuringXSSFilter});
text = u.geoUriToHttp(text, _converse.api.settings.get("geouri_replacement"));
text = u.geoUriToHttp(text, api.settings.get("geouri_replacement"));
text = u.addMentionsMarkup(text, this.model.get('references'), this.model.collection.chatbox);
text = u.addHyperlinks(text);
text = u.renderNewLines(text);
@ -220,12 +221,12 @@ converse.plugins.add('converse-message-view', {
* @param { string } text - The message text
* @example _converse.api.listen.on('afterMessageBodyTransformed', (view, text) => { ... });
*/
await _converse.api.trigger('afterMessageBodyTransformed', this, text, {'Synchronous': true});
await api.trigger('afterMessageBodyTransformed', this, text, {'Synchronous': true});
return text;
},
async renderChatMessage () {
await _converse.api.waitUntil('emojisInitialized');
await api.waitUntil('emojisInitialized');
const time = dayjs(this.model.get('time'));
const role = this.model.vcard ? this.model.vcard.get('role') : null;
const roles = role ? role.split(',') : [];
@ -243,7 +244,7 @@ converse.plugins.add('converse-message-view', {
'is_me_message': this.model.isMeCommand(),
'label_show': __('Show more'),
'occupant': this.model.occupant,
'pretty_time': time.format(_converse.api.settings.get('time_format')),
'pretty_time': time.format(api.settings.get('time_format')),
'retraction_text': is_retracted ? this.getRetractionText() : null,
'roles': roles,
'time': time.toISOString(),
@ -259,7 +260,7 @@ converse.plugins.add('converse-message-view', {
const msg_content = msg.querySelector('.chat-msg__text');
if (text && text !== url) {
msg_content.innerHTML = await this.transformBodyText(text);
if (_converse.api.settings.get('show_images_inline')) {
if (api.settings.get('show_images_inline')) {
u.renderImageURLs(_converse, msg_content).then(() => this.triggerRendered());
}
}

View File

@ -165,8 +165,9 @@ converse.plugins.add('converse-minimize', {
*/
const { _converse } = this;
const { __ } = _converse;
const { api } = _converse;
_converse.api.settings.update({'no_trimming': false});
api.settings.update({'no_trimming': false});
const minimizableChatBox = {
maximize () {
@ -210,7 +211,7 @@ converse.plugins.add('converse-minimize', {
* @type { _converse.ChatBoxView }
* @example _converse.api.listen.on('chatBoxMaximized', view => { ... });
*/
_converse.api.trigger('chatBoxMaximized', this);
api.trigger('chatBoxMaximized', this);
return this;
},
@ -239,7 +240,7 @@ converse.plugins.add('converse-minimize', {
* @type { _converse.ChatBoxView }
* @example _converse.api.listen.on('chatBoxMinimized', view => { ... });
*/
_converse.api.trigger('chatBoxMinimized', this);
api.trigger('chatBoxMinimized', this);
return this;
},
@ -314,7 +315,7 @@ converse.plugins.add('converse-minimize', {
* @param { _converse.ChatBoxView|_converse.ChatRoomView|_converse.ControlBoxView|_converse.HeadlinesBoxView } [newchat]
*/
async trimChats (newchat) {
if (_converse.api.settings.get('no_trimming') || !_converse.api.connection.connected() || _converse.api.settings.get("view_mode") !== 'overlayed') {
if (api.settings.get('no_trimming') || !api.connection.connected() || api.settings.get("view_mode") !== 'overlayed') {
return;
}
const shown_chats = this.getShownChats();
@ -328,7 +329,7 @@ converse.plugins.add('converse-minimize', {
// fullscreen. In this case we don't trim.
return;
}
await _converse.api.waitUntil('minimizedChatsInitialized');
await api.waitUntil('minimizedChatsInitialized');
const minimized_el = _converse.minimized_chats?.el;
if (minimized_el) {
while ((this.getMinimizedWidth() + this.getBoxesWidth(newchat)) > body_width) {
@ -369,7 +370,7 @@ converse.plugins.add('converse-minimize', {
Object.assign(_converse.ChatBoxViews.prototype, chatTrimmer);
_converse.api.promises.add('minimizedChatsInitialized');
api.promises.add('minimizedChatsInitialized');
_converse.MinimizedChatBoxView = View.extend({
tagName: 'div',
@ -390,7 +391,7 @@ converse.plugins.add('converse-minimize', {
* @type { _converse.MinimizedChatBoxView }
* @example _converse.api.listen.on('minimizedChatViewInitialized', view => { ... });
*/
_converse.api.trigger('minimizedChatViewInitialized', this);
api.trigger('minimizedChatViewInitialized', this);
},
render () {
@ -413,7 +414,7 @@ converse.plugins.add('converse-minimize', {
view.close();
} else {
this.model.destroy();
_converse.api.trigger('chatBoxClosed', this);
api.trigger('chatBoxClosed', this);
}
return this;
},
@ -562,17 +563,17 @@ converse.plugins.add('converse-minimize', {
* @event _converse#minimizedChatsInitialized
* @example _converse.api.listen.on('minimizedChatsInitialized', () => { ... });
*/
_converse.api.trigger('minimizedChatsInitialized');
api.trigger('minimizedChatsInitialized');
}
/************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('chatBoxViewsInitialized', () => initMinimizedChats());
_converse.api.listen.on('chatBoxInsertedIntoDOM', view => _converse.chatboxviews.trimChats(view));
_converse.api.listen.on('controlBoxOpened', view => _converse.chatboxviews.trimChats(view));
api.listen.on('chatBoxViewsInitialized', () => initMinimizedChats());
api.listen.on('chatBoxInsertedIntoDOM', view => _converse.chatboxviews.trimChats(view));
api.listen.on('controlBoxOpened', view => _converse.chatboxviews.trimChats(view));
const debouncedTrimChats = debounce(() => _converse.chatboxviews.trimChats(), 250);
_converse.api.listen.on('registeredGlobalEventHandlers', () => window.addEventListener("resize", debouncedTrimChats));
_converse.api.listen.on('unregisteredGlobalEventHandlers', () => window.removeEventListener("resize", debouncedTrimChats));
api.listen.on('registeredGlobalEventHandlers', () => window.addEventListener("resize", debouncedTrimChats));
api.listen.on('unregisteredGlobalEventHandlers', () => window.removeEventListener("resize", debouncedTrimChats));
/************************ END Event Handlers ************************/
}
});

View File

@ -90,14 +90,15 @@ converse.plugins.add('converse-muc-views', {
initialize () {
const { _converse } = this;
const { api } = _converse;
_converse.api.promises.add(['roomsPanelRendered']);
api.promises.add(['roomsPanelRendered']);
// Configuration values for this plugin
// ====================================
// Refer to docs/source/configuration.rst for explanations of these
// configuration settings.
_converse.api.settings.update({
api.settings.update({
'auto_list_rooms': false,
'cache_muc_messages': true,
'locked_muc_nickname': false,
@ -142,7 +143,7 @@ converse.plugins.add('converse-muc-views', {
* @event _converse#roomsPanelRendered
* @example _converse.api.listen.on('roomsPanelRendered', () => { ... });
*/
_converse.api.trigger('roomsPanelRendered');
api.trigger('roomsPanelRendered');
return this.roomspanel;
},
@ -216,7 +217,7 @@ converse.plugins.add('converse-muc-views', {
parent_el.querySelector('a.room-info').classList.remove('selected');
} else {
parent_el.insertAdjacentHTML('beforeend', tpl_spinner());
_converse.api.disco.info(ev.target.getAttribute('data-room-jid'), null)
api.disco.info(ev.target.getAttribute('data-room-jid'), null)
.then(stanza => insertRoomInfo(parent_el, stanza))
.catch(e => log.error(e));
}
@ -449,7 +450,7 @@ converse.plugins.add('converse-muc-views', {
const jid = ev.target.getAttribute('data-room-jid');
const name = ev.target.getAttribute('data-room-name');
this.modal.hide();
_converse.api.rooms.open(jid, {'name': name});
api.rooms.open(jid, {'name': name});
},
toggleRoomInfo (ev) {
@ -516,7 +517,7 @@ converse.plugins.add('converse-muc-views', {
'from': _converse.connection.jid,
'type': "get"
}).c("query", {xmlns: Strophe.NS.DISCO_ITEMS});
_converse.api.sendIQ(iq)
api.sendIQ(iq)
.then(iq => this.onRoomsFound(iq))
.catch(() => this.informNoRoomsFound())
},
@ -606,7 +607,7 @@ converse.plugins.add('converse-muc-views', {
jid = data.jid
this.model.setDomain(jid);
}
_converse.api.rooms.open(jid, Object.assign(data, {jid}));
api.rooms.open(jid, Object.assign(data, {jid}));
this.modal.hide();
ev.target.reset();
},
@ -735,7 +736,7 @@ converse.plugins.add('converse-muc-views', {
* @type { _converse.ChatRoomView }
* @example _converse.api.listen.on('chatRoomViewInitialized', view => { ... });
*/
_converse.api.trigger('chatRoomViewInitialized', this);
api.trigger('chatRoomViewInitialized', this);
},
render () {
@ -990,7 +991,7 @@ converse.plugins.add('converse-muc-views', {
if (_converse.show_retraction_warning) {
messages[1] = retraction_warning;
}
const result = await _converse.api.confirm(__('Confirm'), messages);
const result = await api.confirm(__('Confirm'), messages);
if (result) {
this.retractOwnMessage(message);
}
@ -1000,7 +1001,7 @@ converse.plugins.add('converse-muc-views', {
if (_converse.show_retraction_warning) {
messages = [messages[0], retraction_warning, messages[1]]
}
if (await _converse.api.confirm(__('Confirm'), messages)) {
if (await api.confirm(__('Confirm'), messages)) {
this.retractOtherMessage(message);
}
} else {
@ -1011,7 +1012,7 @@ converse.plugins.add('converse-muc-views', {
if (_converse.show_retraction_warning) {
messages = [messages[0], retraction_warning, messages[1]]
}
const reason = await _converse.api.prompt(
const reason = await api.prompt(
__('Message Retraction'),
messages,
__('Optional reason')
@ -1022,7 +1023,7 @@ converse.plugins.add('converse-muc-views', {
}
} else {
const err_msg = __(`Sorry, you're not allowed to retract this message`);
_converse.api.alert('error', __('Error'), err_msg);
api.alert('error', __('Error'), err_msg);
}
},
@ -1057,13 +1058,13 @@ converse.plugins.add('converse-muc-views', {
const result = await this.model.retractOtherMessage(message, reason);
if (result === null) {
const err_msg = __(`A timeout occurred while trying to retract the message`);
_converse.api.alert('error', __('Error'), err_msg);
_converse.log(err_msg, Strophe.LogLevel.WARN);
api.alert('error', __('Error'), err_msg);
log(err_msg, Strophe.LogLevel.WARN);
} else if (u.isErrorStanza(result)) {
const err_msg = __(`Sorry, you're not allowed to retract this message.`);
_converse.api.alert('error', __('Error'), err_msg);
_converse.log(err_msg, Strophe.LogLevel.WARN);
_converse.log(result, Strophe.LogLevel.WARN);
api.alert('error', __('Error'), err_msg);
log(err_msg, Strophe.LogLevel.WARN);
log(result, Strophe.LogLevel.WARN);
}
},
@ -1225,17 +1226,17 @@ converse.plugins.add('converse-muc-views', {
});
}
if (!_converse.api.settings.get("singleton")) {
if (!api.settings.get("singleton")) {
buttons.push({
'i18n_text': __('Leave'),
'i18n_title': __('Leave and close this groupchat'),
'handler': async ev => {
const messages = [__('Are you sure you want to leave this groupchat?')];
const result = await _converse.api.confirm(__('Confirm'), messages);
const result = await api.confirm(__('Confirm'), messages);
result && this.close(ev);
},
'a_class': 'close-chatbox-button',
'standalone': _converse.api.settings.get("view_mode") === 'overlayed',
'standalone': api.settings.get("view_mode") === 'overlayed',
'icon_class': 'fa-sign-out-alt',
'name': 'signout'
});
@ -1547,7 +1548,7 @@ converse.plugins.add('converse-muc-views', {
async destroy (reason, new_jid) {
const message = [__('Are you sure you want to destroy this groupchat?')];
if (await _converse.api.confirm(__('Confirm'), message)) {
if (await api.confirm(__('Confirm'), message)) {
return this.model.sendDestroyIQ(reason, new_jid).then(() => this.close())
}
},
@ -1646,7 +1647,7 @@ converse.plugins.add('converse-muc-views', {
this.showErrorMessage(__('Your nickname is "%1$s"', this.model.get('nick')))
} else {
const jid = Strophe.getBareJidFromJid(this.model.get('jid'));
_converse.api.send($pres({
api.send($pres({
from: _converse.connection.jid,
to: `${jid}/${args}`,
id: u.getUniqueId()
@ -1825,7 +1826,7 @@ converse.plugins.add('converse-muc-views', {
if (switch_el) {
switch_el.addEventListener('click', async ev => {
ev.preventDefault();
const room = await _converse.api.rooms.get(moved_jid, null, true);
const room = await api.rooms.get(moved_jid, null, true);
room.maybeShow(true);
this.model.destroy();
});
@ -2359,8 +2360,8 @@ converse.plugins.add('converse-muc-views', {
});
}
}
_converse.api.waitUntil('discoInitialized').then(() => {
_converse.api.listen.on('serviceDiscovered', featureAdded);
api.waitUntil('discoInitialized').then(() => {
api.listen.on('serviceDiscovered', featureAdded);
// Features could have been added before the controlbox was
// initialized. We're only interested in MUC
_converse.disco_entities.each(entity => featureAdded(entity.features.findWhere({'var': Strophe.NS.MUC })));
@ -2381,11 +2382,11 @@ converse.plugins.add('converse-muc-views', {
/************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('chatBoxViewsInitialized', () => {
api.listen.on('chatBoxViewsInitialized', () => {
function openChatRoomFromURIClicked (ev) {
ev.preventDefault();
_converse.api.rooms.open(ev.target.href);
api.rooms.open(ev.target.href);
}
_converse.chatboxviews.delegate('click', 'a.open-chatroom', openChatRoomFromURIClicked);
@ -2402,7 +2403,7 @@ converse.plugins.add('converse-muc-views', {
_converse.chatboxes.on('add', addView);
});
_converse.api.listen.on('clearSession', () => {
api.listen.on('clearSession', () => {
const view = _converse.chatboxviews.get('controlbox');
if (view && view.roomspanel) {
view.roomspanel.model.destroy();
@ -2411,7 +2412,7 @@ converse.plugins.add('converse-muc-views', {
}
});
_converse.api.listen.on('controlBoxInitialized', (view) => {
api.listen.on('controlBoxInitialized', (view) => {
if (!_converse.allow_muc) {
return;
}
@ -2454,10 +2455,10 @@ converse.plugins.add('converse-muc-views', {
*/
get (jids) {
if (Array.isArray(jids)) {
const views = _converse.api.chatviews.get(jids);
const views = api.chatviews.get(jids);
return views.filter(v => v.model.get('type') === _converse.CHATROOMS_TYPE)
} else {
const view = _converse.api.chatviews.get(jids);
const view = api.chatviews.get(jids);
if (view.model.get('type') === _converse.CHATROOMS_TYPE) {
return view;
} else {

View File

@ -20,17 +20,18 @@ converse.plugins.add('converse-notification', {
*/
const { _converse } = this;
const { __ } = _converse;
const { api } = _converse;
_converse.supports_html5_notification = "Notification" in window;
_converse.api.settings.update({
api.settings.update({
notify_all_room_messages: false,
show_desktop_notifications: true,
show_chat_state_notifications: false,
chatstate_notification_blacklist: [],
// ^ a list of JIDs to ignore concerning chat state notifications
play_sounds: true,
sounds_path: _converse.api.settings.get("assets_path")+'/sounds/',
sounds_path: api.settings.get("assets_path")+'/sounds/',
notification_icon: 'logo/conversejs-filled.svg',
notification_delay: 5000
});
@ -135,7 +136,7 @@ converse.plugins.add('converse-notification', {
const full_from_jid = message.getAttribute('from'),
from_jid = Strophe.getBareJidFromJid(full_from_jid);
if (message.getAttribute('type') === 'headline') {
if (!from_jid.includes('@') || _converse.api.settings.get("allow_non_roster_messaging")) {
if (!from_jid.includes('@') || api.settings.get("allow_non_roster_messaging")) {
title = __("Notification from %1$s", from_jid);
} else {
return;
@ -154,7 +155,7 @@ converse.plugins.add('converse-notification', {
if (roster_item !== undefined) {
title = __("%1$s says", roster_item.getDisplayName());
} else {
if (_converse.api.settings.get("allow_non_roster_messaging")) {
if (api.settings.get("allow_non_roster_messaging")) {
title = __("%1$s says", from_jid);
} else {
return;
@ -262,7 +263,7 @@ converse.plugins.add('converse-notification', {
* @type { XMLElement }
* @example _converse.api.listen.on('messageNotification', stanza => { ... });
*/
_converse.api.trigger('messageNotification', message);
api.trigger('messageNotification', message);
_converse.playSoundNotification();
_converse.showMessageNotification(message);
};
@ -286,15 +287,15 @@ converse.plugins.add('converse-notification', {
}
};
_converse.api.listen.on('pluginsInitialized', function () {
api.listen.on('pluginsInitialized', function () {
// We only register event handlers after all plugins are
// registered, because other plugins might override some of our
// handlers.
_converse.api.listen.on('contactRequest', _converse.handleContactRequestNotification);
_converse.api.listen.on('contactPresenceChanged', _converse.handleChatStateNotification);
_converse.api.listen.on('message', _converse.handleMessageNotification);
_converse.api.listen.on('feedback', _converse.handleFeedback);
_converse.api.listen.on('connected', _converse.requestPermission);
api.listen.on('contactRequest', _converse.handleContactRequestNotification);
api.listen.on('contactPresenceChanged', _converse.handleChatStateNotification);
api.listen.on('message', _converse.handleMessageNotification);
api.listen.on('feedback', _converse.handleFeedback);
api.listen.on('connected', _converse.requestPermission);
});
}
});

View File

@ -55,8 +55,9 @@ converse.plugins.add("converse-oauth", {
render () {
const { _converse } = this.__super__;
const { api } = _converse;
const result = this.__super__.render.apply(this, arguments);
if (_converse.oauth_providers && !_converse.api.settings.get("auto_login")) {
if (_converse.oauth_providers && !api.settings.get("auto_login")) {
this.insertOAuthProviders();
}
return result;
@ -68,10 +69,11 @@ converse.plugins.add("converse-oauth", {
/* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this,
{ __ } = _converse;
const { _converse } = this;
const { api } = _converse;
const { __ } = _converse;
_converse.api.settings.update({
api.settings.update({
'oauth_providers': {},
});
@ -79,7 +81,7 @@ converse.plugins.add("converse-oauth", {
'sync': function sync () {},
initialize () {
_converse.api.settings.get('oauth_providers').forEach(provider => {
api.settings.get('oauth_providers').forEach(provider => {
const item = new Model(Object.assign(provider, {
'login_text': __('Log in with %1$s', provider.name)
}));
@ -102,7 +104,7 @@ converse.plugins.add("converse-oauth", {
async fetchOAuthProfileDataAndLogin () {
const profile = await this.oauth_service.api('me');
const response = this.oauth_service.getAuthResponse();
_converse.api.user.login(
api.user.login(
`${profile.name}@${this.provider.get('host')}`,
response.access_token
);

View File

@ -242,12 +242,13 @@ converse.plugins.add('converse-omemo', {
*/
const { _converse } = this;
const { __ } = _converse;
const { api } = _converse;
_converse.api.settings.update({
api.settings.update({
'omemo_default': false,
});
_converse.api.promises.add(['OMEMOInitialized']);
api.promises.add(['OMEMOInitialized']);
_converse.NUM_PREKEYS = 100; // Set here so that tests can override
@ -306,7 +307,7 @@ converse.plugins.add('converse-omemo', {
},
reportDecryptionError (e) {
if (_converse.api.settings.get("loglevel") === 'debug') {
if (api.settings.get("loglevel") === 'debug') {
const { __ } = _converse;
this.createMessage({
'message': __("Sorry, could not decrypt a received OMEMO message due to an error.") + ` ${e.name} ${e.message}`,
@ -414,10 +415,10 @@ converse.plugins.add('converse-omemo', {
err_msgs.push(__("Unable to send an encrypted message due to an unexpected error."));
err_msgs.push(e.iq.outerHTML);
}
_converse.api.alert('error', __('Error'), err_msgs);
api.alert('error', __('Error'), err_msgs);
log.error(e);
} else if (e.user_facing) {
_converse.api.alert('error', __('Error'), [e.message]);
api.alert('error', __('Error'), [e.message]);
log.error(e);
} else {
throw e;
@ -471,7 +472,7 @@ converse.plugins.add('converse-omemo', {
this.model.contact.getDisplayName()
)];
}
return _converse.api.alert('error', __('Error'), messages);
return api.alert('error', __('Error'), messages);
}
ev.preventDefault();
this.model.save({'omemo_active': !this.model.get('omemo_active')});
@ -500,7 +501,7 @@ converse.plugins.add('converse-omemo', {
}
async function getDevicesForContact (jid) {
await _converse.api.waitUntil('OMEMOInitialized');
await api.waitUntil('OMEMOInitialized');
const devicelist = _converse.devicelists.get(jid) || _converse.devicelists.create({'jid': jid});
await devicelist.fetchDevices();
return devicelist.devices;
@ -828,7 +829,7 @@ converse.plugins.add('converse-omemo', {
Object.values(this.get('prekeys')).forEach((prekey, id) => item.c('preKeyPublic', {'preKeyId': id}).t(prekey.pubKey).up());
const options = {'pubsub#access_model': 'open'};
return _converse.api.pubsub.publish(null, node, item, options, false);
return api.pubsub.publish(null, node, item, options, false);
},
async generateMissingPreKeys () {
@ -933,7 +934,7 @@ converse.plugins.add('converse-omemo', {
let iq;
try {
iq = await _converse.api.sendIQ(stanza)
iq = await api.sendIQ(stanza)
} catch (iq) {
throw new IQError("Could not fetch bundle", iq);
}
@ -1037,7 +1038,7 @@ converse.plugins.add('converse-omemo', {
let iq;
try {
iq = await _converse.api.sendIQ(stanza);
iq = await api.sendIQ(stanza);
} catch (e) {
log.error(e);
return [];
@ -1054,7 +1055,7 @@ converse.plugins.add('converse-omemo', {
const item = $build('item').c('list', {'xmlns': Strophe.NS.OMEMO})
this.devices.filter(d => d.get('active')).forEach(d => item.c('device', {'id': d.get('id')}).up());
const options = {'pubsub#access_model': 'open'};
return _converse.api.pubsub.publish(null, Strophe.NS.OMEMO_DEVICELIST, item, options, false);
return api.pubsub.publish(null, Strophe.NS.OMEMO_DEVICELIST, item, options, false);
},
removeOwnDevices (device_ids) {
@ -1193,7 +1194,7 @@ converse.plugins.add('converse-omemo', {
* @event _converse#OMEMOInitialized
* @example _converse.api.listen.on('OMEMOInitialized', () => { ... });
*/
_converse.api.trigger('OMEMOInitialized');
api.trigger('OMEMOInitialized');
}
async function onOccupantAdded (chatroom, occupant) {
@ -1216,20 +1217,20 @@ converse.plugins.add('converse-omemo', {
async function checkOMEMOSupported (chatbox) {
let supported;
if (chatbox.get('type') === _converse.CHATROOMS_TYPE) {
await _converse.api.waitUntil('OMEMOInitialized');
await api.waitUntil('OMEMOInitialized');
supported = chatbox.features.get('nonanonymous') && chatbox.features.get('membersonly');
} else if (chatbox.get('type') === _converse.PRIVATE_CHAT_TYPE) {
supported = await _converse.contactHasOMEMOSupport(chatbox.get('jid'));
}
chatbox.set('omemo_supported', supported);
if (supported && _converse.api.settings.get('omemo_default')) {
if (supported && api.settings.get('omemo_default')) {
chatbox.set('omemo_active', true);
}
}
/******************** Event Handlers ********************/
_converse.api.waitUntil('chatBoxesInitialized').then(() =>
api.waitUntil('chatBoxesInitialized').then(() =>
_converse.chatboxes.on('add', chatbox => {
checkOMEMOSupported(chatbox);
if (chatbox.get('type') === _converse.CHATROOMS_TYPE) {
@ -1239,24 +1240,24 @@ converse.plugins.add('converse-omemo', {
})
);
_converse.api.listen.on('connected', registerPEPPushHandler);
_converse.api.listen.on('renderToolbar', view => view.renderOMEMOToolbarButton());
_converse.api.listen.on('statusInitialized', initOMEMO);
_converse.api.listen.on('addClientFeatures',
() => _converse.api.disco.own.features.add(`${Strophe.NS.OMEMO_DEVICELIST}+notify`));
api.listen.on('connected', registerPEPPushHandler);
api.listen.on('renderToolbar', view => view.renderOMEMOToolbarButton());
api.listen.on('statusInitialized', initOMEMO);
api.listen.on('addClientFeatures',
() => api.disco.own.features.add(`${Strophe.NS.OMEMO_DEVICELIST}+notify`));
_converse.api.listen.on('userDetailsModalInitialized', (contact) => {
api.listen.on('userDetailsModalInitialized', (contact) => {
const jid = contact.get('jid');
_converse.generateFingerprints(jid).catch(e => log.error(e));
});
_converse.api.listen.on('profileModalInitialized', () => {
api.listen.on('profileModalInitialized', () => {
_converse.generateFingerprints(_converse.bare_jid).catch(e => log.error(e));
});
_converse.api.listen.on('afterTearDown', () => (delete _converse.omemo_store));
api.listen.on('afterTearDown', () => (delete _converse.omemo_store));
_converse.api.listen.on('clearSession', () => {
api.listen.on('clearSession', () => {
if (_converse.shouldClearCache() && _converse.devicelists) {
_converse.devicelists.clearStore();
delete _converse.devicelists;

View File

@ -27,10 +27,11 @@ converse.plugins.add('converse-profile', {
/* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this,
{ __ } = _converse;
const { _converse } = this;
const { api } = _converse;
const { __ } = _converse;
_converse.api.settings.update({
api.settings.update({
'show_client_info': true
});
@ -52,7 +53,7 @@ converse.plugins.add('converse-profile', {
* @type { _converse.XMPPStatus }
* @example _converse.api.listen.on('profileModalInitialized', status => { ... });
*/
_converse.api.trigger('profileModalInitialized', this.model);
api.trigger('profileModalInitialized', this.model);
},
toHTML () {
@ -84,11 +85,11 @@ converse.plugins.add('converse-profile', {
},
setVCard (data) {
_converse.api.vcard.set(_converse.bare_jid, data)
.then(() => _converse.api.vcard.update(this.model.vcard, true))
api.vcard.set(_converse.bare_jid, data)
.then(() => api.vcard.update(this.model.vcard, true))
.catch((err) => {
log.fatal(err);
_converse.api.show('error', __('Error'), [
api.show('error', __('Error'), [
__("Sorry, an error happened while trying to save your profile data."),
__("You can check your browser's developer console for any error output.")
]);
@ -251,7 +252,7 @@ converse.plugins.add('converse-profile', {
ev.preventDefault();
const result = confirm(__("Are you sure you want to log out?"));
if (result === true) {
_converse.api.user.logout();
api.user.logout();
}
},
@ -274,8 +275,8 @@ converse.plugins.add('converse-profile', {
/******************** Event Handlers ********************/
_converse.api.listen.on('controlBoxPaneInitialized', async view => {
await _converse.api.waitUntil('VCardsInitialized');
api.listen.on('controlBoxPaneInitialized', async view => {
await api.waitUntil('VCardsInitialized');
_converse.xmppstatusview = new _converse.XMPPStatusView({'model': _converse.xmppstatus});
view.el.insertAdjacentElement('afterBegin', _converse.xmppstatusview.render().el);
});

View File

@ -22,8 +22,9 @@ converse.plugins.add('converse-push', {
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
_converse.api.settings.update({
api.settings.update({
'push_app_servers': [],
'enable_muc_push': false
});
@ -32,7 +33,7 @@ converse.plugins.add('converse-push', {
if (!push_app_server.jid) {
return;
}
if (!(await _converse.api.disco.supports(Strophe.NS.PUSH, domain || _converse.bare_jid))) {
if (!(await api.disco.supports(Strophe.NS.PUSH, domain || _converse.bare_jid))) {
log.warn(`Not disabling push app server "${push_app_server.jid}", no disco support from your server.`);
return;
}
@ -47,7 +48,7 @@ converse.plugins.add('converse-push', {
if (push_app_server.node) {
stanza.attrs({'node': push_app_server.node});
}
_converse.api.sendIQ(stanza)
api.sendIQ(stanza)
.catch(e => {
log.error(`Could not disable push app server for ${push_app_server.jid}`);
log.error(e);
@ -58,15 +59,15 @@ converse.plugins.add('converse-push', {
if (!push_app_server.jid || !push_app_server.node) {
return;
}
const identity = await _converse.api.disco.getIdentity('pubsub', 'push', push_app_server.jid);
const identity = await api.disco.getIdentity('pubsub', 'push', push_app_server.jid);
if (!identity) {
return log.warn(
`Not enabling push the service "${push_app_server.jid}", it doesn't have the right disco identtiy.`
);
}
const result = await Promise.all([
_converse.api.disco.supports(Strophe.NS.PUSH, push_app_server.jid),
_converse.api.disco.supports(Strophe.NS.PUSH, domain)
api.disco.supports(Strophe.NS.PUSH, push_app_server.jid),
api.disco.supports(Strophe.NS.PUSH, domain)
]);
if (!result[0] && !result[1]) {
log.warn(`Not enabling push app server "${push_app_server.jid}", no disco support from your server.`);
@ -88,7 +89,7 @@ converse.plugins.add('converse-push', {
.c('field', {'var': 'secret'})
.c('value').t(push_app_server.secret);
}
return _converse.api.sendIQ(stanza);
return api.sendIQ(stanza);
}
async function enablePush (domain) {
@ -97,8 +98,8 @@ converse.plugins.add('converse-push', {
if (push_enabled.includes(domain)) {
return;
}
const enabled_services = reject(_converse.api.settings.get('push_app_servers'), 'disable');
const disabled_services = filter(_converse.api.settings.get('push_app_servers'), 'disable');
const enabled_services = reject(api.settings.get('push_app_servers'), 'disable');
const disabled_services = filter(api.settings.get('push_app_servers'), 'disable');
const enabled = enabled_services.map(s => enablePushAppServer(domain, s));
const disabled = disabled_services.map(s => disablePushAppServer(domain, s));
try {
@ -111,15 +112,15 @@ converse.plugins.add('converse-push', {
}
_converse.session.save('push_enabled', push_enabled);
}
_converse.api.listen.on('statusInitialized', () => enablePush());
api.listen.on('statusInitialized', () => enablePush());
function onChatBoxAdded (model) {
if (model.get('type') == _converse.CHATROOMS_TYPE) {
enablePush(Strophe.getDomainFromJid(model.get('jid')));
}
}
if (_converse.api.settings.get('enable_muc_push')) {
_converse.api.listen.on('chatBoxesInitialized', () => _converse.chatboxes.on('add', onChatBoxAdded));
if (api.settings.get('enable_muc_push')) {
api.listen.on('chatBoxesInitialized', () => _converse.chatboxes.on('add', onChatBoxAdded));
}
}
});

View File

@ -7,6 +7,7 @@
* @license Mozilla Public License (MPLv2)
*/
import "converse-controlbox";
import { __ } from '@converse/headless/i18n';
import { View } from "skeletor.js/src/view";
import { pick } from "lodash";
import converse from "@converse/headless/converse-core";
@ -63,15 +64,15 @@ converse.plugins.add('converse-register', {
/* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this,
{ __ } = _converse;
const { _converse } = this;
const { api } = _converse;
_converse.CONNECTION_STATUS[Strophe.Status.REGIFAIL] = 'REGIFAIL';
_converse.CONNECTION_STATUS[Strophe.Status.REGISTERED] = 'REGISTERED';
_converse.CONNECTION_STATUS[Strophe.Status.CONFLICT] = 'CONFLICT';
_converse.CONNECTION_STATUS[Strophe.Status.NOTACCEPTABLE] = 'NOTACCEPTABLE';
_converse.api.settings.update({
api.settings.update({
'allow_registration': true,
'domain_placeholder': __(" e.g. conversejs.org"), // Placeholder text shown in the domain input on the registration form
'providers_link': 'https://compliance.conversations.im/', // Link to XMPP providers shown on registration page
@ -95,7 +96,7 @@ converse.plugins.add('converse-register', {
},
renderRegistrationPanel () {
if (_converse.api.settings.get('allow_registration')) {
if (api.settings.get('allow_registration')) {
this.registerpanel = new _converse.RegisterPanel({
'model': this.model
});
@ -113,7 +114,7 @@ converse.plugins.add('converse-register', {
function setActiveForm (value) {
_converse.api.waitUntil('controlBoxInitialized').then(() => {
api.waitUntil('controlBoxInitialized').then(() => {
const controlbox = _converse.chatboxes.get('controlbox')
controlbox.set({'active-form': value});
}).catch(e => log.fatal(e));
@ -138,22 +139,22 @@ converse.plugins.add('converse-register', {
initialize () {
this.reset();
_converse.api.listen.on('connectionInitialized', () => this.registerHooks());
api.listen.on('connectionInitialized', () => this.registerHooks());
},
render () {
this.model.set('registration_form_rendered', false);
this.el.innerHTML = tpl_register_panel({
'__': __,
'default_domain': _converse.api.settings.get('registration_domain'),
'default_domain': api.settings.get('registration_domain'),
'label_register': __('Fetch registration form'),
'help_providers': __('Tip: A list of public XMPP providers is available'),
'help_providers_link': __('here'),
'href_providers': _converse.api.settings.get('providers_link'),
'domain_placeholder': _converse.api.settings.get('domain_placeholder')
'href_providers': api.settings.get('providers_link'),
'domain_placeholder': api.settings.get('domain_placeholder')
});
if (_converse.api.settings.get('registration_domain')) {
this.fetchRegistrationForm(_converse.api.settings.get('registration_domain'));
if (api.settings.get('registration_domain')) {
this.fetchRegistrationForm(api.settings.get('registration_domain'));
}
return this;
},
@ -324,7 +325,7 @@ converse.plugins.add('converse-register', {
'beforeend',
tpl_registration_request({
'__': _converse.__,
'cancel': _converse.api.settings.get('registration_domain'),
'cancel': api.settings.get('registration_domain'),
})
);
},
@ -447,11 +448,11 @@ converse.plugins.add('converse-register', {
renderRegistrationForm (stanza) {
const form = this.el.querySelector('form');
form.innerHTML = tpl_registration_form({
'__': _converse.__,
'__': __,
'domain': this.domain,
'title': this.title,
'instructions': this.instructions,
'registration_domain': _converse.api.settings.get('registration_domain')
'registration_domain': api.settings.get('registration_domain')
});
const buttons = form.querySelector('fieldset.buttons');
@ -522,9 +523,9 @@ converse.plugins.add('converse-register', {
_converse.connection._proto._abortAllRequests();
_converse.connection.reset();
if (this.model.get('registration_form_rendered')) {
if (_converse.api.settings.get('registration_domain') && this.model.get('registration_form_rendered')) {
if (api.settings.get('registration_domain') && this.model.get('registration_form_rendered')) {
this.fetchRegistrationForm(
_converse.api.settings.get('registration_domain')
api.settings.get('registration_domain')
);
}
} else {
@ -645,7 +646,7 @@ converse.plugins.add('converse-register', {
});
/************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('controlBoxInitialized', view => {
api.listen.on('controlBoxInitialized', view => {
view.model.on('change:active-form', view.showLoginOrRegisterForm, view);
});
/************************ END Event Handlers ************************/

View File

@ -38,9 +38,10 @@ converse.plugins.add('converse-roomslist', {
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
// Promises exposed by this plugin
_converse.api.promises.add('roomsListInitialized');
api.promises.add('roomsListInitialized');
_converse.RoomsList = Model.extend({
@ -121,8 +122,8 @@ converse.plugins.add('converse-roomslist', {
const data = {
'name': name || Strophe.unescapeNode(Strophe.getNodeFromJid(jid)) || jid
}
await _converse.api.rooms.open(jid, data, true);
_converse.api.chatviews.get(jid).maybeFocus();
await api.rooms.open(jid, data, true);
api.chatviews.get(jid).maybeFocus();
},
closeRoom (ev) {
@ -164,22 +165,22 @@ converse.plugins.add('converse-roomslist', {
* @event _converse#roomsListInitialized
* @example _converse.api.listen.on('roomsListInitialized', status => { ... });
*/
_converse.api.trigger('roomsListInitialized');
api.trigger('roomsListInitialized');
};
_converse.api.listen.on('connected', async () => {
api.listen.on('connected', async () => {
if (_converse.allow_bookmarks) {
await _converse.api.waitUntil('bookmarksInitialized');
await api.waitUntil('bookmarksInitialized');
} else {
await Promise.all([
_converse.api.waitUntil('chatBoxesFetched'),
_converse.api.waitUntil('roomsPanelRendered')
api.waitUntil('chatBoxesFetched'),
api.waitUntil('roomsPanelRendered')
]);
}
initRoomsListView();
});
_converse.api.listen.on('reconnected', initRoomsListView);
api.listen.on('reconnected', initRoomsListView);
}
});

View File

@ -33,10 +33,11 @@ converse.plugins.add('converse-rosterview', {
/* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this,
{ __ } = _converse;
const { _converse } = this;
const { api } = _converse;
const { __ } = _converse;
_converse.api.settings.update({
api.settings.update({
'autocomplete_add_contact': true,
'allow_chat_pending_contacts': true,
'allow_contact_removal': true,
@ -44,7 +45,7 @@ converse.plugins.add('converse-rosterview', {
'roster_groups': true,
'xhr_user_search_url': null,
});
_converse.api.promises.add('rosterViewInitialized');
api.promises.add('rosterViewInitialized');
const STATUSES = {
'dnd': __('This contact is busy'),
@ -68,7 +69,7 @@ converse.plugins.add('converse-rosterview', {
},
toHTML () {
const label_nickname = _converse.api.settings.get('xhr_user_search_url') ? __('Contact name') : __('Optional nickname');
const label_nickname = api.settings.get('xhr_user_search_url') ? __('Contact name') : __('Optional nickname');
return tpl_add_contact_modal(Object.assign(this.model.toJSON(), {
'_converse': _converse,
'label_nickname': label_nickname,
@ -76,7 +77,7 @@ converse.plugins.add('converse-rosterview', {
},
afterRender () {
if (_converse.api.settings.get('xhr_user_search_url') && isString(_converse.api.settings.get('xhr_user_search_url'))) {
if (api.settings.get('xhr_user_search_url') && isString(api.settings.get('xhr_user_search_url'))) {
this.initXHRAutoComplete();
} else {
this.initJIDAutoComplete();
@ -86,7 +87,7 @@ converse.plugins.add('converse-rosterview', {
},
initJIDAutoComplete () {
if (!_converse.api.settings.get('autocomplete_add_contact')) {
if (!api.settings.get('autocomplete_add_contact')) {
return;
}
const el = this.el.querySelector('.suggestion-box__jid').parentElement;
@ -98,7 +99,7 @@ converse.plugins.add('converse-rosterview', {
},
initXHRAutoComplete () {
if (!_converse.api.settings.get('autocomplete_add_contact')) {
if (!api.settings.get('autocomplete_add_contact')) {
return this.initXHRFetch();
}
const el = this.el.querySelector('.suggestion-box__name').parentElement;
@ -119,7 +120,7 @@ converse.plugins.add('converse-rosterview', {
};
const input_el = this.el.querySelector('input[name="name"]');
input_el.addEventListener('input', debounce(() => {
xhr.open("GET", `${_converse.api.settings.get('xhr_user_search_url')}q=${encodeURIComponent(input_el.value)}`, true);
xhr.open("GET", `${api.settings.get('xhr_user_search_url')}q=${encodeURIComponent(input_el.value)}`, true);
xhr.send()
} , 300));
this.name_auto_complete.on('suggestion-box-selectcomplete', ev => {
@ -176,9 +177,9 @@ converse.plugins.add('converse-rosterview', {
const data = new FormData(ev.target),
jid = (data.get('jid') || '').trim();
if (!jid && _converse.api.settings.get('xhr_user_search_url') && isString(_converse.api.settings.get('xhr_user_search_url'))) {
if (!jid && api.settings.get('xhr_user_search_url') && isString(api.settings.get('xhr_user_search_url'))) {
const input_el = this.el.querySelector('input[name="name"]');
this.xhr.open("GET", `${_converse.api.settings.get('xhr_user_search_url')}q=${encodeURIComponent(input_el.value)}`, true);
this.xhr.open("GET", `${api.settings.get('xhr_user_search_url')}q=${encodeURIComponent(input_el.value)}`, true);
this.xhr.send()
return;
}
@ -357,7 +358,7 @@ converse.plugins.add('converse-rosterview', {
Object.assign(this.model.toJSON(), {
display_name,
'desc_remove': __('Click to remove %1$s as a contact', display_name),
'allow_chat_pending_contacts': _converse.api.settings.get('allow_chat_pending_contacts')
'allow_chat_pending_contacts': api.settings.get('allow_chat_pending_contacts')
})
);
} else if (requesting === true) {
@ -368,7 +369,7 @@ converse.plugins.add('converse-rosterview', {
display_name,
'desc_accept': __("Click to accept the contact request from %1$s", display_name),
'desc_decline': __("Click to decline the contact request from %1$s", display_name),
'allow_chat_pending_contacts': _converse.api.settings.get('allow_chat_pending_contacts')
'allow_chat_pending_contacts': api.settings.get('allow_chat_pending_contacts')
})
);
} else if (subscription === 'both' || subscription === 'to' || _converse.rosterview.isSelf(jid)) {
@ -419,7 +420,7 @@ converse.plugins.add('converse-rosterview', {
'desc_status': STATUSES[show],
'desc_chat': __('Click to chat with %1$s (JID: %2$s)', display_name, item.get('jid')),
'desc_remove': __('Click to remove %1$s as a contact', display_name),
'allow_contact_removal': _converse.api.settings.get('allow_contact_removal'),
'allow_contact_removal': api.settings.get('allow_contact_removal'),
'num_unread': item.get('num_unread') || 0,
classes: ''
})
@ -438,7 +439,7 @@ converse.plugins.add('converse-rosterview', {
*/
mayBeShown () {
const chatStatus = this.model.presence.get('show');
if (_converse.api.settings.get('hide_offline_users') && chatStatus === 'offline') {
if (api.settings.get('hide_offline_users') && chatStatus === 'offline') {
// If pending or requesting, show
if ((this.model.get('ask') === 'subscribe') ||
(this.model.get('subscription') === 'from') ||
@ -453,12 +454,12 @@ converse.plugins.add('converse-rosterview', {
openChat (ev) {
if (ev && ev.preventDefault) { ev.preventDefault(); }
const attrs = this.model.attributes;
_converse.api.chats.open(attrs.jid, attrs, true);
api.chats.open(attrs.jid, attrs, true);
},
async removeContact (ev) {
if (ev && ev.preventDefault) { ev.preventDefault(); }
if (!_converse.api.settings.get('allow_contact_removal')) { return; }
if (!api.settings.get('allow_contact_removal')) { return; }
if (!confirm(__("Are you sure you want to remove this contact?"))) { return; }
try {
@ -471,7 +472,7 @@ converse.plugins.add('converse-rosterview', {
}
} catch (e) {
log.error(e);
_converse.api.alert('error', __('Error'),
api.alert('error', __('Error'),
[__('Sorry, there was an error while trying to remove %1$s as a contact.', this.model.getDisplayName())]
);
}
@ -744,9 +745,9 @@ converse.plugins.add('converse-rosterview', {
// just this group's) have been fetched from browser
// storage or the XMPP server and once they've been
// assigned to their various groups.
_converse.api.listen.on('rosterGroupsFetched', this.sortAndPositionAllItems.bind(this));
api.listen.on('rosterGroupsFetched', this.sortAndPositionAllItems.bind(this));
_converse.api.listen.on('rosterContactsFetched', () => {
api.listen.on('rosterContactsFetched', () => {
_converse.roster.each(contact => this.addRosterContact(contact, {'silent': true}));
this.update();
this.updateFilter();
@ -892,7 +893,7 @@ converse.plugins.add('converse-rosterview', {
addExistingContact (contact, options) {
let groups;
if (_converse.api.settings.get('roster_groups')) {
if (api.settings.get('roster_groups')) {
groups = contact.get('groups');
groups = (groups.length === 0) ? [_converse.HEADER_UNGROUPED] : groups;
} else {
@ -931,7 +932,7 @@ converse.plugins.add('converse-rosterview', {
});
/* -------- Event Handlers ----------- */
_converse.api.listen.on('chatBoxesInitialized', () => {
api.listen.on('chatBoxesInitialized', () => {
function highlightRosterItem (chatbox) {
const contact = _converse.roster && _converse.roster.findWhere({'jid': chatbox.get('jid')});
if (contact !== undefined) {
@ -943,13 +944,13 @@ converse.plugins.add('converse-rosterview', {
});
_converse.api.listen.on('controlBoxInitialized', (view) => {
api.listen.on('controlBoxInitialized', (view) => {
function insertRoster () {
if (!view.model.get('connected') || _converse.api.settings.get("authentication") === _converse.ANONYMOUS) {
if (!view.model.get('connected') || api.settings.get("authentication") === _converse.ANONYMOUS) {
return;
}
/* Place the rosterview inside the "Contacts" panel. */
_converse.api.waitUntil('rosterViewInitialized')
api.waitUntil('rosterViewInitialized')
.then(() => view.controlbox_pane.el.insertAdjacentElement('beforeEnd', _converse.rosterview.el))
.catch(e => log.fatal(e));
}
@ -962,7 +963,7 @@ converse.plugins.add('converse-rosterview', {
/* Create an instance of RosterView once the RosterGroups
* collection has been created (in @converse/headless/converse-core.js)
*/
if (_converse.api.settings.get("authentication") === _converse.ANONYMOUS) {
if (api.settings.get("authentication") === _converse.ANONYMOUS) {
return;
}
_converse.rosterview = new _converse.RosterView({
@ -974,12 +975,12 @@ converse.plugins.add('converse-rosterview', {
* @event _converse#rosterViewInitialized
* @example _converse.api.listen.on('rosterViewInitialized', () => { ... });
*/
_converse.api.trigger('rosterViewInitialized');
api.trigger('rosterViewInitialized');
}
_converse.api.listen.on('rosterInitialized', initRosterView);
_converse.api.listen.on('rosterReadyAfterReconnection', initRosterView);
api.listen.on('rosterInitialized', initRosterView);
api.listen.on('rosterReadyAfterReconnection', initRosterView);
_converse.api.listen.on('afterTearDown', () => {
api.listen.on('afterTearDown', () => {
if (converse.rosterview) {
converse.rosterview.model.off().reset();
converse.rosterview.each(groupview => groupview.removeAll().remove());

View File

@ -60,20 +60,21 @@ converse.plugins.add('converse-bookmarks', {
/* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this,
{ __ } = _converse;
const { _converse } = this;
const { api } = _converse;
const { __ } = _converse;
// Configuration values for this plugin
// ====================================
// Refer to docs/source/configuration.rst for explanations of these
// configuration settings.
_converse.api.settings.update({
api.settings.update({
allow_bookmarks: true,
allow_public_bookmarks: false,
muc_respect_autojoin: true
});
_converse.api.promises.add('bookmarksInitialized');
api.promises.add('bookmarksInitialized');
/**
* Check if the user has a bookmark with a saved nickanme
@ -82,7 +83,7 @@ converse.plugins.add('converse-bookmarks', {
* @method _converse#getNicknameFromBookmark
*/
_converse.getNicknameFromBookmark = function (jid) {
if (!_converse.bookmarks || !_converse.api.settings.get('allow_bookmarks')) {
if (!_converse.bookmarks || !api.settings.get('allow_bookmarks')) {
return null;
}
const bookmark = _converse.bookmarks.findWhere({'jid': jid});
@ -116,8 +117,8 @@ converse.plugins.add('converse-bookmarks', {
},
async openBookmarkedRoom (bookmark) {
if ( _converse.api.settings.get('muc_respect_autojoin') && bookmark.get('autojoin')) {
const groupchat = await _converse.api.rooms.create(bookmark.get('jid'), bookmark.get('nick'));
if ( api.settings.get('muc_respect_autojoin') && bookmark.get('autojoin')) {
const groupchat = await api.rooms.create(bookmark.get('jid'), bookmark.get('nick'));
groupchat.maybeShow();
}
return bookmark;
@ -166,13 +167,13 @@ converse.plugins.add('converse-bookmarks', {
.c('value').t('true').up().up()
.c('field', {'var':'pubsub#access_model'})
.c('value').t('whitelist');
return _converse.api.sendIQ(stanza);
return api.sendIQ(stanza);
},
onBookmarkError (iq, options) {
log.error("Error while trying to add bookmark");
log.error(iq);
_converse.api.alert(
api.alert(
'error', __('Error'), [__("Sorry, something went wrong while trying to save your bookmark.")]
);
this.findWhere({'jid': options.jid}).destroy();
@ -184,7 +185,7 @@ converse.plugins.add('converse-bookmarks', {
'type': 'get',
}).c('pubsub', {'xmlns': Strophe.NS.PUBSUB})
.c('items', {'node': 'storage:bookmarks'});
_converse.api.sendIQ(stanza)
api.sendIQ(stanza)
.then(iq => this.onBookmarksReceived(deferred, iq))
.catch(iq => this.onBookmarksReceivedError(deferred, iq)
);
@ -231,7 +232,7 @@ converse.plugins.add('converse-bookmarks', {
onBookmarksReceivedError (deferred, iq) {
if (iq === null) {
log.error('Error: timeout while fetching bookmarks');
_converse.api.alert('error', __('Timeout Error'),
api.alert('error', __('Timeout Error'),
[__("The server did not return your bookmarks within the allowed time. "+
"You can reload the page to request them again.")]
);
@ -263,16 +264,16 @@ converse.plugins.add('converse-bookmarks', {
});
_converse.checkBookmarksSupport = async function () {
const identity = await _converse.api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid);
const identity = await api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid);
if (_converse.allow_public_bookmarks) {
return !!identity;
} else {
return _converse.api.disco.supports(Strophe.NS.PUBSUB+'#publish-options', _converse.bare_jid);
return api.disco.supports(Strophe.NS.PUBSUB+'#publish-options', _converse.bare_jid);
}
}
const initBookmarks = async function () {
if (!_converse.api.settings.get('allow_bookmarks')) {
if (!api.settings.get('allow_bookmarks')) {
return;
}
if (await _converse.checkBookmarksSupport()) {
@ -284,11 +285,11 @@ converse.plugins.add('converse-bookmarks', {
* @event _converse#bookmarksInitialized
* @example _converse.api.listen.on('bookmarksInitialized', () => { ... });
*/
_converse.api.trigger('bookmarksInitialized');
api.trigger('bookmarksInitialized');
}
}
_converse.api.listen.on('clearSession', () => {
api.listen.on('clearSession', () => {
if (_converse.bookmarks !== undefined) {
_converse.bookmarks.clearStore({'silent': true});
window.sessionStorage.removeItem(_converse.bookmarks.fetched_flag);
@ -296,19 +297,19 @@ converse.plugins.add('converse-bookmarks', {
}
});
_converse.api.listen.on('reconnected', initBookmarks);
api.listen.on('reconnected', initBookmarks);
_converse.api.listen.on('connected', async () => {
api.listen.on('connected', async () => {
// Add a handler for bookmarks pushed from other connected clients
_converse.connection.addHandler(message => {
if (sizzle('event[xmlns="'+Strophe.NS.PUBSUB+'#event"] items[node="storage:bookmarks"]', message).length) {
_converse.api.waitUntil('bookmarksInitialized')
api.waitUntil('bookmarksInitialized')
.then(() => _converse.bookmarks.createBookmarksFromStanza(message))
.catch(e => log.fatal(e));
}
}, null, 'message', 'headline', null, _converse.bare_jid);
await Promise.all([_converse.api.waitUntil('chatBoxesFetched')]);
await Promise.all([api.waitUntil('chatBoxesFetched')]);
initBookmarks();
});
}

View File

@ -22,8 +22,9 @@ converse.plugins.add('converse-bosh', {
initialize () {
const { _converse } = this;
const { api } = _converse;
_converse.api.settings.update({
api.settings.update({
bosh_service_url: undefined,
prebind_url: null
});
@ -51,11 +52,11 @@ converse.plugins.add('converse-bosh', {
_converse.startNewPreboundBOSHSession = function () {
if (!_converse.api.settings.get('prebind_url')) {
if (!api.settings.get('prebind_url')) {
throw new Error("startNewPreboundBOSHSession: If you use prebind then you MUST supply a prebind_url");
}
const xhr = new XMLHttpRequest();
xhr.open('GET', _converse.api.settings.get('prebind_url'), true);
xhr.open('GET', api.settings.get('prebind_url'), true);
xhr.setRequestHeader('Accept', 'application/json, text/javascript');
xhr.onload = async function () {
if (xhr.status >= 200 && xhr.status < 400) {
@ -79,7 +80,7 @@ converse.plugins.add('converse-bosh', {
* @type { _converse }
* @example _converse.api.listen.on('noResumeableBOSHSession', _converse => { ... });
*/
_converse.api.trigger('noResumeableBOSHSession', _converse);
api.trigger('noResumeableBOSHSession', _converse);
};
xhr.send();
}
@ -101,7 +102,7 @@ converse.plugins.add('converse-bosh', {
/************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('clearSession', () => {
api.listen.on('clearSession', () => {
if (_converse.bosh_session === undefined) {
// Remove manually, even if we don't have the corresponding
// model, to avoid trying to reconnect to a stale BOSH session
@ -114,28 +115,28 @@ converse.plugins.add('converse-bosh', {
}
});
_converse.api.listen.on('setUserJID', () => {
api.listen.on('setUserJID', () => {
if (_converse.bosh_session !== undefined) {
_converse.bosh_session.save({'jid': _converse.jid});
}
});
_converse.api.listen.on('addClientFeatures', () => _converse.api.disco.own.features.add(Strophe.NS.BOSH));
api.listen.on('addClientFeatures', () => api.disco.own.features.add(Strophe.NS.BOSH));
/************************ END Event Handlers ************************/
/************************ BEGIN API ************************/
Object.assign(_converse.api, {
Object.assign(api, {
/**
* This namespace lets you access the BOSH tokens
*
* @namespace _converse.api.tokens
* @memberOf _converse.api
* @namespace api.tokens
* @memberOf api
*/
tokens: {
/**
* @method _converse.api.tokens.get
* @method api.tokens.get
* @param {string} [id] The type of token to return ('rid' or 'sid').
* @returns 'string' A token, either the RID or SID token depending on what's asked for.
* @example _converse.api.tokens.get('rid');

View File

@ -35,13 +35,14 @@ converse.plugins.add('converse-chat', {
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
const { __ } = _converse;
// Configuration values for this plugin
// ====================================
// Refer to docs/source/configuration.rst for explanations of these
// configuration settings.
_converse.api.settings.update({
api.settings.update({
'allow_message_corrections': 'all',
'allow_message_retraction': 'all',
'auto_join_private_chats': [],
@ -58,7 +59,7 @@ converse.plugins.add('converse-chat', {
},
async setRosterContact (jid) {
const contact = await _converse.api.contacts.get(jid);
const contact = await api.contacts.get(jid);
if (contact) {
this.contact = contact;
this.set('nickname', contact.get('nickname'));
@ -103,7 +104,7 @@ converse.plugins.add('converse-chat', {
* @type { _converse.Message}
* @example _converse.api.listen.on('messageInitialized', model => { ... });
*/
await _converse.api.trigger('messageInitialized', this, {'Synchronous': true});
await api.trigger('messageInitialized', this, {'Synchronous': true});
this.initialized.resolve();
},
@ -151,7 +152,7 @@ converse.plugins.add('converse-chat', {
*/
mayBeRetracted () {
const is_own_message = this.get('sender') === 'me';
return is_own_message && ['all', 'own'].includes(_converse.api.settings.get('allow_message_retraction'));
return is_own_message && ['all', 'own'].includes(api.settings.get('allow_message_retraction'));
},
safeDestroy () {
@ -212,7 +213,7 @@ converse.plugins.add('converse-chat', {
'size': this.file.size,
'content-type': this.file.type
})
return _converse.api.sendIQ(iq);
return api.sendIQ(iq);
},
async getRequestSlotURL () {
@ -306,7 +307,7 @@ converse.plugins.add('converse-chat', {
return {
'bookmarked': false,
'chat_state': undefined,
'hidden': ['mobile', 'fullscreen'].includes(_converse.api.settings.get("view_mode")),
'hidden': ['mobile', 'fullscreen'].includes(api.settings.get("view_mode")),
'message_type': 'chat',
'nickname': undefined,
'num_unread': 0,
@ -347,7 +348,7 @@ converse.plugins.add('converse-chat', {
* @type { _converse.ChatBox}
* @example _converse.api.listen.on('chatBoxInitialized', model => { ... });
*/
await _converse.api.trigger('chatBoxInitialized', this, {'Synchronous': true});
await api.trigger('chatBoxInitialized', this, {'Synchronous': true});
this.initialized.resolve();
},
@ -361,7 +362,7 @@ converse.plugins.add('converse-chat', {
this.messages.browserStorage = _converse.createStore(this.getMessagesCacheKey());
this.listenTo(this.messages, 'change:upload', message => {
if (message.get('upload') === _converse.SUCCESS) {
_converse.api.send(this.createMessageStanza(message));
api.send(this.createMessageStanza(message));
}
});
},
@ -378,7 +379,7 @@ converse.plugins.add('converse-chat', {
* @type {_converse.ChatBox | _converse.ChatRoom}
* @example _converse.api.listen.on('afterMessagesFetched', view => { ... });
*/
_converse.api.trigger('afterMessagesFetched', this);
api.trigger('afterMessagesFetched', this);
},
fetchMessages () {
@ -453,7 +454,7 @@ converse.plugins.add('converse-chat', {
} catch (e) {
log.error(e);
} finally {
if (_converse.api.settings.get('clear_messages_on_reconnection')) {
if (api.settings.get('clear_messages_on_reconnection')) {
await this.clearMessages();
}
}
@ -466,11 +467,11 @@ converse.plugins.add('converse-chat', {
* @type {_converse.ChatBox | _converse.ChatRoom}
* @example _converse.api.listen.on('onChatReconnected', chatbox => { ... });
*/
_converse.api.trigger('chatReconnected', this);
api.trigger('chatReconnected', this);
},
async onReconnection () {
if (_converse.api.settings.get('clear_messages_on_reconnection')) {
if (api.settings.get('clear_messages_on_reconnection')) {
await this.clearMessages();
}
this.announceReconnection();
@ -481,8 +482,8 @@ converse.plugins.add('converse-chat', {
return 'Ignored ChatBox without JID';
}
const room_jids = _converse.auto_join_rooms.map(s => isObject(s) ? s.jid : s);
const auto_join = _converse.api.settings.get('auto_join_private_chats').concat(room_jids);
if (_converse.api.settings.get("singleton") && !auto_join.includes(attrs.jid) && !_converse.auto_join_on_invite) {
const auto_join = api.settings.get('auto_join_private_chats').concat(room_jids);
if (api.settings.get("singleton") && !auto_join.includes(attrs.jid) && !_converse.auto_join_on_invite) {
const msg = `${attrs.jid} is not allowed because singleton is true and it's not being auto_joined`;
log.warn(msg);
return msg;
@ -793,7 +794,7 @@ converse.plugins.add('converse-chat', {
'to': to_jid,
'type': 'chat',
}).c(type, {'xmlns': Strophe.NS.MARKERS, 'id': id});
_converse.api.send(stanza);
api.send(stanza);
},
handleChatMarker (stanza, from_jid) {
@ -836,7 +837,7 @@ converse.plugins.add('converse-chat', {
'type': 'chat',
}).c('received', {'xmlns': Strophe.NS.RECEIPTS, 'id': id}).up()
.c('store', {'xmlns': Strophe.NS.HINTS}).up();
_converse.api.send(receipt_stanza);
api.send(receipt_stanza);
},
handleReceipt (stanza, original_stanza, from_jid) {
@ -936,7 +937,7 @@ converse.plugins.add('converse-chat', {
/**
* Responsible for setting the editable attribute of messages.
* If _converse.api.settings.get('allow_message_corrections') is "last", then only the last
* If api.settings.get('allow_message_corrections') is "last", then only the last
* message sent from me will be editable. If set to "all" all messages
* will be editable. Otherwise no messages will be editable.
* @method _converse.ChatBox#setEditable
@ -951,9 +952,9 @@ converse.plugins.add('converse-chat', {
if (u.isEmptyMessage(attrs) || attrs.sender !== 'me') {
return;
}
if (_converse.api.settings.get('allow_message_corrections') === 'all') {
if (api.settings.get('allow_message_corrections') === 'all') {
attrs.editable = !(attrs.file || attrs.retracted || 'oob_url' in attrs);
} else if ((_converse.api.settings.get('allow_message_corrections') === 'last') && (send_time > this.get('time_sent'))) {
} else if ((api.settings.get('allow_message_corrections') === 'last') && (send_time > this.get('time_sent'))) {
this.set({'time_sent': send_time});
const msg = this.messages.findWhere({'editable': true});
if (msg) {
@ -981,7 +982,7 @@ converse.plugins.add('converse-chat', {
* @param { String } spoiler_hint - An optional hint, if the message being sent is a spoiler
* @returns { _converse.Message }
* @example
* const chat = _converse.api.chats.get('buddy1@example.com');
* const chat = api.chats.get('buddy1@example.com');
* chat.sendMessage('hello world');
*/
async sendMessage (text, spoiler_hint) {
@ -1004,7 +1005,7 @@ converse.plugins.add('converse-chat', {
this.setEditable(attrs, (new Date()).toISOString());
message = await this.createMessage(attrs);
}
_converse.api.send(this.createMessageStanza(message));
api.send(this.createMessageStanza(message));
return message;
},
@ -1015,12 +1016,12 @@ converse.plugins.add('converse-chat', {
* @method _converse.ChatBox#sendChatState
*/
sendChatState () {
if (_converse.api.settings.get('send_chat_state_notifications') && this.get('chat_state')) {
const allowed = _converse.api.settings.get('send_chat_state_notifications');
if (api.settings.get('send_chat_state_notifications') && this.get('chat_state')) {
const allowed = api.settings.get('send_chat_state_notifications');
if (Array.isArray(allowed) && !allowed.includes(this.get('chat_state'))) {
return;
}
_converse.api.send(
api.send(
$msg({
'id': u.getUniqueId(),
'to': this.get('jid'),
@ -1034,7 +1035,7 @@ converse.plugins.add('converse-chat', {
async sendFiles (files) {
const result = await _converse.api.disco.features.get(Strophe.NS.HTTPUPLOAD, _converse.domain);
const result = await api.disco.features.get(Strophe.NS.HTTPUPLOAD, _converse.domain);
const item = result.pop();
if (!item) {
this.createMessage({
@ -1141,7 +1142,7 @@ converse.plugins.add('converse-chat', {
function rejectMessage (stanza, text) {
// Reject an incoming message by replying with an error message of type "cancel".
_converse.api.send(
api.send(
$msg({
'to': stanza.getAttribute('from'),
'type': 'error',
@ -1160,7 +1161,7 @@ converse.plugins.add('converse-chat', {
if (utils.isSameBareJID(from_jid, _converse.bare_jid)) {
return;
}
const chatbox = await _converse.api.chatboxes.get(from_jid);
const chatbox = await api.chatboxes.get(from_jid);
if (!chatbox) {
return;
}
@ -1184,7 +1185,7 @@ converse.plugins.add('converse-chat', {
let to_jid = stanza.getAttribute('to');
const to_resource = Strophe.getResourceFromJid(to_jid);
if (_converse.api.settings.get('filter_by_resource') && (to_resource && to_resource !== _converse.resource)) {
if (api.settings.get('filter_by_resource') && (to_resource && to_resource !== _converse.resource)) {
return log.info(`handleMessageStanza: Ignoring incoming message intended for a different resource: ${to_jid}`);
} else if (utils.isHeadlineMessage(_converse, stanza)) {
// XXX: Prosody sends headline messages with the
@ -1229,15 +1230,15 @@ converse.plugins.add('converse-chat', {
return log.error(`Don't know how to handle message stanza without 'to' attribute. ${stanza.outerHTML}`);
}
const contact_jid = is_me ? Strophe.getBareJidFromJid(to_jid) : from_bare_jid;
const contact = await _converse.api.contacts.get(contact_jid);
if (contact === undefined && !_converse.api.settings.get("allow_non_roster_messaging")) {
const contact = await api.contacts.get(contact_jid);
if (contact === undefined && !api.settings.get("allow_non_roster_messaging")) {
log.error(`Blocking messaging with a JID not in our roster because allow_non_roster_messaging is false.`);
return log.error(stanza);
}
// Get chat box, but only create when the message has something to show to the user
const has_body = sizzle(`body, encrypted[xmlns="${Strophe.NS.OMEMO}"]`, stanza).length > 0;
const roster_nick = contact?.attributes?.nickname;
const chatbox = await _converse.api.chats.get(contact_jid, {'nickname': roster_nick}, has_body);
const chatbox = await api.chats.get(contact_jid, {'nickname': roster_nick}, has_body);
chatbox && await chatbox.queueMessage(stanza, original_stanza, from_jid);
/**
* Triggered when a message stanza is been received and processed.
@ -1247,7 +1248,7 @@ converse.plugins.add('converse-chat', {
* @property { XMLElement } stanza
* @example _converse.api.listen.on('message', obj => { ... });
*/
_converse.api.trigger('message', {'stanza': original_stanza, 'chatbox': chatbox});
api.trigger('message', {'stanza': original_stanza, 'chatbox': chatbox});
}
@ -1287,12 +1288,12 @@ converse.plugins.add('converse-chat', {
function autoJoinChats () {
// Automatically join private chats, based on the
// "auto_join_private_chats" configuration setting.
_converse.api.settings.get('auto_join_private_chats').forEach(jid => {
api.settings.get('auto_join_private_chats').forEach(jid => {
if (_converse.chatboxes.where({'jid': jid}).length) {
return;
}
if (isString(jid)) {
_converse.api.chats.open(jid);
api.chats.open(jid);
} else {
log.error('Invalid jid criteria specified for "auto_join_private_chats"');
}
@ -1305,7 +1306,7 @@ converse.plugins.add('converse-chat', {
* @example _converse.api.listen.on('privateChatsAutoJoined', () => { ... });
* @example _converse.api.waitUntil('privateChatsAutoJoined').then(() => { ... });
*/
_converse.api.trigger('privateChatsAutoJoined');
api.trigger('privateChatsAutoJoined');
}
@ -1314,17 +1315,17 @@ converse.plugins.add('converse-chat', {
if (!utils.isValidJID(jid)) {
return log.warn(`Invalid JID "${jid}" provided in URL fragment`);
}
_converse.api.chats.open(jid);
api.chats.open(jid);
}
_converse.router.route('converse/chat?jid=:jid', openChat);
/************************ END Route Handlers ************************/
/************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('chatBoxesFetched', autoJoinChats);
_converse.api.listen.on('presencesInitialized', registerMessageHandlers);
api.listen.on('chatBoxesFetched', autoJoinChats);
api.listen.on('presencesInitialized', registerMessageHandlers);
_converse.api.listen.on('clearSession', () => {
api.listen.on('clearSession', () => {
if (_converse.shouldClearCache()) {
return Promise.all(_converse.chatboxes.map(c => c.messages && c.messages.clearStore({'silent': true})));
}
@ -1333,26 +1334,26 @@ converse.plugins.add('converse-chat', {
/************************ BEGIN API ************************/
Object.assign(_converse.api, {
Object.assign(api, {
/**
* The "chats" namespace (used for one-on-one chats)
*
* @namespace _converse.api.chats
* @memberOf _converse.api
* @namespace api.chats
* @memberOf api
*/
chats: {
/**
* @method _converse.api.chats.create
* @method api.chats.create
* @param {string|string[]} jid|jids An jid or array of jids
* @param {object} [attrs] An object containing configuration attributes.
*/
async create (jids, attrs) {
if (isString(jids)) {
if (attrs && !attrs?.fullname) {
const contact = await _converse.api.contacts.get(jids);
const contact = await api.contacts.get(jids);
attrs.fullname = contact?.attributes?.fullname;
}
const chatbox = _converse.api.chats.get(jids, attrs, true);
const chatbox = api.chats.get(jids, attrs, true);
if (!chatbox) {
log.error("Could not open chatbox for JID: "+jids);
return;
@ -1361,9 +1362,9 @@ converse.plugins.add('converse-chat', {
}
if (Array.isArray(jids)) {
return Promise.all(jids.forEach(async jid => {
const contact = await _converse.api.contacts.get(jids);
const contact = await api.contacts.get(jids);
attrs.fullname = contact?.attributes?.fullname;
return _converse.api.chats.get(jid, attrs, true).maybeShow();
return api.chats.get(jid, attrs, true).maybeShow();
}));
}
log.error("chats.create: You need to provide at least one JID");
@ -1373,7 +1374,7 @@ converse.plugins.add('converse-chat', {
/**
* Opens a new one-on-one chat.
*
* @method _converse.api.chats.open
* @method api.chats.open
* @param {String|string[]} name - e.g. 'buddy@example.com' or ['buddy1@example.com', 'buddy2@example.com']
* @param {Object} [attrs] - Attributes to be set on the _converse.ChatBox model.
* @param {Boolean} [attrs.minimized] - Should the chat be created in minimized state.
@ -1392,7 +1393,7 @@ converse.plugins.add('converse-chat', {
* initialize: function() {
* const _converse = this._converse;
* // Note, buddy@example.org must be in your contacts roster!
* _converse.api.chats.open('buddy@example.com').then(chat => {
* api.chats.open('buddy@example.com').then(chat => {
* // Now you can do something with the chat model
* });
* }
@ -1404,7 +1405,7 @@ converse.plugins.add('converse-chat', {
* initialize: function () {
* const _converse = this._converse;
* // Note, these users must first be in your contacts roster!
* _converse.api.chats.open(['buddy1@example.com', 'buddy2@example.com']).then(chats => {
* api.chats.open(['buddy1@example.com', 'buddy2@example.com']).then(chats => {
* // Now you can do something with the chat models
* });
* }
@ -1412,14 +1413,14 @@ converse.plugins.add('converse-chat', {
*/
async open (jids, attrs, force) {
if (isString(jids)) {
const chat = await _converse.api.chats.get(jids, attrs, true);
const chat = await api.chats.get(jids, attrs, true);
if (chat) {
return chat.maybeShow(force);
}
return chat;
} else if (Array.isArray(jids)) {
return Promise.all(
jids.map(j => _converse.api.chats.get(j, attrs, true).then(c => c && c.maybeShow(force)))
jids.map(j => api.chats.get(j, attrs, true).then(c => c && c.maybeShow(force)))
.filter(c => c)
);
}
@ -1431,7 +1432,7 @@ converse.plugins.add('converse-chat', {
/**
* Retrieves a chat or all chats.
*
* @method _converse.api.chats.get
* @method api.chats.get
* @param {String|string[]} jids - e.g. 'buddy@example.com' or ['buddy1@example.com', 'buddy2@example.com']
* @param {Object} [attrs] - Attributes to be set on the _converse.ChatBox model.
* @param {Boolean} [create=false] - Whether the chat should be created if it's not found.
@ -1439,22 +1440,22 @@ converse.plugins.add('converse-chat', {
*
* @example
* // To return a single chat, provide the JID of the contact you're chatting with in that chat:
* const model = await _converse.api.chats.get('buddy@example.com');
* const model = await api.chats.get('buddy@example.com');
*
* @example
* // To return an array of chats, provide an array of JIDs:
* const models = await _converse.api.chats.get(['buddy1@example.com', 'buddy2@example.com']);
* const models = await api.chats.get(['buddy1@example.com', 'buddy2@example.com']);
*
* @example
* // To return all open chats, call the method without any parameters::
* const models = await _converse.api.chats.get();
* const models = await api.chats.get();
*
*/
async get (jids, attrs={}, create=false) {
async function _get (jid) {
let model = await _converse.api.chatboxes.get(jid);
let model = await api.chatboxes.get(jid);
if (!model && create) {
model = await _converse.api.chatboxes.create(jid, attrs, _converse.ChatBox);
model = await api.chatboxes.create(jid, attrs, _converse.ChatBox);
} else {
model = (model && model.get('type') === _converse.PRIVATE_CHAT_TYPE) ? model : null;
if (model && Object.keys(attrs).length) {
@ -1464,7 +1465,7 @@ converse.plugins.add('converse-chat', {
return model;
}
if (jids === undefined) {
const chats = await _converse.api.chatboxes.get();
const chats = await api.chatboxes.get();
return chats.filter(c => (c.get('type') === _converse.PRIVATE_CHAT_TYPE));
} else if (isString(jids)) {
return _get(jids);

View File

@ -26,8 +26,9 @@ converse.plugins.add('converse-chatboxes', {
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
_converse.api.promises.add([
api.promises.add([
'chatBoxesFetched',
'chatBoxesInitialized',
'privateChatsAutoJoined'
@ -78,7 +79,7 @@ converse.plugins.add('converse-chatboxes', {
* @example _converse.api.listen.on('message', obj => { ... });
* @example _converse.api.waitUntil('chatBoxesFetched').then(() => { ... });
*/
_converse.api.trigger('chatBoxesFetched');
api.trigger('chatBoxesFetched');
},
onConnected (reconnecting) {
@ -114,13 +115,13 @@ converse.plugins.add('converse-chatboxes', {
/************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('addClientFeatures', () => {
_converse.api.disco.own.features.add(Strophe.NS.MESSAGE_CORRECT);
_converse.api.disco.own.features.add(Strophe.NS.HTTPUPLOAD);
_converse.api.disco.own.features.add(Strophe.NS.OUTOFBAND);
api.listen.on('addClientFeatures', () => {
api.disco.own.features.add(Strophe.NS.MESSAGE_CORRECT);
api.disco.own.features.add(Strophe.NS.HTTPUPLOAD);
api.disco.own.features.add(Strophe.NS.OUTOFBAND);
});
_converse.api.listen.on('pluginsInitialized', () => {
api.listen.on('pluginsInitialized', () => {
_converse.chatboxes = new _converse.ChatBoxes();
/**
* Triggered once the _converse.ChatBoxes collection has been initialized.
@ -128,32 +129,32 @@ converse.plugins.add('converse-chatboxes', {
* @example _converse.api.listen.on('chatBoxesInitialized', () => { ... });
* @example _converse.api.waitUntil('chatBoxesInitialized').then(() => { ... });
*/
_converse.api.trigger('chatBoxesInitialized');
api.trigger('chatBoxesInitialized');
});
_converse.api.listen.on('presencesInitialized', (reconnecting) => _converse.chatboxes.onConnected(reconnecting));
_converse.api.listen.on('reconnected', () => _converse.chatboxes.forEach(m => m.onReconnection()));
_converse.api.listen.on('windowStateChanged', d => (d.state === 'visible') && _converse.clearMsgCounter());
api.listen.on('presencesInitialized', (reconnecting) => _converse.chatboxes.onConnected(reconnecting));
api.listen.on('reconnected', () => _converse.chatboxes.forEach(m => m.onReconnection()));
api.listen.on('windowStateChanged', d => (d.state === 'visible') && _converse.clearMsgCounter());
/************************ END Event Handlers ************************/
/************************ BEGIN API ************************/
Object.assign(_converse.api, {
Object.assign(api, {
/**
* The "chatboxes" namespace.
*
* @namespace _converse.api.chatboxes
* @memberOf _converse.api
* @namespace api.chatboxes
* @memberOf api
*/
chatboxes: {
/**
* @method _converse.api.chats.create
* @method api.chats.create
* @param { String|String[] } jids - A JID or array of JIDs
* @param { Object } [attrs] An object containing configuration attributes
* @param { Model } model - The type of chatbox that should be created
*/
async create (jids=[], attrs={}, model) {
await _converse.api.waitUntil('chatBoxesFetched');
await api.waitUntil('chatBoxesFetched');
if (isString(jids)) {
return createChatBox(jids, attrs, model);
} else {
@ -162,11 +163,11 @@ converse.plugins.add('converse-chatboxes', {
},
/**
* @method _converse.api.chats.get
* @method api.chats.get
* @param { String|String[] } jids - A JID or array of JIDs
*/
async get (jids) {
await _converse.api.waitUntil('chatBoxesFetched');
await api.waitUntil('chatBoxesFetched');
if (jids === undefined) {
return _converse.chatboxes.models;
} else if (isString(jids)) {

View File

@ -20,10 +20,11 @@ converse.plugins.add('converse-disco', {
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
// Promises exposed by this plugin
_converse.api.promises.add('discoInitialized');
_converse.api.promises.add('streamFeaturesAdded');
api.promises.add('discoInitialized');
api.promises.add('streamFeaturesAdded');
/**
@ -106,7 +107,7 @@ converse.plugins.add('converse-disco', {
* @type { Model }
* @example _converse.api.listen.on('featuresDiscovered', feature => { ... });
*/
_converse.api.trigger('serviceDiscovered', feature);
api.trigger('serviceDiscovered', feature);
},
onFieldAdded (field) {
@ -117,7 +118,7 @@ converse.plugins.add('converse-disco', {
* @event _converse#discoExtensionFieldDiscovered
* @example _converse.api.listen.on('discoExtensionFieldDiscovered', () => { ... });
*/
_converse.api.trigger('discoExtensionFieldDiscovered', field);
api.trigger('discoExtensionFieldDiscovered', field);
},
async fetchFeatures (options) {
@ -144,7 +145,7 @@ converse.plugins.add('converse-disco', {
async queryInfo () {
let stanza;
try {
stanza = await _converse.api.disco.info(this.get('jid'), null);
stanza = await api.disco.info(this.get('jid'), null);
} catch (iq) {
log.error(iq);
this.waitUntilFeaturesDiscovered.resolve(this);
@ -178,7 +179,7 @@ converse.plugins.add('converse-disco', {
// server or a conference component.
return;
}
const stanza = await _converse.api.disco.items(this.get('jid'));
const stanza = await api.disco.items(this.get('jid'));
this.onDiscoItems(stanza);
},
@ -246,13 +247,13 @@ converse.plugins.add('converse-disco', {
function addClientFeatures () {
// See https://xmpp.org/registrar/disco-categories.html
_converse.api.disco.own.identities.add('client', 'web', 'Converse');
api.disco.own.identities.add('client', 'web', 'Converse');
_converse.api.disco.own.features.add(Strophe.NS.CHATSTATES);
_converse.api.disco.own.features.add(Strophe.NS.DISCO_INFO);
_converse.api.disco.own.features.add(Strophe.NS.ROSTERX); // Limited support
if (_converse.api.settings.get("message_carbons")) {
_converse.api.disco.own.features.add(Strophe.NS.CARBONS);
api.disco.own.features.add(Strophe.NS.CHATSTATES);
api.disco.own.features.add(Strophe.NS.DISCO_INFO);
api.disco.own.features.add(Strophe.NS.ROSTERX); // Limited support
if (api.settings.get("message_carbons")) {
api.disco.own.features.add(Strophe.NS.CARBONS);
}
/**
* Triggered in converse-disco once the core disco features of
@ -260,7 +261,7 @@ converse.plugins.add('converse-disco', {
* @event _converse#addClientFeatures
* @example _converse.api.listen.on('addClientFeatures', () => { ... });
*/
_converse.api.trigger('addClientFeatures');
api.trigger('addClientFeatures');
return this;
}
@ -274,7 +275,7 @@ converse.plugins.add('converse-disco', {
if (!_converse.stream_features) {
const bare_jid = Strophe.getBareJidFromJid(_converse.jid);
const id = `converse.stream-features-${bare_jid}`;
_converse.api.promises.add('streamFeaturesAdded');
api.promises.add('streamFeaturesAdded');
_converse.stream_features = new Collection();
_converse.stream_features.browserStorage = _converse.createStore(id, "session");
}
@ -306,7 +307,7 @@ converse.plugins.add('converse-disco', {
* @event _converse#streamFeaturesAdded
* @example _converse.api.listen.on('streamFeaturesAdded', () => { ... });
*/
_converse.api.trigger('streamFeaturesAdded');
api.trigger('streamFeaturesAdded');
}
@ -339,7 +340,7 @@ converse.plugins.add('converse-disco', {
iqresult.c('identity', attrs).up();
});
plugin._features.forEach(feature => iqresult.c('feature', {'var': feature}).up());
_converse.api.send(iqresult.tree());
api.send(iqresult.tree());
return true;
}
@ -364,12 +365,12 @@ converse.plugins.add('converse-disco', {
* @event _converse#discoInitialized
* @example _converse.api.listen.on('discoInitialized', () => { ... });
*/
_converse.api.trigger('discoInitialized');
api.trigger('discoInitialized');
}
/******************** Event Handlers ********************/
_converse.api.listen.on('userSessionInitialized', async () => {
api.listen.on('userSessionInitialized', async () => {
initStreamFeatures();
if (_converse.connfeedback.get('connection_status') === Strophe.Status.ATTACHED) {
// When re-attaching to a BOSH session, we fetch the stream features from the cache.
@ -377,20 +378,20 @@ converse.plugins.add('converse-disco', {
notifyStreamFeaturesAdded();
}
});
_converse.api.listen.on('beforeResourceBinding', populateStreamFeatures);
api.listen.on('beforeResourceBinding', populateStreamFeatures);
_converse.api.listen.on('reconnected', initializeDisco);
_converse.api.listen.on('connected', initializeDisco);
api.listen.on('reconnected', initializeDisco);
api.listen.on('connected', initializeDisco);
_converse.api.listen.on('beforeTearDown', async () => {
_converse.api.promises.add('streamFeaturesAdded')
api.listen.on('beforeTearDown', async () => {
api.promises.add('streamFeaturesAdded')
if (_converse.stream_features) {
await _converse.stream_features.clearStore();
delete _converse.stream_features;
}
});
_converse.api.listen.on('clearSession', () => {
api.listen.on('clearSession', () => {
if (_converse.shouldClearCache() && _converse.disco_entities) {
Array.from(_converse.disco_entities.models).forEach(e => e.features.clearStore());
Array.from(_converse.disco_entities.models).forEach(e => e.identities.clearStore());
@ -404,34 +405,34 @@ converse.plugins.add('converse-disco', {
/************************ API ************************/
Object.assign(_converse.api, {
Object.assign(api, {
/**
* The XEP-0030 service discovery API
*
* This API lets you discover information about entities on the
* XMPP network.
*
* @namespace _converse.api.disco
* @memberOf _converse.api
* @namespace api.disco
* @memberOf api
*/
disco: {
/**
* @namespace _converse.api.disco.stream
* @memberOf _converse.api.disco
* @namespace api.disco.stream
* @memberOf api.disco
*/
stream: {
/**
* @method _converse.api.disco.stream.getFeature
* @method api.disco.stream.getFeature
* @param {String} name The feature name
* @param {String} xmlns The XML namespace
* @example _converse.api.disco.stream.getFeature('ver', 'urn:xmpp:features:rosterver')
*/
async getFeature (name, xmlns) {
await _converse.api.waitUntil('streamFeaturesAdded');
await api.waitUntil('streamFeaturesAdded');
if (!name || !xmlns) {
throw new Error("name and xmlns need to be provided when calling disco.stream.getFeature");
}
if (_converse.stream_features === undefined && !_converse.api.connection.connected()) {
if (_converse.stream_features === undefined && !api.connection.connected()) {
// Happens during tests when disco lookups happen asynchronously after teardown.
const msg = `Tried to get feature ${name} ${xmlns} but _converse.stream_features has been torn down`;
log.warn(msg);
@ -442,18 +443,18 @@ converse.plugins.add('converse-disco', {
},
/**
* @namespace _converse.api.disco.own
* @memberOf _converse.api.disco
* @namespace api.disco.own
* @memberOf api.disco
*/
own: {
/**
* @namespace _converse.api.disco.own.identities
* @memberOf _converse.api.disco.own
* @namespace api.disco.own.identities
* @memberOf api.disco.own
*/
identities: {
/**
* Lets you add new identities for this client (i.e. instance of Converse)
* @method _converse.api.disco.own.identities.add
* @method api.disco.own.identities.add
*
* @param {String} category - server, client, gateway, directory, etc.
* @param {String} type - phone, pc, web, etc.
@ -475,7 +476,7 @@ converse.plugins.add('converse-disco', {
},
/**
* Clears all previously registered identities.
* @method _converse.api.disco.own.identities.clear
* @method api.disco.own.identities.clear
* @example _converse.api.disco.own.identities.clear();
*/
clear () {
@ -484,8 +485,8 @@ converse.plugins.add('converse-disco', {
/**
* Returns all of the identities registered for this client
* (i.e. instance of Converse).
* @method _converse.api.disco.identities.get
* @example const identities = _converse.api.disco.own.identities.get();
* @method api.disco.identities.get
* @example const identities = api.disco.own.identities.get();
*/
get () {
return plugin._identities;
@ -493,13 +494,13 @@ converse.plugins.add('converse-disco', {
},
/**
* @namespace _converse.api.disco.own.features
* @memberOf _converse.api.disco.own
* @namespace api.disco.own.features
* @memberOf api.disco.own
*/
features: {
/**
* Lets you register new disco features for this client (i.e. instance of Converse)
* @method _converse.api.disco.own.features.add
* @method api.disco.own.features.add
* @param {String} name - e.g. http://jabber.org/protocol/caps
* @example _converse.api.disco.own.features.add("http://jabber.org/protocol/caps");
*/
@ -511,7 +512,7 @@ converse.plugins.add('converse-disco', {
},
/**
* Clears all previously registered features.
* @method _converse.api.disco.own.features.clear
* @method api.disco.own.features.clear
* @example _converse.api.disco.own.features.clear();
*/
clear () {
@ -519,8 +520,8 @@ converse.plugins.add('converse-disco', {
},
/**
* Returns all of the features registered for this client (i.e. instance of Converse).
* @method _converse.api.disco.own.features.get
* @example const features = _converse.api.disco.own.features.get();
* @method api.disco.own.features.get
* @example const features = api.disco.own.features.get();
*/
get () {
return plugin._features;
@ -531,7 +532,7 @@ converse.plugins.add('converse-disco', {
/**
* Query for information about an XMPP entity
*
* @method _converse.api.disco.info
* @method api.disco.info
* @param {string} jid The Jabber ID of the entity to query
* @param {string} [node] A specific node identifier associated with the JID
* @returns {promise} Promise which resolves once we have a result from the server.
@ -546,13 +547,13 @@ converse.plugins.add('converse-disco', {
'to':jid,
'type':'get'
}).c('query', attrs);
return _converse.api.sendIQ(info);
return api.sendIQ(info);
},
/**
* Query for items associated with an XMPP entity
*
* @method _converse.api.disco.items
* @method api.disco.items
* @param {string} jid The Jabber ID of the entity to query for items
* @param {string} [node] A specific node identifier associated with the JID
* @returns {promise} Promise which resolves once we have a result from the server.
@ -562,7 +563,7 @@ converse.plugins.add('converse-disco', {
if (node) {
attrs.node = node;
}
return _converse.api.sendIQ(
return api.sendIQ(
$iq({
'from': _converse.connection.jid,
'to':jid,
@ -574,24 +575,24 @@ converse.plugins.add('converse-disco', {
/**
* Namespace for methods associated with disco entities
*
* @namespace _converse.api.disco.entities
* @memberOf _converse.api.disco
* @namespace api.disco.entities
* @memberOf api.disco
*/
entities: {
/**
* Get the corresponding `DiscoEntity` instance.
*
* @method _converse.api.disco.entities.get
* @method api.disco.entities.get
* @param {string} jid The Jabber ID of the entity
* @param {boolean} [create] Whether the entity should be created if it doesn't exist.
* @example _converse.api.disco.entities.get(jid);
*/
async get (jid, create=false) {
await _converse.api.waitUntil('discoInitialized');
await api.waitUntil('discoInitialized');
if (!jid) {
return _converse.disco_entities;
}
if (_converse.disco_entities === undefined && !_converse.api.connection.connected()) {
if (_converse.disco_entities === undefined && !api.connection.connected()) {
// Happens during tests when disco lookups happen asynchronously after teardown.
const msg = `Tried to look up entity ${jid} but _converse.disco_entities has been torn down`;
log.warn(msg);
@ -601,7 +602,7 @@ converse.plugins.add('converse-disco', {
if (entity || !create) {
return entity;
}
return _converse.api.disco.entities.create(jid);
return api.disco.entities.create(jid);
},
/**
@ -612,7 +613,7 @@ converse.plugins.add('converse-disco', {
* Fetching from cache can be disabled by passing in
* `ignore_cache: true` in the options parameter.
*
* @method _converse.api.disco.entities.create
* @method api.disco.entities.create
* @param {string} jid The Jabber ID of the entity
* @param {object} [options] Additional options
* @param {boolean} [options.ignore_cache]
@ -625,14 +626,14 @@ converse.plugins.add('converse-disco', {
},
/**
* @namespace _converse.api.disco.features
* @memberOf _converse.api.disco
* @namespace api.disco.features
* @memberOf api.disco
*/
features: {
/**
* Return a given feature of a disco entity
*
* @method _converse.api.disco.features.get
* @method api.disco.features.get
* @param {string} feature The feature that might be
* supported. In the XML stanza, this is the `var`
* attribute of the `<feature>` element. For
@ -644,16 +645,16 @@ converse.plugins.add('converse-disco', {
* itself or those items associated with the entity if
* they support the given feature.
* @example
* _converse.api.disco.features.get(Strophe.NS.MAM, _converse.bare_jid);
* api.disco.features.get(Strophe.NS.MAM, _converse.bare_jid);
*/
async get (feature, jid) {
if (!jid) {
throw new TypeError('You need to provide an entity JID');
}
await _converse.api.waitUntil('discoInitialized');
let entity = await _converse.api.disco.entities.get(jid, true);
await api.waitUntil('discoInitialized');
let entity = await api.disco.entities.get(jid, true);
if (_converse.disco_entities === undefined && !_converse.api.connection.connected()) {
if (_converse.disco_entities === undefined && !api.connection.connected()) {
// Happens during tests when disco lookups happen asynchronously after teardown.
const msg = `Tried to get feature ${feature} for ${jid} but _converse.disco_entities has been torn down`;
log.warn(msg);
@ -669,7 +670,7 @@ converse.plugins.add('converse-disco', {
/**
* Used to determine whether an entity supports a given feature.
*
* @method _converse.api.disco.supports
* @method api.disco.supports
* @param {string} feature The feature that might be
* supported. In the XML stanza, this is the `var`
* attribute of the `<feature>` element. For
@ -678,32 +679,32 @@ converse.plugins.add('converse-disco', {
* (and its associated items) which should be queried
* @returns {promise} A promise which resolves with `true` or `false`.
* @example
* if (await _converse.api.disco.supports(Strophe.NS.MAM, _converse.bare_jid)) {
* if (await api.disco.supports(Strophe.NS.MAM, _converse.bare_jid)) {
* // The feature is supported
* } else {
* // The feature is not supported
* }
*/
async supports (feature, jid) {
const features = await _converse.api.disco.features.get(feature, jid);
const features = await api.disco.features.get(feature, jid);
return features.length > 0;
},
/**
* Refresh the features, fields and identities associated with a
* disco entity by refetching them from the server
* @method _converse.api.disco.refresh
* @method api.disco.refresh
* @param {string} jid The JID of the entity whose features are refreshed.
* @returns {promise} A promise which resolves once the features have been refreshed
* @example
* await _converse.api.disco.refresh('room@conference.example.org');
* await api.disco.refresh('room@conference.example.org');
*/
async refresh (jid) {
if (!jid) {
throw new TypeError('api.disco.refresh: You need to provide an entity JID');
}
await _converse.api.waitUntil('discoInitialized');
let entity = await _converse.api.disco.entities.get(jid);
await api.waitUntil('discoInitialized');
let entity = await api.disco.entities.get(jid);
if (entity) {
entity.features.reset();
entity.fields.reset();
@ -714,34 +715,34 @@ converse.plugins.add('converse-disco', {
entity.queryInfo();
} else {
// Create it if it doesn't exist
entity = await _converse.api.disco.entities.create(jid, {'ignore_cache': true});
entity = await api.disco.entities.create(jid, {'ignore_cache': true});
}
return entity.waitUntilFeaturesDiscovered;
},
/**
* @deprecated Use {@link _converse.api.disco.refresh} instead.
* @method _converse.api.disco.refreshFeatures
* @deprecated Use {@link api.disco.refresh} instead.
* @method api.disco.refreshFeatures
*/
refreshFeatures (jid) {
return _converse.api.refresh(jid);
return api.refresh(jid);
},
/**
* Return all the features associated with a disco entity
*
* @method _converse.api.disco.getFeatures
* @method api.disco.getFeatures
* @param {string} jid The JID of the entity whose features are returned.
* @returns {promise} A promise which resolves with the returned features
* @example
* const features = await _converse.api.disco.getFeatures('room@conference.example.org');
* const features = await api.disco.getFeatures('room@conference.example.org');
*/
async getFeatures (jid) {
if (!jid) {
throw new TypeError('api.disco.getFeatures: You need to provide an entity JID');
}
await _converse.api.waitUntil('discoInitialized');
let entity = await _converse.api.disco.entities.get(jid, true);
await api.waitUntil('discoInitialized');
let entity = await api.disco.entities.get(jid, true);
entity = await entity.waitUntilFeaturesDiscovered;
return entity.features;
},
@ -752,17 +753,17 @@ converse.plugins.add('converse-disco', {
*
* See [XEP-0129: Service Discovery Extensions](https://xmpp.org/extensions/xep-0128.html)
*
* @method _converse.api.disco.getFields
* @method api.disco.getFields
* @param {string} jid The JID of the entity whose fields are returned.
* @example
* const fields = await _converse.api.disco.getFields('room@conference.example.org');
* const fields = await api.disco.getFields('room@conference.example.org');
*/
async getFields (jid) {
if (!jid) {
throw new TypeError('api.disco.getFields: You need to provide an entity JID');
}
await _converse.api.waitUntil('discoInitialized');
let entity = await _converse.api.disco.entities.get(jid, true);
await api.waitUntil('discoInitialized');
let entity = await api.disco.entities.get(jid, true);
entity = await entity.waitUntilFeaturesDiscovered;
return entity.fields;
},
@ -775,7 +776,7 @@ converse.plugins.add('converse-disco', {
* `category='pubsub'` and `type='pep'` as explained in this section of
* XEP-0163: https://xmpp.org/extensions/xep-0163.html#support
*
* @method _converse.api.disco.getIdentity
* @method api.disco.getIdentity
* @param {string} The identity category.
* In the XML stanza, this is the `category`
* attribute of the `<identity>` element.
@ -788,7 +789,7 @@ converse.plugins.add('converse-disco', {
* @returns {promise} A promise which resolves with a map indicating
* whether an identity with a given type is provided by the entity.
* @example
* _converse.api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid).then(
* api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid).then(
* function (identity) {
* if (identity) {
* // The entity DOES have this identity
@ -799,8 +800,8 @@ converse.plugins.add('converse-disco', {
* ).catch(e => log.error(e));
*/
async getIdentity (category, type, jid) {
const e = await _converse.api.disco.entities.get(jid, true);
if (e === undefined && !_converse.api.connection.connected()) {
const e = await api.disco.entities.get(jid, true);
if (e === undefined && !api.connection.connected()) {
// Happens during tests when disco lookups happen asynchronously after teardown.
const msg = `Tried to look up category ${category} for ${jid} but _converse.disco_entities has been torn down`;
log.warn(msg);

View File

@ -61,9 +61,10 @@ converse.plugins.add('converse-emoji', {
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
const { ___ } = _converse;
_converse.api.settings.update({
api.settings.update({
'emoji_image_path': twemoji.default.base,
'emoji_categories': {
"smileys": ":grinning:",
@ -98,8 +99,8 @@ converse.plugins.add('converse-emoji', {
});
_converse.emojis = {};
_converse.api.promises.add('emojisInitialized', false);
twemoji.default.base = _converse.api.settings.get('emoji_image_path');
api.promises.add('emojisInitialized', false);
twemoji.default.base = api.settings.get('emoji_image_path');
/**
@ -162,7 +163,7 @@ converse.plugins.add('converse-emoji', {
}
};
const transform = u.shortnamesToEmojis;
return _converse.api.settings.get('use_system_emojis') ? transform : text => twemoji.default.parse(transform(text), how);
return api.settings.get('use_system_emojis') ? transform : text => twemoji.default.parse(transform(text), how);
},
/**
@ -263,18 +264,18 @@ converse.plugins.add('converse-emoji', {
/************************ BEGIN API ************************/
// We extend the default converse.js API to add methods specific to MUC groupchats.
Object.assign(_converse.api, {
Object.assign(api, {
/**
* The "rooms" namespace groups methods relevant to chatrooms
* (aka groupchats).
*
* @namespace _converse.api.rooms
* @memberOf _converse.api
* @namespace api.rooms
* @memberOf api
*/
emojis: {
/**
* Initializes Emoji support by downloading the emojis JSON (and any applicable images).
* @method _converse.api.emojis.initialize
* @method api.emojis.initialize
* @returns {Promise}
*/
async initialize () {
@ -300,7 +301,7 @@ converse.plugins.add('converse-emoji', {
* fetched and its save to start calling emoji utility methods.
* @event _converse#emojisInitialized
*/
_converse.api.trigger('emojisInitialized');
api.trigger('emojisInitialized');
}
}
});

View File

@ -47,6 +47,7 @@ converse.plugins.add('converse-headlines', {
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
/**
* Shows headline messages
@ -58,7 +59,7 @@ converse.plugins.add('converse-headlines', {
defaults () {
return {
'bookmarked': false,
'hidden': ['mobile', 'fullscreen'].includes(_converse.api.settings.get("view_mode")),
'hidden': ['mobile', 'fullscreen'].includes(api.settings.get("view_mode")),
'message_type': 'headline',
'num_unread': 0,
'time_opened': this.get('time_opened') || (new Date()).getTime(),
@ -75,7 +76,7 @@ converse.plugins.add('converse-headlines', {
* @type { _converse.HeadlinesBox }
* @example _converse.api.listen.on('headlinesBoxInitialized', model => { ... });
*/
_converse.api.trigger('headlinesBoxInitialized', this);
api.trigger('headlinesBoxInitialized', this);
}
});
@ -85,7 +86,7 @@ converse.plugins.add('converse-headlines', {
const from_jid = message.getAttribute('from');
if (from_jid.includes('@') &&
!_converse.roster.get(from_jid) &&
!_converse.api.settings.get("allow_non_roster_messaging")) {
!api.settings.get("allow_non_roster_messaging")) {
return;
}
if (message.querySelector('body') === null) {
@ -100,7 +101,7 @@ converse.plugins.add('converse-headlines', {
});
const attrs = await chatbox.getMessageAttributesFromStanza(message, message);
await chatbox.createMessage(attrs);
_converse.api.trigger('message', {'chatbox': chatbox, 'stanza': message});
api.trigger('message', {'chatbox': chatbox, 'stanza': message});
}
}
@ -112,26 +113,26 @@ converse.plugins.add('converse-headlines', {
return true
}, null, 'message');
}
_converse.api.listen.on('connected', registerHeadlineHandler);
_converse.api.listen.on('reconnected', registerHeadlineHandler);
api.listen.on('connected', registerHeadlineHandler);
api.listen.on('reconnected', registerHeadlineHandler);
/************************ END Event Handlers ************************/
/************************ BEGIN API ************************/
Object.assign(_converse.api, {
Object.assign(api, {
/**
* The "headlines" namespace, which is used for headline-channels
* which are read-only channels containing messages of type
* "headline".
*
* @namespace _converse.api.headlines
* @memberOf _converse.api
* @namespace api.headlines
* @memberOf api
*/
headlines: {
/**
* Retrieves a headline-channel or all headline-channels.
*
* @method _converse.api.headlines.get
* @method api.headlines.get
* @param {String|String[]} jids - e.g. 'buddy@example.com' or ['buddy1@example.com', 'buddy2@example.com']
* @param {Object} [attrs] - Attributes to be set on the _converse.ChatBox model.
* @param {Boolean} [create=false] - Whether the chat should be created if it's not found.
@ -139,9 +140,9 @@ converse.plugins.add('converse-headlines', {
*/
async get (jids, attrs={}, create=false) {
async function _get (jid) {
let model = await _converse.api.chatboxes.get(jid);
let model = await api.chatboxes.get(jid);
if (!model && create) {
model = await _converse.api.chatboxes.create(jid, attrs, _converse.HeadlinesBox);
model = await api.chatboxes.create(jid, attrs, _converse.HeadlinesBox);
} else {
model = (model && model.get('type') === _converse.HEADLINES_TYPE) ? model : null;
if (model && Object.keys(attrs).length) {
@ -151,7 +152,7 @@ converse.plugins.add('converse-headlines', {
return model;
}
if (jids === undefined) {
const chats = await _converse.api.chatboxes.get();
const chats = await api.chatboxes.get();
return chats.filter(c => (c.get('type') === _converse.HEADLINES_TYPE));
} else if (isString(jids)) {
return _get(jids);

View File

@ -28,8 +28,9 @@ converse.plugins.add('converse-mam', {
* loaded by Converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
_converse.api.settings.update({
api.settings.update({
archived_messages_page_size: '50',
message_archiving: undefined, // Supported values are 'always', 'never', 'roster' (https://xmpp.org/extensions/xep-0313.html#prefs)
message_archiving_timeout: 20000, // Time (in milliseconds) to wait before aborting MAM request
@ -85,18 +86,18 @@ converse.plugins.add('converse-mam', {
}
const is_groupchat = this.get('type') === _converse.CHATROOMS_TYPE;
const mam_jid = is_groupchat ? this.get('jid') : _converse.bare_jid;
if (!(await _converse.api.disco.supports(Strophe.NS.MAM, mam_jid))) {
if (!(await api.disco.supports(Strophe.NS.MAM, mam_jid))) {
return;
}
const msg_handler = is_groupchat ? s => this.queueMessage(s) : s => _converse.handleMessageStanza(s);
const query = Object.assign({
'groupchat': is_groupchat,
'max': _converse.api.settings.get('archived_messages_page_size'),
'max': api.settings.get('archived_messages_page_size'),
'with': this.get('jid'),
}, options);
const result = await _converse.api.archive.query(query);
const result = await api.archive.query(query);
/* eslint-disable no-await-in-loop */
for (const message of result.messages) {
try {
@ -113,9 +114,9 @@ converse.plugins.add('converse-mam', {
if (page && result.rsm) {
if (page === 'forwards') {
options = result.rsm.next(_converse.api.settings.get('archived_messages_page_size'), options.before);
options = result.rsm.next(api.settings.get('archived_messages_page_size'), options.before);
} else if (page === 'backwards') {
options = result.rsm.previous(_converse.api.settings.get('archived_messages_page_size'), options.after);
options = result.rsm.previous(api.settings.get('archived_messages_page_size'), options.after);
}
return this.fetchArchivedMessages(options, page);
} else {
@ -150,32 +151,32 @@ converse.plugins.add('converse-mam', {
*/
const preference = sizzle(`prefs[xmlns="${Strophe.NS.MAM}"]`, iq).pop();
const default_pref = preference.getAttribute('default');
if (default_pref !== _converse.api.settings.get('message_archiving')) {
if (default_pref !== api.settings.get('message_archiving')) {
const stanza = $iq({'type': 'set'})
.c('prefs', {
'xmlns':Strophe.NS.MAM,
'default':_converse.api.settings.get('message_archiving')
'default':api.settings.get('message_archiving')
});
Array.from(preference.children).forEach(child => stanza.cnode(child).up());
// XXX: Strictly speaking, the server should respond with the updated prefs
// (see example 18: https://xmpp.org/extensions/xep-0313.html#config)
// but Prosody doesn't do this, so we don't rely on it.
_converse.api.sendIQ(stanza)
.then(() => feature.save({'preferences': {'default':_converse.api.settings.get('message_archiving')}}))
api.sendIQ(stanza)
.then(() => feature.save({'preferences': {'default':api.settings.get('message_archiving')}}))
.catch(_converse.onMAMError);
} else {
feature.save({'preferences': {'default':_converse.api.settings.get('message_archiving')}});
feature.save({'preferences': {'default':api.settings.get('message_archiving')}});
}
};
function getMAMPrefsFromFeature (feature) {
const prefs = feature.get('preferences') || {};
if (feature.get('var') !== Strophe.NS.MAM || _converse.api.settings.get('message_archiving') === undefined) {
if (feature.get('var') !== Strophe.NS.MAM || api.settings.get('message_archiving') === undefined) {
return;
}
if (prefs['default'] !== _converse.api.settings.get('message_archiving')) {
_converse.api.sendIQ($iq({'type': 'get'}).c('prefs', {'xmlns': Strophe.NS.MAM}))
if (prefs['default'] !== api.settings.get('message_archiving')) {
api.sendIQ($iq({'type': 'get'}).c('prefs', {'xmlns': Strophe.NS.MAM}))
.then(iq => _converse.onMAMPreferences(iq, feature))
.catch(_converse.onMAMError);
}
@ -193,26 +194,26 @@ converse.plugins.add('converse-mam', {
}
/************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('addClientFeatures', () => _converse.api.disco.own.features.add(Strophe.NS.MAM));
_converse.api.listen.on('serviceDiscovered', getMAMPrefsFromFeature);
_converse.api.listen.on('chatRoomViewInitialized', view => {
api.listen.on('addClientFeatures', () => api.disco.own.features.add(Strophe.NS.MAM));
api.listen.on('serviceDiscovered', getMAMPrefsFromFeature);
api.listen.on('chatRoomViewInitialized', view => {
if (_converse.muc_show_logs_before_join) {
// If we want to show MAM logs before entering the MUC, we need
// to be informed once it's clear that this MUC supports MAM.
view.model.features.on('change:mam_enabled', preMUCJoinMAMFetch(view.model));
}
});
_converse.api.listen.on('enteredNewRoom', room => room.features.get('mam_enabled') && room.fetchNewestMessages());
api.listen.on('enteredNewRoom', room => room.features.get('mam_enabled') && room.fetchNewestMessages());
_converse.api.listen.on('chatReconnected', chat => {
api.listen.on('chatReconnected', chat => {
// XXX: For MUCs, we listen to enteredNewRoom instead
if (chat.get('type') === _converse.PRIVATE_CHAT_TYPE) {
chat.fetchNewestMessages();
}
});
_converse.api.listen.on('afterMessagesFetched', chat => {
api.listen.on('afterMessagesFetched', chat => {
// XXX: We don't want to query MAM every time this is triggered
// since it's not necessary when the chat is restored from cache.
// (given that BOSH or SMACKS will ensure that you get messages
@ -226,7 +227,7 @@ converse.plugins.add('converse-mam', {
/************************ BEGIN API ************************/
Object.assign(_converse.api, {
Object.assign(api, {
/**
* The [XEP-0313](https://xmpp.org/extensions/xep-0313.html) Message Archive Management API
*
@ -236,8 +237,8 @@ converse.plugins.add('converse-mam', {
* option in the configuration settings section, which you'll
* usually want to use in conjunction with this API.
*
* @namespace _converse.api.archive
* @memberOf _converse.api
* @namespace api.archive
* @memberOf api
*/
'archive': {
/**
@ -246,7 +247,7 @@ converse.plugins.add('converse-mam', {
* The options parameter can also be an instance of
* _converse.RSM to enable easy querying between results pages.
*
* @method _converse.api.archive.query
* @method api.archive.query
* @param {(Object|_converse.RSM)} options Query parameters, either
* MAM-specific or also for Result Set Management.
* Can be either an object or an instance of _converse.RSM.
@ -276,7 +277,7 @@ converse.plugins.add('converse-mam', {
*
* let result;
* try {
* result = await _converse.api.archive.query();
* result = await api.archive.query();
* } catch (e) {
* // The query was not successful, perhaps inform the user?
* // The IQ stanza returned by the XMPP server is passed in, so that you
@ -296,7 +297,7 @@ converse.plugins.add('converse-mam', {
* // For a particular user
* let result;
* try {
* result = await _converse.api.archive.query({'with': 'john@doe.net'});
* result = await api.archive.query({'with': 'john@doe.net'});
* } catch (e) {
* // The query was not successful
* }
@ -304,7 +305,7 @@ converse.plugins.add('converse-mam', {
* // For a particular room
* let result;
* try {
* result = await _converse.api.archive.query({'with': 'discuss@conference.doglovers.net', 'groupchat': true});
* result = await api.archive.query({'with': 'discuss@conference.doglovers.net', 'groupchat': true});
* } catch (e) {
* // The query was not successful
* }
@ -324,7 +325,7 @@ converse.plugins.add('converse-mam', {
* };
* let result;
* try {
* result = await _converse.api.archive.query(options);
* result = await api.archive.query(options);
* } catch (e) {
* // The query was not successful
* }
@ -339,7 +340,7 @@ converse.plugins.add('converse-mam', {
* // Return maximum 10 archived messages
* let result;
* try {
* result = await _converse.api.archive.query({'with': 'john@doe.net', 'max':10});
* result = await api.archive.query({'with': 'john@doe.net', 'max':10});
* } catch (e) {
* // The query was not successful
* }
@ -363,7 +364,7 @@ converse.plugins.add('converse-mam', {
*
* let result;
* try {
* result = await _converse.api.archive.query({'with': 'john@doe.net', 'max':10});
* result = await api.archive.query({'with': 'john@doe.net', 'max':10});
* } catch (e) {
* // The query was not successful
* }
@ -372,7 +373,7 @@ converse.plugins.add('converse-mam', {
*
* while (result.rsm) {
* try {
* result = await _converse.api.archive.query(rsm.next(10));
* result = await api.archive.query(rsm.next(10));
* } catch (e) {
* // The query was not successful
* }
@ -391,7 +392,7 @@ converse.plugins.add('converse-mam', {
*
* let result;
* try {
* result = await _converse.api.archive.query({'before': '', 'max':5});
* result = await api.archive.query({'before': '', 'max':5});
* } catch (e) {
* // The query was not successful
* }
@ -400,7 +401,7 @@ converse.plugins.add('converse-mam', {
*
* // Now we query again, to get the previous batch.
* try {
* result = await _converse.api.archive.query(rsm.previous(5););
* result = await api.archive.query(rsm.previous(5););
* } catch (e) {
* // The query was not successful
* }
@ -409,7 +410,7 @@ converse.plugins.add('converse-mam', {
*
*/
async query (options) {
if (!_converse.api.connection.connected()) {
if (!api.connection.connected()) {
throw new Error('Can\'t call `api.archive.query` before having established an XMPP session');
}
const attrs = {'type':'set'};
@ -423,7 +424,7 @@ converse.plugins.add('converse-mam', {
}
const jid = attrs.to || _converse.bare_jid;
const supported = await _converse.api.disco.supports(Strophe.NS.MAM, jid);
const supported = await api.disco.supports(Strophe.NS.MAM, jid);
if (!supported) {
log.warn(`Did not fetch MAM archive for ${jid} because it doesn't support ${Strophe.NS.MAM}`);
return {'messages': []};
@ -479,7 +480,7 @@ converse.plugins.add('converse-mam', {
}, Strophe.NS.MAM);
let error;
const iq_result = await _converse.api.sendIQ(stanza, _converse.api.settings.get('message_archiving_timeout'), false)
const iq_result = await api.sendIQ(stanza, api.settings.get('message_archiving_timeout'), false)
if (iq_result === null) {
const err_msg = "Timeout while trying to fetch archived messages.";
log.error(err_msg);

View File

@ -102,13 +102,14 @@ converse.plugins.add('converse-muc', {
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
const { __, ___ } = _converse;
// Configuration values for this plugin
// ====================================
// Refer to docs/source/configuration.rst for explanations of these
// configuration settings.
_converse.api.settings.update({
api.settings.update({
'allow_muc': true,
'allow_muc_invitations': true,
'auto_join_on_invite': false,
@ -122,9 +123,9 @@ converse.plugins.add('converse-muc', {
'muc_nickname_from_jid': false,
'muc_show_logs_before_join': false
});
_converse.api.promises.add(['roomsAutoJoined']);
api.promises.add(['roomsAutoJoined']);
if (_converse.api.settings.get('locked_muc_domain') && !isString(_converse.api.settings.get('muc_domain'))) {
if (api.settings.get('locked_muc_domain') && !isString(api.settings.get('muc_domain'))) {
throw new Error("Config Error: it makes no sense to set locked_muc_domain "+
"to true when muc_domain is not set");
}
@ -188,11 +189,11 @@ converse.plugins.add('converse-muc', {
if (!u.isValidMUCJID(jid)) {
return log.warn(`invalid jid "${jid}" provided in url fragment`);
}
await _converse.api.waitUntil('roomsAutoJoined');
await api.waitUntil('roomsAutoJoined');
if (_converse.allow_bookmarks) {
await _converse.api.waitUntil('bookmarksInitialized');
await api.waitUntil('bookmarksInitialized');
}
_converse.api.rooms.open(jid);
api.rooms.open(jid);
}
_converse.router.route('converse/room?jid=:jid', openRoom);
@ -207,7 +208,7 @@ converse.plugins.add('converse-muc', {
const nick = _converse.xmppstatus.getNickname();
if (nick) {
return nick;
} else if (_converse.api.settings.get('muc_nickname_from_jid')) {
} else if (api.settings.get('muc_nickname_from_jid')) {
return Strophe.unescapeNode(Strophe.getNodeFromJid(_converse.bare_jid));
}
}
@ -219,7 +220,7 @@ converse.plugins.add('converse-muc', {
*/
settings.type = _converse.CHATROOMS_TYPE;
settings.id = jid;
const chatbox = await _converse.api.rooms.get(jid, settings, true);
const chatbox = await api.rooms.get(jid, settings, true);
chatbox.maybeShow(true);
return chatbox;
}
@ -247,7 +248,7 @@ converse.plugins.add('converse-muc', {
* @type { _converse.ChatRoomMessages}
* @example _converse.api.listen.on('chatRoomMessageInitialized', model => { ... });
*/
_converse.api.trigger('chatRoomMessageInitialized', this);
api.trigger('chatRoomMessageInitialized', this);
},
/**
@ -259,7 +260,7 @@ converse.plugins.add('converse-muc', {
* @returns { Boolean }
*/
mayBeModerated () {
return ['all', 'moderator'].includes(_converse.api.settings.get('allow_message_retraction')) &&
return ['all', 'moderator'].includes(api.settings.get('allow_message_retraction')) &&
this.collection.chatbox.canModerateMessages();
},
@ -351,7 +352,7 @@ converse.plugins.add('converse-muc', {
'num_unread_general': 0,
'bookmarked': false,
'chat_state': undefined,
'hidden': ['mobile', 'fullscreen'].includes(_converse.api.settings.get("view_mode")),
'hidden': ['mobile', 'fullscreen'].includes(api.settings.get("view_mode")),
'message_type': 'groupchat',
'name': '',
'num_unread': 0,
@ -386,7 +387,7 @@ converse.plugins.add('converse-muc', {
* @type { _converse.ChatRoom }
* @example _converse.api.listen.on('chatRoomInitialized', model => { ... });
*/
await _converse.api.trigger('chatRoomInitialized', this, {'Synchronous': true});
await api.trigger('chatRoomInitialized', this, {'Synchronous': true});
this.initialized.resolve();
},
@ -427,7 +428,7 @@ converse.plugins.add('converse-muc', {
nick = await this.getAndPersistNickname(nick);
if (!nick) {
u.safeSave(this.session, {'connection_status': converse.ROOMSTATUS.NICKNAME_REQUIRED});
if (_converse.api.settings.get('muc_show_logs_before_join')) {
if (api.settings.get('muc_show_logs_before_join')) {
await this.fetchMessages();
}
return this;
@ -436,13 +437,13 @@ converse.plugins.add('converse-muc', {
'from': _converse.connection.jid,
'to': this.getRoomJIDAndNick()
}).c("x", {'xmlns': Strophe.NS.MUC})
.c("history", {'maxstanzas': this.features.get('mam_enabled') ? 0 : _converse.api.settings.get('muc_history_max_stanzas')}).up();
.c("history", {'maxstanzas': this.features.get('mam_enabled') ? 0 : api.settings.get('muc_history_max_stanzas')}).up();
if (password) {
stanza.cnode(Strophe.xmlElement("password", [], password));
}
this.session.save('connection_status', converse.ROOMSTATUS.CONNECTING);
_converse.api.send(stanza);
api.send(stanza);
return this;
},
@ -491,10 +492,10 @@ converse.plugins.add('converse-muc', {
* @type { _converse.ChatRoom}
* @example _converse.api.listen.on('enteredNewRoom', model => { ... });
*/
_converse.api.trigger('enteredNewRoom', this);
api.trigger('enteredNewRoom', this);
if (_converse.api.settings.get('auto_register_muc_nickname') &&
await _converse.api.disco.supports(Strophe.NS.MUC_REGISTER, this.get('jid'))) {
if (api.settings.get('auto_register_muc_nickname') &&
await api.disco.supports(Strophe.NS.MUC_REGISTER, this.get('jid'))) {
this.registerNickname()
}
}
@ -618,7 +619,7 @@ converse.plugins.add('converse-muc', {
},
invitesAllowed () {
return _converse.api.settings.get('allow_muc_invitations') &&
return api.settings.get('allow_muc_invitations') &&
(this.features.get('open') ||
this.getOwnAffiliation() === "owner"
);
@ -628,7 +629,7 @@ converse.plugins.add('converse-muc', {
const name = this.get('name');
if (name) {
return name;
} else if (_converse.api.settings.get('locked_muc_domain') === 'hidden') {
} else if (api.settings.get('locked_muc_domain') === 'hidden') {
return Strophe.getNodeFromJid(this.get('jid'));
} else {
return this.get('jid');
@ -671,7 +672,7 @@ converse.plugins.add('converse-muc', {
promise.reject(stanza);
}
}, null, 'message', ['error', 'groupchat'], id);
_converse.api.send(el)
api.send(el)
return promise;
},
@ -771,7 +772,7 @@ converse.plugins.add('converse-muc', {
}).c('moderate', {xmlns: Strophe.NS.MODERATE})
.c('retract', {xmlns: Strophe.NS.RETRACT}).up()
.c('reason').t(reason || '');
return _converse.api.sendIQ(iq, null, false);
return api.sendIQ(iq, null, false);
},
/**
@ -795,7 +796,7 @@ converse.plugins.add('converse-muc', {
if (reason && reason.length > 0) {
iq.c("reason", reason);
}
return _converse.api.sendIQ(iq);
return api.sendIQ(iq);
},
/**
@ -813,7 +814,7 @@ converse.plugins.add('converse-muc', {
await new Promise((success, error) => disco_entity.destroy({success, error}));
}
}
if (_converse.api.connection.connected()) {
if (api.connection.connected()) {
this.sendUnavailablePresence(exit_msg);
}
u.safeSave(this.session, {'connection_status': converse.ROOMSTATUS.DISCONNECTED});
@ -836,7 +837,7 @@ converse.plugins.add('converse-muc', {
canModerateMessages () {
const self = this.getOwnOccupant();
return self && self.isModerator() && _converse.api.disco.supports(Strophe.NS.MODERATE, this.get('jid'));
return self && self.isModerator() && api.disco.supports(Strophe.NS.MODERATE, this.get('jid'));
},
sendUnavailablePresence (exit_msg) {
@ -986,7 +987,7 @@ converse.plugins.add('converse-muc', {
// <gone/> is not applicable within MUC context
return;
}
_converse.api.send(
api.send(
$msg({'to':this.get('jid'), 'type': 'groupchat'})
.c(chat_state, {'xmlns': Strophe.NS.CHATSTATES}).up()
.c('no-store', {'xmlns': Strophe.NS.HINTS}).up()
@ -1020,7 +1021,7 @@ converse.plugins.add('converse-muc', {
'to': recipient,
'id': u.getUniqueId()
}).c('x', attrs);
_converse.api.send(invitation);
api.send(invitation);
/**
* After the user has sent out a direct invitation (as per XEP-0249),
* to a roster contact, asking them to join a room.
@ -1031,7 +1032,7 @@ converse.plugins.add('converse-muc', {
* @property {string} reason - The original reason for the invitation
* @example _converse.api.listen.on('chatBoxMaximized', view => { ... });
*/
_converse.api.trigger('roomInviteSent', {
api.trigger('roomInviteSent', {
'room': this,
'recipient': recipient,
'reason': reason
@ -1046,7 +1047,7 @@ converse.plugins.add('converse-muc', {
* @returns {Promise}
*/
refreshDiscoInfo () {
return _converse.api.disco.refresh(this.get('jid'))
return api.disco.refresh(this.get('jid'))
.then(() => this.getDiscoInfo())
.catch(e => log.error(e));
},
@ -1059,7 +1060,7 @@ converse.plugins.add('converse-muc', {
* @returns {Promise}
*/
getDiscoInfo () {
return _converse.api.disco.getIdentity('conference', 'text', this.get('jid'))
return api.disco.getIdentity('conference', 'text', this.get('jid'))
.then(identity => this.save({'name': identity && identity.get('name')}))
.then(() => this.getDiscoInfoFields())
.then(() => this.getDiscoInfoFeatures())
@ -1075,7 +1076,7 @@ converse.plugins.add('converse-muc', {
* @returns {Promise}
*/
async getDiscoInfoFields () {
const fields = await _converse.api.disco.getFields(this.get('jid'));
const fields = await api.disco.getFields(this.get('jid'));
const config = fields.reduce((config, f) => {
const name = f.get('var');
if (name && name.startsWith('muc#roominfo_')) {
@ -1095,7 +1096,7 @@ converse.plugins.add('converse-muc', {
* @returns {Promise}
*/
async getDiscoInfoFeatures () {
const features = await _converse.api.disco.getFeatures(this.get('jid'));
const features = await api.disco.getFeatures(this.get('jid'));
const attrs = Object.assign(
zipObject(converse.ROOM_FEATURES, converse.ROOM_FEATURES.map(() => false)),
{'fetched': (new Date()).toISOString()}
@ -1194,7 +1195,7 @@ converse.plugins.add('converse-muc', {
* @returns { Promise<XMLElement> }
*/
fetchRoomConfiguration () {
return _converse.api.sendIQ(
return api.sendIQ(
$iq({'to': this.get('jid'), 'type': "get"})
.c("query", {xmlns: Strophe.NS.MUC_OWNER})
);
@ -1213,7 +1214,7 @@ converse.plugins.add('converse-muc', {
.c("query", {xmlns: Strophe.NS.MUC_OWNER})
.c("x", {xmlns: Strophe.NS.XFORM, type: "submit"});
config.forEach(node => iq.cnode(node).up());
return _converse.api.sendIQ(iq);
return api.sendIQ(iq);
},
/**
@ -1267,7 +1268,7 @@ converse.plugins.add('converse-muc', {
if (member.reason !== undefined) {
iq.c("reason", member.reason);
}
return _converse.api.sendIQ(iq);
return api.sendIQ(iq);
},
/**
@ -1309,7 +1310,7 @@ converse.plugins.add('converse-muc', {
if (reason !== null) {
iq.c("reason", reason);
}
return _converse.api.sendIQ(iq).then(onSuccess).catch(onError);
return api.sendIQ(iq).then(onSuccess).catch(onError);
},
/**
@ -1388,7 +1389,7 @@ converse.plugins.add('converse-muc', {
const iq = $iq({to: this.get('jid'), type: "get"})
.c("query", {xmlns: Strophe.NS.MUC_ADMIN})
.c("item", {'affiliation': affiliation});
const result = await _converse.api.sendIQ(iq, null, false);
const result = await api.sendIQ(iq, null, false);
if (result === null) {
const err_msg = `Error: timeout while fetching ${affiliation} list for MUC ${this.get('jid')}`;
const err = new Error(err_msg);
@ -1466,7 +1467,7 @@ converse.plugins.add('converse-muc', {
'xmlns': Strophe.NS.DISCO_INFO,
'node': 'x-roomuser-item'
})
const result = await _converse.api.sendIQ(stanza, null, false);
const result = await api.sendIQ(stanza, null, false);
if (u.isErrorObject(result)) {
throw result;
}
@ -1480,7 +1481,7 @@ converse.plugins.add('converse-muc', {
const jid = this.get('jid');
let iq, err_msg;
try {
iq = await _converse.api.sendIQ(
iq = await api.sendIQ(
$iq({
'to': jid,
'from': _converse.connection.jid,
@ -1501,7 +1502,7 @@ converse.plugins.add('converse-muc', {
return log.error(`Can't register the user register in the groupchat ${jid} due to the required fields`);
}
try {
await _converse.api.sendIQ($iq({
await api.sendIQ($iq({
'to': jid,
'from': _converse.connection.jid,
'type': 'set'
@ -1675,7 +1676,7 @@ converse.plugins.add('converse-muc', {
* @param { String } value
*/
setSubject(value='') {
_converse.api.send(
api.send(
$msg({
to: this.get('jid'),
from: _converse.connection.jid,
@ -1749,7 +1750,7 @@ converse.plugins.add('converse-muc', {
'type': "get"
}).c("ping", {'xmlns': Strophe.NS.PING});
try {
await _converse.api.sendIQ(ping);
await api.sendIQ(ping);
} catch (e) {
if (e === null) {
log.error(`Timeout error while checking whether we're joined to MUC: ${this.get('jid')}`);
@ -1950,14 +1951,14 @@ converse.plugins.add('converse-muc', {
this.updateMessage(message, original_stanza);
}
if (message || stanza_utils.isReceipt(stanza) || stanza_utils.isChatMarker(stanza)) {
return _converse.api.trigger('message', {'stanza': original_stanza});
return api.trigger('message', {'stanza': original_stanza});
}
if (await this.handleRetraction(attrs) ||
await this.handleModeration(attrs) ||
this.subjectChangeHandled(attrs) ||
this.ignorableCSN(attrs)) {
return _converse.api.trigger('message', {'stanza': original_stanza});
return api.trigger('message', {'stanza': original_stanza});
}
this.setEditable(attrs, attrs.time);
@ -1968,7 +1969,7 @@ converse.plugins.add('converse-muc', {
const msg = this.handleCorrection(attrs) || await this.createMessage(attrs);
this.incrementUnreadMsgCounter(msg);
}
_converse.api.trigger('message', {'stanza': original_stanza, 'chatbox': this});
api.trigger('message', {'stanza': original_stanza, 'chatbox': this});
},
handleModifyError(pres) {
@ -2089,7 +2090,7 @@ converse.plugins.add('converse-muc', {
onNicknameClash (presence) {
if (_converse.api.settings.get('muc_nickname_from_jid')) {
if (api.settings.get('muc_nickname_from_jid')) {
const nick = presence.getAttribute('from').split('/')[1];
if (nick === _converse.getDefaultMUCNickname()) {
this.join(nick + '-2');
@ -2216,7 +2217,7 @@ converse.plugins.add('converse-muc', {
if (locked_room) {
if (this.get('auto_configure')) {
this.autoConfigureChatRoom().then(() => this.refreshDiscoInfo());
} else if (_converse.api.settings.get('muc_instant_rooms')) {
} else if (api.settings.get('muc_instant_rooms')) {
// Accept default configuration
this.sendConfiguration().then(() => this.refreshDiscoInfo());
} else {
@ -2320,7 +2321,7 @@ converse.plugins.add('converse-muc', {
vcards.filter(v => v).forEach(vcard => {
if (hash && vcard.get('image_hash') !== hash) {
_converse.api.vcard.update(vcard, true);
api.vcard.update(vcard, true);
}
});
},
@ -2359,7 +2360,7 @@ converse.plugins.add('converse-muc', {
},
getAutoFetchedAffiliationLists () {
const affs = _converse.api.settings.get('muc_fetch_members');
const affs = api.settings.get('muc_fetch_members');
return Array.isArray(affs) ? affs : (affs ? ['member', 'admin', 'owner'] : []);
},
@ -2402,7 +2403,7 @@ converse.plugins.add('converse-muc', {
* @event _converse#membersFetched
* @example _converse.api.listen.on('membersFetched', () => { ... });
*/
_converse.api.trigger('membersFetched');
api.trigger('membersFetched');
},
findOccupant (data) {
@ -2426,13 +2427,13 @@ converse.plugins.add('converse-muc', {
_converse.RoomsPanelModel = Model.extend({
defaults: function () {
return {
'muc_domain': _converse.api.settings.get('muc_domain'),
'muc_domain': api.settings.get('muc_domain'),
'nick': _converse.getDefaultMUCNickname()
}
},
setDomain (jid) {
if (!_converse.api.settings.get('locked_muc_domain')) {
if (!api.settings.get('locked_muc_domain')) {
this.save('muc_domain', Strophe.getDomainFromJid(jid));
}
}
@ -2453,7 +2454,7 @@ converse.plugins.add('converse-muc', {
reason = x_el.getAttribute('reason');
let result;
if (_converse.api.settings.get('auto_join_on_invite')) {
if (api.settings.get('auto_join_on_invite')) {
result = true;
} else {
// Invite request might come from someone not your roster list
@ -2478,7 +2479,7 @@ converse.plugins.add('converse-muc', {
}
};
if (_converse.api.settings.get('allow_muc_invitations')) {
if (api.settings.get('allow_muc_invitations')) {
const registerDirectInvitationHandler = function () {
_converse.connection.addHandler(
(message) => {
@ -2486,15 +2487,15 @@ converse.plugins.add('converse-muc', {
return true;
}, 'jabber:x:conference', 'message');
};
_converse.api.listen.on('connected', registerDirectInvitationHandler);
_converse.api.listen.on('reconnected', registerDirectInvitationHandler);
api.listen.on('connected', registerDirectInvitationHandler);
api.listen.on('reconnected', registerDirectInvitationHandler);
}
const createChatRoom = function (jid, attrs) {
if (jid.startsWith('xmpp:') && jid.endsWith('?join')) {
jid = jid.replace(/^xmpp:/, '').replace(/\?join$/, '');
}
return _converse.api.rooms.get(jid, attrs, true);
return api.rooms.get(jid, attrs, true);
};
/**
@ -2504,14 +2505,14 @@ converse.plugins.add('converse-muc', {
* settings).
*/
function autoJoinRooms () {
_converse.api.settings.get('auto_join_rooms').forEach(groupchat => {
api.settings.get('auto_join_rooms').forEach(groupchat => {
if (isString(groupchat)) {
if (_converse.chatboxes.where({'jid': groupchat}).length) {
return;
}
_converse.api.rooms.open(groupchat);
api.rooms.open(groupchat);
} else if (isObject(groupchat)) {
_converse.api.rooms.open(groupchat.jid, clone(groupchat));
api.rooms.open(groupchat.jid, clone(groupchat));
} else {
log.error('Invalid groupchat criteria specified for "auto_join_rooms"');
}
@ -2523,40 +2524,40 @@ converse.plugins.add('converse-muc', {
* @example _converse.api.listen.on('roomsAutoJoined', () => { ... });
* @example _converse.api.waitUntil('roomsAutoJoined').then(() => { ... });
*/
_converse.api.trigger('roomsAutoJoined');
api.trigger('roomsAutoJoined');
}
async function onWindowStateChanged (data) {
if (data.state === 'visible' && _converse.api.connection.connected()) {
const rooms = await _converse.api.rooms.get();
if (data.state === 'visible' && api.connection.connected()) {
const rooms = await api.rooms.get();
rooms.forEach(room => room.rejoinIfNecessary());
}
}
/************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('beforeTearDown', () => {
api.listen.on('beforeTearDown', () => {
const groupchats = _converse.chatboxes.where({'type': _converse.CHATROOMS_TYPE});
groupchats.forEach(muc => u.safeSave(muc.session, {'connection_status': converse.ROOMSTATUS.DISCONNECTED}));
});
_converse.api.listen.on('windowStateChanged', onWindowStateChanged);
api.listen.on('windowStateChanged', onWindowStateChanged);
_converse.api.listen.on('addClientFeatures', () => {
if (_converse.api.settings.get('allow_muc')) {
_converse.api.disco.own.features.add(Strophe.NS.MUC);
api.listen.on('addClientFeatures', () => {
if (api.settings.get('allow_muc')) {
api.disco.own.features.add(Strophe.NS.MUC);
}
if (_converse.api.settings.get('allow_muc_invitations')) {
_converse.api.disco.own.features.add('jabber:x:conference'); // Invites
if (api.settings.get('allow_muc_invitations')) {
api.disco.own.features.add('jabber:x:conference'); // Invites
}
});
_converse.api.listen.on('chatBoxesFetched', autoJoinRooms);
api.listen.on('chatBoxesFetched', autoJoinRooms);
_converse.api.listen.on('beforeResourceBinding', () => {
api.listen.on('beforeResourceBinding', () => {
_converse.connection.addHandler(stanza => {
const muc_jid = Strophe.getBareJidFromJid(stanza.getAttribute('from'));
if (!_converse.chatboxes.get(muc_jid)) {
_converse.api.waitUntil('chatBoxesFetched')
api.waitUntil('chatBoxesFetched')
.then(async () => {
const muc = _converse.chatboxes.get(muc_jid);
if (muc) {
@ -2580,11 +2581,11 @@ converse.plugins.add('converse-muc', {
.filter(m => (m.get('type') === _converse.CHATROOMS_TYPE))
.forEach(m => m.session.save({'connection_status': converse.ROOMSTATUS.DISCONNECTED}));
}
_converse.api.listen.on('disconnected', disconnectChatRooms);
api.listen.on('disconnected', disconnectChatRooms);
_converse.api.listen.on('statusInitialized', () => {
api.listen.on('statusInitialized', () => {
window.addEventListener(_converse.unloadevent, () => {
const using_websocket = _converse.api.connection.isType('websocket');
const using_websocket = api.connection.isType('websocket');
if (using_websocket &&
(!_converse.enable_smacks || !_converse.session.get('smacks_stream_id'))) {
// For non-SMACKS websocket connections, or non-resumeable
@ -2601,22 +2602,22 @@ converse.plugins.add('converse-muc', {
converse.env.muc_utils = muc_utils;
// We extend the default converse.js API to add methods specific to MUC groupchats.
Object.assign(_converse.api, {
Object.assign(api, {
/**
* The "rooms" namespace groups methods relevant to chatrooms
* (aka groupchats).
*
* @namespace _converse.api.rooms
* @memberOf _converse.api
* @namespace api.rooms
* @memberOf api
*/
rooms: {
/**
* Creates a new MUC chatroom (aka groupchat)
*
* Similar to {@link _converse.api.rooms.open}, but creates
* Similar to {@link api.rooms.open}, but creates
* the chatroom in the background (i.e. doesn't cause a view to open).
*
* @method _converse.api.rooms.create
* @method api.rooms.create
* @param {(string[]|string)} jid|jids The JID or array of
* JIDs of the chatroom(s) to create
* @param {object} [attrs] attrs The room attributes
@ -2624,7 +2625,7 @@ converse.plugins.add('converse-muc', {
*/
create (jids, attrs={}) {
attrs = isString(attrs) ? {'nick': attrs} : (attrs || {});
if (!attrs.nick && _converse.api.settings.get('muc_nickname_from_jid')) {
if (!attrs.nick && api.settings.get('muc_nickname_from_jid')) {
attrs.nick = Strophe.getNodeFromJid(_converse.bare_jid);
}
if (jids === undefined) {
@ -2638,9 +2639,9 @@ converse.plugins.add('converse-muc', {
/**
* Opens a MUC chatroom (aka groupchat)
*
* Similar to {@link _converse.api.chats.open}, but for groupchats.
* Similar to {@link api.chats.open}, but for groupchats.
*
* @method _converse.api.rooms.open
* @method api.rooms.open
* @param {string} jid The room JID or JIDs (if not specified, all
* currently open rooms will be returned).
* @param {string} attrs A map containing any extra room attributes.
@ -2667,19 +2668,19 @@ converse.plugins.add('converse-muc', {
* @returns {Promise} Promise which resolves with the Model representing the chat.
*
* @example
* this._converse.api.rooms.open('group@muc.example.com')
* this.api.rooms.open('group@muc.example.com')
*
* @example
* // To return an array of rooms, provide an array of room JIDs:
* _converse.api.rooms.open(['group1@muc.example.com', 'group2@muc.example.com'])
* api.rooms.open(['group1@muc.example.com', 'group2@muc.example.com'])
*
* @example
* // To setup a custom nickname when joining the room, provide the optional nick argument:
* _converse.api.rooms.open('group@muc.example.com', {'nick': 'mycustomnick'})
* api.rooms.open('group@muc.example.com', {'nick': 'mycustomnick'})
*
* @example
* // For example, opening a room with a specific default configuration:
* _converse.api.rooms.open(
* api.rooms.open(
* 'myroom@conference.example.org',
* { 'nick': 'coolguy69',
* 'auto_configure': true,
@ -2695,17 +2696,17 @@ converse.plugins.add('converse-muc', {
* );
*/
async open (jids, attrs, force=false) {
await _converse.api.waitUntil('chatBoxesFetched');
await api.waitUntil('chatBoxesFetched');
if (jids === undefined) {
const err_msg = 'rooms.open: You need to provide at least one JID';
log.error(err_msg);
throw(new TypeError(err_msg));
} else if (isString(jids)) {
const room = await _converse.api.rooms.create(jids, attrs);
const room = await api.rooms.create(jids, attrs);
room && room.maybeShow(force);
return room;
} else {
const rooms = await Promise.all(jids.map(jid => _converse.api.rooms.create(jid, attrs)));
const rooms = await Promise.all(jids.map(jid => api.rooms.create(jid, attrs)));
rooms.forEach(r => r.maybeShow(force));
return rooms;
}
@ -2714,7 +2715,7 @@ converse.plugins.add('converse-muc', {
/**
* Fetches the object representing a MUC chatroom (aka groupchat)
*
* @method _converse.api.rooms.get
* @method api.rooms.get
* @param {string} [jid] The room JID (if not specified, all rooms will be returned).
* @param {object} attrs A map containing any extra room attributes For example, if you want
* to specify the nickname, use `{'nick': 'bloodninja'}`. Previously (before
@ -2726,9 +2727,9 @@ converse.plugins.add('converse-muc', {
* if not found (default: `false`)
* @returns { Promise<_converse.ChatRoom> }
* @example
* _converse.api.waitUntil('roomsAutoJoined').then(() => {
* api.waitUntil('roomsAutoJoined').then(() => {
* const create_if_not_found = true;
* _converse.api.rooms.get(
* api.rooms.get(
* 'group@muc.example.com',
* {'nick': 'dread-pirate-roberts'},
* create_if_not_found
@ -2737,9 +2738,9 @@ converse.plugins.add('converse-muc', {
*/
async get (jids, attrs={}, create=false) {
async function _get (jid) {
let model = await _converse.api.chatboxes.get(jid);
let model = await api.chatboxes.get(jid);
if (!model && create) {
model = await _converse.api.chatboxes.create(jid, attrs, _converse.ChatRoom);
model = await api.chatboxes.create(jid, attrs, _converse.ChatRoom);
} else {
model = (model && model.get('type') === _converse.CHATROOMS_TYPE) ? model : null;
if (model && Object.keys(attrs).length) {
@ -2749,7 +2750,7 @@ converse.plugins.add('converse-muc', {
return model;
}
if (jids === undefined) {
const chats = await _converse.api.chatboxes.get();
const chats = await api.chatboxes.get();
return chats.filter(c => (c.get('type') === _converse.CHATROOMS_TYPE));
} else if (isString(jids)) {
return _get(jids);

View File

@ -22,9 +22,11 @@ converse.plugins.add('converse-ping', {
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
let lastStanzaDate;
_converse.api.settings.update({
api.settings.update({
ping_interval: 60 //in seconds
});
@ -39,14 +41,14 @@ converse.plugins.add('converse-ping', {
function registerPongHandler () {
if (_converse.connection.disco !== undefined) {
_converse.api.disco.own.features.add(Strophe.NS.PING);
api.disco.own.features.add(Strophe.NS.PING);
}
return _converse.connection.addHandler(pong, Strophe.NS.PING, "iq", "get");
}
function registerPingHandler () {
_converse.connection.addHandler(() => {
if (_converse.api.settings.get('ping_interval') > 0) {
if (api.settings.get('ping_interval') > 0) {
// Handler on each stanza, saves the received date
// in order to ping only when needed.
lastStanzaDate = new Date();
@ -56,13 +58,13 @@ converse.plugins.add('converse-ping', {
}
setTimeout(() => {
if (_converse.api.settings.get('ping_interval') > 0) {
if (api.settings.get('ping_interval') > 0) {
const now = new Date();
if (!lastStanzaDate) {
lastStanzaDate = now;
}
if ((now - lastStanzaDate)/1000 > _converse.api.settings.get('ping_interval')) {
return _converse.api.ping();
if ((now - lastStanzaDate)/1000 > api.settings.get('ping_interval')) {
return api.ping();
}
return true;
}
@ -75,25 +77,25 @@ converse.plugins.add('converse-ping', {
registerPongHandler();
registerPingHandler();
};
_converse.api.listen.on('connected', onConnected);
_converse.api.listen.on('reconnected', onConnected);
api.listen.on('connected', onConnected);
api.listen.on('reconnected', onConnected);
function onWindowStateChanged (data) {
if (data.state === 'visible' && _converse.api.connection.connected()) {
_converse.api.ping(null, 5000);
if (data.state === 'visible' && api.connection.connected()) {
api.ping(null, 5000);
}
}
_converse.api.listen.on('windowStateChanged', onWindowStateChanged);
api.listen.on('windowStateChanged', onWindowStateChanged);
/************************ END Event Handlers ************************/
/************************ BEGIN API ************************/
Object.assign(_converse.api, {
Object.assign(api, {
/**
* Pings the service represented by the passed in JID by sending an IQ stanza.
* @private
* @method _converse.api.ping
* @method api.ping
* @param { String } [jid] - The JID of the service to ping
* @param { Integer } [timeout] - The amount of time in
* milliseconds to wait for a response. The default is 10000;
@ -112,11 +114,11 @@ converse.plugins.add('converse-ping', {
'id': u.getUniqueId('ping')
}).c('ping', {'xmlns': Strophe.NS.PING});
const result = await _converse.api.sendIQ(iq, timeout || 10000, false);
const result = await api.sendIQ(iq, timeout || 10000, false);
if (result === null) {
log.warn(`Timeout while pinging ${jid}`);
if (jid === Strophe.getDomainFromJid(_converse.bare_jid)) {
_converse.api.connection.reconnect();
api.connection.reconnect();
}
} else if (u.isErrorStanza(result)) {
log.error(`Error while pinging ${jid}`);

View File

@ -21,6 +21,7 @@ converse.plugins.add('converse-pubsub', {
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
/************************ BEGIN API ************************/
@ -58,7 +59,7 @@ converse.plugins.add('converse-pubsub', {
if (options) {
jid = jid || _converse.bare_jid;
if (await _converse.api.disco.supports(Strophe.NS.PUBSUB + '#publish-options', jid)) {
if (await api.disco.supports(Strophe.NS.PUBSUB + '#publish-options', jid)) {
stanza.c('publish-options')
.c('x', {'xmlns': Strophe.NS.XFORM, 'type': 'submit'})
.c('field', {'var': 'FORM_TYPE', 'type': 'hidden'})
@ -71,7 +72,7 @@ converse.plugins.add('converse-pubsub', {
}
}
try {
_converse.api.sendIQ(stanza);
api.sendIQ(stanza);
} catch (iq) {
if (iq instanceof Element &&
strict_options &&
@ -82,7 +83,7 @@ converse.plugins.add('converse-pubsub', {
const el = stanza.nodeTree;
el.querySelector('publish-options').outerHTML = '';
log.warn(`PubSub: Republishing without publish options. ${el.outerHTML}`);
_converse.api.sendIQ(el);
api.sendIQ(el);
} else {
throw iq;
}

View File

@ -22,16 +22,17 @@ converse.plugins.add('converse-roster', {
/* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this,
{ __ } = _converse;
const { _converse } = this;
const { api } = _converse;
const { __ } = _converse;
_converse.api.settings.update({
api.settings.update({
'allow_contact_requests': true,
'auto_subscribe': false,
'synchronize_availability': true,
});
_converse.api.promises.add([
api.promises.add([
'cachedRoster',
'roster',
'rosterContactsFetched',
@ -73,7 +74,7 @@ converse.plugins.add('converse-roster', {
_converse.rejectPresenceSubscription = function (jid, message) {
const pres = $pres({to: jid, type: "unsubscribed"});
if (message && message !== "") { pres.c("status").t(message); }
_converse.api.send(pres);
api.send(pres);
};
@ -107,9 +108,9 @@ converse.plugins.add('converse-roster', {
* @example _converse.api.listen.on('rosterGroupsFetched', () => { ... });
* @example _converse.api.waitUntil('rosterGroupsFetched').then(() => { ... });
*/
_converse.api.trigger('rosterGroupsFetched');
api.trigger('rosterGroupsFetched');
await _converse.roster.fetchRosterContacts();
_converse.api.trigger('rosterContactsFetched');
api.trigger('rosterContactsFetched');
} catch (reason) {
log.error(reason);
} finally {
@ -231,14 +232,14 @@ converse.plugins.add('converse-roster', {
* @type { _converse.RosterContact }
* @example _converse.api.listen.on('contactPresenceChanged', contact => { ... });
*/
this.listenTo(this.presence, 'change:show', () => _converse.api.trigger('contactPresenceChanged', this));
this.listenTo(this.presence, 'change:show', () => api.trigger('contactPresenceChanged', this));
this.listenTo(this.presence, 'change:show', () => this.trigger('presenceChanged'));
/**
* Synchronous event which provides a hook for further initializing a RosterContact
* @event _converse#rosterContactInitialized
* @param { _converse.RosterContact } contact
*/
await _converse.api.trigger('rosterContactInitialized', this, {'Synchronous': true});
await api.trigger('rosterContactInitialized', this, {'Synchronous': true});
this.initialized.resolve();
},
@ -277,7 +278,7 @@ converse.plugins.add('converse-roster', {
if (nick) {
pres.c('nick', {'xmlns': Strophe.NS.NICK}).t(nick).up();
}
_converse.api.send(pres);
api.send(pres);
this.save('ask', "subscribe"); // ask === 'subscribe' Means we have asked to subscribe to them.
return this;
},
@ -291,7 +292,7 @@ converse.plugins.add('converse-roster', {
* @method _converse.RosterContacts#ackSubscribe
*/
ackSubscribe () {
_converse.api.send($pres({
api.send($pres({
'type': 'subscribe',
'to': this.get('jid')
}));
@ -308,7 +309,7 @@ converse.plugins.add('converse-roster', {
* @param { String } jid - The Jabber ID of the user who is unsubscribing
*/
ackUnsubscribe () {
_converse.api.send($pres({'type': 'unsubscribe', 'to': this.get('jid')}));
api.send($pres({'type': 'unsubscribe', 'to': this.get('jid')}));
this.removeFromRoster();
this.destroy();
},
@ -335,7 +336,7 @@ converse.plugins.add('converse-roster', {
if (message && message !== "") {
pres.c("status").t(message);
}
_converse.api.send(pres);
api.send(pres);
return this;
},
@ -349,7 +350,7 @@ converse.plugins.add('converse-roster', {
const iq = $iq({type: 'set'})
.c('query', {xmlns: Strophe.NS.ROSTER})
.c('item', {jid: this.get('jid'), subscription: "remove"});
return _converse.api.sendIQ(iq);
return api.sendIQ(iq);
}
});
@ -441,7 +442,7 @@ converse.plugins.add('converse-roster', {
* @example _converse.api.listen.on('cachedRoster', (items) => { ... });
* @example _converse.api.waitUntil('cachedRoster').then(items => { ... });
*/
_converse.api.trigger('cachedRoster', result);
api.trigger('cachedRoster', result);
} else {
_converse.send_initial_presence = true;
return _converse.roster.fetchFromServer();
@ -498,7 +499,7 @@ converse.plugins.add('converse-roster', {
.c('query', {'xmlns': Strophe.NS.ROSTER})
.c('item', { jid, name });
groups.forEach(g => iq.c('group').t(g).up());
return _converse.api.sendIQ(iq);
return api.sendIQ(iq);
},
/**
@ -513,7 +514,7 @@ converse.plugins.add('converse-roster', {
* @param { Object } attributes - Any additional attributes to be stored on the user's model.
*/
async addContactToRoster (jid, name, groups, attributes) {
await _converse.api.waitUntil('rosterContactsFetched');
await api.waitUntil('rosterContactsFetched');
groups = groups || [];
try {
await this.sendContactAddIQ(jid, name, groups);
@ -573,7 +574,7 @@ converse.plugins.add('converse-roster', {
);
return;
}
_converse.api.send($iq({type: 'result', id, from: _converse.connection.jid}));
api.send($iq({type: 'result', id, from: _converse.connection.jid}));
const query = sizzle(`query[xmlns="${Strophe.NS.ROSTER}"]`, iq).pop();
this.data.save('version', query.getAttribute('ver'));
@ -595,12 +596,12 @@ converse.plugins.add('converse-roster', {
* @type { XMLElement }
* @example _converse.api.listen.on('rosterPush', iq => { ... });
*/
_converse.api.trigger('rosterPush', iq);
api.trigger('rosterPush', iq);
return;
},
rosterVersioningSupported () {
return _converse.api.disco.stream.getFeature('ver', 'urn:xmpp:features:rosterver') && this.data.get('version');
return api.disco.stream.getFeature('ver', 'urn:xmpp:features:rosterver') && this.data.get('version');
},
/**
@ -617,7 +618,7 @@ converse.plugins.add('converse-roster', {
if (this.rosterVersioningSupported()) {
stanza.attrs({'ver': this.data.get('version')});
}
const iq = await _converse.api.sendIQ(stanza, null, false);
const iq = await api.sendIQ(stanza, null, false);
if (iq.getAttribute('type') !== 'error') {
const query = sizzle(`query[xmlns="${Strophe.NS.ROSTER}"]`, iq).pop();
if (query) {
@ -641,7 +642,7 @@ converse.plugins.add('converse-roster', {
* @example _converse.api.listen.on('roster', iq => { ... });
* @example _converse.api.waitUntil('roster').then(iq => { ... });
*/
_converse.api.trigger('roster', iq);
api.trigger('roster', iq);
},
/* Update or create RosterContact models based on the given `item` XML
@ -701,7 +702,7 @@ converse.plugins.add('converse-roster', {
* @type { _converse.RosterContact }
* @example _converse.api.listen.on('contactRequest', contact => { ... });
*/
_converse.api.trigger('contactRequest', this.create(user_data));
api.trigger('contactRequest', this.create(user_data));
},
@ -710,13 +711,13 @@ converse.plugins.add('converse-roster', {
bare_jid = Strophe.getBareJidFromJid(jid),
contact = this.get(bare_jid);
if (!_converse.api.settings.get('allow_contact_requests')) {
if (!api.settings.get('allow_contact_requests')) {
_converse.rejectPresenceSubscription(
jid,
__("This client does not allow presence subscriptions")
);
}
if (_converse.api.settings.get('auto_subscribe')) {
if (api.settings.get('auto_subscribe')) {
if ((!contact) || (contact.get('subscription') !== 'to')) {
this.subscribeBack(bare_jid, presence);
} else {
@ -742,8 +743,8 @@ converse.plugins.add('converse-roster', {
if ((_converse.connection.jid !== jid) &&
(presence_type !== 'unavailable') &&
(_converse.api.settings.get('synchronize_availability') === true ||
_converse.api.settings.get('synchronize_availability') === resource)) {
(api.settings.get('synchronize_availability') === true ||
api.settings.get('synchronize_availability') === resource)) {
// Another resource has changed its status and
// synchronize_availability option set to update,
// we'll update ours as well.
@ -889,7 +890,7 @@ converse.plugins.add('converse-roster', {
}
}
_converse.api.listen.on('chatBoxesInitialized', () => {
api.listen.on('chatBoxesInitialized', () => {
_converse.chatboxes.on('change:num_unread', updateUnreadCounter);
_converse.chatboxes.on('add', chatbox => {
@ -899,9 +900,9 @@ converse.plugins.add('converse-roster', {
});
});
_converse.api.listen.on('beforeTearDown', () => _converse.unregisterPresenceHandler());
api.listen.on('beforeTearDown', () => _converse.unregisterPresenceHandler());
_converse.api.waitUntil('rosterContactsFetched').then(() => {
api.waitUntil('rosterContactsFetched').then(() => {
_converse.roster.on('add', (contact) => {
/* When a new contact is added, check if we already have a
* chatbox open for it, and if so attach it to the chatbox.
@ -917,9 +918,9 @@ converse.plugins.add('converse-roster', {
_converse.presences && await _converse.presences.clearStore();
}
_converse.api.listen.on('streamResumptionFailed', () => _converse.session.set('roster_cached', false));
api.listen.on('streamResumptionFailed', () => _converse.session.set('roster_cached', false));
_converse.api.listen.on('clearSession', async () => {
api.listen.on('clearSession', async () => {
await clearPresences();
if (_converse.shouldClearCache()) {
if (_converse.rostergroups) {
@ -934,7 +935,7 @@ converse.plugins.add('converse-roster', {
}
});
_converse.api.listen.on('statusInitialized', async reconnecting => {
api.listen.on('statusInitialized', async reconnecting => {
if (reconnecting) {
// When reconnecting and not resuming a previous session,
// we clear all cached presence data, since it might be stale
@ -957,14 +958,14 @@ converse.plugins.add('converse-roster', {
* @type { bool }
* @example _converse.api.listen.on('presencesInitialized', reconnecting => { ... });
*/
_converse.api.trigger('presencesInitialized', reconnecting);
api.trigger('presencesInitialized', reconnecting);
});
async function initRoster () {
// Initialize the Bakcbone collections that represent the contats
// roster and the roster groups.
await _converse.api.waitUntil('VCardsInitialized');
await api.waitUntil('VCardsInitialized');
_converse.roster = new _converse.RosterContacts();
let id = `converse.contacts-${_converse.bare_jid}`;
_converse.roster.browserStorage = _converse.createStore(id);
@ -986,10 +987,10 @@ converse.plugins.add('converse-roster', {
* @example _converse.api.listen.on('rosterInitialized', () => { ... });
* @example _converse.api.waitUntil('rosterInitialized').then(() => { ... });
*/
_converse.api.trigger('rosterInitialized');
api.trigger('rosterInitialized');
}
_converse.api.listen.on('presencesInitialized', async (reconnecting) => {
api.listen.on('presencesInitialized', async (reconnecting) => {
if (reconnecting) {
/**
* Similar to `rosterInitialized`, but instead pertaining to reconnection.
@ -998,7 +999,7 @@ converse.plugins.add('converse-roster', {
* @event _converse#rosterReadyAfterReconnection
* @example _converse.api.listen.on('rosterReadyAfterReconnection', () => { ... });
*/
_converse.api.trigger('rosterReadyAfterReconnection');
api.trigger('rosterReadyAfterReconnection');
} else {
await initRoster();
}
@ -1050,7 +1051,7 @@ converse.plugins.add('converse-roster', {
* });
*/
async get (jids) {
await _converse.api.waitUntil('rosterContactsFetched');
await api.waitUntil('rosterContactsFetched');
const _getter = jid => _converse.roster.get(Strophe.getBareJidFromJid(jid));
if (jids === undefined) {
jids = _converse.roster.pluck('jid');
@ -1073,7 +1074,7 @@ converse.plugins.add('converse-roster', {
* _converse.api.contacts.add('buddy@example.com', 'Buddy')
*/
async add (jid, name) {
await _converse.api.waitUntil('rosterContactsFetched');
await api.waitUntil('rosterContactsFetched');
if (!isString(jid) || !jid.includes('@')) {
throw new TypeError('contacts.add: invalid jid');
}

View File

@ -18,21 +18,22 @@ converse.plugins.add('converse-smacks', {
initialize () {
const { _converse } = this;
const { api } = _converse;
// Configuration values for this plugin
// ====================================
// Refer to docs/source/configuration.rst for explanations of these
// configuration settings.
_converse.api.settings.update({
api.settings.update({
'enable_smacks': true,
'smacks_max_unacked_stanzas': 5,
});
function isStreamManagementSupported () {
if (_converse.api.connection.isType('bosh') && !_converse.isTestEnv()) {
if (api.connection.isType('bosh') && !_converse.isTestEnv()) {
return false;
}
return _converse.api.disco.stream.getFeature('sm', Strophe.NS.SM);
return api.disco.stream.getFeature('sm', Strophe.NS.SM);
}
function handleAck (el) {
@ -69,7 +70,7 @@ converse.plugins.add('converse-smacks', {
if (_converse.session.get('smacks_enabled')) {
const h = _converse.session.get('num_stanzas_handled');
const stanza = u.toStanza(`<a xmlns="${Strophe.NS.SM}" h="${h}"/>`);
_converse.api.send(stanza);
api.send(stanza);
}
return true;
}
@ -132,7 +133,7 @@ converse.plugins.add('converse-smacks', {
* Triggered when the XEP-0198 stream could not be resumed.
* @event _converse#streamResumptionFailed
*/
_converse.api.trigger('streamResumptionFailed');
api.trigger('streamResumptionFailed');
return true;
}
@ -158,7 +159,7 @@ converse.plugins.add('converse-smacks', {
// service worker or handling IQ[type="result"] stanzas
// differently, more like push stanzas, so that they don't need
// explicit handlers.
stanzas.forEach(s => _converse.api.send(s));
stanzas.forEach(s => api.send(s));
}
function onResumedStanza (el) {
@ -179,13 +180,13 @@ converse.plugins.add('converse-smacks', {
const previous_id = _converse.session.get('smacks_stream_id');
const h = _converse.session.get('num_stanzas_handled');
const stanza = u.toStanza(`<resume xmlns="${Strophe.NS.SM}" h="${h}" previd="${previous_id}"/>`);
_converse.api.send(stanza);
api.send(stanza);
_converse.connection.flush();
await promise;
}
async function sendEnableStanza () {
if (!_converse.api.settings.get('enable_smacks') || _converse.session.get('smacks_enabled')) {
if (!api.settings.get('enable_smacks') || _converse.session.get('smacks_enabled')) {
return;
}
if (await isStreamManagementSupported()) {
@ -193,16 +194,16 @@ converse.plugins.add('converse-smacks', {
_converse.connection._addSysHandler(el => promise.resolve(saveSessionData(el)), Strophe.NS.SM, 'enabled');
_converse.connection._addSysHandler(el => promise.resolve(onFailedStanza(el)), Strophe.NS.SM, 'failed');
const resume = (_converse.api.connection.isType('websocket') || _converse.isTestEnv());
const resume = (api.connection.isType('websocket') || _converse.isTestEnv());
const stanza = u.toStanza(`<enable xmlns="${Strophe.NS.SM}" resume="${resume}"/>`);
_converse.api.send(stanza);
api.send(stanza);
_converse.connection.flush();
await promise;
}
}
async function enableStreamManagement () {
if (!_converse.api.settings.get('enable_smacks')) {
if (!api.settings.get('enable_smacks')) {
return;
}
if (!(await isStreamManagementSupported())) {
@ -235,21 +236,21 @@ converse.plugins.add('converse-smacks', {
'unacked_stanzas',
(_converse.session.get('unacked_stanzas') || []).concat([stanza_string])
);
const max_unacked = _converse.api.settings.get('smacks_max_unacked_stanzas');
const max_unacked = api.settings.get('smacks_max_unacked_stanzas');
if (max_unacked > 0) {
const num = _converse.session.get('num_stanzas_since_last_ack') + 1;
if (num % max_unacked === 0) {
// Request confirmation of sent stanzas
_converse.api.send(u.toStanza(`<r xmlns="${Strophe.NS.SM}"/>`));
api.send(u.toStanza(`<r xmlns="${Strophe.NS.SM}"/>`));
}
_converse.session.save({'num_stanzas_since_last_ack': num});
}
}
}
_converse.api.listen.on('userSessionInitialized', initSessionData);
_converse.api.listen.on('beforeResourceBinding', enableStreamManagement);
_converse.api.listen.on('afterResourceBinding', sendEnableStanza);
_converse.api.listen.on('send', onStanzaSent);
api.listen.on('userSessionInitialized', initSessionData);
api.listen.on('beforeResourceBinding', enableStreamManagement);
api.listen.on('afterResourceBinding', sendEnableStanza);
api.listen.on('send', onStanzaSent);
}
});

View File

@ -14,8 +14,9 @@ converse.plugins.add('converse-status', {
initialize () {
const { _converse } = this;
const { api } = _converse;
_converse.api.settings.update({
api.settings.update({
auto_away: 0, // Seconds after which user status is set to 'away'
auto_xa: 0, // Seconds after which user status is set to 'xa'
csi_waiting_time: 0, // Support for XEP-0352. Seconds before client is considered idle and CSI is sent out.
@ -25,7 +26,7 @@ converse.plugins.add('converse-status', {
_converse.XMPPStatus = Model.extend({
defaults () {
return {"status": _converse.api.settings.get("default_state")}
return {"status": api.settings.get("default_state")}
},
initialize () {
@ -50,7 +51,7 @@ converse.plugins.add('converse-status', {
constructPresence (type, status_message) {
let presence;
type = isString(type) ? type : (this.get('status') || _converse.api.settings.get("default_state"));
type = isString(type) ? type : (this.get('status') || api.settings.get("default_state"));
status_message = isString(status_message) ? status_message : this.get('status_message');
// Most of these presence types are actually not explicitly sent,
// but I add all of them here for reference and future proofing.
@ -73,7 +74,7 @@ converse.plugins.add('converse-status', {
presence.c('status').t(status_message).up();
}
const priority = _converse.api.settings.get("priority");
const priority = api.settings.get("priority");
presence.c('priority').t(isNaN(Number(priority)) ? 0 : priority).up();
if (_converse.idle) {
const idle_since = new Date();
@ -84,7 +85,7 @@ converse.plugins.add('converse-status', {
},
sendPresence (type, status_message) {
_converse.api.send(this.constructPresence(type, status_message));
api.send(this.constructPresence(type, status_message));
}
});
@ -97,7 +98,7 @@ converse.plugins.add('converse-status', {
* @param { String } stat - The user's chat status
*/
_converse.sendCSI = function (stat) {
_converse.api.send($build(stat, {xmlns: Strophe.NS.CSI}));
api.send($build(stat, {xmlns: Strophe.NS.CSI}));
_converse.inactive = (stat === _converse.INACTIVE) ? true : false;
};
@ -123,7 +124,7 @@ converse.plugins.add('converse-status', {
_converse.auto_changed_status = false;
// XXX: we should really remember the original state here, and
// then set it back to that...
_converse.xmppstatus.set('status', _converse.api.settings.get("default_state"));
_converse.xmppstatus.set('status', api.settings.get("default_state"));
}
};
@ -138,24 +139,24 @@ converse.plugins.add('converse-status', {
}
const stat = _converse.xmppstatus.get('status');
_converse.idle_seconds++;
if (_converse.api.settings.get("csi_waiting_time") > 0 &&
_converse.idle_seconds > _converse.api.settings.get("csi_waiting_time") &&
if (api.settings.get("csi_waiting_time") > 0 &&
_converse.idle_seconds > api.settings.get("csi_waiting_time") &&
!_converse.inactive) {
_converse.sendCSI(_converse.INACTIVE);
}
if (_converse.api.settings.get("idle_presence_timeout") > 0 &&
_converse.idle_seconds > _converse.api.settings.get("idle_presence_timeout") &&
if (api.settings.get("idle_presence_timeout") > 0 &&
_converse.idle_seconds > api.settings.get("idle_presence_timeout") &&
!_converse.idle) {
_converse.idle = true;
_converse.xmppstatus.sendPresence();
}
if (_converse.api.settings.get("auto_away") > 0 &&
_converse.idle_seconds > _converse.api.settings.get("auto_away") &&
if (api.settings.get("auto_away") > 0 &&
_converse.idle_seconds > api.settings.get("auto_away") &&
stat !== 'away' && stat !== 'xa' && stat !== 'dnd') {
_converse.auto_changed_status = true;
_converse.xmppstatus.set('status', 'away');
} else if (_converse.api.settings.get("auto_xa") > 0 &&
_converse.idle_seconds > _converse.api.settings.get("auto_xa") &&
} else if (api.settings.get("auto_xa") > 0 &&
_converse.idle_seconds > api.settings.get("auto_xa") &&
stat !== 'xa' && stat !== 'dnd') {
_converse.auto_changed_status = true;
_converse.xmppstatus.set('status', 'xa');
@ -167,10 +168,10 @@ converse.plugins.add('converse-status', {
* Required for the auto_away, auto_xa and csi_waiting_time features.
*/
if (
_converse.api.settings.get("auto_away") < 1 &&
_converse.api.settings.get("auto_xa") < 1 &&
_converse.api.settings.get("csi_waiting_time") < 1 &&
_converse.api.settings.get("idle_presence_timeout") < 1
api.settings.get("auto_away") < 1 &&
api.settings.get("auto_xa") < 1 &&
api.settings.get("csi_waiting_time") < 1 &&
api.settings.get("idle_presence_timeout") < 1
) {
// Waiting time of less then one second means features aren't used.
return;
@ -192,7 +193,7 @@ converse.plugins.add('converse-status', {
};
_converse.api.listen.on('presencesInitialized', (reconnecting) => {
api.listen.on('presencesInitialized', (reconnecting) => {
if (!reconnecting) {
_converse.registerIntervalHandler();
}
@ -206,7 +207,7 @@ converse.plugins.add('converse-status', {
* @example _converse.api.listen.on('statusInitialized', status => { ... });
* @example _converse.api.waitUntil('statusInitialized').then(() => { ... });
*/
_converse.api.trigger('statusInitialized', reconnecting);
api.trigger('statusInitialized', reconnecting);
}
@ -230,15 +231,15 @@ converse.plugins.add('converse-status', {
/************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('clearSession', () => {
api.listen.on('clearSession', () => {
if (_converse.shouldClearCache() && _converse.xmppstatus) {
_converse.xmppstatus.destroy();
delete _converse.xmppstatus;
}
});
_converse.api.listen.on('connected', () => initStatus(false));
_converse.api.listen.on('reconnected', () => initStatus(true));
api.listen.on('connected', () => initStatus(false));
api.listen.on('reconnected', () => initStatus(true));
/************************ END Event Handlers ************************/

View File

@ -65,8 +65,9 @@ converse.plugins.add('converse-vcard', {
* loaded by converse.js's plugin machinery.
*/
const { _converse } = this;
const { api } = _converse;
_converse.api.promises.add('VCardsInitialized');
api.promises.add('VCardsInitialized');
_converse.VCard = Model.extend({
@ -105,7 +106,7 @@ converse.plugins.add('converse-vcard', {
initialize () {
this.on('add', vcard => {
_converse.api.vcard.update(vcard);
api.vcard.update(vcard);
});
}
});
@ -152,7 +153,7 @@ converse.plugins.add('converse-vcard', {
const to = Strophe.getBareJidFromJid(jid) === _converse.bare_jid ? null : jid;
let iq;
try {
iq = await _converse.api.sendIQ(createStanza("get", to))
iq = await api.sendIQ(createStanza("get", to))
} catch (iq) {
return {
'stanza': iq,
@ -174,7 +175,7 @@ converse.plugins.add('converse-vcard', {
} else {
jid = model.get('jid');
}
await _converse.api.waitUntil('VCardsInitialized');
await api.waitUntil('VCardsInitialized');
model.vcard = _converse.vcards.findWhere({'jid': jid});
if (!model.vcard) {
model.vcard = _converse.vcards.create({'jid': jid});
@ -202,7 +203,7 @@ converse.plugins.add('converse-vcard', {
async function setVCardOnMUCMessage (message) {
await _converse.api.waitUntil('VCardsInitialized');
await api.waitUntil('VCardsInitialized');
if (['error', 'info'].includes(message.get('type'))) {
return;
} else {
@ -229,13 +230,13 @@ converse.plugins.add('converse-vcard', {
* Triggered as soon as the `_converse.vcards` collection has been initialized and populated from cache.
* @event _converse#VCardsInitialized
*/
_converse.api.trigger('VCardsInitialized');
api.trigger('VCardsInitialized');
}
function clearVCardsSession () {
if (_converse.shouldClearCache()) {
_converse.api.promises.add('VCardsInitialized');
api.promises.add('VCardsInitialized');
if (_converse.vcards) {
_converse.vcards.clearStore();
delete _converse.vcards;
@ -246,14 +247,14 @@ converse.plugins.add('converse-vcard', {
/************************ BEGIN Event Handlers ************************/
_converse.api.listen.on('chatBoxInitialized', m => setVCardOnModel(m));
_converse.api.listen.on('chatRoomInitialized', m => setVCardOnModel(m));
_converse.api.listen.on('chatRoomMessageInitialized', m => setVCardOnMUCMessage(m));
_converse.api.listen.on('addClientFeatures', () => _converse.api.disco.own.features.add(Strophe.NS.VCARD));
_converse.api.listen.on('clearSession', () => clearVCardsSession());
_converse.api.listen.on('messageInitialized', m => setVCardOnModel(m));
_converse.api.listen.on('rosterContactInitialized', m => setVCardOnModel(m));
_converse.api.listen.on('statusInitialized', _converse.initVCardCollection);
api.listen.on('chatBoxInitialized', m => setVCardOnModel(m));
api.listen.on('chatRoomInitialized', m => setVCardOnModel(m));
api.listen.on('chatRoomMessageInitialized', m => setVCardOnMUCMessage(m));
api.listen.on('addClientFeatures', () => api.disco.own.features.add(Strophe.NS.VCARD));
api.listen.on('clearSession', () => clearVCardsSession());
api.listen.on('messageInitialized', m => setVCardOnModel(m));
api.listen.on('rosterContactInitialized', m => setVCardOnModel(m));
api.listen.on('statusInitialized', _converse.initVCardCollection);
/************************ BEGIN API ************************/
@ -289,7 +290,7 @@ converse.plugins.add('converse-vcard', {
throw Error("No jid provided for the VCard data");
}
const vcard_el = Strophe.xmlHtmlNode(tpl_vcard(data)).firstElementChild;
return _converse.api.sendIQ(createStanza("set", jid, vcard_el));
return api.sendIQ(createStanza("set", jid, vcard_el));
},
/**