1 var fs
= require('fs'),
2 crypto
= require('crypto'),
3 config
= require('./configuration.js');
6 module
.exports
.generate
= generateSettings
;
7 module
.exports
.get = getSettings
;
10 // Cache for settings.json
11 var cached_settings
= {
22 // Clear the settings cache when the settings change
23 config
.on('loaded', function () {
24 cached_settings
.debug
.settings
= cached_settings
.production
.settings
= '';
25 cached_settings
.debug
.hash
= cached_settings
.production
.hash
= '';
31 function getSettings(debug
, callback
) {
32 var settings
= cached_settings
[debug
? 'debug' : 'production'];
34 var returnSettings = function() {
38 // Generate the settings if we don't have them cached as yet
39 if (settings
.settings
=== '') {
40 generateSettings(debug
, returnSettings
);
48 * Generate a settings object for the client.
49 * Settings include available translations, default client config, etc
51 function generateSettings(debug
, callback
) {
58 'assets/libs/lodash.min.js'
60 ['assets/libs/backbone.min.js', 'assets/libs/jed.js']
64 // Any restricted server mode set?
65 if (config
.get().restrict_server
) {
66 vars
.server_settings
= {
68 server
: config
.get().restrict_server
,
69 port
: config
.get().restrict_server_port
|| 6667,
70 ssl
: config
.get().restrict_server_ssl
,
71 channel
: config
.get().restrict_server_channel
,
72 nick
: config
.get().restrict_server_nick
,
78 // Any client default settings?
79 if (config
.get().client
) {
80 vars
.server_settings
.client
= config
.get().client
;
83 // Any client plugins?
84 if (config
.get().client_plugins
&& config
.get().client_plugins
.length
> 0) {
85 vars
.client_plugins
= config
.get().client_plugins
;
88 addScripts(vars
, debug
);
90 // Further jobs depend on callbacks, so tally up completed jobs before callback()
93 jobComplete = function() {
96 if (completed_jobs
< total_jobs
)
99 settings
= cached_settings
[debug
?'debug':'production'];
100 settings
.settings
= JSON
.stringify(vars
);
101 settings
.hash
= crypto
.createHash('md5').update(settings
.settings
).digest('hex');
106 addThemes(vars
, jobComplete
);
107 addTranslations(vars
, jobComplete
);
112 function addThemes(vars
, callback
) {
113 readThemeInfo(config
.get().client_themes
|| ['relaxed'], function (err
, themes
) {
115 return callback(err
);
118 vars
.themes
= themes
;
124 function readThemeInfo(themes
, prev
, callback
) {
126 var theme
= themes
[0];
128 if (typeof prev
=== 'function') {
133 fs
.readFile(__dirname
+ '/../client/assets/themes/' + theme
.toLowerCase() + '/theme.json', function (err
, theme_json
) {
135 return callback(err
);
139 theme_json
= JSON
.parse(theme_json
);
144 prev
.push(theme_json
);
146 if (themes
.length
> 1) {
147 return readThemeInfo(themes
.slice(1), prev
, callback
);
150 callback(null, prev
);
155 function addTranslations(vars
, callback
) {
156 // Get a list of available translations
157 fs
.readFile(__dirname
+ '/../client/src/translations/translations.json', function (err
, translations
) {
159 return callback(err
);
162 translations
= JSON
.parse(translations
);
163 fs
.readdir(__dirname
+ '/../client/src/translations/', function (err
, pofiles
) {
165 return callback(err
);
168 pofiles
.forEach(function (file
) {
169 var locale
= file
.slice(0, -3);
170 if ((file
.slice(-3) === '.po') && (locale
!== 'template')) {
171 vars
.translations
.push({tag
: locale
, language
: translations
[locale
]});
181 function addScripts(vars
, debug
) {
183 vars
.scripts
.push(['assets/kiwi.min.js', 'assets/libs/engine.io.bundle.min.js']);
187 vars
.scripts
= vars
.scripts
.concat([
190 'assets/libs/engine.io.js',
191 'assets/libs/engine.io.tools.js'
194 'src/models/application.js',
195 'src/models/gateway.js'
198 'src/models/newconnection.js',
199 'src/models/panellist.js',
200 'src/models/networkpanellist.js',
201 'src/models/panel.js',
202 'src/models/member.js',
203 'src/models/memberlist.js',
204 'src/models/network.js',
205 'src/models/channelinfo.js'
209 'src/models/channel.js',
210 'src/models/applet.js'
214 'src/models/query.js',
215 'src/models/server.js', // Depends on models/channel.js
216 'src/applets/settings.js',
217 'src/applets/chanlist.js',
218 'src/applets/scripteditor.js'
222 'src/models/pluginmanager.js',
223 'src/models/datastore.js',
224 'src/helpers/utils.js'
227 // Some views extend these, so make sure they're loaded beforehand
233 'src/views/channel.js',
234 'src/views/applet.js',
235 'src/views/application.js',
236 'src/views/apptoolbar.js',
237 'src/views/controlbox.js',
238 'src/views/favicon.js',
239 'src/views/mediamessage.js',
240 'src/views/member.js',
241 'src/views/memberlist.js',
242 'src/views/menubox.js',
243 'src/views/networktabs.js',
244 'src/views/nickchangebox.js',
245 'src/views/resizehandler.js',
246 'src/views/serverselect.js',
247 'src/views/statusmessage.js',
249 'src/views/topicbar.js',
250 'src/views/userbox.js',
251 'src/views/channeltools.js',
252 'src/views/channelinfo.js'