Better KISS support

This commit is contained in:
Nick Denry 2019-04-26 03:30:50 +03:00
parent 0d25765510
commit 6a4c38134d
8 changed files with 203 additions and 66 deletions

BIN
images/envelope@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
images/icon@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
images/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

BIN
images/logo@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -5,11 +5,12 @@
<title>Chimeverse</title>
<link rel="stylesheet" type="text/css" media="screen" href="node_modules/converse.js/css/converse.css">
<link rel="stylesheet" href="node_modules/uikit/dist/css/uikit.min.css">
<style> .ng-cloak { display: none !important; } </style>
</head>
<body ng-app="app">
<div class="main-window" ng-controller="AppController">
<!-- Account form -->
<div ng-hide="loginExist" class="uk-section uk-section-muted uk-flex uk-flex-middle uk-animation-fade" uk-height-viewport ng-controller="LoginController">
<div ng-show="showLoginForm" class="uk-section uk-section-muted uk-flex uk-flex-middle uk-animation-fade ng-cloak" uk-height-viewport>
<div class="uk-width-1-1">
<div class="uk-container">
<h3 class="uk-card-title uk-text-center">Welcome to Chimeverse</h3>
@ -21,7 +22,7 @@
<div class="uk-margin">
<div class="uk-inline uk-width-1-1">
<span class="uk-form-icon" uk-icon="icon: link"></span>
<input ng-model="boshService" class="uk-input uk-form-large" type="text" placeholder="Bosh service url" required>
<input ng-model="bosh" class="uk-input uk-form-large" type="text" placeholder="Bosh service url" required>
</div>
</div>
<div class="uk-margin">
@ -48,13 +49,19 @@
</div>
</div>
</div>
<!-- /Account form -->
<!-- Background and settings -->
<div ng-show="loginExist" class="uk-position-center">
<h3 class="uk-text-center">Chimeverse</h3>
</div>
</div>
<!-- /Account form -->
<!-- Background and settings -->
<div ng-show="!showLoginForm" class="uk-position-center ng-cloak">
<div class="uk-text-center">
<img src="images/logo.png" srcset="images/logo@2x.png 2x" alt="" />
<h3 class="uk-heading-small uk-text-muted uk-margin-remove">Chimeverse</h3>
<!--
TODO: Add next
<span ng-hide="showSpinner" class="uk-margin-small-right" uk-spinner="ratio: 2"></span>
-->
</div>
</div>
</div>
<script src="node_modules/uikit/dist/js/uikit.min.js"></script>

17
main.js
View File

@ -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;
exports.showEnvelope = showEnvelope;
exports.hideEnvelope = hideEnvelope;

View File

@ -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()
})