From 6a4c38134d77db9a5dc35b4a1a93a26c126cea6e Mon Sep 17 00:00:00 2001 From: Nick Denry Date: Fri, 26 Apr 2019 03:30:50 +0300 Subject: [PATCH] Better KISS support --- images/envelope@2x.png | Bin 0 -> 5280 bytes images/icon.png | Bin 1355 -> 1150 bytes images/icon@2x.png | Bin 0 -> 1531 bytes images/logo.png | Bin 0 -> 8038 bytes images/logo@2x.png | Bin 0 -> 13446 bytes index.html | 23 +++-- main.js | 17 ++- renderer.js | 229 +++++++++++++++++++++++++++++++---------- 8 files changed, 203 insertions(+), 66 deletions(-) create mode 100644 images/envelope@2x.png create mode 100644 images/icon@2x.png create mode 100644 images/logo.png create mode 100644 images/logo@2x.png diff --git a/images/envelope@2x.png b/images/envelope@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..98024bc1f546ab4117b3753e66fab6f89416cbce GIT binary patch literal 5280 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 delta 1324 zcmV+{1=ITe2+In8iBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVE_OF&U#c> zbW&k=AaHVTW@&6?Aar?fWgumEX=VTbc-q~UU3&8<42ADm#Vi3yh@a(Pex7G`Fw36< z#!llVZIiDzGodwD5eK1HrmkuK{N2r8_^@@}I1SM!?=3!mF1f@RgJ}29-jj9nx^C<- zxU-w{3x-M1%YN(I^3SmAZ9;I%zTMkRC`%_Up+k8I%2=5(SblK{3Ga4V_a?1**?ri~ z`js#xPUq{r3rI#)7=;ZtA+flQi7bdfl4SG_R~Chn6~WlyZdlUe+?jKDN!~fSz9LnzvO7yNgwBKX6QogSo!XY7S1I;<*xS{dvE*hvh&E4H)~VJR^|wf8&WBA znnxR=igB1Np+#)5An6q}H?(3X5hL53997EHsm;DnL5PkU2lUK^W!jb%{(%HzSB;j-bd*Y*?8s(aq%cXgfYmC zE4%=N`pT)!{LW@R)Q$ZBRzOf^nj`LLMXdWJJ#5cmn}aCAz55#}H#oF(*!fBTSP| z!K9c{${CAhNN3E>@W^@NO*Xgb=C`oLEp54=e2Obtd(X7 zTe)<9_?q8{=3eOW>fiNebmn7tZ}$kooKf&$cH|U4conjBjzaPQZ$pPQ$ZpMeO4?y% zQ|HiPGjpU(Q!7??>kGZvWolV6nec+6hq&nX;%lyXYx2{GF6!@yn?Kst(})Q_Kqw_|s_i zI{JlZUdqvT(V9Kn!+ak4?kJ%cE|vGB;7t5UMgE}wzX%E5lkmT-`4^pYt?pt2WFnB0 z2?H~K04g1b_}!=g0090;L_t(I%gvL&N&`UX>2zF4v#ycBKJVort#E&0gr&b2(7my)>VIy2dGE`7-z)*?mbqe zk@p9l4o-jvkNyalZ2;9D310uHrC<(Jw*kmUGSIwep9boi*&jf~boPPIf~|cyj~^gN z3wSO7B!V=(YYa`)2im|b@Vy4G2V4Rpo5tNtSkhf)aRE$#GEf8VoPNIX65Tuw1i1nq iP}Q6Fm*HYJKin^s`$9-)Xm39N0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=K7lH({0hTl2G9sx-RiQ`}cRda(q{{CRv>7;w6 zYG>zR9|9GFW$_F2fs=&(_m2_&LZKotBsI?^=ZKO@DqPX=c$KTAnAUX_KKC~S@HTF(A_Jo^xT zy-$W@G=-jU;4UN)SD#S?Gms(`ZNimB`LfpOg{z8upSy5(Uy^tCUUC=fw##!WLd@GC zzvO7!Nnh-8hvBCg(IfKH1Cu+%m)wofe2jjruBMDk<**m^v6R(=oeeGX$+B!N#)Z!XCCy5M4R~4*2bB}l z1ZKYHLMv`r@lJ9?ZUj#zh!IA7so^{0@6=mpjJb7*qTji~ym;f*`OvzxmYuZ4@?6{aN@3&l$*wIXPRbj9cj zk6I5tNsXkMq7jnO*Mw{9smX@DAsKIRZAwlzXqLUejaUu}6NdOy~C$s33 z5>IlISuBi0p$uxI6HcQ^3y{D4^000SaNLh0L02U;o0R8T<$-$Lht-ZK=9n2csTFV#_}#KgLz0i#fhSGb9Fs0*8O z82`O9)f1c1f)99ri@1sx@muTl4&A;d+0nQbY2Jq6naovVEH>g6-eOB+qi~GH!-(e4 zcG!2ray$uX3@DOp--y^n^y%QU!|*@;L$9I;AH`$*SmN_Ta1TvIkZr(wtSHmZui>XY zZ^9>V9bFUDfonLJC)v8#npP$9wrKe5>ogZPR4>sftI-U z&V%r548s0|8LNr=>pbM}H!hd(q2I!qAloH1+3BIRMTz}3;osC`yF^=fDSCrcsKRaR zNlmyhHu!0Y{Z5Lk%}VKXesoydb6695aX&!;`kbz1c!T4KrO>)X-od_d9aUp4&V~$j zr;0!ZlS2+O%NcJr#aDm8Q_RV+Vs4Cglr??SU_mrDZ}1Yw@N*9Pt(qX@t4$eo! z?_nnF}Os31H;e4y!+rPOpX5aQ7p>8u%v^d&X^!PrO27C zN9g@j=>0|L{ik;5eOwTpSQOcbk=9o954~RqB6maYL=`S}OgCd&sq3JW&)q#0$Bz}no hzDWfYR8T?L_y|tMp(R1~uRQ<&002ovPDHLkV1mOx>wo|N literal 0 HcmV?d00001 diff --git a/images/logo.png b/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..df795479b092a73e0d2809eeb3ff45490c6a2977 GIT binary patch literal 8038 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 NOBEgE+7~tv{}15RQz8HW literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 8279bce..e0c9087 100644 --- a/index.html +++ b/index.html @@ -5,11 +5,12 @@ Chimeverse +
-
+

Welcome to Chimeverse

@@ -21,7 +22,7 @@
- +
@@ -48,13 +49,19 @@
- - -
-

Chimeverse

-
- + + +
+
+ +

Chimeverse

+ +
+
diff --git a/main.js b/main.js index 222fb61..abd4c56 100644 --- a/main.js +++ b/main.js @@ -13,6 +13,9 @@ function initApp() { createWindow(); tray.on('click', function() { hideEnvelope(); + if (mainWindow === null) { + createWindow(); + } mainWindow.show(); }); } @@ -54,7 +57,10 @@ app.on('ready', initApp) app.on('window-all-closed', function () { // On macOS it is common for applications and their menu bar // to stay active until the user quits explicitly with Cmd + Q - if (process.platform !== 'darwin') app.quit() + // if (process.platform !== 'darwin') + // ^^^^ NOPE ;) + // Quit ANYWAY + app.quit() }) app.on('activate', function () { @@ -66,6 +72,12 @@ app.on('activate', function () { // In this file you can include the rest of your app's specific main process // code. You can also put them in separate files and require them here. +// Allow to play audio automatically +app.commandLine.appendSwitch('autoplay-policy', 'no-user-gesture-required'); + +/** + * Export functions + */ function showEnvelope() { tray.setImage('./images/envelope.png') } @@ -74,4 +86,5 @@ function hideEnvelope() { tray.setImage('./images/icon.png') } -exports.showEnvelope = showEnvelope; \ No newline at end of file +exports.showEnvelope = showEnvelope; +exports.hideEnvelope = hideEnvelope; \ No newline at end of file diff --git a/renderer.js b/renderer.js index fd6afc9..e017f83 100644 --- a/renderer.js +++ b/renderer.js @@ -2,68 +2,185 @@ // be executed in the renderer process for that window. // All of the Node.js APIs are available in this process. -const keytar = require('keytar'); -const angular = require('angular'); -const settings = require('electron-settings'); +const angular = require('angular') + +var angApp = angular.module('app', []) -var remote = require('electron').remote; +angApp.factory('SettingsServise', () => { -var angApp = angular.module('app', []); + const keytar = require('keytar') + const settings = require('electron-settings') -angApp.controller('AppController', function ($scope) { - $scope.loginExist = false; - $scope.login = settings.get('login'); + let settingsService = {} - $scope.playAudio = function() { - var audio = new Audio('sounds/graceful.ogg'); - audio.play(); - }; - - if ($scope.login) { - var showEnvelope = remote.require('./main').showEnvelope; - $scope.loginExist = true; - $scope.boshService = settings.get('bosh'); - var xmppService = $scope.login.split('@').pop(); - var password = keytar.getPassword(xmppService, $scope.login); - password.then((result) => { - $scope.password = result; - converse.plugins.add('chimeVerse', { - initialize: function() { - var _converse = this._converse; - Promise.all([ - _converse.api.waitUntil('rosterContactsFetched'), - _converse.api.waitUntil('chatBoxesFetched') - ]).then(function() { - _converse.on('message', function (data) { - //_converse.api.archive.query({'with': 'admin2@localhost'}); - $scope.playAudio(); - showEnvelope(); - }); - }); - } - }); - - var lang = navigator.language; - converse.initialize({ - bosh_service_url: $scope.boshService, - view_mode: 'fullscreen', - jid: $scope.login, - password: $scope.password, - auto_login: true, - whitelisted_plugins: ['chimeVerse'], - i18n: lang - }); - }); + settingsService.getCredentials = () => { + let credentials = {} + credentials.login = settings.get('login') + let promise = new Promise((resolve, reject) => { + if (credentials.login) { + credentials.bosh = settings.get('bosh') + credentials.xmppService = credentials.login.split('@').pop() + let password = keytar.getPassword(credentials.xmppService, credentials.login) + password.then((result) => { + credentials.password = result + resolve(credentials) + }) + } + else { + reject(Error('No login stored')) + } + }) + return promise } -}); -angApp.controller('LoginController', function ($scope) { + settingsService.addCredentials = (bosh, login, password) => { + console.log('sdsad') + let xmppService = login.split('@').pop() + settings.set('bosh', bosh) + settings.set('login', login) + keytar.setPassword(xmppService, login, password) + } + + settingsService.removeCredentials = (login) => { + let xmppService = login.split('@').pop() + passwordDelete = keytar.deletePassword(xmppService, login) + let promise = new Promise((resolve, reject) => { + passwordDelete.then((result) => { + settings.delete('login') + settings.delete('bosh') + resolve() + }, (error) => { + reject(error) + }) + }) + return promise + } + + return settingsService +}) + + +angApp.factory('SystemService', () => { + + const remote = require('electron').remote + + let systemService = {} + + systemService.playAudio = () => { + var audio = new Audio('sounds/graceful.ogg') + audio.play() + } + + systemService.showEnvelope = () => { + remote.require('./main').showEnvelope() + } + + systemService.hideEnvelope = () => { + remote.require('./main').hideEnvelope() + } + + systemService.reloadWindow = () => { + remote.getCurrentWindow().reload() + } + + return systemService + +}) + + +angApp.factory('ChimeVerseService', (SettingsServise, SystemService) => { + + let chimeverseService = {} + + chimeverseService.settings = SettingsServise + chimeverseService.system = SystemService + + console.log(chimeverseService.system) + + chimeverseService._notifyMessage = (data) => { + if (data.message.attributes.sender === 'me') { + chimeverseService.system.hideEnvelope() + return ; + } + if (data.message.attributes.chat_state === 'active') { + chimeverseService.system.playAudio() + chimeverseService.system.showEnvelope() + } + } + + chimeverseService.addChimeVersePluign = () => { + converse.plugins.add('chimeVerse', { + initialize: (event) => { + var _converse = event.properties._converse + Promise.all([ + _converse.api.waitUntil('rosterContactsFetched'), + _converse.api.waitUntil('chatBoxesFetched') + ]).then(() => { + _converse.api.listen.on('logout', () => { + let credentials = SettingsServise.getCredentials() + credentials.then((result) => { + let remove = chimeverseService.settings.removeCredentials(result.login) + remove.then(() => { + chimeverseService.system.reloadWindow() + }) + }) + }) + _converse.api.listen.on('messageAdded', (data) => { + chimeverseService._notifyMessage(data) + }) + _converse.api.listen.on('chatBoxFocused', () => { + chimeverseService.system.hideEnvelope() + }) + }) + } + }) + } + + chimeverseService.initConverse = (bosh, login, password) => { + chimeverseService.addChimeVersePluign() + let lang = navigator.language + converse.initialize({ + bosh_service_url: bosh, + view_mode: 'fullscreen', + jid: login + '/chimeverse', + password: password, + auto_login: true, + whitelisted_plugins: ['chimeVerse'], + i18n: lang, + priority: 50, + debug: true, + auto_reconnect: true + }) + } + + return chimeverseService + +}) + + +angApp.controller('AppController', function ($scope, ChimeVerseService) { + + $scope.showLoginForm = false + $scope.addAccountAction = function() { - var xmppService = $scope.login.split('@').pop(); - settings.set('bosh', $scope.boshService); - settings.set('login', $scope.login); - keytar.setPassword(xmppService, $scope.login, $scope.password); - + ChimeVerseService.settings.addCredentials($scope.bosh, $scope.login, $scope.password) + $scope.showLoginForm = false + ChimeVerseService.initConverse($scope.bosh, $scope.login, $scope.password) } -}); + + $scope.getCredentialsAndLogin = () => { + let credentials = ChimeVerseService.settings.getCredentials() + credentials.then((result) => { + console.log(credentials.bosh) + ChimeVerseService.initConverse(result.bosh, result.login, result.password) + }, (error) => { + console.log(error) + $scope.showLoginForm = true + $scope.$apply() + }) + } + + $scope.getCredentialsAndLogin() + +})