Commit | Line | Data |
---|---|---|
132ba3df D |
1 | var fs = require('fs'), |
2 | crypto = require('crypto'), | |
81f42bda | 3 | Promise = require('es6-promise').Promise, |
132ba3df D |
4 | config = require('./configuration.js'); |
5 | ||
6 | ||
7 | module.exports.generate = generateSettings; | |
8 | module.exports.get = getSettings; | |
9 | ||
10 | ||
11 | // Cache for settings.json | |
12 | var 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 | |
24 | config.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 | ||
32 | function 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 | 53 | function 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 |
111 | function 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 |
135 | function 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 | ||
169 | function 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 | } |