channel:join + channel:leave plugin events
[KiwiIRC.git] / server / settingsgenerator.js
index 076a9b789fce4215afc512e2da05b4bead936540..083a3788f14e9b48c5cb5e835057ce0590cdd071 100644 (file)
@@ -1,5 +1,6 @@
 var fs          = require('fs'),
     crypto      = require('crypto'),
+    Promise     = require('es6-promise').Promise,
     config      = require('./configuration.js');
 
 
@@ -31,15 +32,16 @@ config.on('loaded', function () {
 function getSettings(debug, callback) {
     var settings = cached_settings[debug ? 'debug' : 'production'];
 
-    var returnSettings = function() {
-        callback(settings);
-    };
-
     // Generate the settings if we don't have them cached as yet
     if (settings.settings === '') {
-        generateSettings(debug, returnSettings);
+        generateSettings(debug).then(function (settings) {
+            cached_settings[debug ? 'debug' : 'production'] = settings;
+            callback(null, settings);
+        }, function (err) {
+            callback(err);
+        });
     } else {
-        returnSettings();
+        callback(null, settings);
     }
 }
 
@@ -48,7 +50,7 @@ function getSettings(debug, callback) {
  * Generate a settings object for the client.
  * Settings include available translations, default client config, etc
  */
-function generateSettings(debug, callback) {
+function generateSettings(debug) {
     var vars = {
             server_settings: {},
             client_plugins: [],
@@ -80,6 +82,11 @@ function generateSettings(debug, callback) {
         vars.server_settings.client = config.get().client;
     }
 
+    // Client transport specified?
+    if (config.get().client_transports) {
+        vars.server_settings.transports = config.get().client_transports;
+    }
+
     // Any client plugins?
     if (config.get().client_plugins && config.get().client_plugins.length > 0) {
         vars.client_plugins = config.get().client_plugins;
@@ -87,92 +94,73 @@ function generateSettings(debug, callback) {
 
     addScripts(vars, debug);
 
-    // Further jobs depend on callbacks, so tally up completed jobs before callback()
-    var total_jobs = 2,
-        completed_jobs = 0,
-        jobComplete = function() {
-            completed_jobs++;
-
-            if (completed_jobs < total_jobs)
-                return;
-
-            settings = cached_settings[debug?'debug':'production'];
-            settings.settings = JSON.stringify(vars);
-            settings.hash = crypto.createHash('md5').update(settings.settings).digest('hex');
-
-            callback();
-        };
-
-    addThemes(vars, jobComplete);
-    addTranslations(vars, jobComplete);
-
-}
-
-
-function addThemes(vars, callback) {
-    readThemeInfo(config.get().client_themes || ['relaxed'], function (err, themes) {
-        if (err) {
-            return callback(err);
-        }
-
+    return Promise.all([addThemes().then(function (themes) {
         vars.themes = themes;
-        return callback();
+    }), addTranslations().then(function (translations) {
+        vars.translations = translations;
+    })]).then(function () {
+        var settings = JSON.stringify(vars);
+        return ({
+            settings: settings,
+            hash: crypto.createHash('md5').update(settings).digest('hex')
+        });
     });
 }
 
 
-function readThemeInfo(themes, prev, callback) {
-    "use strict";
-    var theme = themes[0];
-
-    if (typeof prev === 'function') {
-        callback = prev;
-        prev = [];
-    }
-
-    fs.readFile(__dirname + '/../client/assets/themes/' + theme.toLowerCase() + '/theme.json', function (err, theme_json) {
-        if (err) {
-            return callback(err);
-        }
-
-        try {
-            theme_json = JSON.parse(theme_json);
-        } catch (e) {
-            return callback(e);
-        }
-
-        prev.push(theme_json);
-
-        if (themes.length > 1) {
-            return readThemeInfo(themes.slice(1), prev, callback);
-        }
-
-        callback(null, prev);
-    });
+function addThemes() {
+    return (config.get().client_themes || ['relaxed']).reduce(function (prom, theme) {
+        return prom.then(function (themes) {
+            return new Promise(function readThemeInfo(resolve, reject) {
+                fs.readFile(__dirname + '/../client/assets/themes/' + theme.toLowerCase() + '/theme.json', function (err, theme_json) {
+                    var theme;
+                    if (err) {
+                        return reject(err);
+                    }
+
+                    try {
+                        theme = JSON.parse(theme_json);
+                    } catch (e) {
+                        return reject(e);
+                    }
+
+                    themes.push(theme);
+                    resolve(themes);
+                });
+            });
+        });
+    }, Promise.resolve([]));
 }
 
-
-function addTranslations(vars, callback) {
-    // Get a list of available translations
-    fs.readFile(__dirname + '/../client/src/translations/translations.json', function (err, translations) {
-        if (err) {
-            return callback(err);
-        }
-
-        translations = JSON.parse(translations);
-        fs.readdir(__dirname + '/../client/src/translations/', function (err, pofiles) {
+function addTranslations() {
+    return new Promise(function (resolve, reject) {
+        fs.readFile(__dirname + '/../client/src/translations/translations.json', function readTranslations(err, translations) {
             if (err) {
-                return callback(err);
+                return reject(err);
+            }
+
+            try {
+                translations = JSON.parse(translations);
+            } catch (e) {
+                return reject(e);
             }
+            
+            fs.readdir(__dirname + '/../client/src/translations/', function readTranslationFile(err, pofiles) {
+                var trans = [];
 
-            pofiles.forEach(function (file) {
-                var locale = file.slice(0, -3);
-                if ((file.slice(-3) === '.po') && (locale !== 'template')) {
-                    vars.translations.push({tag: locale, language: translations[locale]});
+                if (err) {
+                    return reject(err);
                 }
-            });
 
-            return callback();
+                pofiles.forEach(function (file) {
+                    var locale = file.slice(0, -3);
+                    if ((file.slice(-3) === '.po') && (locale !== 'template')) {
+                        trans.push({tag: locale, language: translations[locale]});
+                    }
+                });
+
+                resolve(trans);
+            });
         });
     });
 }
@@ -213,15 +201,11 @@ function addScripts(vars, debug) {
         [
             'src/models/query.js',
             'src/models/server.js',     // Depends on models/channel.js
-            'src/applets/settings.js',
-            'src/applets/chanlist.js',
-            'src/applets/scripteditor.js'
-        ],
-
-        [
             'src/models/pluginmanager.js',
             'src/models/datastore.js',
-            'src/helpers/utils.js'
+            'src/helpers/utils.js',
+            'src/helpers/formatdate.js',
+            'src/helpers/plugininterface.js'
         ],
 
         // Some views extend these, so make sure they're loaded beforehand
@@ -248,7 +232,21 @@ function addScripts(vars, debug) {
             'src/views/tabs.js',
             'src/views/topicbar.js',
             'src/views/userbox.js',
-            'src/views/channelinfo.js'
+            'src/views/channeltools.js',
+            'src/views/channelinfo.js',
+            'src/views/rightbar.js',
+            'src/views/notification.js'
+        ],
+
+        [
+            'src/misc/clientuicommands.js'
+        ],
+
+        [
+            'src/applets/settings.js',
+            'src/applets/chanlist.js',
+            'src/applets/scripteditor.js',
+            'src/applets/startup.js'
         ]
     ]);
-}
\ No newline at end of file
+}