diff --git a/.gitignore b/.gitignore index efae82615..6e15fc122 100644 --- a/.gitignore +++ b/.gitignore @@ -34,7 +34,5 @@ npm-debug.log # Vagrant .vagrant/ -env.js -rambox_cfg.json languages.js electron/dev-app-update.yml diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a0b271063..f6161b8c2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -122,22 +122,6 @@ Once you have rambox cloned, before you start the application, you first need to npm install ``` -Then you need to add the private environment variables (API Keys): - -```bash -# Copy `env-sample.js` with a name of env.js -# Populate it with Auth0 clientid and domain e.g. test.auth0.com -# You can get these details from one of your "apps" here https://manage.auth0.com/#/clients/ - -# macOS / Linux -cp env-sample.js env.js - -# Windows -copy env-sample.js env.js -``` - -Then edit the `env.js` file and modify the API keys only for services that you will use. - ```bash # Compile the files... sencha app watch diff --git a/README.md b/README.md index b9b603255..c71503049 100644 --- a/README.md +++ b/README.md @@ -110,8 +110,6 @@ Fork and work! ```shell git clone https://github.com/saenzramiro/rambox.git cd rambox -cp env-sample.js env.js -# update env.js with your auth0 details. npm install sencha app watch npm start diff --git a/app.js b/app.js index c7a3f9cbe..4db0e030e 100644 --- a/app.js +++ b/app.js @@ -61,18 +61,18 @@ ipc.on('autoUpdater:update-downloaded', function(e, info) { '->' ,{ xtype: 'label' - ,html: 'New version ready to install ('+info.version+')! It will be installed the next time Rambox is relaunched.' + ,html: 'New version is ready to be installed ('+info.version+')! Click the following button to install it now.' } ,{ xtype: 'button' - ,text: 'Relaunch Now' + ,text: 'Install now' ,handler: function(btn) { ipc.send('autoUpdater:quit-and-install'); } } ,{ xtype: 'button' ,text: 'Changelog' ,ui: 'decline' - ,href: 'https://github.com/ramboxapp/community-edition/releases/tag/'+info.version + ,href: 'https://github.com/ramboxapp/download/releases/latest' } ,'->' ,{ diff --git a/app.json b/app.json index 62f9a8f89..a1edb1ea9 100644 --- a/app.json +++ b/app.json @@ -109,10 +109,6 @@ { "path": "resources/js/loadscreen.js" }, - { - "path": "env.js", - "remote": true - }, { "path": "app.js", "bundle": true @@ -291,10 +287,10 @@ */ "resources": [ "electron", - "env.js", "package.json", "package-lock.json", - "masterpassword.html" + "masterpassword.html", + "screenselector.html" ], /** diff --git a/app/Application.js b/app/Application.js index dbe779346..9195754a6 100644 --- a/app/Application.js +++ b/app/Application.js @@ -4,8 +4,7 @@ Ext.define('Rambox.Application', { ,name: 'Rambox' ,requires: [ - 'Rambox.ux.Auth0' - ,'Rambox.util.MD5' + 'Rambox.util.MD5' ,'Ext.window.Toast' ,'Ext.util.Cookies' ] @@ -134,47 +133,20 @@ Ext.define('Rambox.Application', { ] }); } - // Prevent track if the user have disabled this option (default: false) - if ( !ipc.sendSync('sendStatistics') ) { - ga_storage = { - _enableSSL: Ext.emptyFn - ,_disableSSL: Ext.emptyFn - ,_setAccount: Ext.emptyFn - ,_setDomain: Ext.emptyFn - ,_setLocale: Ext.emptyFn - ,_setCustomVar: Ext.emptyFn - ,_deleteCustomVar: Ext.emptyFn - ,_trackPageview: Ext.emptyFn - ,_trackEvent: Ext.emptyFn - } - } - - // Set Google Analytics events - ga_storage._setAccount('UA-80680424-1'); - ga_storage._trackPageview('/index.html', 'main'); - ga_storage._trackEvent('Versions', require('electron').remote.app.getVersion()); // Load language for Ext JS library - Ext.Loader.loadScript({url: Ext.util.Format.format("ext/packages/ext-locale/build/ext-locale-{0}.js", localStorage.getItem('locale-auth0') || 'en')}); - - // Initialize Auth0 - if ( auth0Cfg.clientID !== '' && auth0Cfg.domain !== '' ) Rambox.ux.Auth0.init(); - - // Set cookies to help Tooltip.io messages segmentation - Ext.util.Cookies.set('version', require('electron').remote.app.getVersion()); - if ( Ext.util.Cookies.get('auth0') === null ) Ext.util.Cookies.set('auth0', false); - - // Check for updates - if ( require('electron').remote.process.argv.indexOf('--without-update') === -1 ) Rambox.app.checkUpdate(true); - - // Get Google URLs - Ext.Ajax.request({ - url: 'https://raw.githubusercontent.com/ramboxapp/community-edition/gh-pages/api/google.json' - ,method: 'GET' - ,success: function(response) { - Rambox.app.config.googleURLs = Ext.decode(response.responseText); - } - }); + Ext.Loader.loadScript({url: Ext.util.Format.format("ext/packages/ext-locale/build/ext-locale-{0}.js", localStorage.getItem('locale-extjs') || 'en')}); + + // Set Google URLs + Rambox.app.config.googleURLs = [ + "accounts.google.com/ServiceLogin", + "accounts.google.com/signin", + "accounts.google.com/_/lookup/accountlookup", + "accounts.google.com/o/oauth2", + "accounts.google.com/_/signin", + "accounts.google.com/AddSession?", + "accounts.google.com/_/" + ]; // Shortcuts const platform = require('electron').remote.process.platform; @@ -275,60 +247,6 @@ Ext.define('Rambox.Application', { } ,checkUpdate: function(silence) { - console.info('Checking for updates...'); - Ext.Ajax.request({ - url: 'https://api.github.com/repos/ramboxapp/community-edition/releases/latest' - ,method: 'GET' - ,success: function(response) { - var json = Ext.decode(response.responseText); - var appVersion = new Ext.Version(require('electron').remote.app.getVersion()); - if ( appVersion.isLessThan(json.name) && !json.draft && !json.prerelease ) { - console.info('New version is available', json.version); - Ext.cq1('app-main').addDocked({ - xtype: 'toolbar' - ,dock: 'top' - ,ui: 'newversion' - ,items: [ - '->' - ,{ - xtype: 'label' - ,html: ''+locale['app.update[0]']+' ('+json.version+')' + ( process.platform === 'win32' ? ' is downloading in the background and you will be notified when it is ready to be installed.' : '' ) - } - ,{ - xtype: 'button' - ,text: locale['app.update[1]'] - ,href: process.platform === 'darwin' ? 'https://getrambox.herokuapp.com/download/'+process.platform+'_'+process.arch : 'https://github.com/ramboxapp/community-edition/releases/latest' - ,hidden: process.platform === 'win32' - } - ,{ - xtype: 'button' - ,text: locale['app.update[2]'] - ,ui: 'decline' - ,tooltip: 'Click here to see more information about the new version.' - ,href: 'https://github.com/ramboxapp/community-edition/releases/tag/'+json.version - } - ,'->' - ,{ - glyph: 'xf00d@FontAwesome' - ,baseCls: '' - ,style: 'cursor:pointer;' - ,handler: function(btn) { Ext.cq1('app-main').removeDocked(btn.up('toolbar'), true); } - } - ] - }); - ipc.send('autoUpdater:check-for-updates'); - return; - } else if ( !silence ) { - Ext.Msg.show({ - title: locale['app.update[3]'] - ,message: locale['app.update[4]'] - ,icon: Ext.Msg.INFO - ,buttons: Ext.Msg.OK - }); - } - - console.info('Your version is the latest. No need to update.'); - } - }); + ipc.send('autoUpdater:check-for-updates'); } }); diff --git a/app/store/ServicesList.js b/app/store/ServicesList.js index a2172525d..d3d150506 100644 --- a/app/store/ServicesList.js +++ b/app/store/ServicesList.js @@ -10,7 +10,7 @@ Ext.define('Rambox.store.ServicesList', { ,proxy: { type: 'ajax', - url: 'https://raw.githubusercontent.com/ramboxapp/community-edition/gh-pages/api/services.json', + url: 'resources/services.json', reader: { type: 'json', rootProperty: 'responseText' diff --git a/app/ux/Auth0.js b/app/ux/Auth0.js deleted file mode 100644 index 8f3b6afee..000000000 --- a/app/ux/Auth0.js +++ /dev/null @@ -1,298 +0,0 @@ -Ext.define('Rambox.ux.Auth0', { - singleton: true - - // private - ,lock: null - ,auth0: null - ,authService: null - ,backupCurrent: false - - ,init: function() { - var me = this; - - var Auth0 = require('auth0-js'); - var _AuthService = require('./resources/js/AuthService'); - - me.authService = new _AuthService.default({ - clientId: auth0Cfg.clientID, - authorizeEndpoint: 'https://'+auth0Cfg.domain+'/authorize', - audience: 'https://'+auth0Cfg.domain+'/userinfo', - scope: 'openid profile offline_access', - redirectUri: 'https://'+auth0Cfg.domain+'/mobile', - tokenEndpoint: 'https://'+auth0Cfg.domain+'/oauth/token' - }); - - me.auth0 = new Auth0.WebAuth({ clientID: auth0Cfg.clientID, domain : auth0Cfg.domain }); - - //me.defineEvents(); - } - - ,onLogin: function(token, authWindow) { - var me = this; - - authWindow.close(); - - me.auth0.client.userInfo(token.access_token, function(err, profile) { - if ( err ) { - if ( err.error === 401 || err.error === 'Unauthorized' ) return me.renewToken(me.checkConfiguration); - Ext.Msg.hide(); - return Ext.Msg.show({ - title: 'Error' - ,message: 'There was an error getting the profile: ' + err.error_description - ,icon: Ext.Msg.ERROR - ,buttons: Ext.Msg.OK - }); - } - - profile.user_metadata = profile['https://rambox.pro/user_metadata']; - delete profile['https://rambox.pro/user_metadata']; - - // Display a spinner while waiting - Ext.Msg.wait(locale['app.window[29]'], locale['app.window[28]']); - - // Google Analytics Event - ga_storage._trackEvent('Users', 'loggedIn'); - - // Set cookies to help Tooltip.io messages segmentation - Ext.util.Cookies.set('auth0', true); - - // User is logged in - // Save the profile and JWT. - localStorage.setItem('profile', JSON.stringify(profile)); - localStorage.setItem('access_token', token.access_token); - localStorage.setItem('id_token', token.id_token); - localStorage.setItem('refresh_token', token.refresh_token); - - if ( !Ext.isEmpty(profile.user_metadata) && !Ext.isEmpty(profile.user_metadata.services) && !me.backupCurrent ) { - Ext.each(profile.user_metadata.services, function(s) { - var service = Ext.create('Rambox.model.Service', s); - service.save(); - Ext.getStore('Services').add(service); - }); - - require('electron').remote.app.relaunch(); - require('electron').remote.app.exit(); - } - - Ext.Msg.hide(); - Ext.cq1('app-main').getViewModel().set('username', profile.name); - Ext.cq1('app-main').getViewModel().set('avatar', profile.picture); - }); - } - - ,backupConfiguration: function(callback) { - var me = this; - - Ext.Msg.wait('Saving backup...', 'Please wait...'); - - // Getting all services - var lastupdate = (new Date()).toJSON(); - var services = []; - Ext.getStore('Services').each(function(service) { - var s = Ext.clone(service); - delete s.data.id; - delete s.data.zoomLevel; - services.push(s.data); - }); - - Ext.Ajax.request({ - url: 'https://rambox.auth0.com/api/v2/users/'+Ext.decode(localStorage.getItem('profile')).sub - ,method: 'PATCH' - ,headers: { authorization: "Bearer " + localStorage.getItem('id_token') } - ,jsonData: { user_metadata: { services: services, services_lastupdate: lastupdate } } - ,success: function(response) { - Ext.Msg.hide(); - // Save the last update in localStorage - var profile = Ext.decode(localStorage.getItem('profile')); - if ( !profile.user_metadata ) profile.user_metadata = {}; - profile.user_metadata.services_lastupdate = lastupdate; - localStorage.setItem('profile', Ext.encode(profile)); - Ext.cq1('app-main').getViewModel().set('last_sync', new Date(lastupdate).toUTCString()); - - Ext.toast({ - html: ' Your configuration were successfully backed up.' - ,title: 'Synchronize Configuration' - ,width: 300 - ,align: 't' - ,closable: false - }); - - if ( Ext.isFunction(callback) ) callback.bind(me)(); - } - ,failure: function(response) { - if ( response.status === 401 ) return me.renewToken(me.backupConfiguration); - - Ext.Msg.hide(); - Ext.toast({ - html: ' Error occurred when trying to backup your configuration.' - ,title: 'Synchronize Configuration' - ,width: 300 - ,align: 't' - ,closable: false - }); - - if ( Ext.isFunction(callback) ) callback.bind(me)(); - - console.error(response); - } - }); - } - - ,restoreConfiguration: function() { - var me = this; - - me.auth0.client.userInfo(localStorage.getItem('access_token'), function(err, profile) { - if ( err ) { - if ( err.code === 401 ) return me.renewToken(me.restoreConfiguration); - return Ext.Msg.show({ - title: 'Error' - ,message: 'There was an error getting the profile: ' + err.description - ,icon: Ext.Msg.ERROR - ,buttons: Ext.Msg.OK - }); - } - - profile.user_metadata = profile['https://rambox.pro/user_metadata']; - delete profile['https://rambox.pro/user_metadata']; - - // First we remove all current services - Ext.cq1('app-main').getController().removeAllServices(false, function() { - if ( !profile.user_metadata || !profile.user_metadata.services ) return; - Ext.each(profile.user_metadata.services, function(s) { - var service = Ext.create('Rambox.model.Service', s); - service.save(); - Ext.getStore('Services').add(service); - }); - - require('electron').remote.getCurrentWindow().reload(); - }); - }); - } - - ,checkConfiguration: function() { - var me = this; - - me.auth0.client.userInfo(localStorage.getItem('access_token'), function(err, profile) { - if ( err ) { - if ( err.code === 401 ) return me.renewToken(me.checkConfiguration); - return Ext.Msg.show({ - title: 'Error' - ,message: 'There was an error getting the profile: ' + err.description - ,icon: Ext.Msg.ERROR - ,buttons: Ext.Msg.OK - }); - } - - profile.user_metadata = profile['https://rambox.pro/user_metadata']; - delete profile['https://rambox.pro/user_metadata']; - - if ( !profile.user_metadata ) { - Ext.toast({ - html: 'You don\'t have any backup yet.' - ,title: 'Synchronize Configuration' - ,width: 300 - ,align: 't' - ,closable: false - }); - return; - } - - if ( Math.floor(new Date(profile.user_metadata.services_lastupdate) / 1000) > Math.floor(new Date(Ext.decode(localStorage.getItem('profile')).user_metadata.services_lastupdate) / 1000) ) { - Ext.toast({ - html: 'Your settings are out of date.' - ,title: 'Synchronize Configuration' - ,width: 300 - ,align: 't' - ,closable: false - }); - } else { - Ext.toast({ - html: ' Latest backup is already applied.' - ,title: 'Synchronize Configuration' - ,width: 300 - ,align: 't' - ,closable: false - }); - } - }); - } - - ,renewToken: function(callback) { - var me = this; - - Ext.Ajax.request({ - url: 'https://rambox.auth0.com/oauth/token' - ,method: 'POST' - ,jsonData: { - grant_type: 'refresh_token' - ,client_id: auth0Cfg.clientID - ,client_secret: auth0Cfg.clientSecret - ,refresh_token: localStorage.getItem('refresh_token') - ,api_type: 'app' - } - ,success: function(response) { - var json = Ext.decode(response.responseText); - localStorage.setItem('access_token', json.access_token); - localStorage.setItem('id_token', json.id_token); - - if ( Ext.isFunction(callback) ) callback.bind(me)(); - } - ,failure: function(response) { - console.error(response); - } - }); - } - - ,login: function() { - var me = this; - - var electron = require('electron').remote; - var authWindow = new electron.BrowserWindow({ - title: 'Rambox - Login' - ,width: 400 - ,height: 600 - ,maximizable: false - ,minimizable: false - ,resizable: true - ,closable: true - ,center: true - ,autoHideMenuBar: true - ,skipTaskbar: true - ,fullscreenable: false - ,parent: require('electron').remote.getCurrentWindow() - ,webPreferences: { - partition: 'persist:rambox' - } - }); - - authWindow.on('closed', function() { - authWindow = null; - }); - - authWindow.loadURL(me.authService.requestAuthCode()); - - authWindow.webContents.on('did-start-loading', function(e) { - authWindow.webContents.session.webRequest.onBeforeSendHeaders((details, callback) => { - Rambox.app.config.googleURLs.forEach((loginURL) => { - if ( details.url.indexOf(loginURL) > -1 ) details.requestHeaders['User-Agent'] = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0' }) - callback({ cancel: false, requestHeaders: details.requestHeaders }); - }); - }); - - authWindow.webContents.on('did-navigate', function(e, url) { - me.authService.requestAccessCode(url, me.onLogin.bind(me), authWindow); - }); - } - - ,logout: function() { - var me = this; - - localStorage.removeItem('profile'); - localStorage.removeItem('id_token'); - localStorage.removeItem('refresh_token'); - localStorage.removeItem('access_token'); - - // Set cookies to help Tooltip.io messages segmentation - Ext.util.Cookies.set('auth0', false); - } -}); diff --git a/app/ux/WebView.js b/app/ux/WebView.js index db92fbe91..5ac2b4a9f 100644 --- a/app/ux/WebView.js +++ b/app/ux/WebView.js @@ -39,7 +39,7 @@ Ext.define('Rambox.ux.WebView',{ Ext.apply(me, { items: me.webViewConstructor() ,title: prefConfig.hide_tabbar_labels ? '' : (me.record.get('tabname') ? me.record.get('name') : '') - ,icon: me.record.get('type') === 'custom' ? (me.record.get('logo') === '' ? 'resources/icons/custom.png' : me.record.get('logo')) : 'https://firebasestorage.googleapis.com/v0/b/rambox-d1326.appspot.com/o/services%2F'+me.record.get('logo')+'?alt=media' + ,icon: me.record.get('type') === 'custom' ? (me.record.get('logo') === '' ? 'resources/icons/custom.png' : me.record.get('logo')) : 'resources/icons/'+me.record.get('logo') ,src: me.record.get('url') ,type: me.record.get('type') ,align: me.record.get('align') @@ -274,24 +274,23 @@ Ext.define('Rambox.ux.WebView',{ var webview = me.getWebView(); me.errorCodeLog = [] - // Google Analytics Event - ga_storage._trackEvent('Services', 'load', me.type, 1, true); - // Notifications in Webview me.setNotifications(localStorage.getItem('locked') || JSON.parse(localStorage.getItem('dontDisturb')) ? false : me.record.get('notifications')); + require('electron').remote.session.fromPartition('persist:' + me.record.get('type') + '_' + me.id.replace('tab_', '') + (localStorage.getItem('id_token') ? '_' + Ext.decode(localStorage.getItem('profile')).sub : '')).webRequest.onBeforeSendHeaders((details, callback) => { + const change = details.url.match(/^https:\/\/accounts\.google\.com(\/|$)/); + if ( change ) details.requestHeaders['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0'; + callback({ cancel: false, requestHeaders: details.requestHeaders }); + }); + // Show and hide spinner when is loading webview.addEventListener("did-start-loading", function() { console.info('Start loading...', me.src); - require('electron').remote.webContents.fromId(webview.getWebContentsId()).session.webRequest.onBeforeSendHeaders((details, callback) => { - Rambox.app.config.googleURLs.forEach((loginURL) => { if ( details.url.indexOf(loginURL) > -1 ) details.requestHeaders['User-Agent'] = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0'}); - callback({ cancel: false, requestHeaders: details.requestHeaders }); - }); - if ( !me.down('statusbar').closed || !me.down('statusbar').keep ) me.down('statusbar').show(); me.down('statusbar').showBusy(); }); + webview.addEventListener("did-stop-loading", function() { me.down('statusbar').clearStatus({useDefaults: true}); if ( !me.down('statusbar').keep ) me.down('statusbar').hide(); @@ -377,11 +376,13 @@ Ext.define('Rambox.ux.WebView',{ // Open links in default browser webview.addEventListener('new-window', function(e) { e.preventDefault(); - const protocol = require('url').parse(e.url).protocol; + const { URL } = require('url'); + const url = new URL(e.url); + const protocol = url.protocol; // Block some Deep links to prevent that open its app (Ex: Slack) if ( ['slack:'].includes(protocol) ) return; // Allow Deep links - if ( !['http:', 'https:', 'about:'].includes(protocol) ) return require('electron').shell.openExternal(e.url); + if ( !['http:', 'https:', 'about:'].includes(protocol) ) return require('electron').shell.openExternal(url.href); }); webview.addEventListener('will-navigate', function(e, url) { diff --git a/app/view/add/Add.js b/app/view/add/Add.js index 3f1112dd7..9ddb15999 100644 --- a/app/view/add/Add.js +++ b/app/view/add/Add.js @@ -28,7 +28,7 @@ Ext.define('Rambox.view.add.Add',{ var me = this; me.title = (!me.edit ? locale['app.window[0]'] : locale['app.window[1]']) + ' ' + me.record.get('name'); - me.icon = me.record.get('type') === 'custom' ? (!me.edit ? 'resources/icons/custom.png' : (me.record.get('logo') === '' ? 'resources/icons/custom.png' : me.record.get('logo'))) : 'https://firebasestorage.googleapis.com/v0/b/rambox-d1326.appspot.com/o/services%2F'+me.record.get('logo')+'?alt=media'; + me.icon = me.record.get('type') === 'custom' ? (!me.edit ? 'resources/icons/custom.png' : (me.record.get('logo') === '' ? 'resources/icons/custom.png' : me.record.get('logo'))) : 'resources/icons/'+me.record.get('logo'); me.items = [ { xtype: 'form' diff --git a/app/view/main/Main.js b/app/view/main/Main.js index 209bc1e92..852ca7d5f 100644 --- a/app/view/main/Main.js +++ b/app/view/main/Main.js @@ -28,13 +28,6 @@ Ext.define('Rambox.view.main.Main', { ,tabBar: { id: 'mainTabBar' ,cls: JSON.parse(localStorage.getItem('dontDisturb')) ? 'dontdisturb' : '' - ,items: [{ - xtype: 'button' - ,html: '' - ,baseCls: '' - ,tooltip: locale['app.main[25]'] - ,href: 'https://rambox.app/donate.html' - }] } ,items: [ { @@ -110,7 +103,7 @@ Ext.define('Rambox.view.main.Main', { ,tpl: [ '' ,'
' - ,'' + ,'' ,'{name}' ,'
' ,'
' @@ -158,7 +151,7 @@ Ext.define('Rambox.view.main.Main', { xtype: 'templatecolumn' ,width: 52 ,variableRowHeight: true - ,tpl: '' + ,tpl: '' } ,{ dataIndex: 'name' @@ -256,79 +249,8 @@ Ext.define('Rambox.view.main.Main', { ,tooltip: locale['app.main[20]']+'
'+locale['app.main[18]']+(require('electron').remote.process.platform === 'darwin' ? ': Cmd + Alt + L' : ': Alt + Shift + L') ,handler: 'lockRambox' ,id: 'lockRamboxBtn' - },'-' - ,{ - html: ' Try Rambox Pro' - ,href: 'https://rambox.pro/api/download' - ,baseCls: '' } ,'->' - ,{ - xtype: 'image' - ,id: 'avatar' - ,bind: { - src: '{avatar}' - ,hidden: '{!avatar}' - } - ,width: 30 - ,height: 30 - ,style: 'border-radius: 50%;border:2px solid #d8d8d8;' - } - ,{ - id: 'usernameBtn' - ,bind: { - text: '{username}' - ,hidden: '{!username}' - } - ,menu: [ - { - text: 'Synchronize Configuration' - ,glyph: 'xf0c2@FontAwesome' - ,menu: [ - { - xtype: 'label' - ,bind: { - html: 'Last Sync: {last_sync}' - } - } - ,{ - text: 'Backup' - ,glyph: 'xf0ee@FontAwesome' - ,scope: Rambox.ux.Auth0 - ,handler: Rambox.ux.Auth0.backupConfiguration - } - ,{ - text: 'Restore' - ,glyph: 'xf0ed@FontAwesome' - ,scope: Rambox.ux.Auth0 - ,handler: Rambox.ux.Auth0.restoreConfiguration - } - ,{ - text: 'Check for updated backup' - ,glyph: 'xf021@FontAwesome' - ,scope: Rambox.ux.Auth0 - ,handler: Rambox.ux.Auth0.checkConfiguration - } - ] - } - ,'-' - ,{ - text: locale['app.main[21]'] - ,glyph: 'xf08b@FontAwesome' - ,handler: 'logout' - } - ] - } - ,{ - text: locale['app.main[22]'] - ,icon: 'resources/auth0.png' - ,id: 'loginBtn' - ,tooltip: locale['app.main[23]']+'

