Panel container refactor
[KiwiIRC.git] / client_backbone / model_application.js
CommitLineData
2c80d916
D
1kiwi.model.Application = Backbone.Model.extend(new (function () {\r
2 var that = this;\r
3\r
99e0111e
D
4 // The auto connect details entered into the server select box\r
5 var auto_connect_details = {};\r
6\r
b5141adb
D
7 /** Instance of kiwi.model.PanelList */\r
8 this.panels = null;\r
9\r
2c80d916
D
10 this.initialize = function () {\r
11 // Update `that` with this new Model object\r
12 that = this;\r
48d660e6 13 };\r
2c80d916 14\r
48d660e6 15 this.start = function () {\r
2c80d916
D
16 // Set the gateway up\r
17 kiwi.gateway = new kiwi.model.Gateway();\r
18 this.bindGatewayCommands(kiwi.gateway);\r
19\r
2c80d916 20 this.initializeClient();\r
2af70088 21 this.view.barsHide(true);\r
2c80d916 22\r
2af70088
D
23 this.panels.server.server_login.on('server_connect', function (event) {\r
24 var form = this;\r
2c80d916 25\r
99e0111e
D
26 auto_connect_details = event;\r
27\r
2af70088 28 kiwi.gateway.set('nick', event.nick);\r
99e0111e 29 kiwi.gateway.connect(event.server, 6667, false, false, function () {});\r
2af70088 30 });\r
2c80d916 31\r
2c80d916
D
32 };\r
33\r
34\r
35 this.initializeClient = function () {\r
b5141adb 36 this.view = new kiwi.view.Application({model: this, el: this.get('container')});\r
2c80d916
D
37\r
38 \r
39 /**\r
40 * Set the UI components up\r
41 */\r
42 this.controlbox = new kiwi.view.ControlBox({el: $('#controlbox')[0]});\r
43 this.bindControllboxCommands(this.controlbox);\r
44\r
52773494
D
45 this.topicbar = new kiwi.view.TopicBar({el: $('#topic')[0]});\r
46\r
2c80d916
D
47 // Container for the channels\r
48 this.panels = new kiwi.model.PanelList();\r
49 this.panels.server.view.show();\r
50\r
51 // Rejigg the UI sizes\r
52 this.view.doLayout();\r
2af70088
D
53\r
54 // Populate the server select box with defaults\r
55 this.panels.server.server_login.populateFields({\r
56 'nick': getQueryVariable('nick') || 'kiwi_' + Math.ceil(Math.random() * 10000).toString(),\r
9783a703 57 'server': getQueryVariable('server') || 'irc.kiwiirc.com',\r
2af70088
D
58 'channel': window.location.hash || '#test'\r
59 });\r
2c80d916
D
60 };\r
61\r
62\r
63\r
64 this.bindGatewayCommands = function (gw) {\r
65 gw.on('onmotd', function (event) {\r
66 that.panels.server.addMsg(event.server, event.msg, 'motd');\r
67 });\r
68\r
69\r
99e0111e
D
70 gw.on('onconnect', function (event) {\r
71 that.view.barsShow();\r
72 \r
73 if (auto_connect_details.channel) {\r
74 kiwi.gateway.join(auto_connect_details.channel);\r
75 }\r
76 });\r
2c80d916
D
77\r
78\r
79 gw.on('onjoin', function (event) {\r
2c80d916
D
80 var c, members, user;\r
81 c = that.panels.getByName(event.channel);\r
82 if (!c) {\r
83 c = new kiwi.model.Channel({name: event.channel});\r
84 that.panels.add(c);\r
85 }\r
86\r
87 members = c.get('members');\r
88 if (!members) return;\r
89\r
90 user = new kiwi.model.Member({nick: event.nick, ident: event.ident, hostname: event.hostname});\r
91 members.add(user);\r
92 // TODO: highlight the new channel in some way\r
93 });\r
94\r
95\r
96 gw.on('onpart', function (event) {\r
5712c148
D
97 var channel, members, user,\r
98 part_options = {};\r
99\r
100 part_options.type = 'part';\r
101 part_options.message = event.message || '';\r
2c80d916
D
102\r
103 channel = that.panels.getByName(event.channel);\r
104 if (!channel) return;\r
105\r
106 // If this is us, close the panel\r
107 if (event.nick === kiwi.gateway.get('nick')) {\r
108 channel.close();\r
109 return;\r
110 }\r
111\r
112 members = channel.get('members');\r
113 if (!members) return;\r
114\r
115 user = members.getByNick(event.nick);\r
116 if (!user) return;\r
117\r
5712c148
D
118 members.remove(user, part_options);\r
119 });\r
120\r
121\r
122 gw.on('onquit', function (event) {\r
123 var member, members,\r
124 quit_options = {};\r
125\r
126 quit_options.type = 'quit';\r
127 quit_options.message = event.message || '';\r
128\r
129 $.each(that.panels.models, function (index, panel) {\r
130 if (!panel.isChannel()) return;\r
131\r
132 member = panel.get('members').getByNick(event.nick);\r
133 if (member) {\r
134 panel.get('members').remove(member, quit_options);\r
135 }\r
136 });\r
2c80d916
D
137 });\r
138\r
139\r
140 gw.on('onmsg', function (event) {\r
141 var panel,\r
142 is_pm = (event.channel == kiwi.gateway.get('nick'));\r
143\r
144 if (is_pm) {\r
145 // If a panel isn't found for this PM, create one\r
146 panel = that.panels.getByName(event.nick);\r
147 if (!panel) {\r
148 panel = new kiwi.model.Channel({name: event.nick});\r
149 that.panels.add(panel);\r
150 }\r
151\r
152 } else {\r
153 // If a panel isn't found for this channel, reroute to the\r
154 // server panel\r
155 panel = that.panels.getByName(event.channel);\r
156 if (!panel) {\r
157 panel = that.panels.server;\r
158 }\r
159 }\r
160 \r
161 panel.addMsg(event.nick, event.msg);\r
162 });\r
163\r
164\r
165 gw.on('onnotice', function (event) {\r
68314431
D
166 var panel;\r
167\r
9783a703
D
168 // Find a panel for the destination(channel) or who its from\r
169 panel = that.panels.getByName(event.target) || that.panels.getByName(event.nick);\r
68314431
D
170 if (!panel) {\r
171 panel = that.panels.server;\r
172 }\r
173\r
174 panel.addMsg('[' + (event.nick||'') + ']', event.msg);\r
2c80d916
D
175 });\r
176\r
177\r
0f40d499
D
178 gw.on('onaction', function (event) {\r
179 var panel,\r
180 is_pm = (event.channel == kiwi.gateway.get('nick'));\r
181\r
182 if (is_pm) {\r
183 // If a panel isn't found for this PM, create one\r
184 panel = that.panels.getByName(event.nick);\r
185 if (!panel) {\r
186 panel = new kiwi.model.Channel({name: event.nick});\r
187 that.panels.add(panel);\r
188 }\r
189\r
190 } else {\r
191 // If a panel isn't found for this channel, reroute to the\r
192 // server panel\r
193 panel = that.panels.getByName(event.channel);\r
194 if (!panel) {\r
195 panel = that.panels.server;\r
196 }\r
197 }\r
198\r
199 panel.addMsg('', '* ' + event.nick + ' ' + event.msg, 'action');\r
200 });\r
201\r
202\r
2c80d916
D
203 gw.on('ontopic', function (event) {\r
204 var c;\r
205 c = that.panels.getByName(event.channel);\r
206 if (!c) return;\r
207\r
208 // Set the channels topic\r
209 c.set('topic', event.topic);\r
210\r
211 // If this is the active channel, update the topic bar too\r
48d660e6 212 if (c.get('name') === kiwi.app.panels.active.get('name')) {\r
52773494 213 that.topicbar.setCurrentTopic(event.topic);\r
2c80d916
D
214 }\r
215 });\r
216\r
217\r
4a9e8527
D
218 gw.on('ontopicsetby', function (event) {\r
219 var c, when;\r
220 c = that.panels.getByName(event.channel);\r
221 if (!c) return;\r
222\r
223 when = new Date(event.when * 1000).toLocaleString();\r
224 c.addMsg('', 'Topic set by ' + event.nick + ' at ' + when, 'topic');\r
225 });\r
226\r
227\r
2c80d916
D
228 gw.on('onuserlist', function (event) {\r
229 var channel;\r
230 channel = that.panels.getByName(event.channel);\r
231\r
232 // If we didn't find a channel for this, may aswell leave\r
233 if (!channel) return;\r
234\r
235 channel.temp_userlist = channel.temp_userlist || [];\r
236 _.each(event.users, function (item) {\r
237 var user = new kiwi.model.Member({nick: item.nick, modes: item.modes});\r
238 channel.temp_userlist.push(user);\r
239 });\r
240 });\r
241\r
242\r
243 gw.on('onuserlist_end', function (event) {\r
244 var channel;\r
245 channel = that.panels.getByName(event.channel);\r
246\r
247 // If we didn't find a channel for this, may aswell leave\r
248 if (!channel) return;\r
249\r
250 // Update the members list with the new list\r
251 channel.get('members').reset(channel.temp_userlist || []);\r
252\r
253 // Clear the temporary userlist\r
254 delete channel.temp_userlist;\r
255 });\r
dfe8ef37
D
256\r
257\r
258 gw.on('onmode', function (event) {\r
259 var channel, members, member;\r
260\r
261 if (!event.channel) return;\r
262 channel = that.panels.getByName(event.channel);\r
263 if (!channel) return;\r
264\r
265 members = channel.get('members');\r
266 if (!members) return;\r
267\r
268 member = members.getByNick(event.effected_nick);\r
269 if (!member) return;\r
270\r
271 if (event.mode[0] === '+') {\r
272 member.addMode(event.mode.substr(1));\r
273 } else if (event.mode[0] === '-') {\r
274 member.removeMode(event.mode.substr(1));\r
275 }\r
967687fc
D
276 });\r
277\r
278\r
279 gw.on('onnick', function (event) {\r
280 var member;\r
dfe8ef37 281\r
967687fc
D
282 $.each(that.panels.models, function (index, panel) {\r
283 if (!panel.isChannel()) return;\r
284\r
285 member = panel.get('members').getByNick(event.nick);\r
286 if (member) {\r
287 member.set('nick', event.newnick);\r
288 panel.addMsg('', '== ' + event.nick + ' is now known as ' + event.newnick, 'action nick');\r
289 }\r
290 });\r
dfe8ef37 291 });\r
2c80d916
D
292 };\r
293\r
294\r
295\r
296 /**\r
297 * Bind to certain commands that may be typed into the control box\r
298 */\r
299 this.bindControllboxCommands = function (controlbox) {\r
300 controlbox.on('unknown_command', this.unknownCommand);\r
301\r
302 controlbox.on('command', this.allCommands);\r
303 controlbox.on('command_msg', this.msgCommand);\r
304\r
0f40d499
D
305 controlbox.on('command_action', this.actionCommand);\r
306 controlbox.on('command_me', this.actionCommand);\r
307\r
2c80d916
D
308 controlbox.on('command_join', this.joinCommand);\r
309 controlbox.on('command_j', this.joinCommand);\r
310\r
311 controlbox.on('command_part', this.partCommand);\r
312 controlbox.on('command_p', this.partCommand);\r
313\r
314 controlbox.on('command_nick', function (ev) {\r
315 kiwi.gateway.changeNick(ev.params[0]);\r
316 });\r
317\r
9783a703
D
318 controlbox.on('command_query', this.queryCommand);\r
319 controlbox.on('command_q', this.queryCommand);\r
320\r
b5141adb
D
321 controlbox.on('command_topic', this.topicCommand);\r
322\r
68314431
D
323 controlbox.on('command_notice', this.noticeCommand);\r
324\r
2c80d916
D
325 controlbox.on('command_css', function (ev) {\r
326 var queryString = '?reload=' + new Date().getTime();\r
327 $('link[rel="stylesheet"]').each(function () {\r
328 this.href = this.href.replace(/\?.*|$/, queryString);\r
329 });\r
330 });\r
331 };\r
332\r
9783a703 333 // A fallback action. Send a raw command to the server\r
2c80d916 334 this.unknownCommand = function (ev) {\r
9783a703
D
335 var raw_cmd = ev.command + ' ' + ev.params.join(' ');\r
336 console.log('RAW: ' + raw_cmd);\r
337 kiwi.gateway.raw(raw_cmd);\r
2c80d916
D
338 };\r
339\r
340 this.allCommands = function (ev) {\r
341 console.log('allCommands', ev);\r
342 };\r
343\r
344 this.joinCommand = function (ev) {\r
0e12f51d
D
345 var channel, channel_names;\r
346\r
347 channel_names = ev.params.join(' ').split(',');\r
348\r
349 $.each(channel_names, function (index, channel_name) {\r
350 // Trim any whitespace off the name\r
351 channel_name = channel_name.trim();\r
352\r
353 // Check if we have the panel already. If not, create it\r
354 channel = that.panels.getByName(channel_name);\r
355 if (!channel) {\r
356 channel = new kiwi.model.Channel({name: channel_name});\r
357 kiwi.app.panels.add(channel);\r
358 }\r
359\r
360 kiwi.gateway.join(channel_name);\r
361 });\r
362\r
363 if (channel) channel.view.show();\r
364 \r
2c80d916
D
365 };\r
366\r
9783a703
D
367 this.queryCommand = function (ev) {\r
368 var destination, panel;\r
369\r
370 destination = ev.params[0];\r
371\r
372 // Check if we have the panel already. If not, create it\r
373 panel = that.panels.getByName(destination);\r
374 if (!panel) {\r
375 panel = new kiwi.model.Channel({name: destination});\r
376 kiwi.app.panels.add(panel);\r
377 }\r
378\r
379 if (panel) panel.view.show();\r
380 \r
381 };\r
382\r
2c80d916 383 this.msgCommand = function (ev) {\r
9783a703
D
384 var destination = ev.params[0],\r
385 panel = that.panels.getByName(destination) || that.panels.server;\r
386\r
387 ev.params.shift();\r
388\r
389 panel.addMsg(kiwi.gateway.get('nick'), ev.params.join(' '));\r
390 kiwi.gateway.privmsg(destination, ev.params.join(' '));\r
2c80d916
D
391 };\r
392\r
0f40d499 393 this.actionCommand = function (ev) {\r
48d660e6 394 if (kiwi.app.panels.active === kiwi.app.panels.server) {\r
0f40d499
D
395 return;\r
396 }\r
397\r
48d660e6 398 var panel = kiwi.app.panels.active;\r
0f40d499
D
399 panel.addMsg('', '* ' + kiwi.gateway.get('nick') + ' ' + ev.params.join(' '), 'action');\r
400 kiwi.gateway.action(panel.get('name'), ev.params.join(' '));\r
401 };\r
402\r
2c80d916
D
403 this.partCommand = function (ev) {\r
404 if (ev.params.length === 0) {\r
48d660e6 405 kiwi.gateway.part(kiwi.app.panels.active.get('name'));\r
2c80d916
D
406 } else {\r
407 _.each(ev.params, function (channel) {\r
408 kiwi.gateway.part(channel);\r
409 });\r
410 }\r
52773494 411 // TODO: More responsive = close tab now, more accurate = leave until part event\r
48d660e6 412 //kiwi.app.panels.remove(kiwi.app.panels.active);\r
2c80d916
D
413 };\r
414\r
b5141adb
D
415 this.topicCommand = function (ev) {\r
416 var channel_name;\r
417\r
418 if (ev.params.length === 0) return;\r
419\r
420 if (that.isChannelName(ev.params[0])) {\r
421 channel_name = ev.params[0];\r
422 ev.params.shift();\r
423 } else {\r
48d660e6 424 channel_name = kiwi.app.panels.active.get('name');\r
b5141adb
D
425 }\r
426\r
427 kiwi.gateway.topic(channel_name, ev.params.join(' '));\r
428 };\r
429\r
68314431
D
430 this.noticeCommand = function (ev) {\r
431 var destination;\r
432\r
433 // Make sure we have a destination and some sort of message\r
434 if (ev.params.length <= 1) return;\r
435\r
436 destination = ev.params[0];\r
437 ev.params.shift();\r
438\r
439 kiwi.gateway.notice(destination, ev.params.join(' '));\r
440 };\r
441\r
2c80d916
D
442\r
443\r
444\r
445\r
b5141adb
D
446 this.isChannelName = function (channel_name) {\r
447 var channel_prefix = kiwi.gateway.get('channel_prefix');\r
448\r
449 if (!channel_name || !channel_name.length) return false;\r
450 return (channel_prefix.indexOf(channel_name[0]) > -1);\r
451 };\r
452\r
2dd6a025 453})());