electorrent
Version:
An Electron/Node/AngularJS remote client app for uTorrent server
193 lines (168 loc) • 5.96 kB
JavaScript
;
angular.module('torrentApp').service('configService', ['$rootScope', 'notificationService', 'electron', '$q', 'Server', function($rootScope, $notify, electron, $q, Server) {
const MenuItem = electron.menuItem
const config = electron.config;
var settings = {
startup: 'default',
server: {
ip: '',
port: '',
user: '',
password: '',
type: '',
},
ui: {
resizeMode: '',
notifications: true
},
servers: []
};
this.initSettings = function() {
var org = config.settingsReference();
angular.merge(settings, org)
settings.servers = settings.servers.map((server) => {
return new Server(server)
})
console.log("Settings", settings);
}
// Angular wrapper for saving to config
function put(key, value) {
var q = $q.defer();
config.put(key, value, function(err) {
if(err) q.reject(err)
else q.resolve();
});
return q.promise;
}
// Angular wrapper for getting config
function get(value) {
return config.get(value);
}
function isDefault(server) {
return server.default === true
}
this.appendServer = function(server) {
settings.servers.push(server)
this.renderServerMenu()
}
this.getAllSettings = function() {
return settings;
}
this.setCurrentServerAsDefault = function() {
if (!$rootScope.$server) {
$notify.warning('Can\'t set default server', 'You need to chose a server to set it as default')
}
console.log("Set default", $rootScope.$server);
this.setDefault($rootScope.$server)
}
this.setDefault = function(server, skipsave) {
let found = this.getServer(server.id)
if (!found) return
settings.servers.forEach(function(value) {
value.default = false
})
found.default = true
if (!skipsave) {
this.saveAllSettings().then(() => {
$notify.ok('Default server saved', 'You default server is now ' + server.getNameAtAddress())
}).catch(function() {
$notify.alert('I/O Error', 'Could not save default server. Local configuration file could not be written to?!')
})
}
}
function settingsToJson() {
let copy = {}
angular.copy(settings, copy)
copy.servers = copy.servers.map((server) => {
return server.json()
})
return copy
}
this.saveAllSettings = function(newSettings) {
var q = $q.defer();
angular.merge(settings, newSettings)
config.saveAll(settingsToJson(), function(err) {
if(err) q.reject(err)
else q.resolve();
});
return q.promise;
}
this.saveServer = function(ip, port, user, password, client) {
if(arguments.length === 1) {
this.appendServer(arguments[0]);
} else {
this.appendServer(new Server(ip, port, user, password, client))
}
console.info("Servers:", settings.servers);
return this.saveAllSettings()
}
this.removeServer = function(server) {
settings.servers = settings.servers.filter((s) => {
return s.id !== server.id
})
this.renderServerMenu()
}
this.updateServer = function(update) {
let server = this.getServer(update.id);
if(!server) return $q.reject('Server with id ' + update.id + ' not found')
angular.merge(server, update)
console.info("Servers:", settings.servers);
return this.saveAllSettings()
}
this.getServer = function(id) {
return settings.servers.find((server) => server.id === id)
}
this.getServers = function() {
return settings.servers
}
this.getDefaultServer = function() {
return settings.servers.find(isDefault)
}
this.getRecentServer = function() {
let maxServer = settings.servers[0]
settings.servers.forEach(function(server){
if (server.lastused > maxServer.lastused){
maxServer = server
}
})
return maxServer
}
function getMenu(menu, name) {
return menu.items.find((menuItem) => menuItem.label === name)
}
this.renderServerMenu = function() {
let menu = electron.menu.getApplicationMenu()
let serverMenu = getMenu(menu, 'Servers').submenu
serverMenu.clear()
serverMenu.append(new MenuItem({
label: 'Add new server...',
click: () => $rootScope.$broadcast('add:server'),
}))
serverMenu.append(new MenuItem({
label: 'Set current as default',
click: () => this.setCurrentServerAsDefault(),
enabled: !!$rootScope.$server
}))
serverMenu.append(new MenuItem({type: 'separator'}))
renderServerMenuOptions(serverMenu, this.getServers())
electron.menu.setApplicationMenu(menu)
}
function renderServerMenuOptions(menu, servers) {
if (!$rootScope.$server) {
menu.append(new MenuItem({
label: 'Disabled...',
enabled: false
}))
return
}
servers.forEach((server) => {
menu.append(new MenuItem({
label: server.getNameAtAddress(),
id: server.id,
click: () => $rootScope.$broadcast('connect:server', server),
checked: server.id === $rootScope.$server.id,
type: 'radio'
}))
})
}
}]);