'+locale['app.main[24]']+' Auth0 (https://auth0.com)' - ,bind: { - hidden: '{username}' - } - ,handler: 'login' - } ,{ tooltip: locale['preferences[0]'] ,glyph: 'xf013@FontAwesome' @@ -336,56 +258,23 @@ Ext.define('Rambox.view.main.Main', { } ] } - ,bbar: [ - { - xtype: 'segmentedbutton' - ,allowToggle: false - ,items: [ - { - text: 'Help us with' - ,pressed: true - } - ,{ - text: locale['app.main[25]'] - ,glyph: 'xf21e@FontAwesome' - ,href: 'https://rambox.app/donate.html' - } - ,{ - text: 'Translation' - ,glyph: 'xf0ac@FontAwesome' - ,href: 'https://crowdin.com/project/rambox/invite' - } - ] - } - ,'->' - ,{ - xtype: 'label' - ,html: ' '+locale['app.main[26]']+' '+locale['app.main[27]'].replace('Argentina', 'Argentina') - } - ,'->' - ,{ - xtype: 'segmentedbutton' - ,allowToggle: false - ,items: [ - { - text: 'Follow us' - ,pressed: true - } - ,{ - glyph: 'xf082@FontAwesome' - ,href: 'https://www.facebook.com/ramboxapp' - } - ,{ - glyph: 'xf099@FontAwesome' - ,href: 'https://www.twitter.com/ramboxapp' - } - ,{ - glyph: 'xf09b@FontAwesome' - ,href: 'https://github.com/ramboxapp/community-edition' + ,bbar: { + xtype: 'toolbar' + ,cls: 'deprecation' + ,items: [ + ' This version of Rambox is no longer supported. We highly recommend that you update to the new version of Rambox which has a free plan with all the features you already use and much more!' + ,'->' + ,{ + xtype: 'button' + ,text: 'Migrate now' + ,handler: function(btn) { + btn.setText('Downloading...'); + btn.setDisabled(true); + Rambox.app.checkUpdate(); } - ] - } - ] + } + ] + } } ,{ id: 'tbfill', tabConfig : { xtype : 'tbfill' } } ] diff --git a/app/view/main/MainController.js b/app/view/main/MainController.js index c7a411067..7c369a54e 100644 --- a/app/view/main/MainController.js +++ b/app/view/main/MainController.js @@ -23,9 +23,6 @@ Ext.define('Rambox.view.main.MainController', { ,onTabChange: function( tabPanel, newTab, oldTab ) { var me = this; - // Set Google Analytics event - ga_storage._trackPageview('/index.html', 'main'); - localStorage.setItem('last_active_service', newTab.id); if ( newTab.id === 'ramboxTab' ) { @@ -300,9 +297,6 @@ Ext.define('Rambox.view.main.MainController', { ,dontDisturb: function(btn, e, called) { console.info('Dont Disturb:', btn.pressed ? 'Enabled' : 'Disabled'); - // Google Analytics Event - if ( !called ) ga_storage._trackEvent('Usability', 'dontDisturb', ( btn.pressed ? 'on' : 'off' )); - Ext.Array.each(Ext.getStore('Services').collect('id'), function(serviceId) { // Get Tab var tab = Ext.getCmp('tab_'+serviceId); @@ -397,9 +391,6 @@ Ext.define('Rambox.view.main.MainController', { // Save encrypted password in localStorage to show locked when app is reopen localStorage.setItem('locked', text); - // Google Analytics Event - ga_storage._trackEvent('Usability', 'locked'); - me.lookupReference('disturbBtn').setPressed(true); me.dontDisturb(me.lookupReference('disturbBtn'), false, true); @@ -487,53 +478,6 @@ Ext.define('Rambox.view.main.MainController', { } ,openPreferences: function( btn ) { - var me = this; - Ext.create('Rambox.view.preferences.Preferences').show(); } - - ,login: function(btn) { - var me = this; - - Rambox.ux.Auth0.login(); - } - - ,logout: function(btn) { - var me = this; - - var logoutFn = function(callback) { - Ext.Msg.wait(locale['app.window[37]'], locale['app.main[21]']); - - // Google Analytics Event - ga_storage._trackEvent('Users', 'loggedOut'); - - // Logout from Auth0 - Rambox.ux.Auth0.logout(); - - Ext.cq1('app-main').getViewModel().set('username', ''); - Ext.cq1('app-main').getViewModel().set('avatar', ''); - - if ( Ext.isFunction(callback) ) { - callback(false, function() { - Ext.Msg.hide(); - }); - } else { - Ext.Msg.hide(); - } - } - - if ( btn ) { - Ext.Msg.confirm(locale['app.main[21]'], locale['app.window[38]'], function(btnId) { - if ( btnId === 'yes' ) { - logoutFn(me.removeAllServices.bind(me)); - } - }); - } else { - logoutFn(); - } - } - - ,showDonate: function( btn ) { - Signalayer.API.show('tChaoq3PwSG9wswhn'); - } }); diff --git a/app/view/preferences/Preferences.js b/app/view/preferences/Preferences.js index 38c08e96d..82f2caebc 100644 --- a/app/view/preferences/Preferences.js +++ b/app/view/preferences/Preferences.js @@ -74,50 +74,50 @@ Ext.define('Rambox.view.preferences.Preferences',{ ,store: Ext.create('Ext.data.Store', { fields: ['value', 'label'] ,data: [ - { 'value': 'af', 'auth0': 'af', 'label': 'Afrikaans' } - ,{ 'value': 'ar', 'auth0': 'en', 'label': 'Arabic' } - ,{ 'value': 'bs2', 'auth0': 'en', 'label': 'Barndutsch, Switzerland' } - ,{ 'value': 'bn', 'auth0': 'en', 'label': 'Bengali' } - ,{ 'value': 'bg', 'auth0': 'en', 'label': 'Bulgarian' } - ,{ 'value': 'ca', 'auth0': 'ca', 'label': 'Catalan' } - ,{ 'value': 'ceb', 'auth0': 'en', 'label': 'Cebuano' } - ,{ 'value': 'zh-CN', 'auth0': 'zh', 'label': 'Chinese Simplified' } - ,{ 'value': 'zh-TW', 'auth0': 'zh-tw', 'label': 'Chinese Traditional' } - ,{ 'value': 'hr', 'auth0': 'en', 'label': 'Croatian' } - ,{ 'value': 'cs', 'auth0': 'cs', 'label': 'Czech' } - ,{ 'value': 'da', 'auth0': 'da', 'label': 'Danish' } - ,{ 'value': 'nl', 'auth0': 'nl', 'label': 'Dutch' } - ,{ 'value': 'en', 'auth0': 'en', 'label': 'English' } - ,{ 'value': 'fi', 'auth0': 'fi', 'label': 'Finnish' } - ,{ 'value': 'fil', 'auth0': 'en', 'label': 'Filipino' } - ,{ 'value': 'fr', 'auth0': 'fr', 'label': 'French' } - ,{ 'value': 'de', 'auth0': 'de', 'label': 'German' } - ,{ 'value': 'de-CH', 'auth0': 'de', 'label': 'German, Switzerland' } - ,{ 'value': 'el', 'auth0': 'el', 'label': 'Greek' } - ,{ 'value': 'he', 'auth0': 'en', 'label': 'Hebrew' } - ,{ 'value': 'hi', 'auth0': 'en', 'label': 'Hindi' } - ,{ 'value': 'hu', 'auth0': 'hu', 'label': 'Hungarian' } - ,{ 'value': 'id', 'auth0': 'en', 'label': 'Indonesian' } - ,{ 'value': 'it', 'auth0': 'it', 'label': 'Italian' } - ,{ 'value': 'ja', 'auth0': 'ja', 'label': 'Japanese' } - ,{ 'value': 'ko', 'auth0': 'ko', 'label': 'Korean' } - ,{ 'value': 'no', 'auth0': 'no', 'label': 'Norwegian' } - ,{ 'value': 'fa', 'auth0': 'fa', 'label': 'Persian' } - ,{ 'value': 'pl', 'auth0': 'pl', 'label': 'Polish' } - ,{ 'value': 'pt-PT', 'auth0': 'pt-br', 'label': 'Portuguese' } - ,{ 'value': 'pt-BR', 'auth0': 'pt-br', 'label': 'Portuguese (Brazilian)' } - ,{ 'value': 'ro', 'auth0': 'ro', 'label': 'Romanian' } - ,{ 'value': 'ru', 'auth0': 'ru', 'label': 'Russian' } - ,{ 'value': 'sr', 'auth0': 'en', 'label': 'Serbian (Cyrillic)' } - ,{ 'value': 'sk', 'auth0': 'sk', 'label': 'Slovak' } - ,{ 'value': 'es-ES', 'auth0': 'es', 'label': 'Spanish' } - ,{ 'value': 'sv-SE', 'auth0': 'sv', 'label': 'Swedish' } - ,{ 'value': 'tl', 'auth0': 'en', 'label': 'Tagalog' } - ,{ 'value': 'th', 'auth0': 'en', 'label': 'Thai' } - ,{ 'value': 'tr', 'auth0': 'tr', 'label': 'Turkish' } - ,{ 'value': 'uk', 'auth0': 'en', 'label': 'Ukrainian' } - ,{ 'value': 'ur-PK', 'auth0': 'en', 'label': 'Urdu (Pakistan)' } - ,{ 'value': 'vi', 'auth0': 'en', 'label': 'Vietnamese' } + { 'value': 'af', 'extjs': 'af', 'label': 'Afrikaans' } + ,{ 'value': 'ar', 'extjs': 'en', 'label': 'Arabic' } + ,{ 'value': 'bs2', 'extjs': 'en', 'label': 'Barndutsch, Switzerland' } + ,{ 'value': 'bn', 'extjs': 'en', 'label': 'Bengali' } + ,{ 'value': 'bg', 'extjs': 'en', 'label': 'Bulgarian' } + ,{ 'value': 'ca', 'extjs': 'ca', 'label': 'Catalan' } + ,{ 'value': 'ceb', 'extjs': 'en', 'label': 'Cebuano' } + ,{ 'value': 'zh-CN', 'extjs': 'zh', 'label': 'Chinese Simplified' } + ,{ 'value': 'zh-TW', 'extjs': 'zh-tw', 'label': 'Chinese Traditional' } + ,{ 'value': 'hr', 'extjs': 'en', 'label': 'Croatian' } + ,{ 'value': 'cs', 'extjs': 'cs', 'label': 'Czech' } + ,{ 'value': 'da', 'extjs': 'da', 'label': 'Danish' } + ,{ 'value': 'nl', 'extjs': 'nl', 'label': 'Dutch' } + ,{ 'value': 'en', 'extjs': 'en', 'label': 'English' } + ,{ 'value': 'fi', 'extjs': 'fi', 'label': 'Finnish' } + ,{ 'value': 'fil', 'extjs': 'en', 'label': 'Filipino' } + ,{ 'value': 'fr', 'extjs': 'fr', 'label': 'French' } + ,{ 'value': 'de', 'extjs': 'de', 'label': 'German' } + ,{ 'value': 'de-CH', 'extjs': 'de', 'label': 'German, Switzerland' } + ,{ 'value': 'el', 'extjs': 'el', 'label': 'Greek' } + ,{ 'value': 'he', 'extjs': 'en', 'label': 'Hebrew' } + ,{ 'value': 'hi', 'extjs': 'en', 'label': 'Hindi' } + ,{ 'value': 'hu', 'extjs': 'hu', 'label': 'Hungarian' } + ,{ 'value': 'id', 'extjs': 'en', 'label': 'Indonesian' } + ,{ 'value': 'it', 'extjs': 'it', 'label': 'Italian' } + ,{ 'value': 'ja', 'extjs': 'ja', 'label': 'Japanese' } + ,{ 'value': 'ko', 'extjs': 'ko', 'label': 'Korean' } + ,{ 'value': 'no', 'extjs': 'no', 'label': 'Norwegian' } + ,{ 'value': 'fa', 'extjs': 'fa', 'label': 'Persian' } + ,{ 'value': 'pl', 'extjs': 'pl', 'label': 'Polish' } + ,{ 'value': 'pt-PT', 'extjs': 'pt-br', 'label': 'Portuguese' } + ,{ 'value': 'pt-BR', 'extjs': 'pt-br', 'label': 'Portuguese (Brazilian)' } + ,{ 'value': 'ro', 'extjs': 'ro', 'label': 'Romanian' } + ,{ 'value': 'ru', 'extjs': 'ru', 'label': 'Russian' } + ,{ 'value': 'sr', 'extjs': 'en', 'label': 'Serbian (Cyrillic)' } + ,{ 'value': 'sk', 'extjs': 'sk', 'label': 'Slovak' } + ,{ 'value': 'es-ES', 'extjs': 'es', 'label': 'Spanish' } + ,{ 'value': 'sv-SE', 'extjs': 'sv', 'label': 'Swedish' } + ,{ 'value': 'tl', 'extjs': 'en', 'label': 'Tagalog' } + ,{ 'value': 'th', 'extjs': 'en', 'label': 'Thai' } + ,{ 'value': 'tr', 'extjs': 'tr', 'label': 'Turkish' } + ,{ 'value': 'uk', 'extjs': 'en', 'label': 'Ukrainian' } + ,{ 'value': 'ur-PK', 'extjs': 'en', 'label': 'Urdu (Pakistan)' } + ,{ 'value': 'vi', 'extjs': 'en', 'label': 'Vietnamese' } ] }) } @@ -361,12 +361,6 @@ Ext.define('Rambox.view.preferences.Preferences',{ } ] } - ,{ - xtype: 'checkbox' - ,name: 'sendStatistics' - ,boxLabel: locale['preferences[27]'] - ,value: config.sendStatistics - } ] } ]; diff --git a/app/view/preferences/PreferencesController.js b/app/view/preferences/PreferencesController.js index 2cbe3853a..9f2749410 100644 --- a/app/view/preferences/PreferencesController.js +++ b/app/view/preferences/PreferencesController.js @@ -55,7 +55,7 @@ Ext.define('Rambox.view.preferences.PreferencesController', { // Locale if ( values.locale !== ipc.sendSync('getConfig').locale ) { localStorage.setItem('locale', values.locale); - localStorage.setItem('locale-auth0', me.getView().down('form').down('combo[name="locale"]').getSelection().get('auth0')); + localStorage.setItem('locale-extjs', me.getView().down('form').down('combo[name="locale"]').getSelection().get('extjs')); Ext.Msg.confirm('Action required', 'To change the language of Rambox, you need to reload the app. Do you want to do it now?', function(btnId) { if ( btnId === 'yes' ) ipc.send('relaunchApp'); }); diff --git a/electron/main.js b/electron/main.js index fb68150f2..2b73c41d3 100644 --- a/electron/main.js +++ b/electron/main.js @@ -143,7 +143,7 @@ function createWindow () { tray.create(mainWindow, config); - if ( process.argv.indexOf('--without-update') === -1 ) updater.initialize(mainWindow); + updater.initialize(mainWindow); // Open links in default browser mainWindow.webContents.on('new-window', function(e, url, frameName, disposition, options) { @@ -579,6 +579,7 @@ ipcMain.on('toggleWin', function(event, allwaysShow) { // ScreenShare ipcMain.on('screenShare:show', (event, screenList) => { let tmpWindow = new BrowserWindow({ + title: 'Rambox - Select screen', width: 600, height: 500, icon: __dirname + '/../resources/Icon.ico', @@ -589,6 +590,7 @@ ipcMain.on('screenShare:show', (event, screenList) => { hasShadow: true, webPreferences: { nodeIntegration: true, + contextIsolation: false, }, }); diff --git a/electron/menu.js b/electron/menu.js index ee1b8596a..c90947438 100644 --- a/electron/menu.js +++ b/electron/menu.js @@ -23,7 +23,7 @@ module.exports = function(config) { { label: `&`+locale['menu.help[0]'], click() { - shell.openExternal('https://rambox.pro'); + shell.openExternal('https://rambox.app'); } }, { @@ -47,23 +47,6 @@ module.exports = function(config) { { type: 'separator' }, - { - label: '&'+locale['menu.help[1]'], - click() { - const body = ` - - - - - - - - > ${app.getName()} ${app.getVersion()} - > Electron ${process.versions.electron} - > ${process.platform} ${process.arch} ${os.release()}`; - - shell.openExternal(`https://github.com/ramboxapp/community-edition/issues/new?body=${encodeURIComponent(body)}`); - } - }, { label: `&Tools`, submenu: [ @@ -92,15 +75,6 @@ module.exports = function(config) { } ] }, - { - type: 'separator' - }, - { - label: `&`+locale['menu.help[3]'], - click() { - shell.openExternal('https://rambox.app/donate.html'); - } - } ]; let tpl = [ diff --git a/electron/tray.js b/electron/tray.js index ade4cb71f..c2e16761a 100644 --- a/electron/tray.js +++ b/electron/tray.js @@ -44,12 +44,12 @@ exports.create = function(win, config) { // Double click is not supported and Click its only supported when app indicator is not used. // Read more here (Platform limitations): https://github.com/electron/electron/blob/master/docs/api/tray.md appIcon.on('click', function() { - win.webContents.executeJavaScript('ipc.send("toggleWin", true);'); + win.webContents.executeJavaScript('ipc.send("toggleWin", false);'); }); break; case 'win32': appIcon.on('double-click', function() { - win.webContents.executeJavaScript('ipc.send("toggleWin", true);'); + win.webContents.executeJavaScript('ipc.send("toggleWin", false);'); }); break; default: diff --git a/electron/updater.js b/electron/updater.js index 18b587606..8b6062863 100644 --- a/electron/updater.js +++ b/electron/updater.js @@ -1,12 +1,18 @@ const { app, ipcMain, BrowserWindow } = require('electron'); const { autoUpdater } = require("electron-updater"); -const path = require('path'); // autoUpdater.logger = require("electron-log"); // autoUpdater.logger.transports.file.level = "debug"; -// autoUpdater.currentVersion = '0.6.0'; +// autoUpdater.currentVersion = '0.8.0'; // autoUpdater.updateConfigPath = path.join(__dirname, 'dev-app-update.yml'); +autoUpdater.setFeedURL({ + "provider": "github", + "owner": "ramboxapp", + "repo": "download", + "vPrefixedTagName": true +}); + const initialize = (window) => { const webContents = window.webContents; const send = webContents.send.bind(window.webContents); @@ -15,7 +21,7 @@ const initialize = (window) => { ipcMain.on('autoUpdater:quit-and-install', (event) => { app.removeAllListeners('window-all-closed'); BrowserWindow.getAllWindows().forEach((browserWindow) => browserWindow.removeAllListeners('close')); - autoUpdater.quitAndInstall() + autoUpdater.quitAndInstall(true, true); }); ipcMain.on('autoUpdater:check-for-updates', (event) => autoUpdater.checkForUpdates()); }; diff --git a/env-sample.js b/env-sample.js deleted file mode 100644 index 702922226..000000000 --- a/env-sample.js +++ /dev/null @@ -1,5 +0,0 @@ -var auth0Cfg = { - clientID: '' - ,clientSecret: '' - ,domain: '' -}; diff --git a/package.json b/package.json index 4f2ebbd4b..12281124c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "Rambox", "productName": "Rambox", - "version": "0.7.9", + "version": "0.8.0", "description": "Free and Open Source messaging and emailing app that combines common web applications into one.", "main": "electron/main.js", "repository": { @@ -78,7 +78,12 @@ "category": "public.app-category.productivity", "artifactName": "Rambox-${version}-mac-${arch}.${ext}", "target": [ - "default" + { + "target": "default", + "arch": [ + "universal" + ] + } ], "hardenedRuntime": true, "gatekeeperAssess": false, @@ -213,7 +218,7 @@ "crowdin": "1.0.0", "csvjson": "4.3.3", "electron": "13.6.3", - "electron-builder": "22.14.5", + "electron-builder": "22.14.13", "electron-notarize": "1.0.0", "electron-packager": "15.1.0", "mocha": "5.2.0", @@ -221,14 +226,13 @@ }, "dependencies": { "@exponent/electron-cookies": "2.0.0", - "auth0-js": "9.13.2", "auto-launch-patched": "5.0.2", "crypto": "1.0.1", "electron-contextmenu-wrapper": "git+https://github.com/ramboxapp/electron-contextmenu-wrapper.git", "electron-is-dev": "1.2.0", "electron-log": "4.3.0", "electron-store": "6.0.1", - "electron-updater": "4.3.5", + "electron-updater": "4.5.2", "is-online": "8.2.0", "mime": "2.3.1", "mousetrap": "1.6.3", diff --git a/packages/local/rambox-default-theme/sass/etc/all.scss b/packages/local/rambox-default-theme/sass/etc/all.scss index 7258b77a9..e6651efa8 100644 --- a/packages/local/rambox-default-theme/sass/etc/all.scss +++ b/packages/local/rambox-default-theme/sass/etc/all.scss @@ -279,3 +279,8 @@ body { background-color: #c3c3c3; } } + +.deprecation { + background-color: #E6A23C !important; + color: #FFF; +} diff --git a/resources/css/screenselector.css b/resources/css/screenselector.css deleted file mode 100644 index c3f5314be..000000000 --- a/resources/css/screenselector.css +++ /dev/null @@ -1,146 +0,0 @@ -html, body { - width: 100%; - height: 100%; - margin: 0; - overflow: hidden; -} - -.screen-selector { - background-color: #fff; - width: 100%; - height: 100%; - border-radius: 5px; - border: solid 1px #cdcdcd; - box-sizing: border-box; -} - -.screen-selector ul.type { - display: inline-block; - padding: 0; - margin: 0; - border-bottom: solid 1px #cdcdcd; - width: 100%; - -webkit-app-region: drag; -} - -.screen-selector ul.type li { - display: inline-block; - height: 40px; - line-height: 40px; - color: #65696c; - border-bottom: 2px solid transparent; - font-family: sans-serif; - font-weight: bold; - padding: 0 15px; - cursor: pointer; - -webkit-app-region: no-drag; -} - -.screen-selector ul.type li.active, .screen-selector ul.type li:hover { - color: #426ba3; - border-color: #426ba3; -} - -.screen-selector > .content { - height: calc(100% - 92px); -} - -.screen-selector ul.preview { - display: flex; - margin: 0; - padding: 0; - width: 100%; - max-height: calc(100% - 45px); - box-sizing: border-box; - padding: 10px; - overflow-y: auto; - flex-wrap: wrap; - list-style-type: none; -} - -.screen-selector ul.preview li { - display: inline-block; - box-sizing: border-box; - width: calc(33% - 1px); - cursor: pointer; - padding: 5px; -} - -.screen-selector ul.preview li .content { - display: flex; - box-sizing: border-box; - padding: 10px; - border: solid 2px transparent; - border-radius: 5px; - height: 100%; - flex-direction: column; -} - -.screen-selector ul.preview li.active .content, -.screen-selector ul.preview li:hover .content { - border-color: #88abdb; -} - -.screen-selector ul.preview li.active .content { - color: #000; - height: 100%; -} - -.screen-selector ul.preview li .content .img-wrapper { - display: flex; - height: 100%; - align-items: center; - background: #f0f0f0; -} - -.screen-selector ul.preview li .content img { - display: inline-block; - width: 100%; -} - -.screen-selector ul.preview li .content span { - display: inline-block; - width: 100%; - font-family: sans-serif; - text-align: center; - font-size: 14px; - margin-top: 10px; - color: #333; - box-sizing: border-box; -} - -.screen-selector .footer { - display: inline-block; - width: 100%; - border-top: solid 1px #cdcdcd; - -} - -.screen-selector .footer button { - float: right; - margin-top: 10px; - margin-right: 10px; - border: none; - border-radius: 5px; - padding: 5px 10px; - font-size: 14px; - cursor: pointer; - font-weight: bold; -} - -.screen-selector .footer button#cancel { - border: solid 1px #cdcdcd; - background: #fff; - color: #1c73e4; -} - -.screen-selector .footer button#share { - border: solid 1px #186ddd; - background: #1c73e4; - color: #fff; -} - -.screen-selector .footer button#share[disabled] { - background: #666; - cursor: default; -} diff --git a/resources/icons/airdroid.png b/resources/icons/airdroid.png new file mode 100644 index 000000000..9a975cd03 Binary files /dev/null and b/resources/icons/airdroid.png differ diff --git a/resources/icons/androidmessages.png b/resources/icons/androidmessages.png new file mode 100644 index 000000000..c3cb48693 Binary files /dev/null and b/resources/icons/androidmessages.png differ diff --git a/resources/icons/aol.png b/resources/icons/aol.png new file mode 100644 index 000000000..d5eb6741d Binary files /dev/null and b/resources/icons/aol.png differ diff --git a/resources/icons/awsworkmail.png b/resources/icons/awsworkmail.png new file mode 100644 index 000000000..0ee0b0032 Binary files /dev/null and b/resources/icons/awsworkmail.png differ diff --git a/resources/icons/bearychat.png b/resources/icons/bearychat.png new file mode 100644 index 000000000..0fee9b4d6 Binary files /dev/null and b/resources/icons/bearychat.png differ diff --git a/resources/icons/bip.png b/resources/icons/bip.png new file mode 100644 index 000000000..3254bdc09 Binary files /dev/null and b/resources/icons/bip.png differ diff --git a/resources/icons/calendar.png b/resources/icons/calendar.png new file mode 100644 index 000000000..9ed6830f1 Binary files /dev/null and b/resources/icons/calendar.png differ diff --git a/resources/icons/chatwork.png b/resources/icons/chatwork.png new file mode 100644 index 000000000..110e9fb6b Binary files /dev/null and b/resources/icons/chatwork.png differ diff --git a/resources/icons/cliq.png b/resources/icons/cliq.png new file mode 100644 index 000000000..1dbf0f616 Binary files /dev/null and b/resources/icons/cliq.png differ diff --git a/resources/icons/converse.png b/resources/icons/converse.png new file mode 100644 index 000000000..bc38badaa Binary files /dev/null and b/resources/icons/converse.png differ diff --git a/resources/icons/crisp.png b/resources/icons/crisp.png new file mode 100644 index 000000000..121d39e3e Binary files /dev/null and b/resources/icons/crisp.png differ diff --git a/resources/icons/devrant.png b/resources/icons/devrant.png new file mode 100644 index 000000000..81033d472 Binary files /dev/null and b/resources/icons/devrant.png differ diff --git a/resources/icons/dingtalk.png b/resources/icons/dingtalk.png new file mode 100644 index 000000000..3d36882d0 Binary files /dev/null and b/resources/icons/dingtalk.png differ diff --git a/resources/icons/discord.png b/resources/icons/discord.png new file mode 100644 index 000000000..cc8ca736b Binary files /dev/null and b/resources/icons/discord.png differ diff --git a/resources/icons/drift.png b/resources/icons/drift.png new file mode 100644 index 000000000..13dfe4c4a Binary files /dev/null and b/resources/icons/drift.png differ diff --git a/resources/icons/duo.png b/resources/icons/duo.png new file mode 100644 index 000000000..9ed711a50 Binary files /dev/null and b/resources/icons/duo.png differ diff --git a/resources/icons/element.png b/resources/icons/element.png new file mode 100644 index 000000000..4daab1261 Binary files /dev/null and b/resources/icons/element.png differ diff --git a/resources/icons/facebook.png b/resources/icons/facebook.png new file mode 100644 index 000000000..67e540ce7 Binary files /dev/null and b/resources/icons/facebook.png differ diff --git a/resources/icons/fastmail.png b/resources/icons/fastmail.png new file mode 100644 index 000000000..5587a42ca Binary files /dev/null and b/resources/icons/fastmail.png differ diff --git a/resources/icons/fleep.png b/resources/icons/fleep.png new file mode 100644 index 000000000..72f1d282b Binary files /dev/null and b/resources/icons/fleep.png differ diff --git a/resources/icons/flock.png b/resources/icons/flock.png new file mode 100644 index 000000000..b24106c65 Binary files /dev/null and b/resources/icons/flock.png differ diff --git a/resources/icons/flowdock.png b/resources/icons/flowdock.png new file mode 100644 index 000000000..b1b6390e3 Binary files /dev/null and b/resources/icons/flowdock.png differ diff --git a/resources/icons/freenode.png b/resources/icons/freenode.png new file mode 100644 index 000000000..d6e8c433d Binary files /dev/null and b/resources/icons/freenode.png differ diff --git a/resources/icons/gadugadu.png b/resources/icons/gadugadu.png new file mode 100644 index 000000000..0c4602c5f Binary files /dev/null and b/resources/icons/gadugadu.png differ diff --git a/resources/icons/gitter.png b/resources/icons/gitter.png new file mode 100644 index 000000000..caea49ecf Binary files /dev/null and b/resources/icons/gitter.png differ diff --git a/resources/icons/glip.png b/resources/icons/glip.png new file mode 100644 index 000000000..afa34f3d0 Binary files /dev/null and b/resources/icons/glip.png differ diff --git a/resources/icons/glowingbear.png b/resources/icons/glowingbear.png new file mode 100644 index 000000000..c1814be32 Binary files /dev/null and b/resources/icons/glowingbear.png differ diff --git a/resources/icons/gmail.png b/resources/icons/gmail.png new file mode 100644 index 000000000..75a217e2e Binary files /dev/null and b/resources/icons/gmail.png differ diff --git a/resources/icons/googledrive.png b/resources/icons/googledrive.png new file mode 100644 index 000000000..fb0655e8a Binary files /dev/null and b/resources/icons/googledrive.png differ diff --git a/resources/icons/googlevoice.png b/resources/icons/googlevoice.png new file mode 100644 index 000000000..20753e87e Binary files /dev/null and b/resources/icons/googlevoice.png differ diff --git a/resources/icons/grape.png b/resources/icons/grape.png new file mode 100644 index 000000000..790ca2118 Binary files /dev/null and b/resources/icons/grape.png differ diff --git a/resources/icons/groupme.png b/resources/icons/groupme.png new file mode 100644 index 000000000..5a1f65e8a Binary files /dev/null and b/resources/icons/groupme.png differ diff --git a/resources/icons/guilded.png b/resources/icons/guilded.png new file mode 100644 index 000000000..8dddfe98c Binary files /dev/null and b/resources/icons/guilded.png differ diff --git a/resources/icons/hangouts.png b/resources/icons/hangouts.png new file mode 100644 index 000000000..0bf6e1049 Binary files /dev/null and b/resources/icons/hangouts.png differ diff --git a/resources/icons/hangoutschat.png b/resources/icons/hangoutschat.png new file mode 100644 index 000000000..3e8f48f4b Binary files /dev/null and b/resources/icons/hangoutschat.png differ diff --git a/resources/icons/hibox.png b/resources/icons/hibox.png new file mode 100644 index 000000000..bf5f24434 Binary files /dev/null and b/resources/icons/hibox.png differ diff --git a/resources/icons/honeypot.png b/resources/icons/honeypot.png new file mode 100644 index 000000000..5da545a97 Binary files /dev/null and b/resources/icons/honeypot.png differ diff --git a/resources/icons/hootsuite.png b/resources/icons/hootsuite.png new file mode 100644 index 000000000..b832b4282 Binary files /dev/null and b/resources/icons/hootsuite.png differ diff --git a/resources/icons/horde.png b/resources/icons/horde.png new file mode 100644 index 000000000..e1534fc63 Binary files /dev/null and b/resources/icons/horde.png differ diff --git a/resources/icons/hushmail.png b/resources/icons/hushmail.png new file mode 100644 index 000000000..a07575ba6 Binary files /dev/null and b/resources/icons/hushmail.png differ diff --git a/resources/icons/icloudmail.png b/resources/icons/icloudmail.png new file mode 100644 index 000000000..79548e940 Binary files /dev/null and b/resources/icons/icloudmail.png differ diff --git a/resources/icons/icq.png b/resources/icons/icq.png new file mode 100644 index 000000000..db0eb0e27 Binary files /dev/null and b/resources/icons/icq.png differ diff --git a/resources/icons/inbox.png b/resources/icons/inbox.png new file mode 100644 index 000000000..6f7a2f859 Binary files /dev/null and b/resources/icons/inbox.png differ diff --git a/resources/icons/instagramdirect.png b/resources/icons/instagramdirect.png new file mode 100644 index 000000000..84584f594 Binary files /dev/null and b/resources/icons/instagramdirect.png differ diff --git a/resources/icons/intercom.png b/resources/icons/intercom.png new file mode 100644 index 000000000..eced6396a Binary files /dev/null and b/resources/icons/intercom.png differ diff --git a/resources/icons/irccloud.png b/resources/icons/irccloud.png new file mode 100644 index 000000000..e245492cf Binary files /dev/null and b/resources/icons/irccloud.png differ diff --git a/resources/icons/jandi.png b/resources/icons/jandi.png new file mode 100644 index 000000000..0293ae969 Binary files /dev/null and b/resources/icons/jandi.png differ diff --git a/resources/icons/kaiwa.png b/resources/icons/kaiwa.png new file mode 100644 index 000000000..c13a522c4 Binary files /dev/null and b/resources/icons/kaiwa.png differ diff --git a/resources/icons/kezmo.png b/resources/icons/kezmo.png new file mode 100644 index 000000000..0b68e62ee Binary files /dev/null and b/resources/icons/kezmo.png differ diff --git a/resources/icons/kiwi.png b/resources/icons/kiwi.png new file mode 100644 index 000000000..f1207f244 Binary files /dev/null and b/resources/icons/kiwi.png differ diff --git a/resources/icons/kune.png b/resources/icons/kune.png new file mode 100644 index 000000000..e2bfbbe2d Binary files /dev/null and b/resources/icons/kune.png differ diff --git a/resources/icons/linkedin.png b/resources/icons/linkedin.png new file mode 100644 index 000000000..df92f5770 Binary files /dev/null and b/resources/icons/linkedin.png differ diff --git a/resources/icons/lounge.png b/resources/icons/lounge.png new file mode 100644 index 000000000..de3566142 Binary files /dev/null and b/resources/icons/lounge.png differ diff --git a/resources/icons/mailru.png b/resources/icons/mailru.png new file mode 100644 index 000000000..5fc2579af Binary files /dev/null and b/resources/icons/mailru.png differ diff --git a/resources/icons/mastodon.png b/resources/icons/mastodon.png new file mode 100644 index 000000000..1d81ec02e Binary files /dev/null and b/resources/icons/mastodon.png differ diff --git a/resources/icons/mattermost.png b/resources/icons/mattermost.png new file mode 100644 index 000000000..7e0d5e5f0 Binary files /dev/null and b/resources/icons/mattermost.png differ diff --git a/resources/icons/messenger.png b/resources/icons/messenger.png new file mode 100644 index 000000000..45b2bee8d Binary files /dev/null and b/resources/icons/messenger.png differ diff --git a/resources/icons/messengerpages.png b/resources/icons/messengerpages.png new file mode 100644 index 000000000..f30486c4c Binary files /dev/null and b/resources/icons/messengerpages.png differ diff --git a/resources/icons/mightytext.png b/resources/icons/mightytext.png new file mode 100644 index 000000000..ac072806e Binary files /dev/null and b/resources/icons/mightytext.png differ diff --git a/resources/icons/missive.png b/resources/icons/missive.png new file mode 100644 index 000000000..c3d76c41c Binary files /dev/null and b/resources/icons/missive.png differ diff --git a/resources/icons/movim.png b/resources/icons/movim.png new file mode 100644 index 000000000..a792bb5e2 Binary files /dev/null and b/resources/icons/movim.png differ diff --git a/resources/icons/mysms.png b/resources/icons/mysms.png new file mode 100644 index 000000000..a99ae87e8 Binary files /dev/null and b/resources/icons/mysms.png differ diff --git a/resources/icons/noysi.png b/resources/icons/noysi.png new file mode 100644 index 000000000..f27a29c22 Binary files /dev/null and b/resources/icons/noysi.png differ diff --git a/resources/icons/okru.png b/resources/icons/okru.png new file mode 100644 index 000000000..5de47cccf Binary files /dev/null and b/resources/icons/okru.png differ diff --git a/resources/icons/openmailbox.png b/resources/icons/openmailbox.png new file mode 100644 index 000000000..371a84ecd Binary files /dev/null and b/resources/icons/openmailbox.png differ diff --git a/resources/icons/outlook.png b/resources/icons/outlook.png new file mode 100644 index 000000000..1cb65976f Binary files /dev/null and b/resources/icons/outlook.png differ diff --git a/resources/icons/outlook365.png b/resources/icons/outlook365.png new file mode 100644 index 000000000..1cb65976f Binary files /dev/null and b/resources/icons/outlook365.png differ diff --git a/resources/icons/protonmail.png b/resources/icons/protonmail.png new file mode 100644 index 000000000..1724f40dd Binary files /dev/null and b/resources/icons/protonmail.png differ diff --git a/resources/icons/protonmailch.png b/resources/icons/protonmailch.png new file mode 100644 index 000000000..19fb052b4 Binary files /dev/null and b/resources/icons/protonmailch.png differ diff --git a/resources/icons/pushbullet.png b/resources/icons/pushbullet.png new file mode 100644 index 000000000..c5f8e63c9 Binary files /dev/null and b/resources/icons/pushbullet.png differ diff --git a/resources/icons/rainloop.png b/resources/icons/rainloop.png new file mode 100644 index 000000000..bb639dcea Binary files /dev/null and b/resources/icons/rainloop.png differ diff --git a/resources/icons/reddit.png b/resources/icons/reddit.png new file mode 100644 index 000000000..2cd630528 Binary files /dev/null and b/resources/icons/reddit.png differ diff --git a/resources/icons/riot.png b/resources/icons/riot.png new file mode 100644 index 000000000..ffac56a38 Binary files /dev/null and b/resources/icons/riot.png differ diff --git a/resources/icons/rocketchat.png b/resources/icons/rocketchat.png new file mode 100644 index 000000000..a3a6aea57 Binary files /dev/null and b/resources/icons/rocketchat.png differ diff --git a/resources/icons/roundcube.png b/resources/icons/roundcube.png new file mode 100644 index 000000000..3abda5905 Binary files /dev/null and b/resources/icons/roundcube.png differ diff --git a/resources/icons/ryver.png b/resources/icons/ryver.png new file mode 100644 index 000000000..7f67ac0df Binary files /dev/null and b/resources/icons/ryver.png differ diff --git a/resources/icons/sandstorm.png b/resources/icons/sandstorm.png new file mode 100644 index 000000000..e41f5580d Binary files /dev/null and b/resources/icons/sandstorm.png differ diff --git a/resources/icons/simplenote.png b/resources/icons/simplenote.png new file mode 100644 index 000000000..fc9a7d8d3 Binary files /dev/null and b/resources/icons/simplenote.png differ diff --git a/resources/icons/skype.png b/resources/icons/skype.png new file mode 100644 index 000000000..e561b79b8 Binary files /dev/null and b/resources/icons/skype.png differ diff --git a/resources/icons/slack.png b/resources/icons/slack.png new file mode 100644 index 000000000..e99caad1d Binary files /dev/null and b/resources/icons/slack.png differ diff --git a/resources/icons/smooch.png b/resources/icons/smooch.png new file mode 100644 index 000000000..90959572f Binary files /dev/null and b/resources/icons/smooch.png differ diff --git a/resources/icons/socialcast.png b/resources/icons/socialcast.png new file mode 100644 index 000000000..4487bc6e2 Binary files /dev/null and b/resources/icons/socialcast.png differ diff --git a/resources/auth0.png b/resources/icons/sococo.png similarity index 51% rename from resources/auth0.png rename to resources/icons/sococo.png index 9b9c69cb9..4c4a2f16d 100644 Binary files a/resources/auth0.png and b/resources/icons/sococo.png differ diff --git a/resources/icons/spark.png b/resources/icons/spark.png new file mode 100644 index 000000000..c134c25a2 Binary files /dev/null and b/resources/icons/spark.png differ diff --git a/resources/icons/spike.png b/resources/icons/spike.png new file mode 100644 index 000000000..7c1b02205 Binary files /dev/null and b/resources/icons/spike.png differ diff --git a/resources/icons/squirrelmail.png b/resources/icons/squirrelmail.png new file mode 100644 index 000000000..b177add09 Binary files /dev/null and b/resources/icons/squirrelmail.png differ diff --git a/resources/icons/steam.png b/resources/icons/steam.png new file mode 100644 index 000000000..0bfdb4829 Binary files /dev/null and b/resources/icons/steam.png differ diff --git a/resources/icons/swello.png b/resources/icons/swello.png new file mode 100644 index 000000000..313de158e Binary files /dev/null and b/resources/icons/swello.png differ diff --git a/resources/icons/sync.png b/resources/icons/sync.png new file mode 100644 index 000000000..d0abb2cd1 Binary files /dev/null and b/resources/icons/sync.png differ diff --git a/resources/icons/tawkto.png b/resources/icons/tawkto.png new file mode 100644 index 000000000..6df3cb24a Binary files /dev/null and b/resources/icons/tawkto.png differ diff --git a/resources/icons/teams.png b/resources/icons/teams.png new file mode 100644 index 000000000..540bebde6 Binary files /dev/null and b/resources/icons/teams.png differ diff --git a/resources/icons/teamworkchat.png b/resources/icons/teamworkchat.png new file mode 100644 index 000000000..74facf22e Binary files /dev/null and b/resources/icons/teamworkchat.png differ diff --git a/resources/icons/telegram.png b/resources/icons/telegram.png new file mode 100644 index 000000000..d83df2e8e Binary files /dev/null and b/resources/icons/telegram.png differ diff --git a/resources/icons/threema.png b/resources/icons/threema.png new file mode 100644 index 000000000..2185f466e Binary files /dev/null and b/resources/icons/threema.png differ diff --git a/resources/icons/tutanota.png b/resources/icons/tutanota.png new file mode 100644 index 000000000..e4d64b744 Binary files /dev/null and b/resources/icons/tutanota.png differ diff --git a/resources/icons/tweetdeck.png b/resources/icons/tweetdeck.png new file mode 100644 index 000000000..f9a28ace2 Binary files /dev/null and b/resources/icons/tweetdeck.png differ diff --git a/resources/icons/typetalk.png b/resources/icons/typetalk.png new file mode 100644 index 000000000..9a8ea3176 Binary files /dev/null and b/resources/icons/typetalk.png differ diff --git a/resources/icons/vk.png b/resources/icons/vk.png new file mode 100644 index 000000000..dbe073004 Binary files /dev/null and b/resources/icons/vk.png differ diff --git a/resources/icons/voxer.png b/resources/icons/voxer.png new file mode 100644 index 000000000..dbcf5860f Binary files /dev/null and b/resources/icons/voxer.png differ diff --git a/resources/icons/wechat.png b/resources/icons/wechat.png new file mode 100644 index 000000000..908b3e114 Binary files /dev/null and b/resources/icons/wechat.png differ diff --git a/resources/icons/whatsapp.png b/resources/icons/whatsapp.png new file mode 100644 index 000000000..7c028543f Binary files /dev/null and b/resources/icons/whatsapp.png differ diff --git a/resources/icons/whatsappbusiness.png b/resources/icons/whatsappbusiness.png new file mode 100644 index 000000000..3a27eef09 Binary files /dev/null and b/resources/icons/whatsappbusiness.png differ diff --git a/resources/icons/wire.png b/resources/icons/wire.png new file mode 100644 index 000000000..dd5c82eeb Binary files /dev/null and b/resources/icons/wire.png differ diff --git a/resources/icons/workplace.png b/resources/icons/workplace.png new file mode 100644 index 000000000..5af90dd24 Binary files /dev/null and b/resources/icons/workplace.png differ diff --git a/resources/icons/xender.png b/resources/icons/xender.png new file mode 100644 index 000000000..87be0612b Binary files /dev/null and b/resources/icons/xender.png differ diff --git a/resources/icons/xing.png b/resources/icons/xing.png new file mode 100644 index 000000000..f29912575 Binary files /dev/null and b/resources/icons/xing.png differ diff --git a/resources/icons/yahoo.png b/resources/icons/yahoo.png new file mode 100644 index 000000000..ba7c241fc Binary files /dev/null and b/resources/icons/yahoo.png differ diff --git a/resources/icons/yandex.png b/resources/icons/yandex.png new file mode 100644 index 000000000..8bfbc7f39 Binary files /dev/null and b/resources/icons/yandex.png differ diff --git a/resources/icons/zimbra.png b/resources/icons/zimbra.png new file mode 100644 index 000000000..c8da41711 Binary files /dev/null and b/resources/icons/zimbra.png differ diff --git a/resources/icons/zinc.png b/resources/icons/zinc.png new file mode 100644 index 000000000..aa6c13727 Binary files /dev/null and b/resources/icons/zinc.png differ diff --git a/resources/icons/zohocliq.png b/resources/icons/zohocliq.png new file mode 100644 index 000000000..48bd448d5 Binary files /dev/null and b/resources/icons/zohocliq.png differ diff --git a/resources/icons/zohoemail.png b/resources/icons/zohoemail.png new file mode 100644 index 000000000..12865c447 Binary files /dev/null and b/resources/icons/zohoemail.png differ diff --git a/resources/icons/zulip.png b/resources/icons/zulip.png new file mode 100644 index 000000000..d38b5e804 Binary files /dev/null and b/resources/icons/zulip.png differ diff --git a/resources/icons/zyptonite.png b/resources/icons/zyptonite.png new file mode 100644 index 000000000..733696796 Binary files /dev/null and b/resources/icons/zyptonite.png differ diff --git a/resources/js/screenselector.js b/resources/js/screenselector.js deleted file mode 100644 index 9f5b7a1a3..000000000 --- a/resources/js/screenselector.js +++ /dev/null @@ -1,77 +0,0 @@ -const { ipcRenderer } = require('electron'); - -let sourceList, contentList, typeButtons, shareButton, cancelButton, activeItem, activeTab = 'screen'; - -const getItemDOM = item => { - const li = document.createElement('li'); - li.setAttribute('data-id', item.id); - li.innerHTML = `
${item.name}
`; - li.addEventListener('click', onItemClick, false); - return li; -}; - -const updateTab = () => { - const sources = sourceList.filter(it => it.id.indexOf(activeTab) === 0); - contentList.innerHTML = ''; - sources.forEach(source => contentList.appendChild(getItemDOM(source))); -}; - -const bindTypeClick = () => { - typeButtons.forEach(it => it.addEventListener('click', onChangeType, false)); -}; - -const bindActionsClick = () => { - shareButton.addEventListener('click', onShareClick, false); - cancelButton.addEventListener('click', onCancelClick, false); -}; - -const onChangeType = event => { - event.preventDefault(); - if (!event.target.classList.contains('active')) { - activeTab = event.target.dataset.type; - typeButtons.forEach(it => it.classList.remove('active')); - event.target.classList.add('active'); - updateTab(); - } -}; - -const onItemClick = event => { - event.preventDefault(); - if (!event.currentTarget.classList.contains('active')) { - activeItem = event.currentTarget.dataset.id; - document.querySelectorAll('.preview li').forEach(it => it.classList.remove('active')); - event.currentTarget.classList.add('active'); - changeShareState(); - } -}; - -const onCancelClick = event => { - event.preventDefault(); - ipcRenderer.send('screenShare:cancelSelection'); -}; - -const onShareClick = event => { - event.preventDefault(); - if (activeItem) { - ipcRenderer.send('screenShare:selectScreen', activeItem); - } -}; - -const changeShareState = () => { - if (shareButton.getAttribute('disabled') !== null) { - shareButton.removeAttribute('disabled'); - } -}; - -window.addEventListener('load', async () => { - sourceList = await ipcRenderer.invoke('screenShare:getSources'); - - contentList = document.querySelector('.preview'); - typeButtons = document.querySelectorAll('.type li'); - shareButton = document.querySelector('#share'); - cancelButton = document.querySelector('#cancel'); - - bindTypeClick(); - bindActionsClick(); - updateTab(); -}, false); diff --git a/resources/services.json b/resources/services.json new file mode 100644 index 000000000..061a6cd44 --- /dev/null +++ b/resources/services.json @@ -0,0 +1,1712 @@ +[ + { + "id": "airdroid", + "logo": "airdroid.png", + "name": "Airdroid", + "description": "AirDroid enables you to transfer files across devices, control mobile devices remotely, receive and reply to messages on computer.", + "url": "https://web.airdroid.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "androidmessages", + "logo": "androidmessages.png", + "name": "Android Messages", + "description": "Meet Android Messages, Android's official app for texting (SMS, MMS) and chat (RCS). Message anyone from anywhere with the reliability of texting and the richness of chat. Stay in touch with friends and family, send group texts, and share your favorite pictures, videos, and audio messages.", + "url": "https://messages.google.com/web/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var e=0;document.querySelectorAll(\".text-content.unread\").forEach(function(n){n.querySelector(\".notifications-off\")||e++}),updateBadge(e)}function updateBadge(e){1<=e?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "aol", + "logo": "aol.png", + "name": "Aol", + "description": "Free and simple (old) webmail service.", + "url": "https://mail.aol.com/", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "awsworkmail", + "logo": "awsworkmail.png", + "name": "Amazon WorkMail", + "description": "Amazon WorkMail is a secure, managed business email and calendar service.", + "url": "___", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var t=document.getElementsByClassName(\"giraffe-hierarchy-node-counter\"),e=0;for(i=0;i=1?rambox.setUnreadCount(a):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "bearychat", + "logo": "bearychat.png", + "name": "BearyChat", + "description": "Better Communication that brings your team on the same page", + "url": "https://bearychat.com/start", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "bip", + "logo": "bip.png", + "name": "BiP", + "description": "BiP is a communication client with entertaining content, voice and video calls.", + "url": "https://web.bip.com/chat", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "calendar", + "logo": "calendar.png", + "name": "Google Calendar", + "description": "With Google's free online calendar, it's easy to keep track of life's important events all in one place.", + "url": "https://calendar.google.com", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "chatwork", + "logo": "chatwork.png", + "name": "ChatWork", + "description": "ChatWork is a group chat app for business. Secure messaging, video chat, task management and file sharing. Real-time communication and increase productivity for teams.", + "url": "https://www.chatwork.com/login.php", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "To enable desktop notifications, you have to go to Options inside ChatWork.", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "cliq", + "logo": "cliq.png", + "name": "Cliq", + "description": "Zoho Cliq is a business communication software meant for enhanced productivity at your workplace. With team chat, file sharing, audio & video calls, and more, experience unified communication. Free for Unlimited users.", + "url": "https://accounts.zoho.com/signin?servicename=ZohoChat&signupurl=https://www.zoho.com/cliq/signup.html", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "NotifyByTitle.show = function(){};NotifyByTitle.start = function(){};NotifyByTitle.stop = function(){};function checkUnread(){var t=0;$(\".msgnotify\").each(function() { t += isNaN(parseInt($(this).html())) ? 0 : parseInt(parseInt($(this).html())) });updateBadge(t)}function updateBadge(e){e>=1?document.title=\"(\"+e+\") \"+originalTitle:document.title=originalTitle}var originalTitle=document.title;setInterval(checkUnread,3000);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "converse", + "logo": "converse.png", + "name": "Converse", + "description": "Converse is a free and open-source XMPP chat client that runs in a web browser.", + "url": "___", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "crisp", + "logo": "crisp.png", + "name": "Crisp", + "description": "Connect your customers to your team.", + "url": "https://app.crisp.chat/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "devrant", + "logo": "devrant.png", + "name": "devRant", + "description": "Share and bond over successes and frustrations with code, tech and life as a programmer", + "url": "https://devrant.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var a=document.querySelectorAll(\".menu-notif.notif-badge\")[0];updateBadge(t=a===undefined?0:(a.textContent.length?parseInt(a.textContent.replace(/[^0-9]/g,\"\")):0))}function updateBadge(a){a>=1?rambox.setUnreadCount(a):rambox.clearUnreadCount()}setInterval(checkUnread,3000);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "dingtalk", + "logo": "dingtalk.png", + "name": "DingTalk", + "description": "DingTalk is a multi-sided platform empowers small and medium-sized business to communicate effectively.", + "url": "https://im.dingtalk.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "discord", + "logo": "discord.png", + "name": "Discord", + "description": "Step up your game with a modern voice & text chat app. Crystal clear voice, multiple server and channel support, mobile apps, and more.", + "url": "https://discord.com/app", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){rambox.setUnreadCount([...document.querySelectorAll('[class^=lowerBadge]')].map(elem => parseInt(elem.innerText) || 0).reduce((a, b) => a + b, 0))}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": true, + "custom_domain": false + }, + { + "id": "drift", + "logo": "drift.png", + "name": "Drift", + "description": "Drift is a messaging app that makes it easy for businesses to talk to their website visitors and customers in real-time, from anywhere.", + "url": "https://app.drift.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "duo", + "logo": "duo.png", + "name": "Duo", + "description": "Google Duo is the new, simple video calling app that brings you face-to-face with all the people that matter most.", + "url": "https://duo.google.com/?web", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "element", + "logo": "element.png", + "name": "Element", + "description": "Secure messaging app with strong end-to-end encryption, advanced group chat privacy settings, secure video calls for teams, encrypted communication using Matrix open network. Riot.im is now Element", + "url": "https://app.element.io/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){e=0,document.querySelectorAll(\".mx_RoomSublist_stickable\").forEach(t=>t.querySelector(\".mx_NotificationBadge_count\")&&parseInt(t.querySelector(\".mx_NotificationBadge_count\").innerText)&&(e+=parseInt(t.querySelector(\".mx_NotificationBadge_count\").innerText))),updateBadge(e)}function updateBadge(e){e&&e>=1?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": true + }, + { + "id": "facebook", + "logo": "facebook.png", + "name": "Facebook", + "description": "Create an account or log into Facebook. Connect with friends, family and other people you know. Share photos and videos, send messages and get updates.", + "url": "https://www.facebook.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Rambox/1.5.2 Chrome/83.0.4103.122 Safari/537.36", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "fastmail", + "logo": "fastmail.png", + "name": "Fastmail", + "description": "Secure, reliable email hosting for businesses, families and professionals. Premium email with no ads, excellent spam protection and rapid personal support.", + "url": "https://www.fastmail.com/mail/", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){let e=0;document.querySelectorAll(\".v-MailboxSource-badge\").forEach(a=>{![\"/mail/Drafts/\",\"/mail/Spam/\"].includes(a.parentElement.pathname)&&parseInt(a.innerText)&&(e+=parseInt(a.innerText))}),updateBadge(e)}function updateBadge(e){e&&e>=1?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "fleep", + "logo": "fleep.png", + "name": "Fleep", + "description": "Fleep enables communication within and across organizations - be it your team chats, project communication or 1:1 conversations.", + "url": "https://fleep.io/chat", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "document.getElementsByClassName(\"google-login-area\")[0].remove();document.getElementsByClassName(\"microsoft-login-area\")[0].remove();", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "flock", + "logo": "flock.png", + "name": "Flock", + "description": "Flock is a free enterprise tool for business communication. Packed with tons of productivity features, Flock drives efficiency and boosts speed of execution.", + "url": "https://web.flock.co/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var a=document.getElementsByClassName(\"unreadMessages no-unread-mentions has-unread\"),b=0;for(i=0;i=1?rambox.setUnreadCount(a):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "flowdock", + "logo": "flowdock.png", + "name": "Flowdock", + "description": "Flowdock is your teams chat with a shared inbox. Teams using Flowdock stay up-to-date, react in seconds instead of days, and never forget anything.", + "url": "https://www.flowdock.com/login", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "freenode", + "logo": "freenode.png", + "name": "FreeNode", + "description": "Freenode, formerly known as Open Projects Network, is an IRC network used to discuss peer-directed projects.", + "url": "https://webchat.freenode.net/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "gadugadu", + "logo": "gadugadu.png", + "name": "Gadu-Gadu", + "description": "The most popular Polish messenger.", + "url": "https://www.gg.pl/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "gitter", + "logo": "gitter.png", + "name": "Gitter", + "description": "Gitter is built on top of GitHub and is tightly integrated with your organisations, repositories, issues and activity.", + "url": "https://gitter.im/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){let e=0;document.querySelectorAll(\".unread-indicator\").forEach(n=>parseInt(n.innerText)&&(e+=parseInt(n.innerText))),updateBadge(e)}function updateBadge(e){e&&e>=1?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "glip", + "logo": "glip.png", + "name": "RingCentral (Glip)", + "description": "Find harmony in productivity. RingCentral Glip gives you team messaging with file sharing, task management, and screen sharing in one collaboration tool.", + "url": "https://app.ringcentral.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "glowingbear", + "logo": "glowingbear.png", + "name": "Glowing Bear", + "description": "Glowing Bear is a web frontend for the WeeChat IRC client and strives to be a modern interface.", + "url": "https://www.glowing-bear.org/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "gmail", + "logo": "gmail.png", + "name": "Gmail", + "description": "Gmail, Google's free email service, is one of the world's most popular email programs.", + "url": "https://accounts.google.com/signin/v2/identifier?continue=https%3A%2F%2Fmail.google.com%2Fmail%2F&service=mail&sacu=1&rip=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var e=document.querySelector(\".aim .aio\").querySelector(\"span\").querySelector(\"a\").getAttribute(\"aria-label\").replace(/\\D/g,\"\");updateBadge(e?parseInt(e):0)}function updateBadge(e){1<=e?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "To enable desktop notifications, you have to go to Settings inside Gmail. Read more...", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "googledrive", + "logo": "googledrive.png", + "name": "Google Drive", + "description": "Securely store and share files in the cloud with Google Drive. Get unlimited Drive storage as part of G Suite.", + "url": "https://drive.google.com/drive/u/0/my-drive", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "googlevoice", + "logo": "googlevoice.png", + "name": "Google Voice", + "description": "A free phone number for life. Stay in touch from any screen. Use your free number to text, call, and check voicemail all from one app. Plus, Google Voice works on all of your devices so you can connect and communicate how you want.", + "url": "https://voice.google.com", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function parseIntOrZero(e){return isNaN(parseInt(e))?0:parseInt(e)}function checkUnread() {var e = document.querySelectorAll(\"a[gv-test-id=\\'sidenav-calls\\'] .navItemBadge, a[gv-test-id=\\'sidenav-messages\\'] .navItemBadge, a[gv-test-id=\\'sidenav-voicemail\\'] .navItemBadge\"), n = 0; e.forEach(function(elem) { var bounding = elem.getBoundingClientRect(); if (bounding.top >= 0 && bounding.left >= 0 && bounding.right <= (window.innerWidth || document.documentElement.clientWidth) && bounding.bottom <= (window.innerHeight || document.documentElement.clientHeight) ) { n += parseIntOrZero(elem.innerHTML.replace(/[\\(\\) ]/gi,\"\")); } }); updateBadge(n); }function updateBadge(a){a>=1?rambox.setUnreadCount(a):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "grape", + "logo": "grape.png", + "name": "Grape", + "description": "The world´s most advanced team chat meets enterprise search.", + "url": "https://chatgrape.com/accounts/login/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "groupme", + "logo": "groupme.png", + "name": "GroupMe", + "description": "GroupMe brings group text messaging to every phone. Group message with the people in your life that are important to you.", + "url": "https://web.groupme.com/signin", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var a=document.querySelectorAll(\".badge-count\"),b=0;for(i=0;i=1?rambox.setUnreadCount(a):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "To enable desktop notifications, you have to go to Options inside GroupMe. To count unread messages, be sure to be in Chats.", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "guilded", + "logo": "guilded.png", + "name": "Guilded", + "description": "Guilded upgrades your group chat and equips your server with integrated event calendars, forums, and more – 100% free.", + "url": "https://www.guilded.gg/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "hangouts", + "logo": "hangouts.png", + "name": "Hangouts", + "description": "Hangouts bring conversations to life with photos, emoji, and even group video calls for free. Connect with friends across computers, Android, and Apple devices.", + "url": "https://hangouts.google.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": true, + "js_unread": "function checkUnread(){updateBadge(document.getElementById(\"hangout-landing-chat\").lastChild.contentWindow.document.body.getElementsByClassName(\"ee\").length)}function updateBadge(e){e>=1?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3000);window.trustedTypes&&window.trustedTypes.createPolicy&&window.trustedTypes.createPolicy(\"default\",{createHTML:(e,t)=>e});", + "userAgent": "", + "note": "", + "titleBlink": true, + "custom_domain": false + }, + { + "id": "hangoutschat", + "logo": "hangoutschat.png", + "name": "Google Chat", + "description": "A messaging platform built for teams.", + "url": "https://chat.google.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){if(document.querySelectorAll(\".akt .XU\").length>0){let e=0;document.querySelectorAll(\".akt .XU\").forEach(t=>e+=t.innerText&&parseInt(t.innerText)),updateBadge(e)}else updateBadge(document.querySelectorAll(\".SSPGKf.EyyDtb.Q6oXP:not(.oCHqfe) .PIw6Oe.EdWvwd.FVKzAb .SaMfhe.m9MHid\").length||0)}function updateBadge(e){1<=e?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3),window.trustedTypes&&window.trustedTypes.createPolicy&&window.trustedTypes.createPolicy(\"default\",{createHTML:(e,t)=>e});", + "userAgent": "", + "note": "", + "titleBlink": true, + "custom_domain": false + }, + { + "id": "hibox", + "logo": "hibox.png", + "name": "Hibox", + "description": "Hibox is a secure and private messaging platform for your business.", + "url": "https://app.hibox.co/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "honeypot", + "logo": "honeypot.png", + "name": "Honeypot.io", + "description": "Europe's developer-focused job platform for Software Developers, DevOps Engineers and Engineering Leaders. Get access to top tech jobs in Germany and the Netherlands!\"", + "url": "https://app.honeypot.io/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "hootsuite", + "logo": "hootsuite.png", + "name": "Hootsuite", + "description": "Enhance your social media management with Hootsuite, the leading social media dashboard. Manage multiple networks and profiles and measure your campaign results.", + "url": "https://hootsuite.com/dashboard", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "horde", + "logo": "horde.png", + "name": "Horde", + "description": "Horde is a free and open source web-based groupware.", + "url": "___", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var e=document.getElementsByClassName(\"count\"),t=0;for(i=0;i=1?document.title=\"(\"+e+\") \"+originalTitle:document.title=originalTitle}var originalTitle=document.title;setInterval(checkUnread,3000);", + "userAgent": "", + "note": "To enable desktop notifications and automatic mail check, you have to go to Options inside Horde.", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "hushmail", + "logo": "hushmail.png", + "name": "Hushmail", + "description": "Web-based email service offering PGP-encrypted e-mail and vanity domain service. Hushmail offers \"free\" and \"paid\" versions of service. Hushmail uses OpenPGP standards and the source is available for download.", + "url": "https://www.hushmail.com/hushmail/index.php", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "icloudmail", + "logo": "icloudmail.png", + "name": "iCloud Mail", + "description": "iCloud makes sure you always have the latest versions of your most important things — documents, photos, notes, contacts, and more — on all your devices. It can even help you locate a missing iPhone, iPad, iPod touch or Mac.", + "url": "https://www.icloud.com/#mail", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){updateBadge(document.querySelector(\".current-app\").querySelector(\".sb-badge\").style.display===\"none\"?0:parseInt(document.querySelector(\".current-app\").querySelector(\".text\").innerHTML.trim()))}function updateBadge(a){a>=1?rambox.setUnreadCount(a):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "icq", + "logo": "icq.png", + "name": "ICQ", + "description": "ICQ is an open source instant messaging computer program that was first developed and popularized.", + "url": "https://web.icq.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){updateBadge(parseInt(\"block\"===document.getElementsByClassName(\"nwa-msg-counter\")[0].style.display?document.getElementsByClassName(\"nwa-msg-counter\")[0].innerHTML.trim():0))}function updateBadge(e){1<=e?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "inbox", + "logo": "inbox.png", + "name": "Inbox", + "description": "Inbox by Gmail is a new app from the Gmail team. Inbox is an organized place to get things done and get back to what matters. Bundles keep emails organized.", + "url": "http://inbox.google.com/?cid=imp", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var e=document.querySelector(\".aim .aio\").querySelector(\"span\").querySelector(\"a\").getAttribute(\"aria-label\").replace(/\\D/g,\"\");updateBadge(e?parseInt(e):0)}function updateBadge(e){1<=e?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "Please be sure to sign out of Hangouts inside Inbox, as it causes problems. Read more...", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "instagramdirect", + "logo": "instagramdirect.png", + "name": "Instagram Direct", + "description": "A simple, fun & creative way to capture, edit & share photos, videos & messages with friends & family.", + "url": "https://www.instagram.com/direct/inbox/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": true, + "js_unread": "function checkUnread(){var e=0;\"(\"===document.title[0]&&(e=parseInt(document.title.match(/\\(([^)]+)\\)/)[1])),updateBadge(e)}function updateBadge(e){0 0 ? \"(\" + a + \") \" + original_title : original_title}const original_title = document.title;setInterval(check_unread, 3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "kezmo", + "logo": "kezmo.png", + "name": "Kezmo", + "description": "Kezmo is an enterprise chat and collaboration tool to help teams get things done. It’s an email alternative for secure team communication.", + "url": "https://app.kezmo.com/web/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "kiwi", + "logo": "kiwi.png", + "name": "Kiwi IRC", + "description": "KiwiIRC makes Web IRC easy. A hand-crafted IRC client that you can enjoy. Designed to be used easily and freely.", + "url": "https://kiwiirc.com/nextclient", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "kiwi.plugin(\"ramboxAdditions\",function(o,n){\"undefined\"!=typeof rambox&&o.on(\"buffer.new\",function(n){n.buffer.flags=new Proxy(n.buffer.flags,{set:function(n,f,r){if(n[f]=r,\"unread\"==f){var e=0;o.state.networks.forEach(function(n){n.buffers.forEach(function(n){e+=n.flags.unread})}),0{parseInt(n.innerText)&&(e+=parseInt(n.innerText))}),updateBadge(parseInt(e))}function updateBadge(e){e&&e>=1?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "lounge", + "logo": "lounge.png", + "name": "The Lounge", + "description": "Self-hosted web IRC client.", + "url": "___", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var a=document.getElementsByClassName(\"badge highlight\"),b=0;for(i=0;i=1?document.title=\"(\"+a+\") \"+originalTitle:document.title=originalTitle}var originalTitle=document.title;setInterval(checkUnread,1e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "mailru", + "logo": "mailru.png", + "name": "Mail.ru", + "description": "Mail.ru mail is the largest free mail, fast and convenient interface, unlimited mailbox volume, reliable protection against spam and viruses, mobile version and applications for smartphones. Access via IMAP, SMS notifications, interface in different languages ​​and Mail themes. Also on Mail.ru: news, Internet search, auto, sports, games, dating, weather, work.", + "url": "https://e.mail.ru/inbox/", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "mastodon", + "logo": "mastodon.png", + "name": "Mastodon", + "description": "Mastodon is a free, open-source social network server. A decentralized solution to commercial platforms, it avoids the risks of a single company monopolizing your communication. Anyone can run Mastodon and participate in the social network seamlessly.", + "url": "https://mastodon.social/auth/sign_in", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": true + }, + { + "id": "mattermost", + "logo": "mattermost.png", + "name": "Mattermost", + "description": "Mattermost is an open source, self-hosted Slack-alternative. As an alternative to proprietary SaaS messaging, Mattermost brings all your team communication into one place, making it searchable and accessible anywhere.", + "url": "___", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){let e=document.querySelectorAll(\".badge\"),n=document.querySelectorAll(\".SidebarChannel.unread, .TeamIcon.unread\").length,a=0;e.forEach(e=>{\"unreadMentions\"===e.id&&(a+=parseInt(e.innerText))}),updateBadge(n,a)}function updateBadge(e,n){var a=0t.querySelector(\".lrazzd5p\")&&(e+=1)),updateBadge(e)}function updateBadge(e){rambox.setUnreadCount(e)}setInterval(checkUnread,3e3);", + "userAgent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Rambox/1.5.2 Chrome/83.0.4103.122 Safari/537.36", + "note": "'To enable desktop notifications, you have to go to Options inside Messenger.'", + "titleBlink": true, + "custom_domain": false + }, + { + "id": "messengerpages", + "logo": "messengerpages.png", + "name": "Messenger for Pages", + "description": "Chat with the people of your Facebook Page.", + "url": "https://facebook.com/___/inbox/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var e=document.querySelector(\"iframe\")?document.querySelector(\"iframe\").contentDocument.querySelectorAll(\"#content ._8fg6\"):document.querySelectorAll(\"#content ._6idk._6idh\");a=e[0]?parseInt(e[0].innerText):0,b=e[1]?parseInt(e[1].innerText):0,updateBadge(a+b)}function updateBadge(e){1<=e?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": true + }, + { + "id": "mightytext", + "logo": "mightytext.png", + "name": "Mighty Text", + "description": "Text from your computer, sync\\'d with your Android phone & number.", + "url": "https://mightytext.net/web/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "missive", + "logo": "missive.png", + "name": "Missive", + "description": "Collaborative email and threaded group chat for productive teams. A single app for all your internal and external communication.", + "url": "https://mail.missiveapp.com/login", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var e=document.getElementsByClassName(\"unseen-count\"),t=0;for(i=0;i=1?document.title=\"(\"+e+\") \"+originalTitle:document.title=originalTitle}var originalTitle=document.title;setInterval(checkUnread,3000);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "movim", + "logo": "movim.png", + "name": "Movim", + "description": "Movim is a decentralized social network, written in PHP and HTML5 and based on the XMPP standard protocol.", + "url": "https://___.movim.eu/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var a=document.getElementsByClassName(\"color dark\"),b=0;for(i=0;i=1?document.title=\"(\"+a+\") \"+originalTitle:document.title=originalTitle}var originalTitle=document.title;setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": true + }, + { + "id": "mysms", + "logo": "mysms.png", + "name": "mysms", + "description": "The mysms family of applications helps you text anywhere and enhances your messaging experience on your smartphone, tablet and computer.", + "url": "https://app.mysms.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var e=document.getElementsByClassName(\"unread\"),t=0;for(i=0;i=1?document.title=\"(\"+e+\") \"+originalTitle:document.title=originalTitle}\"https://app.mysms.com/#login\"===document.baseURI&&(document.getElementsByClassName(\"innerPanel\")[0].rows[0].style.display=\"none\",document.getElementsByClassName(\"innerPanel\")[0].rows[1].cells[0].firstElementChild.style.display=\"none\",document.getElementsByClassName(\"msisdnLoginPanel\")[0].style.display=\"inline\");var originalTitle=document.title;setInterval(checkUnread,3000);", + "userAgent": "", + "note": "You have to use this service by signing in with your mobile number.", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "noysi", + "logo": "noysi.png", + "name": "Noysi", + "description": "Noysi is a communication tool for teams where privacy is guaranteed. With Noysi you can access all your conversations and files in seconds from anywhere and unlimited.", + "url": "https://noysi.com/site-en/sign-in", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "okru", + "logo": "okru.png", + "name": "OK.RU", + "description": "Entertaining social network - communication with friends, photos and videos, movies and TV Series, music, games and groups.", + "url": "https://ok.ru/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "openmailbox", + "logo": "openmailbox.png", + "name": "Openmailbox", + "description": "Free mail hosting. Respect your rights and your privacy.", + "url": "https://app.openmailbox.org/", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "outlook", + "logo": "outlook.png", + "name": "Outlook", + "description": "Take control. Do more. Outlook is the free email and calendar service that helps you stay on top of what matters and get things done.", + "url": "https://mail.live.com/", + "type": "email", + "allow_popups": false, + "manual_notifications": true, + "js_unread": "function checkUnread(){const e=document.querySelector(\".ms-FocusZone [role=tree] i[data-icon-name=Inbox]\").parentNode.parentNode.lastElementChild,n=document.querySelectorAll(\".ms-FocusZone [role=tree]\")[1].children[1].querySelector(\"span span\"),t=e?e.innerText:n?n.innerText:0;updateBadge(parseInt(t,10)||0)}function updateBadge(e){1<=e?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "outlook365", + "logo": "outlook365.png", + "name": "Outlook 365", + "description": "Outlook for Business", + "url": "https://outlook.office.___/owa/", + "type": "email", + "allow_popups": false, + "manual_notifications": true, + "js_unread": "function checkUnread(){var e=null!==document.querySelector(\".ms-FocusZone i[data-icon-name=Inbox]\").parentNode.parentNode.querySelector(\"span span\")?parseInt(document.querySelector(\".ms-FocusZone i[data-icon-name=Inbox]\").parentNode.parentNode.querySelector(\"span span\").innerText):0;updateBadge(\"\"===e?0:parseInt(e))}function updateBadge(e){1<=e?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "Please insert the cloud region you want to use. Can be \"com\", \"de\", etc.", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "protonmail", + "logo": "protonmail.png", + "name": "ProtonMail", + "description": "Free and web-based encrypted email service founded in 2013 at the CERN research facility. ProtonMail is designed as a zero-knowledge system, using client-side encryption to protect emails and user data before they are sent to ProtonMail servers, in contrast to other common webmail services such as Gmail and Hotmail.", + "url": "https://mail.protonmail.com/inbox", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "protonmailch", + "logo": "protonmailch.png", + "name": "ProtonMail CH", + "description": "Free and web-based encrypted email service founded in 2013 at the CERN research facility. ProtonMail is designed as a zero-knowledge system, using client-side encryption to protect emails and user data before they are sent to ProtonMail servers, in contrast to other common webmail services such as Gmail and Hotmail.", + "url": "https://app.protonmail.ch/inbox", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "Read HERE to see the differences between protonmail.com and protonmail.ch.", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "pushbullet", + "logo": "pushbullet.png", + "name": "Pushbullet", + "description": "Pushbullet connects your devices, making them feel like one.", + "url": "https://www.pushbullet.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "rainloop", + "logo": "rainloop.png", + "name": "RainLoop", + "description": "RainLoop Webmail - Simple, modern & fast web-based email client.", + "url": "___", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var a=document.querySelectorAll(\".e-item .e-link:not(.hidden) .badge.pull-right.count\"),b=0;for(i=0;i=1?document.title=\"(\"+a+\") \"+originalTitle:document.title=originalTitle}var originalTitle=document.title;setInterval(checkUnread,1e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "reddit", + "logo": "reddit.png", + "name": "Reddit Chat", + "description": "Reddit gives you the best of the internet in one place. Get a constantly updating feed of breaking news, fun stories, pics, memes, and videos just for you.", + "url": "https://www.reddit.com/chat", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "riot", + "logo": "riot.png", + "name": "Riot", + "description": "Riot is now Element.io.", + "url": "https://riot.im/app/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": true + }, + { + "id": "rocketchat", + "logo": "rocketchat.png", + "name": "Rocket Chat", + "description": "From group messages and video calls all the way to helpdesk killer features our goal is to become the number one cross-platform open source chat solution.", + "url": "___", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "roundcube", + "logo": "roundcube.png", + "name": "Roundcube", + "description": "Free and open source webmail software for the masses, written in PHP.", + "url": "___", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "ryver", + "logo": "ryver.png", + "name": "Ryver", + "description": "Ryver is a team communication tool that organizes team collaboration, chats, files, and even emails into a single location, for any size team, for FREE.", + "url": "https://___.ryver.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){updateBadge(parseInt(document.getElementsByClassName(\"scene-space-tab-button--flash\").length))}function updateBadge(a){a>=1?rambox.setUnreadCount(a):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "sandstorm", + "logo": "sandstorm.png", + "name": "Sandstorm", + "description": "Sandstorm is a self-hostable web productivity suite.", + "url": "https://oasis.sandstorm.io/", + "type": "messaging", + "allow_popups": true, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": true + }, + { + "id": "simplenote", + "logo": "simplenote.png", + "name": "Simplenote", + "description": "The simplest way to keep notes. Light, clean, and free. Simplenote is now available for iOS, Android, Mac, and the web.", + "url": "https://app.simplenote.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "skype", + "logo": "skype.png", + "name": "Skype", + "description": "Stay in touch with family and friends for free. Get international calling, free online calls and Skype for Business on desktop and mobile.", + "url": "https://web.skype.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "Mozilla/5.0 (X11; Fedora; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", + "note": "Text and Audio calls are supported only. Be sure to disable Links Previews to make them work. Read more...", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "slack", + "logo": "slack.png", + "name": "Slack", + "description": "Slack brings all your communication together in one place. It’s real-time messaging, archiving and search for modern teams.", + "url": "https://___.slack.com", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){if(document.querySelector(\".p-download_modal__body .p-download_modal__close\")&&document.querySelector(\".p-download_modal__body .p-download_modal__close\").click(),-1!==location.host.indexOf(\"slack.com\")){var e=document.querySelectorAll(\".p-channel_sidebar__channel--unread:not(.p-channel_sidebar__channel--muted)\").length,n=0;document.querySelectorAll(\".p-channel_sidebar__badge:not(.p-channel_sidebar__link_count)\").forEach(e=>{n+=isNaN(parseInt(e.innerHTML))?0:parseInt(e.innerHTML)}),updateBadge(e,n)}}function updateBadge(e,n){var o=0=1?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "squirrelmail", + "logo": "squirrelmail.png", + "name": "SquirrelMail", + "description": "SquirrelMail is a standards-based webmail package written in PHP.", + "url": "___", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var e=document.getElementsByClassName(\"leftunseen\"),t=0;for(i=0;i=1?document.title=\"(\"+e+\") \"+originalTitle:document.title=originalTitle}var originalTitle=document.title;setInterval(checkUnread,3000);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "steam", + "logo": "steam.png", + "name": "Steam", + "description": "Steam is a digital distribution platform developed by Valve Corporation offering digital rights management (DRM), multiplayer gaming and social networking services.", + "url": "https://steamcommunity.com/chat", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "CTitleManager.UpdateTitle = function(){};function checkUnread(){var e=document.getElementsByClassName(\"unread_message_count_value\"),t=0;for(i=0;i=1?document.title=\"(\"+e+\") \"+originalTitle:document.title=originalTitle}var originalTitle=document.title;setInterval(checkUnread,3000);", + "userAgent": "", + "note": "To enable desktop notifications, you have to go to Options inside Steam Chat.", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "swello", + "logo": "swello.png", + "name": "Swello", + "description": "Schedule your posts with love. Save time and manage your social media strategy easily.", + "url": "https://swello.com/dashboard/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "sync", + "logo": "sync.png", + "name": "Sync", + "description": "Sync is a business chat tool that will boost productivity for your team.", + "url": "https://m.wantedly.com/login", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "tawkto", + "logo": "tawkto.png", + "name": "Tawk.to", + "description": "tawk.to is a free live chat app that lets you monitor and chat with visitors on your website or from a free customizable page", + "url": "https://dashboard.tawk.to", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){let e=0;document.querySelectorAll(\"#main-nav .badge\").forEach(n=>{parseInt(n.innerText)&&(e+=parseInt(n.innerText))}),updateBadge(e)}function updateBadge(e){e&&e>=1?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "teams", + "logo": "teams.png", + "name": "Teams", + "description": "Microsoft Teams is the chat-based workspace in Office 365 that integrates all the people, content, and tools your team needs to be more engaged and effective.", + "url": "https://teams.microsoft.com", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var e=0;\"(\"===document.title[0]&&(e=parseInt(document.title.match(/\\(([^)]+)\\)/)[1])),updateBadge(e)}function updateBadge(e){0 0 ? document.getElementsByClassName(\"sidebar-notification-indicator\")[0].innerHTML : 0))}function updateBadge(a){a>=1?rambox.setUnreadCount(a):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "telegram", + "logo": "telegram.png", + "name": "Telegram", + "description": "Telegram is a messaging app with a focus on speed and security. It’s super-fast, simple, secure and free.", + "url": "https://web.telegram.org/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){let e=0;if([\"https://web.telegram.org/k/\",\"https://webk.telegram.org/\"].includes(location.href)){const t=document.querySelectorAll(\".badge.unread\"),a=document.querySelectorAll(\".chatlist .is-muted .badge.unread\");t.forEach(t=>{\"\"!==t.innerText&&(e+=parseInt(t.innerText))}),a.forEach(t=>{\"\"!==t.innerText&&(e-=parseInt(t.innerText))}),updateBadge(e)}else if([\"https://web.telegram.org/z/\",\"https://webz.telegram.org/\"].includes(location.href))document.querySelectorAll(\".Badge.unread:not(.muted)\").forEach(t=>e+=parseInt(t.innerText)),updateBadge(e);else{const t=document.getElementsByClassName(\"im_dialog_badge badge\");for(i=0;i=1?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "threema", + "logo": "threema.png", + "name": "Threema", + "description": "Seriously secure messaging.", + "url": "https://web.threema.ch/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "(function () { let unreadCount = 0; function checkUnread() { let newUnread = 0; try { let webClientService = angular.element(document.documentElement).injector().get(\\'WebClientService\\'); let conversations = webClientService.conversations.conversations; conversations.forEach(function(conversation) { newUnread += conversation.unreadCount; }); } catch (e) { } if (newUnread !== unreadCount) { unreadCount = newUnread; updateBadge(unreadCount); } } function updateBadge(count) { if (count && count >= 1) { rambox.setUnreadCount(count); } else { rambox.clearUnreadCount(); } } setInterval(checkUnread, 3000); checkUnread(); })();", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "tutanota", + "logo": "tutanota.png", + "name": "Tutanota", + "description": "Tutanota is an open-source end-to-end encrypted email software and freemium hosted secure email service based on this software.", + "url": "https://mail.tutanota.com", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){let e=0;document.querySelectorAll(\".folder-counter.z2\").forEach(n=>{!n.parentElement.previousSibling&&parseInt(n.innerText)&&(e+=parseInt(n.innerText))}),updateBadge(e)}function updateBadge(e){e&&e>=1?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "tweetdeck", + "logo": "tweetdeck.png", + "name": "TweetDeck", + "description": "TweetDeck is a social media dashboard application for management of Twitter accounts.", + "url": "https://tweetdeck.twitter.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "typetalk", + "logo": "typetalk.png", + "name": "Typetalk", + "description": "Typetalk brings fun and ease to team discussions through instant messaging on desktop and mobile devices.", + "url": "https://typetalk.com/signin", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "vk", + "logo": "vk.png", + "name": "VK Messenger", + "description": "Simple and Easy App for Messaging on VK.", + "url": "https://vk.com/im", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){updateBadge(parseInt(document.getElementById(\"l_msg\").innerText.replace(/\\D+/g,\"\")))}function updateBadge(a){a>=1?rambox.setUnreadCount(a):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "voxer", + "logo": "voxer.png", + "name": "Voxer", + "description": "Voxer is a messaging app for your smartphone with live voice (like a PTT walkie talkie), text, photo and location sharing.", + "url": "https://web.voxer.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "wechat", + "logo": "wechat.png", + "name": "WeChat", + "description": "WeChat is a free messaging calling app that allows you to easily connect with family; friends across countries. It’s the all-in-one communications app for free text (SMS/MMS), voice; video calls, moments, photo sharing, and games.", + "url": "https://web.wechat.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){let e=0;document.querySelectorAll(\"div.chat_item\").forEach(t=>{const n=t.querySelector(\"i.web_wechat_reddot_middle\");n&&n.innerText&&(e+=parseInt(n.innerText))}),updateBadge(e)}function updateBadge(e){e&&e>=1?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "whatsapp", + "logo": "whatsapp.png", + "name": "WhatsApp", + "description": "WhatsApp is a cross-platform mobile messaging app for iPhone, BlackBerry, Android, Windows Phone and Nokia. Send text, video, images, audio for free.", + "url": "https://web.whatsapp.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){const e=document.querySelectorAll(\"#pane-side ._1pJ9J:not(._2XH9R)\");let t=0;for(let n=0;n=1?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3),(async()=>{try{const e=await window.navigator.serviceWorker.getRegistrations();for(const t of e)t.unregister()}catch(e){}})();var titleEl=document.querySelector(\".landing-title.version-title\");titleEl&&titleEl.innerHTML.includes(\"Google Chrome 60+\")&&window.location.reload(),document.body.scrollTop=0;", + "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "whatsappbusiness", + "logo": "whatsappbusiness.png", + "name": "Whatsapp Business", + "description": "WhatsApp Messenger: More than 2 billion people in over 180 countries use WhatsApp to stay in touch with friends and family, anytime and anywhere. WhatsApp is free and offers simple, secure, reliable messaging and calling, available on phones all over the world.", + "url": "https://web.whatsapp.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){const e=document.querySelectorAll(\"#pane-side ._1pJ9J:not(._2XH9R)\");let t=0;for(let n=0;n=1?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3),(async()=>{try{const e=await window.navigator.serviceWorker.getRegistrations();for(const t of e)t.unregister()}catch(e){}})();var titleEl=document.querySelector(\".landing-title.version-title\");titleEl&&titleEl.innerHTML.includes(\"Google Chrome 60+\")&&window.location.reload(),document.body.scrollTop=0;", + "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "wire", + "logo": "wire.png", + "name": "Wire", + "description": "HD quality calls, private and group chats with inline photos, music and video. Also available for your phone or tablet.", + "url": "https://app.wire.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "workplace", + "logo": "workplace.png", + "name": "Workplace", + "description": "Connect everyone in your company and turn ideas into action. Through group discussion, a personalised News Feed, and voice and video calling, work together and get more done. Workplace is an ad-free space, separate from your personal Facebook account.", + "url": "https://___.facebook.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "xender", + "logo": "xender.png", + "name": "Xender", + "description": "Xender can transfer and share any type of files, from photos, documents, to music, videos, even apps without mobile data usage.", + "url": "http://web.xender.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "xing", + "logo": "xing.png", + "name": "XING", + "description": "Career-oriented social networking.", + "url": "https://www.xing.com/messages/conversations", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "(function() { let originalTitle = document.title; function checkUnread() { let count = null; let notificationElement = document.querySelector(\\'[data-update=\"unread_conversations\"]\\'); if (notificationElement && notificationElement.style.display !== \\'none\\') { count = parseInt(notificationElement.textContent.trim(), 10); } updateBadge(count); } function updateBadge(count) { if (count && count >= 1) { rambox.setUnreadCount(count); } else { rambox.clearUnreadCount(); } } setInterval(checkUnread, 3000); checkUnread(); })();", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "yahoo", + "logo": "yahoo.png", + "name": "Yahoo! Mail", + "description": "Web-based email service offered by the American company Yahoo!. The service is free for personal use, and paid-for business email plans are available.", + "url": "https://mail.yahoo.com/", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "To enable desktop notifications, you have to go to Options inside Yahoo! Mail.", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "yandex", + "logo": "yandex.png", + "name": "Yandex Mail", + "description": "Yandex is a free webmail service with unlimited mail storage, protection from viruses and spam, access from web interface, etc.", + "url": "https://mail.yandex.com/", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var t=parseInt($(\".mail-MessagesFilters-Item_unread .mail-LabelList-Item_count\").html());updateBadge(isNaN(t)?0:t)}function updateBadge(a){a>=1?rambox.setUnreadCount(a):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "zimbra", + "logo": "zimbra.png", + "name": "Zimbra", + "description": "Over 500 million people rely on Zimbra and enjoy enterprise-class open source email collaboration at the lowest TCO in the industry. Discover the benefits!", + "url": "___", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function check_unread(){update_badge(appCtxt.getById(ZmFolder.ID_INBOX).numUnread)}function update_badge(a){document.title=a>0?\"(\"+a+\") \"+original_title:original_title}const original_title=document.title;setInterval(check_unread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "zinc", + "logo": "zinc.png", + "name": "Zinc", + "description": "One platform for all communication while on the job. Pick the mode—Message, Voice, Video or Push to Talk—to communicate in real time.", + "url": "https://zinc-app.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "zohocliq", + "logo": "zohocliq.png", + "name": "Zoho Cliq", + "description": "oho Cliq, a team communication app powers business productivity by organizing people, conversations & workflows in one single place. Sign up now!", + "url": "https://accounts.zoho.com/signin?servicename=ZohoChat&signupurl=https://www.zoho.com/cliq/signup.html", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){const e=document.getElementsByClassName(\"LHS-count\");let n=0;for(let t of e)\"totalunreadcount\"===t.id&&parseInt(t.innerText)&&(n+=parseInt(t.innerText));updateBadge(n)}function updateBadge(e){e&&e>=1?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "zohoemail", + "logo": "zohoemail.png", + "name": "Zoho Email", + "description": "Ad-free business Email Hosting with a clean, minimalist interface. Integrated Calendar, Contacts, Notes, Tasks apps.", + "url": "https://mail.zoho.com/", + "type": "email", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var e=document.querySelector(\".zmTreeCount\").innerText;updateBadge(e?parseInt(e):0)}function updateBadge(e){1<=e?rambox.setUnreadCount(e):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + }, + { + "id": "zulip", + "logo": "zulip.png", + "name": "Zulip", + "description": "The world's most productive group chat.", + "url": "https://___.zulipchat.com", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": true + }, + { + "id": "zyptonite", + "logo": "zyptonite.png", + "name": "Zyptonite", + "description": "Zyptonite is the ultimate cyber secure communication tool for enterprise customers designed to address the need to securely communicate via voice, video, and chat, and transfer files and information across a global mobile workforce.", + "url": "https://app.zyptonite.com/", + "type": "messaging", + "allow_popups": false, + "manual_notifications": false, + "js_unread": "function checkUnread(){var a=document.getElementsByClassName(\"z-messages\"),b=0;for(i=0;i=1?rambox.setUnreadCount(a):rambox.clearUnreadCount()}setInterval(checkUnread,3e3);", + "userAgent": "", + "note": "", + "titleBlink": false, + "custom_domain": false + } +] diff --git a/screenselector.html b/screenselector.html index 61c43a955..6b64de86a 100644 --- a/screenselector.html +++ b/screenselector.html @@ -1,22 +1,272 @@ - - - - -
-
    -
  • Entire Screen
  • -
  • Window
  • -
-
-
    -
    - -
    - - + + + + +
    +
      +
    • Entire screen
    • +
    • Window
    • +
    +
    +
      +
      + +
      + +