Client: Pasting multiple lines
[KiwiIRC.git] / client / assets / dev / model_application.js
CommitLineData
696a66f8
D
1kiwi.model.Application = function () {\r
2 // Set to a reference to this object within initialize()\r
3 var that = null;\r
4\r
5 // The auto connect details entered into the server select box\r
6 var auto_connect_details = {};\r
7\r
8\r
9 var model = function () {\r
10 /** Instance of kiwi.model.PanelList */\r
11 this.panels = null;\r
12\r
13 /** kiwi.view.Application */\r
14 this.view = null;\r
15\r
16 /** kiwi.view.StatusMessage */\r
17 this.message = null;\r
18\r
19 /* Address for the kiwi server */\r
20 this.kiwi_server = null;\r
21\r
22 this.initialize = function (options) {\r
23 that = this;\r
24\r
25 if (options[0].container) {\r
26 this.set('container', options[0].container);\r
27 }\r
28\r
29 // The base url to the kiwi server\r
8b0eb787 30 this.set('base_path', options[0].base_path ? options[0].base_path : '/kiwi');\r
696a66f8
D
31\r
32 // Best guess at where the kiwi server is\r
33 this.detectKiwiServer();\r
34 };\r
35\r
36 this.start = function () {\r
37 // Only debug if set in the querystring\r
38 if (!getQueryVariable('debug')) {\r
39 manageDebug(false);\r
40 } else {\r
41 //manageDebug(true);\r
42 }\r
43 \r
44 // Set the gateway up\r
45 kiwi.gateway = new kiwi.model.Gateway();\r
46 this.bindGatewayCommands(kiwi.gateway);\r
47\r
48 this.initializeClient();\r
49 this.initializeGlobals();\r
50\r
51 this.view.barsHide(true);\r
52\r
53 this.panels.server.server_login.bind('server_connect', function (event) {\r
8b0eb787
D
54 var server_login = this,\r
55 transport_path = '';\r
696a66f8
D
56 auto_connect_details = event;\r
57\r
58 server_login.networkConnecting();\r
59 \r
8b0eb787
D
60 // Path to get the socket.io transport code\r
61 transport_path = that.kiwi_server + that.get('base_path') + '/transport/socket.io.js?ts='+(new Date().getTime());\r
62 \r
63 $script(transport_path, function () {\r
696a66f8
D
64 if (!window.io) {\r
65 kiwiServerNotFound();\r
66 return;\r
67 }\r
68 kiwi.gateway.set('kiwi_server', that.kiwi_server + '/kiwi');\r
69 kiwi.gateway.set('nick', event.nick);\r
70 \r
d2d91c10
D
71 kiwi.gateway.connect(event.server, event.port, event.ssl, event.password, function (error) {\r
72 if (error) {\r
73 kiwiServerNotFound();\r
74 }\r
75 });\r
696a66f8
D
76 });\r
77 });\r
78\r
79 // TODO: Shouldn't really be here but it's not working in the view.. :/\r
80 // Hack for firefox browers: Focus is not given on this event loop iteration\r
81 setTimeout(function(){\r
82 kiwi.app.panels.server.server_login.$el.find('.nick').select();\r
83 }, 0);\r
84 };\r
85\r
86\r
87 function kiwiServerNotFound (e) {\r
88 that.panels.server.server_login.showError();\r
89 }\r
90\r
91\r
92 this.detectKiwiServer = function () {\r
93 // If running from file, default to localhost:7777 by default\r
94 if (window.location.protocol === 'file:') {\r
95 this.kiwi_server = 'http://localhost:7778';\r
96 } else {\r
97 // Assume the kiwi server is on the same server\r
98 this.kiwi_server = window.location.protocol + '//' + window.location.host;\r
99 }\r
100 };\r
101\r
102\r
103 this.initializeClient = function () {\r
104 this.view = new kiwi.view.Application({model: this, el: this.get('container')});\r
105 \r
106 /**\r
107 * Set the UI components up\r
108 */\r
109 this.panels = new kiwi.model.PanelList();\r
110\r
111 this.controlbox = new kiwi.view.ControlBox({el: $('#controlbox')[0]});\r
112 this.bindControllboxCommands(this.controlbox);\r
113\r
114 this.topicbar = new kiwi.view.TopicBar({el: $('#topic')[0]});\r
115\r
7de3dd03
D
116 new kiwi.view.AppToolbar({el: $('#toolbar .app_tools')[0]});\r
117\r
696a66f8
D
118 this.message = new kiwi.view.StatusMessage({el: $('#status_message')[0]});\r
119\r
120 this.resize_handle = new kiwi.view.ResizeHandler({el: $('#memberlists_resize_handle')[0]});\r
121 \r
122 this.panels.server.view.show();\r
123\r
124 // Rejigg the UI sizes\r
125 this.view.doLayout();\r
126\r
127 this.populateDefaultServerSettings();\r
128 };\r
129\r
130\r
131 this.initializeGlobals = function () {\r
132 kiwi.global.control = this.controlbox;\r
133 };\r
134\r
135\r
136 this.populateDefaultServerSettings = function () {\r
137 var parts;\r
138 var defaults = {\r
139 nick: getQueryVariable('nick') || 'kiwi_' + Math.ceil(Math.random() * 10000).toString(),\r
140 server: 'irc.kiwiirc.com',\r
141 port: 6667,\r
142 ssl: false,\r
143 channel: window.location.hash || '#kiwiirc'\r
144 };\r
145\r
146 // Process the URL part by part, extracting as we go\r
147 parts = window.location.pathname.toString().replace(this.get('base_path'), '').split('/');\r
148\r
149 if (parts.length > 0) {\r
150 parts.shift();\r
151\r
152 if (parts.length > 0 && parts[0]) {\r
153 // Extract the port+ssl if we find one\r
154 if (parts[0].search(/:/) > 0) {\r
155 defaults.port = parts[0].substring(parts[0].search(/:/) + 1);\r
156 defaults.server = parts[0].substring(0, parts[0].search(/:/));\r
157 if (defaults.port[0] === '+') {\r
158 defaults.port = parseInt(defaults.port.substring(1), 10);\r
159 defaults.ssl = true;\r
160 } else {\r
161 defaults.ssl = false;\r
162 }\r
163\r
164 } else {\r
165 defaults.server = parts[0];\r
166 }\r
167\r
168 parts.shift();\r
169 }\r
170\r
171 if (parts.length > 0 && parts[0]) {\r
172 defaults.channel = '#' + parts[0];\r
173 parts.shift();\r
174 }\r
175 }\r
176\r
177 // Set any random numbers if needed\r
178 defaults.nick = defaults.nick.replace('?', Math.floor(Math.random() * 100000).toString());\r
179\r
180 // Populate the server select box with defaults\r
181 this.panels.server.server_login.populateFields(defaults);\r
182 };\r
183\r
184\r
185 this.bindGatewayCommands = function (gw) {\r
186 gw.on('onmotd', function (event) {\r
187 that.panels.server.addMsg(kiwi.gateway.get('name'), event.msg, 'motd');\r
188 });\r
189\r
190\r
191 gw.on('onconnect', function (event) {\r
192 that.view.barsShow();\r
193 \r
194 if (auto_connect_details.channel) {\r
195 that.controlbox.processInput('/JOIN ' + auto_connect_details.channel);\r
196 }\r
197 });\r
198\r
199\r
200 (function () {\r
201 var gw_stat = 0;\r
202\r
203 gw.on('disconnect', function (event) {\r
204 var msg = 'You have been disconnected. Attempting to reconnect for you..';\r
205 that.message.text(msg, {timeout: 10000});\r
206\r
207 // Mention the disconnection on every channel\r
208 $.each(kiwi.app.panels.models, function (idx, panel) {\r
209 if (!panel || !panel.isChannel()) return;\r
210 panel.addMsg('', msg, 'action quit');\r
211 });\r
212 kiwi.app.panels.server.addMsg('', msg, 'action quit');\r
213\r
214 gw_stat = 1;\r
215 });\r
216 gw.on('reconnecting', function (event) {\r
217 msg = 'You have been disconnected. Attempting to reconnect again in ' + (event.delay/1000) + ' seconds..';\r
218 kiwi.app.panels.server.addMsg('', msg, 'action quit');\r
219 });\r
220 gw.on('connect', function (event) {\r
221 if (gw_stat !== 1) return;\r
222\r
223 var msg = 'It\'s OK, you\'re connected again :)';\r
224 that.message.text(msg, {timeout: 5000});\r
225\r
226 // Mention the disconnection on every channel\r
227 $.each(kiwi.app.panels.models, function (idx, panel) {\r
228 if (!panel || !panel.isChannel()) return;\r
229 panel.addMsg('', msg, 'action join');\r
230 });\r
231 kiwi.app.panels.server.addMsg('', msg, 'action join');\r
232\r
233 gw_stat = 0;\r
234 });\r
235 })();\r
236\r
237\r
238 gw.on('onjoin', function (event) {\r
239 var c, members, user;\r
240 c = that.panels.getByName(event.channel);\r
241 if (!c) {\r
242 c = new kiwi.model.Channel({name: event.channel});\r
243 that.panels.add(c);\r
244 }\r
245\r
246 members = c.get('members');\r
247 if (!members) return;\r
248\r
249 user = new kiwi.model.Member({nick: event.nick, ident: event.ident, hostname: event.hostname});\r
250 members.add(user);\r
251 // TODO: highlight the new channel in some way\r
252 });\r
253\r
254\r
255 gw.on('onpart', function (event) {\r
256 var channel, members, user,\r
257 part_options = {};\r
258\r
259 part_options.type = 'part';\r
260 part_options.message = event.message || '';\r
261\r
262 channel = that.panels.getByName(event.channel);\r
263 if (!channel) return;\r
264\r
265 // If this is us, close the panel\r
266 if (event.nick === kiwi.gateway.get('nick')) {\r
267 channel.close();\r
268 return;\r
269 }\r
270\r
271 members = channel.get('members');\r
272 if (!members) return;\r
273\r
274 user = members.getByNick(event.nick);\r
275 if (!user) return;\r
276\r
277 members.remove(user, part_options);\r
278 });\r
279\r
280\r
281 gw.on('onquit', function (event) {\r
282 var member, members,\r
283 quit_options = {};\r
284\r
285 quit_options.type = 'quit';\r
286 quit_options.message = event.message || '';\r
287\r
288 $.each(that.panels.models, function (index, panel) {\r
289 if (!panel.isChannel()) return;\r
290\r
291 member = panel.get('members').getByNick(event.nick);\r
292 if (member) {\r
293 panel.get('members').remove(member, quit_options);\r
294 }\r
295 });\r
296 });\r
297\r
298\r
299 gw.on('onkick', function (event) {\r
300 var channel, members, user,\r
301 part_options = {};\r
302\r
303 part_options.type = 'kick';\r
304 part_options.by = event.nick;\r
305 part_options.message = event.message || '';\r
306\r
307 channel = that.panels.getByName(event.channel);\r
308 if (!channel) return;\r
309\r
310 members = channel.get('members');\r
311 if (!members) return;\r
312\r
313 user = members.getByNick(event.kicked);\r
314 if (!user) return;\r
315\r
316 members.remove(user, part_options);\r
317\r
318 if (event.kicked === kiwi.gateway.get('nick')) {\r
319 members.reset([]);\r
320 }\r
321 \r
322 });\r
323\r
324\r
325 gw.on('onmsg', function (event) {\r
326 var panel,\r
327 is_pm = (event.channel == kiwi.gateway.get('nick'));\r
328\r
329 if (is_pm) {\r
330 // If a panel isn't found for this PM, create one\r
331 panel = that.panels.getByName(event.nick);\r
332 if (!panel) {\r
333 panel = new kiwi.model.Channel({name: event.nick});\r
334 that.panels.add(panel);\r
335 }\r
336\r
337 } else {\r
338 // If a panel isn't found for this channel, reroute to the\r
339 // server panel\r
340 panel = that.panels.getByName(event.channel);\r
341 if (!panel) {\r
342 panel = that.panels.server;\r
343 }\r
344 }\r
345 \r
346 panel.addMsg(event.nick, event.msg);\r
347 });\r
348\r
349\r
350 gw.on('onnotice', function (event) {\r
351 var panel;\r
352\r
353 // Find a panel for the destination(channel) or who its from\r
354 panel = that.panels.getByName(event.target) || that.panels.getByName(event.nick);\r
355 if (!panel) {\r
356 panel = that.panels.server;\r
357 }\r
358\r
359 panel.addMsg('[' + (event.nick||'') + ']', event.msg);\r
360 });\r
361\r
362\r
363 gw.on('onaction', function (event) {\r
364 var panel,\r
365 is_pm = (event.channel == kiwi.gateway.get('nick'));\r
366\r
367 if (is_pm) {\r
368 // If a panel isn't found for this PM, create one\r
369 panel = that.panels.getByName(event.nick);\r
370 if (!panel) {\r
371 panel = new kiwi.model.Channel({name: event.nick});\r
372 that.panels.add(panel);\r
373 }\r
374\r
375 } else {\r
376 // If a panel isn't found for this channel, reroute to the\r
377 // server panel\r
378 panel = that.panels.getByName(event.channel);\r
379 if (!panel) {\r
380 panel = that.panels.server;\r
381 }\r
382 }\r
383\r
384 panel.addMsg('', '* ' + event.nick + ' ' + event.msg, 'action');\r
385 });\r
386\r
387\r
388 gw.on('ontopic', function (event) {\r
389 var c;\r
390 c = that.panels.getByName(event.channel);\r
391 if (!c) return;\r
392\r
393 // Set the channels topic\r
394 c.set('topic', event.topic);\r
395\r
396 // If this is the active channel, update the topic bar too\r
397 if (c.get('name') === kiwi.app.panels.active.get('name')) {\r
398 that.topicbar.setCurrentTopic(event.topic);\r
399 }\r
400 });\r
401\r
402\r
403 gw.on('ontopicsetby', function (event) {\r
404 var c, when;\r
405 c = that.panels.getByName(event.channel);\r
406 if (!c) return;\r
407\r
408 when = formatDate(new Date(event.when * 1000));\r
409 c.addMsg('', 'Topic set by ' + event.nick + ' at ' + when, 'topic');\r
410 });\r
411\r
412\r
413 gw.on('onuserlist', function (event) {\r
414 var channel;\r
415 channel = that.panels.getByName(event.channel);\r
416\r
417 // If we didn't find a channel for this, may aswell leave\r
418 if (!channel) return;\r
419\r
420 channel.temp_userlist = channel.temp_userlist || [];\r
421 _.each(event.users, function (item) {\r
422 var user = new kiwi.model.Member({nick: item.nick, modes: item.modes});\r
423 channel.temp_userlist.push(user);\r
424 });\r
425 });\r
426\r
427\r
428 gw.on('onuserlist_end', function (event) {\r
429 var channel;\r
430 channel = that.panels.getByName(event.channel);\r
431\r
432 // If we didn't find a channel for this, may aswell leave\r
433 if (!channel) return;\r
434\r
435 // Update the members list with the new list\r
436 channel.get('members').reset(channel.temp_userlist || []);\r
437\r
438 // Clear the temporary userlist\r
439 delete channel.temp_userlist;\r
440 });\r
441\r
442\r
443 gw.on('onmode', function (event) {\r
444 var channel, i, prefixes, members, member, find_prefix;\r
445 \r
446 // Build a nicely formatted string to be displayed to a regular human\r
447 function friendlyModeString (event_modes, alt_target) {\r
448 var modes = {}, return_string;\r
449\r
450 // If no default given, use the main event info\r
451 if (!event_modes) {\r
452 event_modes = event.modes;\r
453 alt_target = event.target;\r
454 }\r
455\r
456 // Reformat the mode object to make it easier to work with\r
457 _.each(event_modes, function (mode){\r
458 var param = mode.param || alt_target || '';\r
459\r
460 // Make sure we have some modes for this param\r
461 if (!modes[param]) {\r
462 modes[param] = {'+':'', '-':''};\r
463 }\r
464\r
465 modes[param][mode.mode[0]] += mode.mode.substr(1);\r
466 });\r
467\r
468 // Put the string together from each mode\r
469 return_string = [];\r
470 _.each(modes, function (modeset, param) {\r
471 var str = '';\r
472 if (modeset['+']) str += '+' + modeset['+'];\r
473 if (modeset['-']) str += '-' + modeset['-'];\r
474 return_string.push(str + ' ' + param);\r
475 });\r
476 return_string = return_string.join(', ');\r
477\r
478 return return_string;\r
479 }\r
480\r
481\r
482 channel = that.panels.getByName(event.target);\r
483 if (channel) {\r
484 prefixes = kiwi.gateway.get('user_prefixes');\r
485 find_prefix = function (p) {\r
486 return event.modes[i].mode[1] === p.mode;\r
487 };\r
488 for (i = 0; i < event.modes.length; i++) {\r
489 if (_.any(prefixes, find_prefix)) {\r
490 if (!members) {\r
491 members = channel.get('members');\r
492 }\r
493 member = members.getByNick(event.modes[i].param);\r
494 if (!member) {\r
495 console.log('MODE command recieved for unknown member %s on channel %s', event.modes[i].param, event.target);\r
496 return;\r
497 } else {\r
498 if (event.modes[i].mode[0] === '+') {\r
499 member.addMode(event.modes[i].mode[1]);\r
500 } else if (event.modes[i].mode[0] === '-') {\r
501 member.removeMode(event.modes[i].mode[1]);\r
502 }\r
503 members.sort();\r
504 //channel.addMsg('', '== ' + event.nick + ' set mode ' + event.modes[i].mode + ' ' + event.modes[i].param, 'action mode');\r
505 }\r
506 } else {\r
507 // Channel mode being set\r
508 // TODO: Store this somewhere?\r
509 //channel.addMsg('', 'CHANNEL === ' + event.nick + ' set mode ' + event.modes[i].mode + ' on ' + event.target, 'action mode');\r
510 }\r
511 }\r
512\r
513 channel.addMsg('', '== ' + event.nick + ' sets mode ' + friendlyModeString(), 'action mode');\r
514 } else {\r
515 // This is probably a mode being set on us.\r
516 if (event.target.toLowerCase() === kiwi.gateway.get("nick").toLowerCase()) {\r
517 that.panels.server.addMsg('', '== ' + event.nick + ' set mode ' + friendlyModeString(), 'action mode');\r
518 } else {\r
519 console.log('MODE command recieved for unknown target %s: ', event.target, event);\r
520 }\r
521 }\r
522 });\r
523\r
524\r
525 gw.on('onnick', function (event) {\r
526 var member;\r
527\r
528 $.each(that.panels.models, function (index, panel) {\r
529 if (!panel.isChannel()) return;\r
530\r
531 member = panel.get('members').getByNick(event.nick);\r
532 if (member) {\r
533 member.set('nick', event.newnick);\r
534 panel.addMsg('', '== ' + event.nick + ' is now known as ' + event.newnick, 'action nick');\r
535 }\r
536 });\r
537 });\r
538\r
539\r
540 gw.on('onwhois', function (event) {\r
541 /*globals secondsToTime */\r
542 var logon_date, idle_time = '', panel;\r
543\r
544 if (event.end) {\r
545 return;\r
546 }\r
547\r
548 if (typeof event.idle !== 'undefined') {\r
549 idle_time = secondsToTime(parseInt(event.idle, 10));\r
550 idle_time = idle_time.h.toString().lpad(2, "0") + ':' + idle_time.m.toString().lpad(2, "0") + ':' + idle_time.s.toString().lpad(2, "0");\r
551 }\r
552\r
553 panel = kiwi.app.panels.active;\r
554 if (event.ident) {\r
555 panel.addMsg(event.nick, 'is ' + event.nick + '!' + event.ident + '@' + event.host + ' * ' + event.msg, 'whois');\r
556 } else if (event.chans) {\r
557 panel.addMsg(event.nick, 'on ' + event.chans, 'whois');\r
558 } else if (event.server) {\r
559 panel.addMsg(event.nick, 'using ' + event.server, 'whois');\r
560 } else if (event.msg) {\r
561 panel.addMsg(event.nick, event.msg, 'whois');\r
562 } else if (event.logon) {\r
563 logon_date = new Date();\r
564 logon_date.setTime(event.logon * 1000);\r
565 logon_date = formatDate(logon_date);\r
566\r
567 panel.addMsg(event.nick, 'idle for ' + idle_time + ', signed on ' + logon_date, 'whois');\r
568 } else {\r
569 panel.addMsg(event.nick, 'idle for ' + idle_time, 'whois');\r
570 }\r
571 });\r
572\r
573\r
574 gw.on('onlist_start', function (data) {\r
575 if (kiwi.app.channel_list) {\r
576 kiwi.app.channel_list.close();\r
577 delete kiwi.app.channel_list;\r
578 }\r
579\r
580 var panel = new kiwi.model.Applet(),\r
581 applet = new kiwi.applets.Chanlist();\r
582\r
583 panel.load(applet);\r
584 \r
585 kiwi.app.panels.add(panel);\r
586 panel.view.show();\r
587 \r
588 kiwi.app.channel_list = applet;\r
589 });\r
590\r
591\r
592 gw.on('onlist_channel', function (data) {\r
593 // TODO: Put this listener within the applet itself\r
594 kiwi.app.channel_list.addChannel(data.chans);\r
595 });\r
596\r
597\r
598 gw.on('onlist_end', function (data) {\r
599 // TODO: Put this listener within the applet itself\r
600 delete kiwi.app.channel_list;\r
601 });\r
602\r
603\r
604 gw.on('onirc_error', function (data) {\r
605 var panel, tmp;\r
606\r
607 if (data.channel !== undefined && !(panel = kiwi.app.panels.getByName(data.channel))) {\r
608 panel = kiwi.app.panels.server;\r
609 }\r
610\r
611 switch (data.error) {\r
612 case 'banned_from_channel':\r
613 panel.addMsg(' ', '== You are banned from ' + data.channel + '. ' + data.reason, 'status');\r
614 kiwi.app.message.text('You are banned from ' + data.channel + '. ' + data.reason);\r
615 break;\r
616 case 'bad_channel_key':\r
617 panel.addMsg(' ', '== Bad channel key for ' + data.channel, 'status');\r
618 kiwi.app.message.text('Bad channel key or password for ' + data.channel);\r
619 break;\r
620 case 'invite_only_channel':\r
621 panel.addMsg(' ', '== ' + data.channel + ' is invite only.', 'status');\r
622 kiwi.app.message.text(data.channel + ' is invite only');\r
623 break;\r
624 case 'channel_is_full':\r
625 panel.addMsg(' ', '== ' + data.channel + ' is full.', 'status');\r
626 kiwi.app.message.text(data.channel + ' is full');\r
627 break;\r
628 case 'chanop_privs_needed':\r
629 panel.addMsg(' ', '== ' + data.reason, 'status');\r
630 kiwi.app.message.text(data.reason + ' (' + data.channel + ')');\r
631 break;\r
632 case 'no_such_nick':\r
633 tmp = kiwi.app.panels.getByName(data.nick);\r
634 if (tmp) {\r
635 tmp.addMsg(' ', '== ' + data.nick + ': ' + data.reason, 'status');\r
636 } else {\r
637 kiwi.app.panels.server.addMsg(' ', '== ' + data.nick + ': ' + data.reason, 'status');\r
638 }\r
639 break;\r
640 case 'nickname_in_use':\r
641 kiwi.app.panels.server.addMsg(' ', '== The nickname ' + data.nick + ' is already in use. Please select a new nickname', 'status');\r
642 if (kiwi.app.panels.server !== kiwi.app.panels.active) {\r
643 kiwi.app.message.text('The nickname "' + data.nick + '" is already in use. Please select a new nickname');\r
644 }\r
645\r
646 // Only show the nickchange component if the controlbox is open\r
647 if (that.controlbox.$el.css('display') !== 'none') {\r
648 (new kiwi.view.NickChangeBox()).render();\r
649 }\r
650\r
651 break;\r
652 default:\r
653 // We don't know what data contains, so don't do anything with it.\r
654 //kiwi.front.tabviews.server.addMsg(null, ' ', '== ' + data, 'status');\r
655 }\r
656 });\r
657 };\r
658\r
659\r
660\r
661 /**\r
662 * Bind to certain commands that may be typed into the control box\r
663 */\r
664 this.bindControllboxCommands = function (controlbox) {\r
665 // Default aliases\r
666 $.extend(controlbox.preprocessor.aliases, {\r
667 // General aliases\r
668 '/p': '/part $1+',\r
669 '/me': '/action $1+',\r
670 '/j': '/join $1+',\r
671 '/q': '/query $1+',\r
672\r
673 // Op related aliases\r
674 '/op': '/quote mode $channel +o $1+',\r
675 '/deop': '/quote mode $channel -o $1+',\r
676 '/hop': '/quote mode $channel +h $1+',\r
677 '/dehop': '/quote mode $channel -h $1+',\r
678 '/voice': '/quote mode $channel +v $1+',\r
679 '/devoice': '/quote mode $channel -v $1+',\r
680 '/k': '/kick $1+',\r
681\r
682 // Misc aliases\r
70c7e208 683 '/slap': '/me slaps $1 around a bit with a large trout'\r
696a66f8
D
684 });\r
685\r
686 controlbox.on('unknown_command', unknownCommand);\r
687\r
688 controlbox.on('command', allCommands);\r
689 controlbox.on('command_msg', msgCommand);\r
690\r
691 controlbox.on('command_action', actionCommand);\r
692\r
693 controlbox.on('command_join', joinCommand);\r
694\r
695 controlbox.on('command_part', partCommand);\r
696\r
697 controlbox.on('command_nick', function (ev) {\r
698 kiwi.gateway.changeNick(ev.params[0]);\r
699 });\r
700\r
701 controlbox.on('command_query', queryCommand);\r
702\r
703 controlbox.on('command_topic', topicCommand);\r
704\r
705 controlbox.on('command_notice', noticeCommand);\r
706\r
707 controlbox.on('command_quote', quoteCommand);\r
708\r
709 controlbox.on('command_kick', kickCommand);\r
710\r
711\r
712 controlbox.on('command_css', function (ev) {\r
713 var queryString = '?reload=' + new Date().getTime();\r
714 $('link[rel="stylesheet"]').each(function () {\r
715 this.href = this.href.replace(/\?.*|$/, queryString);\r
716 });\r
717 });\r
718\r
719 controlbox.on('command_js', function (ev) {\r
720 if (!ev.params[0]) return;\r
721 $script(ev.params[0] + '?' + (new Date().getTime()));\r
722 });\r
723\r
724 controlbox.on('command_alias', function (ev) {\r
725 var name, rule;\r
726\r
727 // No parameters passed so list them\r
728 if (!ev.params[1]) {\r
729 $.each(controlbox.preprocessor.aliases, function (name, rule) {\r
730 kiwi.app.panels.server.addMsg(' ', name + ' => ' + rule);\r
731 });\r
732 return;\r
733 }\r
734\r
735 // Deleting an alias?\r
736 if (ev.params[0] === 'del' || ev.params[0] === 'delete') {\r
737 name = ev.params[1];\r
738 if (name[0] !== '/') name = '/' + name;\r
739 delete controlbox.preprocessor.aliases[name];\r
740 return;\r
741 }\r
742\r
743 // Add the alias\r
744 name = ev.params[0];\r
745 ev.params.shift();\r
746 rule = ev.params.join(' ');\r
747\r
748 // Make sure the name starts with a slash\r
749 if (name[0] !== '/') name = '/' + name;\r
750\r
751 // Now actually add the alias\r
752 controlbox.preprocessor.aliases[name] = rule;\r
753 });\r
754\r
755 controlbox.on('command_applet', appletCommand);\r
756 controlbox.on('command_settings', settingsCommand);\r
757 };\r
758\r
759 // A fallback action. Send a raw command to the server\r
760 function unknownCommand (ev) {\r
761 var raw_cmd = ev.command + ' ' + ev.params.join(' ');\r
762 console.log('RAW: ' + raw_cmd);\r
763 kiwi.gateway.raw(raw_cmd);\r
764 }\r
765\r
766 function allCommands (ev) {}\r
767\r
768 function joinCommand (ev) {\r
769 var channel, channel_names;\r
770\r
771 channel_names = ev.params.join(' ').split(',');\r
772\r
773 $.each(channel_names, function (index, channel_name) {\r
774 // Trim any whitespace off the name\r
775 channel_name = channel_name.trim();\r
776\r
777 // Check if we have the panel already. If not, create it\r
778 channel = that.panels.getByName(channel_name);\r
779 if (!channel) {\r
780 channel = new kiwi.model.Channel({name: channel_name});\r
781 kiwi.app.panels.add(channel);\r
782 }\r
783\r
784 kiwi.gateway.join(channel_name);\r
785 });\r
786\r
787 if (channel) channel.view.show();\r
788 \r
789 }\r
790\r
791 function queryCommand (ev) {\r
792 var destination, panel;\r
793\r
794 destination = ev.params[0];\r
795\r
796 // Check if we have the panel already. If not, create it\r
797 panel = that.panels.getByName(destination);\r
798 if (!panel) {\r
799 panel = new kiwi.model.Channel({name: destination});\r
800 panel.set('members', undefined);\r
801 kiwi.app.panels.add(panel);\r
802 }\r
803\r
804 if (panel) panel.view.show();\r
805 \r
806 }\r
807\r
808 function msgCommand (ev) {\r
809 var destination = ev.params[0],\r
810 panel = that.panels.getByName(destination) || that.panels.server;\r
811\r
812 ev.params.shift();\r
813\r
814 panel.addMsg(kiwi.gateway.get('nick'), ev.params.join(' '));\r
815 kiwi.gateway.privmsg(destination, ev.params.join(' '));\r
816 }\r
817\r
818 function actionCommand (ev) {\r
819 if (kiwi.app.panels.active === kiwi.app.panels.server) {\r
820 return;\r
821 }\r
822\r
823 var panel = kiwi.app.panels.active;\r
824 panel.addMsg('', '* ' + kiwi.gateway.get('nick') + ' ' + ev.params.join(' '), 'action');\r
825 kiwi.gateway.action(panel.get('name'), ev.params.join(' '));\r
826 }\r
827\r
828 function partCommand (ev) {\r
829 if (ev.params.length === 0) {\r
830 kiwi.gateway.part(kiwi.app.panels.active.get('name'));\r
831 } else {\r
832 _.each(ev.params, function (channel) {\r
833 kiwi.gateway.part(channel);\r
834 });\r
835 }\r
836 // TODO: More responsive = close tab now, more accurate = leave until part event\r
837 //kiwi.app.panels.remove(kiwi.app.panels.active);\r
838 }\r
839\r
840 function topicCommand (ev) {\r
841 var channel_name;\r
842\r
843 if (ev.params.length === 0) return;\r
844\r
845 if (that.isChannelName(ev.params[0])) {\r
846 channel_name = ev.params[0];\r
847 ev.params.shift();\r
848 } else {\r
849 channel_name = kiwi.app.panels.active.get('name');\r
850 }\r
851\r
852 kiwi.gateway.topic(channel_name, ev.params.join(' '));\r
853 }\r
854\r
855 function noticeCommand (ev) {\r
856 var destination;\r
857\r
858 // Make sure we have a destination and some sort of message\r
859 if (ev.params.length <= 1) return;\r
860\r
861 destination = ev.params[0];\r
862 ev.params.shift();\r
863\r
864 kiwi.gateway.notice(destination, ev.params.join(' '));\r
865 }\r
866\r
867 function quoteCommand (ev) {\r
868 var raw = ev.params.join(' ');\r
869 kiwi.gateway.raw(raw);\r
870 }\r
871\r
872 function kickCommand (ev) {\r
873 var nick, panel = kiwi.app.panels.active;\r
874\r
875 if (!panel.isChannel()) return;\r
876\r
877 // Make sure we have a nick\r
878 if (ev.params.length === 0) return;\r
879\r
880 nick = ev.params[0];\r
881 ev.params.shift();\r
882\r
883 kiwi.gateway.kick(panel.get('name'), nick, ev.params.join(' '));\r
884 }\r
885\r
886 function settingsCommand (ev) {\r
887 var panel = new kiwi.model.Applet();\r
888 panel.load(new kiwi.applets.Settings());\r
889 \r
890 kiwi.app.panels.add(panel);\r
891 panel.view.show();\r
892 }\r
893\r
894 function appletCommand (ev) {\r
895 if (!ev.params[0]) return;\r
896\r
897 var panel = new kiwi.model.Applet();\r
898\r
899 if (ev.params[1]) {\r
900 // Url and name given\r
901 panel.load(ev.params[0], ev.params[1]);\r
902 } else {\r
903 // Load a pre-loaded applet\r
904 if (kiwi.applets[ev.params[0]]) {\r
905 panel.load(new kiwi.applets[ev.params[0]]());\r
906 } else {\r
907 kiwi.app.panels.server.addMsg('', 'Applet "' + ev.params[0] + '" does not exist');\r
908 return;\r
909 }\r
910 }\r
911 \r
912 kiwi.app.panels.add(panel);\r
913 panel.view.show();\r
914 }\r
915\r
916\r
917\r
918\r
919\r
920 this.isChannelName = function (channel_name) {\r
921 var channel_prefix = kiwi.gateway.get('channel_prefix');\r
922\r
923 if (!channel_name || !channel_name.length) return false;\r
924 return (channel_prefix.indexOf(channel_name[0]) > -1);\r
925 };\r
926\r
927 };\r
928\r
929\r
930 model = Backbone.Model.extend(new model());\r
931\r
932 return new model(arguments);\r
933};\r