diff --git a/dist/converse.js b/dist/converse.js index 1cefebc35..26213aa55 100644 --- a/dist/converse.js +++ b/dist/converse.js @@ -28230,73 +28230,6 @@ return es; }))); -//! moment.js locale configuration -//! locale : Basque [eu] -//! author : Eneko Illarramendi : https://github.com/eillarra - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define('moment/locale/eu',['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - -var eu = moment.defineLocale('eu', { - months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), - monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), - monthsParseExact : true, - weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), - weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), - weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'YYYY[ko] MMMM[ren] D[a]', - LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm', - LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm', - l : 'YYYY-M-D', - ll : 'YYYY[ko] MMM D[a]', - lll : 'YYYY[ko] MMM D[a] HH:mm', - llll : 'ddd, YYYY[ko] MMM D[a] HH:mm' - }, - calendar : { - sameDay : '[gaur] LT[etan]', - nextDay : '[bihar] LT[etan]', - nextWeek : 'dddd LT[etan]', - lastDay : '[atzo] LT[etan]', - lastWeek : '[aurreko] dddd LT[etan]', - sameElse : 'L' - }, - relativeTime : { - future : '%s barru', - past : 'duela %s', - s : 'segundo batzuk', - m : 'minutu bat', - mm : '%d minutu', - h : 'ordu bat', - hh : '%d ordu', - d : 'egun bat', - dd : '%d egun', - M : 'hilabete bat', - MM : '%d hilabete', - y : 'urte bat', - yy : '%d urte' - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } -}); - -return eu; - -}))); - //! moment.js locale configuration //! locale : French [fr] //! author : John Fischer : https://github.com/jfroffice @@ -29811,6 +29744,8 @@ return zhTw; }))); + + // Converse.js (A browser based XMPP chat client) // http://conversejs.org // @@ -29822,8 +29757,8 @@ return zhTw; /*global define */ (function (root, factory) { - define('i18n',["es6-promise", "jed", "lodash.noconflict", "moment", 'moment/locale/af', 'moment/locale/ar', 'moment/locale/bg', 'moment/locale/ca', 'moment/locale/de', 'moment/locale/es', 'moment/locale/eu', 'moment/locale/fr', 'moment/locale/he', 'moment/locale/hu', 'moment/locale/id', 'moment/locale/it', 'moment/locale/ja', 'moment/locale/nb', 'moment/locale/nl', 'moment/locale/pl', 'moment/locale/pt-br', 'moment/locale/ru', 'moment/locale/tr', 'moment/locale/uk', 'moment/locale/zh-cn', 'moment/locale/zh-tw'], factory); -})(this, function (Promise, Jed, _, moment) { + define('i18n',["es6-promise", "jed", "lodash.noconflict", "moment", 'moment/locale/af', 'moment/locale/ar', 'moment/locale/bg', 'moment/locale/ca', 'moment/locale/de', 'moment/locale/es', 'moment/locale/fr', 'moment/locale/he', 'moment/locale/hu', 'moment/locale/id', 'moment/locale/it', 'moment/locale/ja', 'moment/locale/nb', 'moment/locale/nl', 'moment/locale/pl', 'moment/locale/pt-br', 'moment/locale/ru', 'moment/locale/tr', 'moment/locale/uk', 'moment/locale/zh-cn', 'moment/locale/zh-tw'], factory); +})(void 0, function (Promise, Jed, _, moment) { 'use strict'; function detectLocale(library_check) { @@ -36297,6 +36232,8 @@ require(["strophe-polyfill"]); })); /* jshint ignore:end */ ; + + function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } // Converse.js (A browser based XMPP chat client) @@ -36311,7 +36248,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat /*global define, escape, window */ (function (root, factory) { define('utils',["sizzle", "es6-promise", "lodash.noconflict", "strophe"], factory); -})(this, function (sizzle, Promise, _, Strophe) { +})(void 0, function (sizzle, Promise, _, Strophe) { "use strict"; var b64_sha1 = Strophe.SHA1.b64_sha1; @@ -36526,14 +36463,6 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat })); }; - u.renderMovieURLs = function (obj) { - return ""; - }; - - u.renderAudioURLs = function (obj) { - return ""; - }; - u.slideInAllElements = function (elements) { var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 300; return Promise.all(_.map(elements, _.partial(u.slideIn, _, duration))); @@ -37048,19 +36977,9 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat el.dispatchEvent(evt); }; - u.geoUriToHttp = function (text, _converse) { - var regex = /geo:([\-0-9.]+),([\-0-9.]+)(?:,([\-0-9.]+))?(?:\?(.*))?/g; - return text.replace(regex, _converse.geouri_replacement); - }; - - u.httpToGeoUri = function (text, _converse) { - var replacement = 'geo:$1,$2'; - return text.replace(_converse.geouri_regex, replacement); - }; - return u; }); -//# sourceMappingURL=core.js.map; +//# sourceMappingURL=utils.js.map; (function (global, factory) { if (typeof define === "function" && define.amd) { define('pluggable',['exports', 'lodash'], factory); @@ -39728,6 +39647,8 @@ Backbone.sync = function(method, model, options) { return Backbone.BrowserStorage; })); + + // Converse.js (A browser based XMPP chat client) // http://conversejs.org // @@ -39738,7 +39659,7 @@ return Backbone.BrowserStorage; /*global Backbone, define, window, JSON */ (function (root, factory) { define('converse-core',["sizzle", "es6-promise", "lodash.noconflict", "lodash.fp", "polyfill", "i18n", "utils", "moment", "strophe", "pluggable", "backbone.noconflict", "backbone.nativeview", "backbone.browserStorage"], factory); -})(this, function (sizzle, Promise, _, f, polyfill, i18n, u, moment, Strophe, pluggable, Backbone) { +})(void 0, function (sizzle, Promise, _, f, polyfill, i18n, u, moment, Strophe, pluggable, Backbone) { /* Cannot use this due to Safari bug. * See https://github.com/jcbrand/converse.js/issues/196 */ @@ -39787,7 +39708,7 @@ return Backbone.BrowserStorage; _.extend(_converse, Backbone.Events); // Core plugins are whitelisted automatically - _converse.core_plugins = ['converse-bookmarks', 'converse-chatboxes', 'converse-chatview', 'converse-controlbox', 'converse-core', 'converse-disco', 'converse-dragresize', 'converse-dropdown', 'converse-fullscreen', 'converse-headline', 'converse-httpFileUpload', 'converse-mam', 'converse-minimize', 'converse-modal', 'converse-muc', 'converse-muc-embedded', 'converse-muc-views', 'converse-notification', 'converse-otr', 'converse-ping', 'converse-profile', 'converse-register', 'converse-roomslist', 'converse-rosterview', 'converse-singleton', 'converse-spoilers', 'converse-vcard']; // Make converse pluggable + _converse.core_plugins = ['converse-bookmarks', 'converse-chatboxes', 'converse-chatview', 'converse-controlbox', 'converse-core', 'converse-disco', 'converse-dragresize', 'converse-dropdown', 'converse-fullscreen', 'converse-headline', 'converse-mam', 'converse-minimize', 'converse-modal', 'converse-muc', 'converse-muc-embedded', 'converse-muc-views', 'converse-notification', 'converse-otr', 'converse-ping', 'converse-profile', 'converse-register', 'converse-roomslist', 'converse-rosterview', 'converse-singleton', 'converse-spoilers', 'converse-vcard']; // Make converse pluggable pluggable.enable(_converse, '_converse', 'pluggable'); // Module-level constants @@ -40012,14 +39933,12 @@ return Backbone.BrowserStorage; expose_rid_and_sid: false, filter_by_resource: false, forward_messages: false, - geouri_regex: /https:\/\/www.openstreetmap.org\/.*#map=[0-9]+\/([\-0-9.]+)\/([\-0-9.]+)\S*/g, - geouri_replacement: 'https://www.openstreetmap.org/?mlat=$1&mlon=$2#map=18/$1/$2', hide_offline_users: false, include_offline_state: false, jid: undefined, keepalive: true, locales_url: 'locale/{{{locale}}}/LC_MESSAGES/converse.json', - locales: ['af', 'ar', 'bg', 'ca', 'de', 'es', 'eu', 'en', 'fr', 'he', 'hu', 'id', 'it', 'ja', 'nb', 'nl', 'pl', 'pt_BR', 'ru', 'tr', 'uk', 'zh_CN', 'zh_TW'], + locales: ['af', 'ar', 'bg', 'ca', 'de', 'es', 'en', 'fr', 'he', 'hu', 'id', 'it', 'ja', 'nb', 'nl', 'pl', 'pt_BR', 'ru', 'tr', 'uk', 'zh_CN', 'zh_TW'], message_carbons: true, message_storage: 'session', nickname: undefined, @@ -40829,7 +40748,7 @@ return Backbone.BrowserStorage; } } }, - removeFromRoster: function removeFromRoster(callback, errback) { + removeFromRoster: function removeFromRoster(callback) { /* Instruct the XMPP server to remove this contact from our roster * Parameters: * (Function) callback @@ -40843,7 +40762,7 @@ return Backbone.BrowserStorage; subscription: "remove" }); - _converse.connection.sendIQ(iq, callback, errback); + _converse.connection.sendIQ(iq, callback, callback); return this; } @@ -46297,12 +46216,6 @@ function print() { __p += __j.call(arguments, '') } if (o.use_emoji) { ; __p += '\n
  • \n \n
  • \n'; } ; -__p += '\n'; - if (o.show_fileUpload_button) { ; -__p += '\n\n
  • \n \n
  • \n'; - } ; __p += '\n'; if (o.show_call_button) { ; __p += '\n
  • 2 && arguments[2] !== undefined ? arguments[2] : null; - /* This method gets called once the user has typed a message * and then pressed enter in a chat box. * @@ -48155,17 +47763,7 @@ return __p var attrs = this.getOutgoingMessageAttributes(text, spoiler_hint); var message = this.model.messages.create(attrs); - /* check, if a file was send. If true it will send the file with XEP-0066. */ - - var messageStanza; - - if (file !== null) { - messageStanza = this.createFileMessageStanza(message); - } else { - messageStanza = this.createMessageStanza(message); - } - - this.sendMessage(messageStanza); + this.sendMessage(message); }, getOutgoingMessageAttributes: function getOutgoingMessageAttributes(text, spoiler_hint) { /* Overridable method which returns the attributes to be @@ -48177,7 +47775,7 @@ return __p 'fullname': _.isEmpty(fullname) ? _converse.bare_jid : fullname, 'sender': 'me', 'time': moment().format(), - 'message': u.httpToGeoUri(emojione.shortnameToUnicode(text), _converse), + 'message': emojione.shortnameToUnicode(text), 'is_spoiler': is_spoiler }; @@ -50328,6 +49926,8 @@ exports.default = vnode; }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy8ucmVnaXN0cnkubnBtanMub3JnL2Jyb3dzZXItcGFjay82LjAuMi9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiaHRtbGRvbWFwaS5qcyIsInRvdm5vZGUuanMiLCJ2bm9kZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRhZ05hbWUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVUZXh0Tm9kZSh0ZXh0KSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpO1xufVxuZnVuY3Rpb24gY3JlYXRlQ29tbWVudCh0ZXh0KSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQodGV4dCk7XG59XG5mdW5jdGlvbiBpbnNlcnRCZWZvcmUocGFyZW50Tm9kZSwgbmV3Tm9kZSwgcmVmZXJlbmNlTm9kZSkge1xuICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpO1xufVxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGQobm9kZSwgY2hpbGQpIHtcbiAgICBub2RlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGFwcGVuZENoaWxkKG5vZGUsIGNoaWxkKSB7XG4gICAgbm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiBwYXJlbnROb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5wYXJlbnROb2RlO1xufVxuZnVuY3Rpb24gbmV4dFNpYmxpbmcobm9kZSkge1xuICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nO1xufVxuZnVuY3Rpb24gdGFnTmFtZShlbG0pIHtcbiAgICByZXR1cm4gZWxtLnRhZ05hbWU7XG59XG5mdW5jdGlvbiBzZXRUZXh0Q29udGVudChub2RlLCB0ZXh0KSB7XG4gICAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7XG59XG5mdW5jdGlvbiBnZXRUZXh0Q29udGVudChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudGV4dENvbnRlbnQ7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQobm9kZSkge1xuICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAxO1xufVxuZnVuY3Rpb24gaXNUZXh0KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMztcbn1cbmZ1bmN0aW9uIGlzQ29tbWVudChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IDg7XG59XG5leHBvcnRzLmh0bWxEb21BcGkgPSB7XG4gICAgY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCxcbiAgICBjcmVhdGVFbGVtZW50TlM6IGNyZWF0ZUVsZW1lbnROUyxcbiAgICBjcmVhdGVUZXh0Tm9kZTogY3JlYXRlVGV4dE5vZGUsXG4gICAgY3JlYXRlQ29tbWVudDogY3JlYXRlQ29tbWVudCxcbiAgICBpbnNlcnRCZWZvcmU6IGluc2VydEJlZm9yZSxcbiAgICByZW1vdmVDaGlsZDogcmVtb3ZlQ2hpbGQsXG4gICAgYXBwZW5kQ2hpbGQ6IGFwcGVuZENoaWxkLFxuICAgIHBhcmVudE5vZGU6IHBhcmVudE5vZGUsXG4gICAgbmV4dFNpYmxpbmc6IG5leHRTaWJsaW5nLFxuICAgIHRhZ05hbWU6IHRhZ05hbWUsXG4gICAgc2V0VGV4dENvbnRlbnQ6IHNldFRleHRDb250ZW50LFxuICAgIGdldFRleHRDb250ZW50OiBnZXRUZXh0Q29udGVudCxcbiAgICBpc0VsZW1lbnQ6IGlzRWxlbWVudCxcbiAgICBpc1RleHQ6IGlzVGV4dCxcbiAgICBpc0NvbW1lbnQ6IGlzQ29tbWVudCxcbn07XG5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLmh0bWxEb21BcGk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1odG1sZG9tYXBpLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHZub2RlXzEgPSByZXF1aXJlKFwiLi92bm9kZVwiKTtcbnZhciBodG1sZG9tYXBpXzEgPSByZXF1aXJlKFwiLi9odG1sZG9tYXBpXCIpO1xuZnVuY3Rpb24gdG9WTm9kZShub2RlLCBkb21BcGkpIHtcbiAgICB2YXIgYXBpID0gZG9tQXBpICE9PSB1bmRlZmluZWQgPyBkb21BcGkgOiBodG1sZG9tYXBpXzEuZGVmYXVsdDtcbiAgICB2YXIgdGV4dDtcbiAgICBpZiAoYXBpLmlzRWxlbWVudChub2RlKSkge1xuICAgICAgICB2YXIgaWQgPSBub2RlLmlkID8gJyMnICsgbm9kZS5pZCA6ICcnO1xuICAgICAgICB2YXIgY24gPSBub2RlLmdldEF0dHJpYnV0ZSgnY2xhc3MnKTtcbiAgICAgICAgdmFyIGMgPSBjbiA/ICcuJyArIGNuLnNwbGl0KCcgJykuam9pbignLicpIDogJyc7XG4gICAgICAgIHZhciBzZWwgPSBhcGkudGFnTmFtZShub2RlKS50b0xvd2VyQ2FzZSgpICsgaWQgKyBjO1xuICAgICAgICB2YXIgYXR0cnMgPSB7fTtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gW107XG4gICAgICAgIHZhciBuYW1lXzE7XG4gICAgICAgIHZhciBpID0gdm9pZCAwLCBuID0gdm9pZCAwO1xuICAgICAgICB2YXIgZWxtQXR0cnMgPSBub2RlLmF0dHJpYnV0ZXM7XG4gICAgICAgIHZhciBlbG1DaGlsZHJlbiA9IG5vZGUuY2hpbGROb2RlcztcbiAgICAgICAgZm9yIChpID0gMCwgbiA9IGVsbUF0dHJzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgbmFtZV8xID0gZWxtQXR0cnNbaV0ubm9kZU5hbWU7XG4gICAgICAgICAgICBpZiAobmFtZV8xICE9PSAnaWQnICYmIG5hbWVfMSAhPT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgICAgIGF0dHJzW25hbWVfMV0gPSBlbG1BdHRyc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMCwgbiA9IGVsbUNoaWxkcmVuLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0b1ZOb2RlKGVsbUNoaWxkcmVuW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZub2RlXzEuZGVmYXVsdChzZWwsIHsgYXR0cnM6IGF0dHJzIH0sIGNoaWxkcmVuLCB1bmRlZmluZWQsIG5vZGUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcGkuaXNUZXh0KG5vZGUpKSB7XG4gICAgICAgIHRleHQgPSBhcGkuZ2V0VGV4dENvbnRlbnQobm9kZSk7XG4gICAgICAgIHJldHVybiB2bm9kZV8xLmRlZmF1bHQodW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGV4dCwgbm9kZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFwaS5pc0NvbW1lbnQobm9kZSkpIHtcbiAgICAgICAgdGV4dCA9IGFwaS5nZXRUZXh0Q29udGVudChub2RlKTtcbiAgICAgICAgcmV0dXJuIHZub2RlXzEuZGVmYXVsdCgnIScsIHt9LCBbXSwgdGV4dCwgbm9kZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gdm5vZGVfMS5kZWZhdWx0KCcnLCB7fSwgW10sIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcbiAgICB9XG59XG5leHBvcnRzLnRvVk5vZGUgPSB0b1ZOb2RlO1xuZXhwb3J0cy5kZWZhdWx0ID0gdG9WTm9kZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRvdm5vZGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5mdW5jdGlvbiB2bm9kZShzZWwsIGRhdGEsIGNoaWxkcmVuLCB0ZXh0LCBlbG0pIHtcbiAgICB2YXIga2V5ID0gZGF0YSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZGF0YS5rZXk7XG4gICAgcmV0dXJuIHsgc2VsOiBzZWwsIGRhdGE6IGRhdGEsIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICAgICAgdGV4dDogdGV4dCwgZWxtOiBlbG0sIGtleToga2V5IH07XG59XG5leHBvcnRzLnZub2RlID0gdm5vZGU7XG5leHBvcnRzLmRlZmF1bHQgPSB2bm9kZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZub2RlLmpzLm1hcCJdfQ== ; + + function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } /*! @@ -50342,7 +49942,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat // CommonJS-like environments module.exports = factory(require('snabbdom'), require('snabbdom-attributes'), require('snabbdom-class'), require('snabbdom-dataset'), require('snabbdom-props'), require('snabbdom-style'), require('tovnode'), require('underscore'), require('backbone')); } -})(this, function (snabbdom, snabbdom_attributes, snabbdom_class, snabbdom_dataset, snabbdom_props, snabbdom_style, tovnode, _, Backbone) { +})(void 0, function (snabbdom, snabbdom_attributes, snabbdom_class, snabbdom_dataset, snabbdom_props, snabbdom_style, tovnode, _, Backbone) { "use strict"; var domParser = new DOMParser(); @@ -50410,11 +50010,14 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat }); return Backbone.VDOMView; }); +//# sourceMappingURL=backbone.vdomview.js.map; + + (function (root, factory) { if (typeof define === 'function' && define.amd) { define('converse-modal',["converse-core", "bootstrap", "underscore", "backbone", "backbone.vdomview"], factory); } -})(this, function (converse, bootstrap, _, Backbone) { +})(void 0, function (converse, bootstrap, _, Backbone) { "use strict"; converse.plugins.add('converse-modal', { @@ -50451,6 +50054,8 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat }); }); //# sourceMappingURL=converse-modal.js.map; + + // Converse.js (A browser based XMPP chat client) // http://conversejs.org // @@ -50461,7 +50066,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat /*global define */ (function (root, factory) { define('converse-rosterview',["converse-core", "tpl!add_contact_modal", "tpl!group_header", "tpl!pending_contact", "tpl!requesting_contact", "tpl!roster", "tpl!roster_filter", "tpl!roster_item", "tpl!search_contact", "awesomplete", "converse-chatboxes", "converse-modal"], factory); -})(this, function (converse, tpl_add_contact_modal, tpl_group_header, tpl_pending_contact, tpl_requesting_contact, tpl_roster, tpl_roster_filter, tpl_roster_item, tpl_search_contact, Awesomplete) { +})(void 0, function (converse, tpl_add_contact_modal, tpl_group_header, tpl_pending_contact, tpl_requesting_contact, tpl_roster, tpl_roster_filter, tpl_roster_item, tpl_search_contact, Awesomplete) { "use strict"; var _converse$env = converse.env, @@ -50943,7 +50548,16 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat var result = confirm(__("Are you sure you want to remove this contact?")); if (result === true) { - this.model.removeFromRoster(function (iq) { + var iq = $iq({ + type: 'set' + }).c('query', { + xmlns: Strophe.NS.ROSTER + }).c('item', { + jid: this.model.get('jid'), + subscription: "remove" + }); + + _converse.connection.sendIQ(iq, function (iq) { _this.model.destroy(); _this.remove(); @@ -51709,6 +51323,8 @@ return __p }); })); + + // Converse.js (A browser based XMPP chat client) // http://conversejs.org // @@ -51719,7 +51335,7 @@ return __p /*global define */ (function (root, factory) { define('converse-vcard',["converse-core", "strophe.vcard"], factory); -})(this, function (converse) { +})(void 0, function (converse) { "use strict"; var _converse$env = converse.env, @@ -51931,6 +51547,8 @@ return __p }); }); //# sourceMappingURL=converse-vcard.js.map; + + // Converse.js (A browser based XMPP chat client) // http://conversejs.org // @@ -51941,7 +51559,7 @@ return __p /*global define */ (function (root, factory) { define('converse-profile',["converse-core", "bootstrap", "tpl!chat_status_modal", "tpl!profile_modal", "tpl!profile_view", "tpl!status_option", "converse-vcard", "converse-modal"], factory); -})(this, function (converse, bootstrap, tpl_chat_status_modal, tpl_profile_modal, tpl_profile_view, tpl_status_option) { +})(void 0, function (converse, bootstrap, tpl_chat_status_modal, tpl_profile_modal, tpl_profile_view, tpl_status_option) { "use strict"; var _converse$env = converse.env, @@ -52083,6 +51701,8 @@ return __p }); }); //# sourceMappingURL=converse-profile.js.map; + + // Converse.js (A browser based XMPP chat client) // http://conversejs.org // @@ -52093,7 +51713,7 @@ return __p /*global define */ (function (root, factory) { define('converse-controlbox',["converse-core", "lodash.fp", "tpl!converse_brand_heading", "tpl!controlbox", "tpl!controlbox_toggle", "tpl!login_panel", "converse-chatview", "converse-rosterview", "converse-profile"], factory); -})(this, function (converse, fp, tpl_brand_heading, tpl_controlbox, tpl_controlbox_toggle, tpl_login_panel) { +})(void 0, function (converse, fp, tpl_brand_heading, tpl_controlbox, tpl_controlbox_toggle, tpl_login_panel) { "use strict"; var CHATBOX_TYPE = 'chatbox'; @@ -52865,6 +52485,8 @@ __e(o.value) + return __p };}); + + // Converse.js (A browser based XMPP chat client) // http://conversejs.org // @@ -52877,7 +52499,7 @@ return __p /*global define, escape, Jed */ (function (root, factory) { define('form-utils',["sizzle", "lodash.noconflict", "utils", "tpl!field", "tpl!select_option", "tpl!form_select", "tpl!form_textarea", "tpl!form_checkbox", "tpl!form_username", "tpl!form_input", "tpl!form_captcha", "tpl!form_url"], factory); -})(this, function (sizzle, _, u, tpl_field, tpl_select_option, tpl_form_select, tpl_form_textarea, tpl_form_checkbox, tpl_form_username, tpl_form_input, tpl_form_captcha, tpl_form_url) { +})(void 0, function (sizzle, _, u, tpl_field, tpl_select_option, tpl_form_select, tpl_form_textarea, tpl_form_checkbox, tpl_form_username, tpl_form_input, tpl_form_captcha, tpl_form_url) { "use strict"; var XFORM_TYPE_MAP = { @@ -53006,7 +52628,7 @@ return __p return u; }); -//# sourceMappingURL=form.js.map; +//# sourceMappingURL=form-utils.js.map; /* Copyright 2010, François de Metz */ @@ -53271,6 +52893,8 @@ Strophe.addConnectionPlugin('disco', }); })); + + // Converse.js (A browser based XMPP chat client) // http://conversejs.org // @@ -53283,7 +52907,7 @@ Strophe.addConnectionPlugin('disco', /*global Backbone, define, window */ (function (root, factory) { define('converse-disco',["converse-core", "sizzle", "strophe.disco"], factory); -})(this, function (converse, sizzle) { +})(void 0, function (converse, sizzle) { var _converse$env = converse.env, Backbone = _converse$env.Backbone, Promise = _converse$env.Promise, @@ -53688,112 +53312,8 @@ Strophe.addConnectionPlugin('disco', }); //# sourceMappingURL=backbone.orderedlistview.js.map; -// Converse.js (A browser based XMPP chat client) -// http://conversejs.org -// -// This is the utilities module. -// -// Copyright (c) 2012-2017, Jan-Carel Brand -// Licensed under the Mozilla Public License (MPLv2) -// - -/*global define, escape, Jed */ -(function (root, factory) { - define('muc-utils',["converse-core", "utils"], factory); -})(this, function (converse, u) { - "use strict"; - - var _converse$env = converse.env, - Strophe = _converse$env.Strophe, - sizzle = _converse$env.sizzle, - _ = _converse$env._; - - u.computeAffiliationsDelta = function computeAffiliationsDelta(exclude_existing, remove_absentees, new_list, old_list) { - /* Given two lists of objects with 'jid', 'affiliation' and - * 'reason' properties, return a new list containing - * those objects that are new, changed or removed - * (depending on the 'remove_absentees' boolean). - * - * The affiliations for new and changed members stay the - * same, for removed members, the affiliation is set to 'none'. - * - * The 'reason' property is not taken into account when - * comparing whether affiliations have been changed. - * - * Parameters: - * (Boolean) exclude_existing: Indicates whether JIDs from - * the new list which are also in the old list - * (regardless of affiliation) should be excluded - * from the delta. One reason to do this - * would be when you want to add a JID only if it - * doesn't have *any* existing affiliation at all. - * (Boolean) remove_absentees: Indicates whether JIDs - * from the old list which are not in the new list - * should be considered removed and therefore be - * included in the delta with affiliation set - * to 'none'. - * (Array) new_list: Array containing the new affiliations - * (Array) old_list: Array containing the old affiliations - */ - var new_jids = _.map(new_list, 'jid'); - - var old_jids = _.map(old_list, 'jid'); // Get the new affiliations - var delta = _.map(_.difference(new_jids, old_jids), function (jid) { - return new_list[_.indexOf(new_jids, jid)]; - }); - - if (!exclude_existing) { - // Get the changed affiliations - delta = delta.concat(_.filter(new_list, function (item) { - var idx = _.indexOf(old_jids, item.jid); - - if (idx >= 0) { - return item.affiliation !== old_list[idx].affiliation; - } - - return false; - })); - } - - if (remove_absentees) { - // Get the removed affiliations - delta = delta.concat(_.map(_.difference(old_jids, new_jids), function (jid) { - return { - 'jid': jid, - 'affiliation': 'none' - }; - })); - } - - return delta; - }; - - u.parseMemberListIQ = function parseMemberListIQ(iq) { - /* Given an IQ stanza with a member list, create an array of member - * objects. - */ - return _.map(sizzle("query[xmlns=\"".concat(Strophe.NS.MUC_ADMIN, "\"] item"), iq), function (item) { - return { - 'jid': item.getAttribute('jid'), - 'affiliation': item.getAttribute('affiliation') - }; - }); - }; - - u.marshallAffiliationIQs = function marshallAffiliationIQs() { - /* Marshall a list of IQ stanzas into a map of JIDs and - * affiliations. - * - * Parameters: - * Any amount of XMLElement objects, representing the IQ - * stanzas. - */ - return _.flatMap(arguments[0], u.parseMemberListIQ); - }; -}); -//# sourceMappingURL=muc.js.map; // Converse.js (A browser based XMPP chat client) // http://conversejs.org // @@ -53807,8 +53327,8 @@ Strophe.addConnectionPlugin('disco', * specified in XEP-0045 Multi-user chat. */ (function (root, factory) { - define('converse-muc',["form-utils", "converse-core", "converse-chatview", "converse-disco", "backbone.overview", "backbone.orderedlistview", "backbone.vdomview", "muc-utils"], factory); -})(this, function (u, converse) { + define('converse-muc',["form-utils", "converse-core", "converse-chatview", "converse-disco", "backbone.overview", "backbone.orderedlistview", "backbone.vdomview"], factory); +})(void 0, function (u, converse) { "use strict"; var MUC_ROLE_WEIGHTS = { @@ -54056,328 +53576,6 @@ Strophe.addConnectionPlugin('disco', 'type': converse.CHATROOMS_TYPE }); }, - directInvite: function directInvite(recipient, reason) { - /* Send a direct invitation as per XEP-0249 - * - * Parameters: - * (String) recipient - JID of the person being invited - * (String) reason - Optional reason for the invitation - */ - if (this.get('membersonly')) { - // When inviting to a members-only room, we first add - // the person to the member list by giving them an - // affiliation of 'member' (if they're not affiliated - // already), otherwise they won't be able to join. - var map = {}; - map[recipient] = 'member'; - - var deltaFunc = _.partial(u.computeAffiliationsDelta, true, false); - - this.updateMemberLists([{ - 'jid': recipient, - 'affiliation': 'member', - 'reason': reason - }], ['member', 'owner', 'admin'], deltaFunc); - } - - var attrs = { - 'xmlns': 'jabber:x:conference', - 'jid': this.get('jid') - }; - - if (reason !== null) { - attrs.reason = reason; - } - - if (this.get('password')) { - attrs.password = this.get('password'); - } - - var invitation = $msg({ - from: _converse.connection.jid, - to: recipient, - id: _converse.connection.getUniqueId() - }).c('x', attrs); - - _converse.connection.send(invitation); - - _converse.emit('roomInviteSent', { - 'room': this, - 'recipient': recipient, - 'reason': reason - }); - }, - sendConfiguration: function sendConfiguration(config, callback, errback) { - /* Send an IQ stanza with the room configuration. - * - * Parameters: - * (Array) config: The room configuration - * (Function) callback: Callback upon succesful IQ response - * The first parameter passed in is IQ containing the - * room configuration. - * The second is the response IQ from the server. - * (Function) errback: Callback upon error IQ response - * The first parameter passed in is IQ containing the - * room configuration. - * The second is the response IQ from the server. - */ - var iq = $iq({ - to: this.get('jid'), - type: "set" - }).c("query", { - xmlns: Strophe.NS.MUC_OWNER - }).c("x", { - xmlns: Strophe.NS.XFORM, - type: "submit" - }); - - _.each(config || [], function (node) { - iq.cnode(node).up(); - }); - - callback = _.isUndefined(callback) ? _.noop : _.partial(callback, iq.nodeTree); - errback = _.isUndefined(errback) ? _.noop : _.partial(errback, iq.nodeTree); - return _converse.connection.sendIQ(iq, callback, errback); - }, - parseRoomFeatures: function parseRoomFeatures(iq) { - /* Parses an IQ stanza containing the room's features. - * - * See http://xmpp.org/extensions/xep-0045.html#disco-roominfo - * - * - * - * - * - * - * - * - * - * - */ - var features = { - 'features_fetched': true, - 'name': iq.querySelector('identity').getAttribute('name') - }; - - _.each(iq.querySelectorAll('feature'), function (field) { - var fieldname = field.getAttribute('var'); - - if (!fieldname.startsWith('muc_')) { - if (fieldname === Strophe.NS.MAM) { - features.mam_enabled = true; - } - - return; - } - - features[fieldname.replace('muc_', '')] = true; - }); - - var desc_field = iq.querySelector('field[var="muc#roominfo_description"] value'); - - if (!_.isNull(desc_field)) { - features.description = desc_field.textContent; - } - - this.save(features); - }, - requestMemberList: function requestMemberList(affiliation) { - var _this = this; - - /* Send an IQ stanza to the server, asking it for the - * member-list of this room. - * - * See: http://xmpp.org/extensions/xep-0045.html#modifymember - * - * Parameters: - * (String) affiliation: The specific member list to - * fetch. 'admin', 'owner' or 'member'. - * - * Returns: - * A promise which resolves once the list has been - * retrieved. - */ - return new Promise(function (resolve, reject) { - affiliation = affiliation || 'member'; - var iq = $iq({ - to: _this.get('jid'), - type: "get" - }).c("query", { - xmlns: Strophe.NS.MUC_ADMIN - }).c("item", { - 'affiliation': affiliation - }); - - _converse.connection.sendIQ(iq, resolve, reject); - }); - }, - setAffiliation: function setAffiliation(affiliation, members) { - /* Send IQ stanzas to the server to set an affiliation for - * the provided JIDs. - * - * See: http://xmpp.org/extensions/xep-0045.html#modifymember - * - * XXX: Prosody doesn't accept multiple JIDs' affiliations - * being set in one IQ stanza, so as a workaround we send - * a separate stanza for each JID. - * Related ticket: https://prosody.im/issues/issue/795 - * - * Parameters: - * (String) affiliation: The affiliation - * (Object) members: A map of jids, affiliations and - * optionally reasons. Only those entries with the - * same affiliation as being currently set will be - * considered. - * - * Returns: - * A promise which resolves and fails depending on the - * XMPP server response. - */ - members = _.filter(members, function (member) { - return (// We only want those members who have the right - // affiliation (or none, which implies the provided one). - _.isUndefined(member.affiliation) || member.affiliation === affiliation - ); - }); - - var promises = _.map(members, _.bind(this.sendAffiliationIQ, this, affiliation)); - - return Promise.all(promises); - }, - saveAffiliationAndRole: function saveAffiliationAndRole(pres) { - /* Parse the presence stanza for the current user's - * affiliation. - * - * Parameters: - * (XMLElement) pres: A stanza. - */ - var item = sizzle("x[xmlns=\"".concat(Strophe.NS.MUC_USER, "\"] item"), pres).pop(); - var is_self = pres.querySelector("status[code='110']"); - - if (is_self && !_.isNil(item)) { - var affiliation = item.getAttribute('affiliation'); - var role = item.getAttribute('role'); - - if (affiliation) { - this.save({ - 'affiliation': affiliation - }); - } - - if (role) { - this.save({ - 'role': role - }); - } - } - }, - sendAffiliationIQ: function sendAffiliationIQ(affiliation, member) { - var _this2 = this; - - /* Send an IQ stanza specifying an affiliation change. - * - * Paremeters: - * (String) affiliation: affiliation (could also be stored - * on the member object). - * (Object) member: Map containing the member's jid and - * optionally a reason and affiliation. - */ - return new Promise(function (resolve, reject) { - var iq = $iq({ - to: _this2.get('jid'), - type: "set" - }).c("query", { - xmlns: Strophe.NS.MUC_ADMIN - }).c("item", { - 'affiliation': member.affiliation || affiliation, - 'jid': member.jid - }); - - if (!_.isUndefined(member.reason)) { - iq.c("reason", member.reason); - } - - _converse.connection.sendIQ(iq, resolve, reject); - }); - }, - setAffiliations: function setAffiliations(members) { - /* Send IQ stanzas to the server to modify the - * affiliations in this room. - * - * See: http://xmpp.org/extensions/xep-0045.html#modifymember - * - * Parameters: - * (Object) members: A map of jids, affiliations and optionally reasons - * (Function) onSuccess: callback for a succesful response - * (Function) onError: callback for an error response - */ - var affiliations = _.uniq(_.map(members, 'affiliation')); - - _.each(affiliations, _.partial(this.setAffiliation.bind(this), _, members)); - }, - getJidsWithAffiliations: function getJidsWithAffiliations(affiliations) { - var _this3 = this; - - /* Returns a map of JIDs that have the affiliations - * as provided. - */ - if (_.isString(affiliations)) { - affiliations = [affiliations]; - } - - return new Promise(function (resolve, reject) { - var promises = _.map(affiliations, _.partial(_this3.requestMemberList.bind(_this3))); - - Promise.all(promises).then(_.flow(u.marshallAffiliationIQs, resolve), _.flow(u.marshallAffiliationIQs, resolve)); - }); - }, - updateMemberLists: function updateMemberLists(members, affiliations, deltaFunc) { - var _this4 = this; - - /* Fetch the lists of users with the given affiliations. - * Then compute the delta between those users and - * the passed in members, and if it exists, send the delta - * to the XMPP server to update the member list. - * - * Parameters: - * (Object) members: Map of member jids and affiliations. - * (String|Array) affiliation: An array of affiliations or - * a string if only one affiliation. - * (Function) deltaFunc: The function to compute the delta - * between old and new member lists. - * - * Returns: - * A promise which is resolved once the list has been - * updated or once it's been established there's no need - * to update the list. - */ - this.getJidsWithAffiliations(affiliations).then(function (old_members) { - _this4.setAffiliations(deltaFunc(members, old_members)); - }); - }, - checkForReservedNick: function checkForReservedNick(callback, errback) { - /* Use service-discovery to ask the XMPP server whether - * this user has a reserved nickname for this room. - * If so, we'll use that, otherwise we render the nickname form. - * - * Parameters: - * (Function) callback: Callback upon succesful IQ response - * (Function) errback: Callback upon error IQ response - */ - _converse.connection.sendIQ($iq({ - 'to': this.get('jid'), - 'from': _converse.connection.jid, - 'type': "get" - }).c("query", { - 'xmlns': Strophe.NS.DISCO_INFO, - 'node': 'x-roomuser-item' - }), callback, errback); - - return this; - }, isUserMentioned: function isUserMentioned(message) { /* Returns a boolean to indicate whether the current user * was mentioned in a message. @@ -54401,17 +53599,17 @@ Strophe.addConnectionPlugin('disco', } if (u.isNewMessage(stanza) && this.newMessageWillBeHidden()) { - var settings = { + this.save({ 'num_unread_general': this.get('num_unread_general') + 1 - }; + }); if (this.isUserMentioned(body.textContent)) { - settings.num_unread = this.get('num_unread') + 1; + this.save({ + 'num_unread': this.get('num_unread') + 1 + }); _converse.incrementMsgCounter(); } - - this.save(settings); } }, clearUnreadMsgCounter: function clearUnreadMsgCounter() { @@ -54784,6 +53982,8 @@ __p += '">\n'; return __p };}); + + // Converse.js (A browser based XMPP chat client) // http://conversejs.org // @@ -54798,7 +53998,7 @@ return __p */ (function (root, factory) { define('converse-bookmarks',["converse-core", "converse-muc", "tpl!chatroom_bookmark_form", "tpl!chatroom_bookmark_toggle", "tpl!bookmark", "tpl!bookmarks_list"], factory); -})(this, function (converse, muc, tpl_chatroom_bookmark_form, tpl_chatroom_bookmark_toggle, tpl_bookmark, tpl_bookmarks_list) { +})(void 0, function (converse, muc, tpl_chatroom_bookmark_form, tpl_chatroom_bookmark_toggle, tpl_bookmark, tpl_bookmarks_list) { var _converse$env = converse.env, Backbone = _converse$env.Backbone, Promise = _converse$env.Promise, @@ -55169,7 +54369,7 @@ return __p 'jid': bookmark.getAttribute('jid'), 'name': bookmark.getAttribute('name'), 'autojoin': bookmark.getAttribute('autojoin') === 'true', - 'nick': _.get(bookmark.querySelector('nick'), 'textContent') + 'nick': bookmark.querySelector('nick').textContent }); }); }, @@ -55466,6 +54666,8 @@ __e(o.info_title) + return __p };}); + + // Converse.js (A browser based XMPP chat client) // http://conversejs.org // @@ -55480,7 +54682,7 @@ return __p */ (function (root, factory) { define('converse-roomslist',["utils", "converse-core", "converse-muc", "tpl!rooms_list", "tpl!rooms_list_item"], factory); -})(this, function (utils, converse, muc, tpl_rooms_list, tpl_rooms_list_item) { +})(void 0, function (utils, converse, muc, tpl_rooms_list, tpl_rooms_list_item) { var _converse$env = converse.env, Backbone = _converse$env.Backbone, Promise = _converse$env.Promise, @@ -55832,6 +55034,8 @@ Strophe.RSM.prototype = { }; })); + + // Converse.js (A browser based XMPP chat client) // http://conversejs.org // @@ -55843,7 +55047,7 @@ Strophe.RSM.prototype = { // XEP-0059 Result Set Management (function (root, factory) { define('converse-mam',["sizzle", "converse-core", "utils", "converse-disco", "strophe.rsm"], factory); -})(this, function (sizzle, converse, utils) { +})(void 0, function (sizzle, converse, utils) { "use strict"; var CHATROOMS_TYPE = 'chatroom'; @@ -56390,7 +55594,7 @@ return __p define('tpl!chatarea', ['lodash'], function(_) {return function(o) { var __t, __p = '', __e = _.escape, __j = Array.prototype.join; function print() { __p += __j.call(arguments, '') } -__p += '
    \n
    \n
    \n \n \n
  • \n'; } ; -__p += '\n'; - if (o.show_fileUpload_button) { ; -__p += '\n\n
  • \n \n
  • \n'; - } ; __p += '\n'; if (o.show_call_button) { ; __p += '\n
  • = 0) { + return item.affiliation !== old_list[idx].affiliation; + } + + return false; + })); + } + + if (remove_absentees) { + // Get the removed affiliations + delta = delta.concat(_.map(_.difference(old_jids, new_jids), function (jid) { + return { + 'jid': jid, + 'affiliation': 'none' + }; + })); + } + + return delta; + }, + sendAffiliationIQ: function sendAffiliationIQ(chatroom_jid, affiliation, member) { + /* Send an IQ stanza specifying an affiliation change. + * + * Paremeters: + * (String) chatroom_jid: JID of the relevant room + * (String) affiliation: affiliation (could also be stored + * on the member object). + * (Object) member: Map containing the member's jid and + * optionally a reason and affiliation. + */ + return new Promise(function (resolve, reject) { + var iq = $iq({ + to: chatroom_jid, + type: "set" + }).c("query", { + xmlns: Strophe.NS.MUC_ADMIN + }).c("item", { + 'affiliation': member.affiliation || affiliation, + 'jid': member.jid + }); + + if (!_.isUndefined(member.reason)) { + iq.c("reason", member.reason); + } + + _converse.connection.sendIQ(iq, resolve, reject); + }); + }, + setAffiliation: function setAffiliation(affiliation, members) { + /* Send IQ stanzas to the server to set an affiliation for + * the provided JIDs. + * + * See: http://xmpp.org/extensions/xep-0045.html#modifymember + * + * XXX: Prosody doesn't accept multiple JIDs' affiliations + * being set in one IQ stanza, so as a workaround we send + * a separate stanza for each JID. + * Related ticket: https://prosody.im/issues/issue/795 + * + * Parameters: + * (String) affiliation: The affiliation + * (Object) members: A map of jids, affiliations and + * optionally reasons. Only those entries with the + * same affiliation as being currently set will be + * considered. + * + * Returns: + * A promise which resolves and fails depending on the + * XMPP server response. + */ + members = _.filter(members, function (member) { + return (// We only want those members who have the right + // affiliation (or none, which implies the provided + // one). + _.isUndefined(member.affiliation) || member.affiliation === affiliation + ); + }); + + var promises = _.map(members, _.partial(this.sendAffiliationIQ, this.model.get('jid'), affiliation)); + + return Promise.all(promises); + }, + setAffiliations: function setAffiliations(members) { + /* Send IQ stanzas to the server to modify the + * affiliations in this room. + * + * See: http://xmpp.org/extensions/xep-0045.html#modifymember + * + * Parameters: + * (Object) members: A map of jids, affiliations and optionally reasons + * (Function) onSuccess: callback for a succesful response + * (Function) onError: callback for an error response + */ + var affiliations = _.uniq(_.map(members, 'affiliation')); + + _.each(affiliations, _.partial(this.setAffiliation.bind(this), _, members)); + }, + marshallAffiliationIQs: function marshallAffiliationIQs() { + /* Marshall a list of IQ stanzas into a map of JIDs and + * affiliations. + * + * Parameters: + * Any amount of XMLElement objects, representing the IQ + * stanzas. + */ + return _.flatMap(arguments[0], this.parseMemberListIQ); + }, + getJidsWithAffiliations: function getJidsWithAffiliations(affiliations) { + var _this4 = this; + + /* Returns a map of JIDs that have the affiliations + * as provided. + */ + if (_.isString(affiliations)) { + affiliations = [affiliations]; + } + + return new Promise(function (resolve, reject) { + var promises = _.map(affiliations, _.partial(_this4.requestMemberList, _this4.model.get('jid'))); + + Promise.all(promises).then(_.flow(_this4.marshallAffiliationIQs.bind(_this4), resolve), _.flow(_this4.marshallAffiliationIQs.bind(_this4), resolve)); + }); + }, + updateMemberLists: function updateMemberLists(members, affiliations, deltaFunc) { + var _this5 = this; + + /* Fetch the lists of users with the given affiliations. + * Then compute the delta between those users and + * the passed in members, and if it exists, send the delta + * to the XMPP server to update the member list. + * + * Parameters: + * (Object) members: Map of member jids and affiliations. + * (String|Array) affiliation: An array of affiliations or + * a string if only one affiliation. + * (Function) deltaFunc: The function to compute the delta + * between old and new member lists. + * + * Returns: + * A promise which is resolved once the list has been + * updated or once it's been established there's no need + * to update the list. + */ + this.getJidsWithAffiliations(affiliations).then(function (old_members) { + _this5.setAffiliations(deltaFunc(members, old_members)); + }); + }, + directInvite: function directInvite(recipient, reason) { + /* Send a direct invitation as per XEP-0249 + * + * Parameters: + * (String) recipient - JID of the person being invited + * (String) reason - Optional reason for the invitation + */ + if (this.model.get('membersonly')) { + // When inviting to a members-only room, we first add + // the person to the member list by giving them an + // affiliation of 'member' (if they're not affiliated + // already), otherwise they won't be able to join. + var map = {}; + map[recipient] = 'member'; + + var deltaFunc = _.partial(this.computeAffiliationsDelta, true, false); + + this.updateMemberLists([{ + 'jid': recipient, + 'affiliation': 'member', + 'reason': reason + }], ['member', 'owner', 'admin'], deltaFunc); + } + + var attrs = { + 'xmlns': 'jabber:x:conference', + 'jid': this.model.get('jid') + }; + + if (reason !== null) { + attrs.reason = reason; + } + + if (this.model.get('password')) { + attrs.password = this.model.get('password'); + } + + var invitation = $msg({ + from: _converse.connection.jid, + to: recipient, + id: _converse.connection.getUniqueId() + }).c('x', attrs); + + _converse.connection.send(invitation); + + _converse.emit('roomInviteSent', { + 'room': this, + 'recipient': recipient, + 'reason': reason + }); + }, handleChatStateMessage: function handleChatStateMessage(message) { /* Override the method on the ChatBoxView base class to * ignore notifications in groupchats. @@ -57496,7 +56973,7 @@ return __p * Parameters: * (String) text: The message text to be sent. */ - text = u.httpToGeoUri(emojione.shortnameToUnicode(text), _converse); + text = emojione.shortnameToUnicode(text); var msgid = _converse.connection.getUniqueId(); @@ -57519,20 +56996,6 @@ return __p msgid: msgid }); }, - sendChatRoomFile: function sendChatRoomFile(text) { - var msgid = _converse.connection.getUniqueId(); - - var stanza = $msg({ - 'from': _converse.connection.jid, - 'to': this.model.get('jid'), - 'type': 'groupchat', - 'id': msgid - }).c("body").t(text).up().c("x", { - 'xmlns': Strophe.NS.OUTOFBAND - }).c('url').t(text).up(); - - _converse.connection.send(stanza); - }, modifyRole: function modifyRole(room, nick, role, reason, onSuccess, onError) { var item = $build("item", { nick: nick, @@ -57581,19 +57044,13 @@ return __p onCommandError: function onCommandError() { this.showStatusNotification(__("Error: could not execute the command"), true); }, - onMessageSubmitted: function onMessageSubmitted(text, notNeeded) { - var file = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; - + onMessageSubmitted: function onMessageSubmitted(text) { /* Gets called when the user presses enter to send off a * message in a chat room. * * Parameters: * (String) text - The message text. */ - if (file !== null) { - return this.sendChatRoomFile(text); - } - if (_converse.muc_disable_moderator_commands) { return this.sendChatRoomMessage(text); } @@ -57608,7 +57065,7 @@ return __p break; } - this.model.setAffiliation('admin', [{ + this.setAffiliation('admin', [{ 'jid': args[0], 'reason': args[1] }]).then(null, this.onCommandError.bind(this)); @@ -57619,7 +57076,7 @@ return __p break; } - this.model.setAffiliation('outcast', [{ + this.setAffiliation('outcast', [{ 'jid': args[0], 'reason': args[1] }]).then(null, this.onCommandError.bind(this)); @@ -57662,7 +57119,7 @@ return __p break; } - this.model.setAffiliation('member', [{ + this.setAffiliation('member', [{ 'jid': args[0], 'reason': args[1] }]).then(null, this.onCommandError.bind(this)); @@ -57682,7 +57139,7 @@ return __p break; } - this.model.setAffiliation('owner', [{ + this.setAffiliation('owner', [{ 'jid': args[0], 'reason': args[1] }]).then(null, this.onCommandError.bind(this)); @@ -57701,7 +57158,7 @@ return __p break; } - this.model.setAffiliation('none', [{ + this.setAffiliation('none', [{ 'jid': args[0], 'reason': args[1] }]).then(null, this.onCommandError.bind(this)); @@ -57817,8 +57274,7 @@ return __p nick = nick ? nick : this.model.get('nick'); if (!nick) { - this.checkForReservedNick(); - return this; + return this.checkForReservedNick(); } if (this.model.get('connection_status') === converse.ROOMSTATUS.ENTERED) { @@ -57888,7 +57344,7 @@ return __p _converse.ChatBoxView.prototype.close.apply(this, arguments); }, renderConfigurationForm: function renderConfigurationForm(stanza) { - var _this4 = this; + var _this6 = this; /* Renders a form given an IQ stanza containing the current * room configuration. @@ -57933,16 +57389,48 @@ return __p last_fieldset_el.querySelector('input[type=button]').addEventListener('click', function (ev) { ev.preventDefault(); - _this4.closeForm(); + _this6.closeForm(); }); form_el.addEventListener('submit', function (ev) { ev.preventDefault(); - _this4.saveConfiguration(ev.target).then(_this4.getRoomFeatures.bind(_this4)); + _this6.saveConfiguration(ev.target).then(_this6.getRoomFeatures.bind(_this6)); }, false); }, + sendConfiguration: function sendConfiguration(config, onSuccess, onError) { + /* Send an IQ stanza with the room configuration. + * + * Parameters: + * (Array) config: The room configuration + * (Function) onSuccess: Callback upon succesful IQ response + * The first parameter passed in is IQ containing the + * room configuration. + * The second is the response IQ from the server. + * (Function) onError: Callback upon error IQ response + * The first parameter passed in is IQ containing the + * room configuration. + * The second is the response IQ from the server. + */ + var iq = $iq({ + to: this.model.get('jid'), + type: "set" + }).c("query", { + xmlns: Strophe.NS.MUC_OWNER + }).c("x", { + xmlns: Strophe.NS.XFORM, + type: "submit" + }); + + _.each(config || [], function (node) { + iq.cnode(node).up(); + }); + + onSuccess = _.isUndefined(onSuccess) ? _.noop : _.partial(onSuccess, iq.nodeTree); + onError = _.isUndefined(onError) ? _.noop : _.partial(onError, iq.nodeTree); + return _converse.connection.sendIQ(iq, onSuccess, onError); + }, saveConfiguration: function saveConfiguration(form) { - var _this5 = this; + var _this7 = this; /* Submit the room configuration form by sending an IQ * stanza to the server. @@ -57957,13 +57445,13 @@ return __p var inputs = form ? sizzle(':input:not([type=button]):not([type=submit])', form) : [], configArray = _.map(inputs, u.webForm2xForm); - _this5.model.sendConfiguration(configArray, resolve, reject); + _this7.sendConfiguration(configArray, resolve, reject); - _this5.closeForm(); + _this7.closeForm(); }); }, autoConfigureChatRoom: function autoConfigureChatRoom() { - var _this6 = this; + var _this8 = this; /* Automatically configure room based on the * 'roomconfig' data on this view's model. @@ -57977,7 +57465,7 @@ return __p */ var that = this; return new Promise(function (resolve, reject) { - _this6.fetchRoomConfiguration().then(function (stanza) { + _this8.fetchRoomConfiguration().then(function (stanza) { var configArray = [], fields = stanza.querySelectorAll('field'), config = that.model.get('roomconfig'); @@ -58009,7 +57497,7 @@ return __p configArray.push(field); if (! --count) { - that.model.sendConfiguration(configArray, resolve, reject); + that.sendConfiguration(configArray, resolve, reject); } }); }); @@ -58023,7 +57511,7 @@ return __p this.renderAfterTransition(); }, fetchRoomConfiguration: function fetchRoomConfiguration(handler) { - var _this7 = this, + var _this9 = this, _arguments = arguments; /* Send an IQ stanza to fetch the room configuration data. @@ -58035,13 +57523,13 @@ return __p */ return new Promise(function (resolve, reject) { _converse.connection.sendIQ($iq({ - 'to': _this7.model.get('jid'), + 'to': _this9.model.get('jid'), 'type': "get" }).c("query", { xmlns: Strophe.NS.MUC_OWNER }), function (iq) { if (handler) { - handler.apply(_this7, _arguments); + handler.apply(_this9, _arguments); } resolve(iq); @@ -58049,14 +57537,57 @@ return __p ); }); }, + parseRoomFeatures: function parseRoomFeatures(iq) { + /* See http://xmpp.org/extensions/xep-0045.html#disco-roominfo + * + * + * + * + * + * + * + * + * + * + */ + var features = { + 'features_fetched': true, + 'name': iq.querySelector('identity').getAttribute('name') + }; + + _.each(iq.querySelectorAll('feature'), function (field) { + var fieldname = field.getAttribute('var'); + + if (!fieldname.startsWith('muc_')) { + if (fieldname === Strophe.NS.MAM) { + features.mam_enabled = true; + } + + return; + } + + features[fieldname.replace('muc_', '')] = true; + }); + + var desc_field = iq.querySelector('field[var="muc#roominfo_description"] value'); + + if (!_.isNull(desc_field)) { + features.description = desc_field.textContent; + } + + this.model.save(features); + }, getRoomFeatures: function getRoomFeatures() { - var _this8 = this; + var _this10 = this; /* Fetch the room disco info, parse it and then * save it on the Backbone.Model of this chat rooms. */ return new Promise(function (resolve, reject) { - _converse.connection.disco.info(_this8.model.get('jid'), null, _.flow(_this8.model.parseRoomFeatures.bind(_this8.model), resolve), function () { + _converse.connection.disco.info(_this10.model.get('jid'), null, _.flow(_this10.parseRoomFeatures.bind(_this10), resolve), function () { reject(new Error("Could not parse the room features")); }, 5000); }); @@ -58100,10 +57631,20 @@ return __p checkForReservedNick: function checkForReservedNick() { /* User service-discovery to ask the XMPP server whether * this user has a reserved nickname for this room. - * If so, we'll use that, otherwise we render the nickname form. + * If so, we'll use that, otherwise we render the nickname + * form. */ this.showSpinner(); - this.model.checkForReservedNick(this.onNickNameFound.bind(this), this.onNickNameNotFound.bind(this)); + + _converse.connection.sendIQ($iq({ + 'to': this.model.get('jid'), + 'from': _converse.connection.jid, + 'type': "get" + }).c("query", { + 'xmlns': Strophe.NS.DISCO_INFO, + 'node': 'x-roomuser-item' + }), this.onNickNameFound.bind(this), this.onNickNameNotFound.bind(this)); + return this; }, onNickNameFound: function onNickNameFound(iq) { @@ -58264,6 +57805,33 @@ return __p return; }, + saveAffiliationAndRole: function saveAffiliationAndRole(pres) { + /* Parse the presence stanza for the current user's + * affiliation. + * + * Parameters: + * (XMLElement) pres: A stanza. + */ + var item = sizzle("x[xmlns=\"".concat(Strophe.NS.MUC_USER, "\"] item"), pres).pop(); + var is_self = pres.querySelector("status[code='110']"); + + if (is_self && !_.isNil(item)) { + var affiliation = item.getAttribute('affiliation'); + var role = item.getAttribute('role'); + + if (affiliation) { + this.model.save({ + 'affiliation': affiliation + }); + } + + if (role) { + this.model.save({ + 'role': role + }); + } + } + }, parseXUserElement: function parseXUserElement(x, stanza, is_self) { /* Parse the passed-in * element and construct a map containing relevant @@ -58317,7 +57885,7 @@ return __p return notification; }, displayNotificationsforUser: function displayNotificationsforUser(notification) { - var _this9 = this; + var _this11 = this; /* Given the notification object generated by * parseXUserElement, display any relevant messages and @@ -58339,7 +57907,7 @@ return __p } _.each(notification.messages, function (message) { - _this9.content.insertAdjacentHTML('beforeend', tpl_info({ + _this11.content.insertAdjacentHTML('beforeend', tpl_info({ 'data': '', 'isodate': moment().format(), 'extra_classes': 'chat-event', @@ -58565,7 +58133,7 @@ return __p * Parameters: * (XMLElement) pres: The stanza */ - this.model.saveAffiliationAndRole(pres); + this.saveAffiliationAndRole(pres); var locked_room = pres.querySelector("status[code='201']"); if (locked_room) { @@ -59038,7 +58606,7 @@ return __p var reason = prompt(__('You are about to invite %1$s to the chat room "%2$s". ' + 'You may optionally include a message, explaining the reason for the invitation.', suggestion.text.label, this.model.get('id'))); if (reason !== null) { - this.chatroomview.model.directInvite(suggestion.text.value, reason); + this.chatroomview.directInvite(suggestion.text.value, reason); } var form = suggestion.target.form, @@ -59164,6 +58732,8 @@ return __p }); }); //# sourceMappingURL=converse-muc-views.js.map; + + // Converse.js (A browser based XMPP chat client) // http://conversejs.org // @@ -59172,7 +58742,7 @@ return __p // (function (root, factory) { define('converse-muc-embedded',["converse-core", "converse-muc"], factory); -})(this, function (converse) { +})(void 0, function (converse) { "use strict"; var _converse$env = converse.env, @@ -66523,6 +66093,8 @@ CryptoJS.mode.CTR = (function () { } })); + + // Converse.js (A browser based XMPP chat client) // http://conversejs.org // @@ -66537,7 +66109,7 @@ CryptoJS.mode.CTR = (function () { */ (function (root, factory) { define('converse-otr',["converse-chatview", "bootstrap", "tpl!toolbar_otr", 'otr'], factory); -})(this, function (converse, bootstrap, tpl_toolbar_otr, otr) { +})(void 0, function (converse, bootstrap, tpl_toolbar_otr, otr) { "use strict"; var _converse$env = converse.env, @@ -67133,6 +66705,8 @@ __p += '\n'; return __p };}); + + // Converse.js (A browser based XMPP chat client) // http://conversejs.org // @@ -67147,7 +66721,7 @@ return __p */ (function (root, factory) { define('converse-register',["form-utils", "converse-core", "tpl!form_username", "tpl!register_link", "tpl!register_panel", "tpl!registration_form", "tpl!registration_request", "tpl!form_input", "tpl!spinner", "converse-controlbox"], factory); -})(this, function (utils, converse, tpl_form_username, tpl_register_link, tpl_register_panel, tpl_registration_form, tpl_registration_request, tpl_form_input, tpl_spinner) { +})(void 0, function (utils, converse, tpl_form_username, tpl_register_link, tpl_register_panel, tpl_registration_form, tpl_registration_request, tpl_form_input, tpl_spinner) { "use strict"; // Strophe methods for building stanzas var _converse$env = converse.env, @@ -67935,6 +67509,8 @@ return __p }); })); + + // Converse.js (A browser based XMPP chat client) // http://conversejs.org // @@ -67949,7 +67525,7 @@ return __p */ (function (root, factory) { define('converse-ping',["converse-core", "strophe.ping"], factory); -})(this, function (converse) { +})(void 0, function (converse) { "use strict"; // Strophe methods for building stanzas var _converse$env = converse.env, @@ -68057,6 +67633,8 @@ return __p }); }); //# sourceMappingURL=converse-ping.js.map; + + // Converse.js (A browser based XMPP chat client) // http://conversejs.org // @@ -68067,7 +67645,7 @@ return __p /*global define */ (function (root, factory) { define('converse-notification',["converse-core"], factory); -})(this, function (converse) { +})(void 0, function (converse) { "use strict"; var _converse$env = converse.env, @@ -68414,6 +67992,8 @@ __p += '\n