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