/*global app, client*/ "use strict"; var async = require('async'); var BaseCollection = require('./baseCollection'); var MUC = require('./muc'); module.exports = BaseCollection.extend({ type: 'mucs', model: MUC, comparator: function (model1, model2) { var name1 = model1.displayName.toLowerCase(); var name2 = model2.displayName.toLowerCase(); if (name1 === name2) { return 0; } if (name1 < name2) { return -1; } return 1; }, initialize: function (model, options) { this.bind('change', this.sort, this); }, loadBookmarks: function () { var self = this; app.whenConnected(function () { client.getBookmarks(function (err, res) { if (err) return; var mucs = res.privateStorage.bookmarks.conferences; mucs.forEach(function (muc) { self.add(muc); if (muc.autoJoin) { self.get(muc.jid).join(); } }); }); }); }, init: function () { var self = this; app.whenConnected(function () { function _fetch(init) { self.fetch(function() { self.update(); if (init) self.trigger('loaded'); setTimeout(_fetch, 30000); }); } _fetch(true); }); }, fetch: function(cb) { var self = this; while(app.mucInfos.length > 0) { app.mucInfos.pop(); } if (SERVER_CONFIG.muc) { if (client.sessionStarted) { var rooms = []; client.getDiscoItems(SERVER_CONFIG.muc, '', function (err, res) { if (err) return; rooms = res.discoItems.items; var roomNum = 0; if (rooms) { rooms.forEach (function (room) { client.getDiscoInfo(room.jid, '', function (err, res) { roomNum++; if (err) return; var features = res.discoInfo.features; var persistent = features.indexOf("muc_persistent") > -1; var mucInfo = { id: room.jid.full, name: room.name, jid: room.jid, nick: me.nick, autoJoin: persistent, persistent: persistent }; app.mucInfos.push(mucInfo); }).then(function() { if (cb && roomNum == rooms.length) cb(); }); }); } }).then(function() { if (cb && !rooms.length) cb(); }); } else { app.whenConnected(function () { self.fetch(cb); }); } return; } if (cb) cb(); }, update: function () { if (SERVER_CONFIG.muc) { var toRemove = []; for ( var i = 0; i < this.models.length; i++) { toRemove.push(this.models[i]); } for (var i = 0; i < app.mucInfos.length; i++) { var mucInfo = app.mucInfos[i]; var muc = this.get(mucInfo.jid); if (muc) { muc.name = mucInfo.name; muc.autoJoin = mucInfo.autoJoin; muc.persistent = mucInfo.persistent; var index = toRemove.indexOf(muc); if (index > -1) { toRemove.splice(index, 1); } } else { this.add(mucInfo); muc = this.get(mucInfo.jid); } if (muc.autoJoin && !muc.joined) { muc.join(); } } this.remove(toRemove); while(app.mucInfos.length > 0) { app.mucInfos.pop(); } } }, save: function (cb) { var self = this; app.whenConnected(function () { var models = []; self.models.forEach(function (model) { models.push({ name: model.name, jid: model.jid, nick: model.nick, autoJoin: model.autoJoin }); }); client.setBookmarks({conferences: models}, cb); }); } });