Extracting client user commands from application.js
[KiwiIRC.git] / server / settingsgenerator.js
CommitLineData
132ba3df
D
1var fs = require('fs'),
2 crypto = require('crypto'),
3 config = require('./configuration.js');
4
5
6module.exports.generate = generateSettings;
7module.exports.get = getSettings;
8
9
10// Cache for settings.json
11var cached_settings = {
12 debug: {
13 hash: '',
14 settings: ''
15 },
16 production: {
17 hash: '',
18 settings: ''
19 }
20};
21
22// Clear the settings cache when the settings change
23config.on('loaded', function () {
24 cached_settings.debug.settings = cached_settings.production.settings = '';
25 cached_settings.debug.hash = cached_settings.production.hash = '';
26});
27
28
29
30
31function getSettings(debug, callback) {
32 var settings = cached_settings[debug ? 'debug' : 'production'];
33
34 var returnSettings = function() {
35 callback(settings);
36 };
37
38 // Generate the settings if we don't have them cached as yet
39 if (settings.settings === '') {
40 generateSettings(debug, returnSettings);
41 } else {
42 returnSettings();
43 }
44}
45
46
47/**
48 * Generate a settings object for the client.
49 * Settings include available translations, default client config, etc
50 */
51function generateSettings(debug, callback) {
52 var vars = {
53 server_settings: {},
54 client_plugins: [],
55 translations: [],
56 scripts: [
57 [
58 'assets/libs/lodash.min.js'
59 ],
60 ['assets/libs/backbone.min.js', 'assets/libs/jed.js']
61 ]
62 };
63
64 // Any restricted server mode set?
65 if (config.get().restrict_server) {
66 vars.server_settings = {
67 connection: {
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,
73 allow_change: false
74 }
75 };
76 }
77
78 // Any client default settings?
79 if (config.get().client) {
80 vars.server_settings.client = config.get().client;
81 }
82
9af18c41
D
83 // Client transport specified?
84 if (config.get().client_transports) {
85 vars.server_settings.transports = config.get().client_transports;
86 }
87
132ba3df
D
88 // Any client plugins?
89 if (config.get().client_plugins && config.get().client_plugins.length > 0) {
90 vars.client_plugins = config.get().client_plugins;
91 }
92
93 addScripts(vars, debug);
94
95 // Further jobs depend on callbacks, so tally up completed jobs before callback()
96 var total_jobs = 2,
97 completed_jobs = 0,
98 jobComplete = function() {
99 completed_jobs++;
100
101 if (completed_jobs < total_jobs)
102 return;
103
104 settings = cached_settings[debug?'debug':'production'];
105 settings.settings = JSON.stringify(vars);
106 settings.hash = crypto.createHash('md5').update(settings.settings).digest('hex');
107
108 callback();
109 };
110
111 addThemes(vars, jobComplete);
112 addTranslations(vars, jobComplete);
113
114}
115
116
117function addThemes(vars, callback) {
118 readThemeInfo(config.get().client_themes || ['relaxed'], function (err, themes) {
119 if (err) {
120 return callback(err);
121 }
122
123 vars.themes = themes;
124 return callback();
125 });
126}
127
128
129function readThemeInfo(themes, prev, callback) {
130 "use strict";
131 var theme = themes[0];
132
133 if (typeof prev === 'function') {
134 callback = prev;
135 prev = [];
136 }
137
138 fs.readFile(__dirname + '/../client/assets/themes/' + theme.toLowerCase() + '/theme.json', function (err, theme_json) {
139 if (err) {
140 return callback(err);
141 }
142
143 try {
144 theme_json = JSON.parse(theme_json);
145 } catch (e) {
146 return callback(e);
147 }
148
149 prev.push(theme_json);
150
151 if (themes.length > 1) {
152 return readThemeInfo(themes.slice(1), prev, callback);
153 }
154
155 callback(null, prev);
156 });
157}
158
159
160function addTranslations(vars, callback) {
161 // Get a list of available translations
162 fs.readFile(__dirname + '/../client/src/translations/translations.json', function (err, translations) {
163 if (err) {
164 return callback(err);
165 }
166
167 translations = JSON.parse(translations);
168 fs.readdir(__dirname + '/../client/src/translations/', function (err, pofiles) {
169 if (err) {
170 return callback(err);
171 }
172
173 pofiles.forEach(function (file) {
174 var locale = file.slice(0, -3);
175 if ((file.slice(-3) === '.po') && (locale !== 'template')) {
176 vars.translations.push({tag: locale, language: translations[locale]});
177 }
178 });
179
180 return callback();
181 });
182 });
183}
184
185
186function addScripts(vars, debug) {
187 if (!debug) {
188 vars.scripts.push(['assets/kiwi.min.js', 'assets/libs/engine.io.bundle.min.js']);
189 return;
190 }
191
192 vars.scripts = vars.scripts.concat([
193 [
194 'src/app.js',
195 'assets/libs/engine.io.js',
196 'assets/libs/engine.io.tools.js'
197 ],
198 [
199 'src/models/application.js',
200 'src/models/gateway.js'
201 ],
202 [
203 'src/models/newconnection.js',
204 'src/models/panellist.js',
205 'src/models/networkpanellist.js',
206 'src/models/panel.js',
207 'src/models/member.js',
208 'src/models/memberlist.js',
209 'src/models/network.js',
210 'src/models/channelinfo.js'
211 ],
212
213 [
214 'src/models/channel.js',
215 'src/models/applet.js'
216 ],
217
218 [
219 'src/models/query.js',
220 'src/models/server.js', // Depends on models/channel.js
132ba3df
D
221 'src/models/pluginmanager.js',
222 'src/models/datastore.js',
b19d262f 223 'src/helpers/utils.js',
2a89ba11
D
224 'src/helpers/formatdate.js',
225 'src/helpers/plugininterface.js'
132ba3df
D
226 ],
227
228 // Some views extend these, so make sure they're loaded beforehand
229 [
230 'src/views/panel.js'
231 ],
232
233 [
234 'src/views/channel.js',
235 'src/views/applet.js',
236 'src/views/application.js',
237 'src/views/apptoolbar.js',
238 'src/views/controlbox.js',
239 'src/views/favicon.js',
240 'src/views/mediamessage.js',
241 'src/views/member.js',
242 'src/views/memberlist.js',
243 'src/views/menubox.js',
244 'src/views/networktabs.js',
245 'src/views/nickchangebox.js',
246 'src/views/resizehandler.js',
247 'src/views/serverselect.js',
248 'src/views/statusmessage.js',
249 'src/views/tabs.js',
250 'src/views/topicbar.js',
251 'src/views/userbox.js',
9936359c 252 'src/views/channeltools.js',
626c1246
D
253 'src/views/channelinfo.js',
254 'src/views/rightbar.js'
17f187e6 255 ],
41cba2fd
D
256
257 [
258 'src/misc/clientuicommands.js'
259 ],
260
17f187e6
D
261 [
262 'src/applets/settings.js',
263 'src/applets/chanlist.js',
264 'src/applets/scripteditor.js',
265 'src/applets/startup.js'
132ba3df
D
266 ]
267 ]);
268}