├── test ├── ui.js ├── options.js ├── server │ ├── .jshintrc │ ├── run.js │ └── server.js ├── irc-styles.js ├── .jshintrc ├── qwebirc.js ├── Elements.from.js └── test-runner.html ├── templates ├── nickmenubtn.hbs ├── channelName.hbs ├── failed-validator.hbs ├── topicText.hbs ├── ircTab.hbs ├── menubtn.hbs ├── status.hbs ├── loadingPage.hbs ├── qwebirc-layout.hbs ├── window-container.hbs ├── userlink.hbs ├── ircstyle.hbs ├── nickbtn.hbs ├── customlink.hbs ├── menuitem.hbs ├── ircMessage.hbs ├── ircnick.hbs ├── image-popover.hbs ├── navbar.hbs ├── detachedWindow.hbs ├── window.hbs ├── ircInput.hbs ├── amd │ ├── popup-alert.hbs │ ├── popup-dialog.hbs │ └── welcome-pane.hbs ├── mainmenu.hbs ├── nickMenu.hbs └── authpage.hbs ├── images ├── hs.png ├── hv.png ├── arrow.gif ├── cross.gif ├── icon.png ├── favicon.png ├── loading.gif ├── empty_favicon.ico ├── qwebircsmall.png ├── b_background_sel.gif ├── b_background_sel2.gif ├── b_background_unsel.gif ├── ui-icons_222222_256x240.png ├── ui-icons_2e83ff_256x240.png ├── ui-icons_454545_256x240.png ├── ui-icons_888888_256x240.png └── ui-icons_cd0a0a_256x240.png ├── sound ├── beep.mp3 ├── beep.ogg ├── beep.wav ├── smb_coin.mp3 ├── smb_coin.ogg ├── smb_coin.wav ├── smb_kick.mp3 ├── smb_kick.ogg ├── smb_kick.wav ├── smb_pause.mp3 ├── smb_pause.ogg ├── smb_pause.wav ├── smw_stomp.mp3 ├── smw_stomp.ogg ├── smw_stomp.wav ├── smb3_fireball.mp3 ├── smb3_fireball.ogg ├── smb3_fireball.wav ├── smw_spring_jump.mp3 ├── smw_spring_jump.ogg ├── smw_spring_jump.wav ├── smb3_frog_mario_walk.mp3 ├── smb3_frog_mario_walk.ogg ├── smb3_frog_mario_walk.wav └── readme.md ├── font ├── entypo.eot ├── entypo.ttf ├── entypo.woff └── entypo.css ├── swf ├── WebSocketMain.swf ├── soundmanager2.swf ├── soundmanager2_debug.swf └── soundmanager2_flash9.swf ├── mcss ├── Readme.md └── qui-modifiable-css.hbs ├── lang ├── panes │ ├── options │ │ ├── en-US.json │ │ └── base.json │ ├── channels │ │ └── base.json │ └── welcome │ │ └── base.json └── Readme.md ├── .travis.yml ├── less ├── qwebirc │ ├── image-popover.less │ ├── variables.less │ ├── input.less │ ├── loginbox.less │ ├── detached-window.less │ ├── irc-op-status.less │ ├── panels.less │ ├── tabbar.less │ ├── core.less │ ├── bootstrap-theme.less │ └── irc-colours.less ├── .csslintrc ├── qwebirc.less ├── twbs │ ├── component-animations.less │ ├── wells.less │ ├── breadcrumbs.less │ ├── close.less │ ├── thumbnails.less │ ├── utilities.less │ ├── jumbotron.less │ ├── media.less │ ├── pager.less │ ├── badges.less │ ├── labels.less │ ├── code.less │ ├── alerts.less │ ├── grid.less │ ├── progress-bars.less │ ├── print.less │ ├── pagination.less │ ├── responsive-utilities.less │ ├── tooltip.less │ ├── scaffolding.less │ ├── list-group.less │ ├── popovers.less │ └── modals.less └── bootstrap.less ├── panes ├── feedback.hbs ├── partials │ ├── channel-list-content.hbs │ └── customNotice.hbs ├── wizard.hbs ├── faq.hbs ├── channel-list.hbs ├── privacypolicy.hbs └── about.hbs ├── js ├── src │ ├── ui │ │ ├── panes │ │ │ ├── faq.js │ │ │ ├── wizard.js │ │ │ ├── feedback.js │ │ │ ├── PrivacyPolicy.js │ │ │ ├── about.js │ │ │ ├── ToggleDesktopNotifications.js │ │ │ ├── welcome.js │ │ │ ├── PanelView.js │ │ │ └── ChannelList.js │ │ ├── sounds.js │ │ ├── window │ │ │ └── IDetachable.js │ │ └── interfaces │ │ │ ├── IUIOptions.js │ │ │ └── IKeyboard.js │ ├── config │ │ ├── irc-mode-status.js │ │ ├── registeredCTCP.js │ │ ├── settings.js │ │ ├── commands.js │ │ └── theme-templates.js │ ├── ready.js │ ├── irc │ │ ├── CommandHistory.js │ │ ├── IRC_Error.js │ │ └── irc_Whois.js │ ├── constants │ │ ├── constants.js │ │ └── irc_lowertable.js │ ├── util │ │ ├── lang.js │ │ └── IRCProcessors.js │ ├── qwebirc.js │ ├── components │ │ ├── Asset.js │ │ ├── ImagePopover.js │ │ └── AutoScroll.js │ └── Interface.js ├── libs │ ├── Epitome │ │ ├── 3epitome-isequal.js │ │ ├── 2epitome.js │ │ ├── epitome-model-storage.js │ │ └── unused │ │ │ └── epitome-collection-sync.js │ ├── console-shim.js │ ├── .jshintrc │ ├── Elements.from.js │ ├── underscore-mixin.js │ └── Storage.js └── modules │ └── respond.js ├── .editorconfig ├── .gitignore ├── licence.lic ├── configure ├── config.js └── index.tmpl ├── .jshintrc ├── package.json ├── app-config.yml └── README.md /test/ui.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/options.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/nickmenubtn.hbs: -------------------------------------------------------------------------------- 1 |
{{description}}
-------------------------------------------------------------------------------- /templates/topicText.hbs: -------------------------------------------------------------------------------- 1 | [{{{topic}}}] -------------------------------------------------------------------------------- /images/hs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/images/hs.png -------------------------------------------------------------------------------- /images/hv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/images/hv.png -------------------------------------------------------------------------------- /sound/beep.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/sound/beep.mp3 -------------------------------------------------------------------------------- /sound/beep.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/sound/beep.ogg -------------------------------------------------------------------------------- /sound/beep.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/sound/beep.wav -------------------------------------------------------------------------------- /test/irc-styles.js: -------------------------------------------------------------------------------- 1 | // see https://github.com/megawac/irc-style-parser/blob/master/test 2 | -------------------------------------------------------------------------------- /font/entypo.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/font/entypo.eot -------------------------------------------------------------------------------- /font/entypo.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/font/entypo.ttf -------------------------------------------------------------------------------- /font/entypo.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/font/entypo.woff -------------------------------------------------------------------------------- /images/arrow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/images/arrow.gif -------------------------------------------------------------------------------- /images/cross.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/images/cross.gif -------------------------------------------------------------------------------- /images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/images/icon.png -------------------------------------------------------------------------------- /images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/images/favicon.png -------------------------------------------------------------------------------- /images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/images/loading.gif -------------------------------------------------------------------------------- /sound/smb_coin.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/sound/smb_coin.mp3 -------------------------------------------------------------------------------- /sound/smb_coin.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/sound/smb_coin.ogg -------------------------------------------------------------------------------- /sound/smb_coin.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/sound/smb_coin.wav -------------------------------------------------------------------------------- /sound/smb_kick.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/sound/smb_kick.mp3 -------------------------------------------------------------------------------- /sound/smb_kick.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/sound/smb_kick.ogg -------------------------------------------------------------------------------- /sound/smb_kick.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/sound/smb_kick.wav -------------------------------------------------------------------------------- /sound/smb_pause.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/sound/smb_pause.mp3 -------------------------------------------------------------------------------- /sound/smb_pause.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/sound/smb_pause.ogg -------------------------------------------------------------------------------- /sound/smb_pause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/sound/smb_pause.wav -------------------------------------------------------------------------------- /sound/smw_stomp.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/sound/smw_stomp.mp3 -------------------------------------------------------------------------------- /sound/smw_stomp.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/sound/smw_stomp.ogg -------------------------------------------------------------------------------- /sound/smw_stomp.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/sound/smw_stomp.wav -------------------------------------------------------------------------------- /swf/WebSocketMain.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/swf/WebSocketMain.swf -------------------------------------------------------------------------------- /swf/soundmanager2.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/swf/soundmanager2.swf -------------------------------------------------------------------------------- /templates/ircTab.hbs: -------------------------------------------------------------------------------- 1 | {{{name}}}{{> tabDetach}}{{#if closable}}{{> tabClose}}{{/if}} -------------------------------------------------------------------------------- /images/empty_favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/images/empty_favicon.ico -------------------------------------------------------------------------------- /images/qwebircsmall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/images/qwebircsmall.png -------------------------------------------------------------------------------- /sound/smb3_fireball.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/sound/smb3_fireball.mp3 -------------------------------------------------------------------------------- /sound/smb3_fireball.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/sound/smb3_fireball.ogg -------------------------------------------------------------------------------- /sound/smb3_fireball.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megawac/qwebirc-enhancements/HEAD/sound/smb3_fireball.wav -------------------------------------------------------------------------------- /templates/menubtn.hbs: -------------------------------------------------------------------------------- 1 |
6 | ![]() |
5 | 6 | | qwebirc Add qwebirc to your site |
7 |
I haven't added support for the embedded wizard yet, however you can set up the iFrame manually or clone the source code from the Github repo
12 | 13 |![]() |
5 | 6 | | qwebirc Frequently Asked Questions |
7 |
No, if this was allowed then bad people could IFRAME lots and lots of copies, which would get you glined for having too many clones.
However you can prefill the channel/nickname information (type /EMBED in the main window).
To be continued...
15 | 16 || {{lang "users"}} | 14 |{{lang "channel"}} | 15 |{{lang "topic"}} | 16 |
|---|
foo
bar"; 12 | var div = new Element("div"); 13 | expect(div.adopt(Elements.from(str)).get("html").toLowerCase().trim()).to.equal(str); 14 | }); 15 | 16 | it("should return a text nodes as well as elements", function() { 17 | var str = "foo
some text bar more text"; 18 | var div = new Element("div"); 19 | expect(div.adopt(Elements.from(str)).get("html").toLowerCase().trim()).to.equal(str); 20 | }); 21 | 22 | // it("should return a group of table elements", function() { 23 | // var str = "foo
stuff"; 30 | var commented = " " + str; 31 | var div = new Element("div").adopt(Elements.from(commented)); 32 | expect(div.get("html").toLowerCase().trim()).to.equal(str); 33 | }); 34 | 35 | }); -------------------------------------------------------------------------------- /js/src/ui/panes/welcome.js: -------------------------------------------------------------------------------- 1 | /** 2 | * welcome view 3 | * 4 | * @depends [panes/PanelView, util/ToggleNotifications] 5 | * @provides [panes/Welcome] 6 | */ 7 | ui.WelcomePane = new Class({ 8 | Extends: PanelView, 9 | options: { 10 | pane: "welcome-pane", 11 | i18n: "welcome", 12 | events: { 13 | "click:relay(.enable-notifications)": "enableNotifications", 14 | "click:relay(.controls)": "controlClick" 15 | }, 16 | onEnableNotifications: function() { 17 | /* global toggleNotifications */ 18 | toggleNotifications(this.ui.uiOptions, true, true); 19 | }, 20 | onControlClick: function(e, controls) { 21 | controls.dispose(); 22 | if(!this.element.getElement(".controls")) this._close(); 23 | } 24 | }, 25 | initialize: function(ui, options) { 26 | this.ui = ui; 27 | this.parent(options); 28 | }, 29 | getData: function() { 30 | return _.extend({}, this.options, { 31 | Browser: window.Browser 32 | }); 33 | } 34 | }) 35 | .extend({ 36 | show: function(_ui, options) {//determines if needs to be shown and shows 37 | if(options.firstvisit || notify.permissionLevel() !== notify.PERMISSION_GRANTED) { 38 | options.element = new Element("div.welcome").inject(options.element); 39 | return new ui.WelcomePane(_ui, options); 40 | } 41 | } 42 | }); -------------------------------------------------------------------------------- /less/bootstrap.less: -------------------------------------------------------------------------------- 1 | // Core variables and mixins 2 | @import "twbs/variables.less"; 3 | @import "twbs/mixins.less"; 4 | 5 | // Reset 6 | @import "twbs/normalize.less"; 7 | @import "twbs/print.less"; 8 | 9 | // Core CSS 10 | @import "twbs/scaffolding.less"; 11 | @import "twbs/type.less"; 12 | // @import "twbs/code.less"; 13 | @import "twbs/grid.less"; 14 | @import "twbs/tables.less"; 15 | @import "twbs/forms.less"; 16 | @import "twbs/buttons.less"; 17 | 18 | // Components 19 | @import "twbs/component-animations.less"; 20 | // @import "twbs/glyphicons.less"; 21 | @import "twbs/dropdowns.less"; 22 | @import "twbs/button-groups.less"; 23 | @import "twbs/input-groups.less"; 24 | @import "twbs/navs.less"; 25 | // @import "twbs/navbar.less"; 26 | // @import "twbs/breadcrumbs.less"; 27 | // @import "twbs/pagination.less"; 28 | @import "twbs/pager.less"; 29 | @import "twbs/labels.less"; 30 | // @import "twbs/badges.less"; 31 | @import "twbs/jumbotron.less"; 32 | // @import "twbs/thumbnails.less"; 33 | @import "twbs/alerts.less"; 34 | // @import "twbs/progress-bars.less"; 35 | // @import "twbs/media.less"; 36 | @import "twbs/list-group.less"; 37 | @import "twbs/panels.less"; 38 | @import "twbs/wells.less"; 39 | @import "twbs/close.less"; 40 | 41 | // Components w/ JavaScript 42 | @import "twbs/modals.less"; 43 | // @import "twbs/tooltip.less"; 44 | @import "twbs/popovers.less"; 45 | // @import "twbs/carousel.less"; 46 | 47 | // Utility classes 48 | @import "twbs/utilities.less"; 49 | @import "twbs/responsive-utilities.less"; 50 | -------------------------------------------------------------------------------- /test/test-runner.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | {{#if Browser.Features.notifications}}
7 | {{lang "welcome.enableNotificationMessage"}} {{lang "welcome.enableNotifications"}}
8 | {{else}}
9 | {{lang "welcome.noNotificationSupport"}} {{lang "welcome.considerThis"}}
10 | {{#if Browser.ie}} {{lang "welcome.chromeFrame"}}
11 |
12 | {{lang "welcome.chromeFrameTut"}}
13 | {{else}}
14 | {{#if Browser.firefox}} {{lang "welcome.ffExtension"}}
15 | {{else}}{{! http://caniuse.com/notifications }}
16 | {{lang "welcome.browseHappy"}}{{lang "welcome.desktopNotifications"}}
17 | {{/if}}
18 | {{/if}}
19 | {{/if}}
20 |
{{lang "welcome.visitOptions"}} {{lang "windowNames.options"}}
25 |
5 | Qwebirc is intended to be a simple, intuitive and feature rich IRC client that operates out of the browser. This spiritual *fork* of Chris Porter's [qwebirc](http://qwebirc.org/) is a complete rewrite of the project in order to introduce more customability, add features introduced with HTML5, improve the extensibility of the code and revamp the ui (still qui). I began this project when I became frustrated trying to create a plugin atop of Qwebirc; flexibility and extensibility are two of the main focuses of the changes. I have also added multiple features, made code quality improvements, bug fixes, etc. Here's a ([Screenshot](http://puu.sh/4ANPf.png) [Screenshot 2](http://i.imgur.com/9Cee1iO.jpg)) of a live instance.
6 |
7 | **This is undergoing active development - a RC build is being staged**
8 |
9 | ## Installation:
10 |
11 | - Install [node.js](http://nodejs.org)
12 | - Configure the qwebirc instance settings as described in [configuration](#configuration)
13 | - Install development build dependencies using `npm install` in the base folder (reads in package.json)
14 | - Run `grunt` to build static files
15 | - Start up a [iris or qwebirc](#server) with this repo's static files see [#server](#server). For testing I personally use the server in [`test/server`](https://github.com/megawac/qwebirc-enhancements/blob/master/test/server/run.js) with the `base_url` set to a live instance
16 |
17 | #### Making changes
18 | After making changes to source files run in the base directory and run `grunt` in the command line to recompile resources.
19 |
20 | ### Configuration
21 | You can set compile settings either in the gruntfile manually or setting the compile presets in [`app-config.yml`](https://github.com/megawac/qwebirc-enhancements/blob/master/app-config.yml) and [`build.yml`](https://github.com/megawac/qwebirc-enhancements/blob/master/build.yml). A similar build step to the old `compile.py` build is in the works (see #17)
22 |
23 | Making changes to most source files will require you to rebuild via `grunt`
24 |
25 | ####TODOs:
26 | * Add options for:
27 | * (mid) configure hotkeys
28 | * (major) Refactor python compile code to call appropriate Grunt build and set app options (#17)
29 |
30 |
31 | ##Server:
32 | Requires a light modification of either qwebirc or iris in order to support localization and switching the index file to `static.html`. See commits below if you don't want to use [my server fork](https://github.com/megawac/iris)
33 | - Compile: [`ffba0d7b2772d2`](https://github.com/megawac/iris/commit/ffba0d7b2772d2a26dcd47a4f941f6b020e52254)
34 | - Set index.html: [`83e67bf4b236e`](https://github.com/megawac/iris/commit/83e67bf4b236e532dcdcc7a8c9e6b7cb9f6ee4d9)
35 | - Localization engine: [`fed82b8a6a4c9`](https://github.com/megawac/iris/commit/fed82b8a6a4c9168fda4ee12a657fde5bddfc337)
36 |
37 | #### Twisted (or Iris)
38 | I have an instance of the code running over twisted on the Geeks-IRC network at [atf2.org](http://atf2.org/)
39 |
--------------------------------------------------------------------------------
/js/src/ui/window/IDetachable.js:
--------------------------------------------------------------------------------
1 | /**
2 | * detachable component
3 | *
4 | * @depends [ui/Window]
5 | * @provides [ui/Detachable]
6 | */
7 | ui.IDetachableWindow = new Class({
8 | options: {
9 | events: {
10 | "click:relay(.detached-window .attach)": "attach",
11 | "click:relay(.detached-window .tab-close)": "close"
12 | }
13 | },
14 |
15 | detached: false,
16 |
17 | attach: function(/*e*/) {
18 | this.detached = false;
19 |
20 | util.resetGrid(this.element).removeClass("detached");
21 |
22 | this.window.replaces(this.wrapper);
23 | this.wrapper.destroy();
24 |
25 | this.drag.detach().stop();
26 | this.resizable.detach().stop();
27 | this.wrapper = this.resizable = this.drag = null;
28 |
29 | this.parentObject.nav.toggleTab(this.tab.removeClass("detached"), true);
30 | this.select();
31 |
32 | this.fireEvent("attached");
33 | },
34 |
35 | detach: function(/*e*/) {
36 | var self = this,
37 | win = self.window,
38 | po = self.parentObject,
39 |
40 | wrapper = self.wrapper = Element.from(templates.detachedWindow({
41 | "channel": self.name,
42 | "base": util.isBaseWindow(self.id)
43 | })),
44 | //header = wrapper.getElement(".header"),
45 |
46 | // resizeWrapper = Element.from(templates.resizeHandle()),
47 | // resizeHandle = resizeWrapper.getElement(".resize-handle");
48 | resizeHandle = wrapper.getElement(".resize-handle");
49 |
50 | var size = util.percentToPixel({x:40, y:60}, win.getParent(".qwebirc"));
51 |
52 | //as to not mess with other window remove grid
53 | util.removeGrid(self.element).addClass("detached").show();
54 |
55 | //set size and add detach wrapper to dom
56 | wrapper.setStyles({
57 | "width": size.x,
58 | "height": size.y
59 | }).replaces(win);
60 |
61 | win.addEvent("mousedown", function(e) {
62 | var tag = e.target.tagName.toLowerCase();
63 | if(!(tag == "div" || tag == "form"))//prevent dragging if not on container
64 | e.stopPropagation();
65 | }).inject(wrapper.getElement(".body"));
66 |
67 | self.resizable = wrapper.makeResizable({
68 | limit: {//min/max
69 | x: [400, null],
70 | y: [200, null]
71 | },
72 | handle: resizeHandle,
73 | stopPropagation: true,
74 | onDrag: function() {
75 | self.__dirtyFixes();
76 | }
77 | });
78 | self.drag = wrapper.makeDraggable({
79 | handle: wrapper,
80 | includeMargins: true
81 | });
82 |
83 | /*** update windows and center detached window ****/
84 | if(self.active) po.nextWindow();//change window if we"re active
85 | self.detached = true;
86 | _.defer(function() {
87 | self.setActive();
88 | self._selectUpdates();
89 | wrapper.position();
90 | });
91 |
92 | //keeps order
93 | po.nav.toggleTab(self.tab.addClass("detached"), false);
94 | self.fireEvent("detached");
95 | }
96 | });
97 |
--------------------------------------------------------------------------------
/js/libs/underscore-mixin.js:
--------------------------------------------------------------------------------
1 | /*
2 | A collection of functional helpers for underscore
3 |
4 | */
5 | (function(_, undefined) {
6 | var slice = Array.prototype.slice;
7 |
8 | _.mixin({
9 | //http://lodash.com/docs#curry
10 | curry: function(fn, numArgs) {
11 | numArgs = numArgs || fn.length;
12 | return function wrapper(prev_args) {
13 | return function() {
14 | var args = prev_args.concat(slice.call(arguments));
15 | return args.length < numArgs ? wrapper(args) : fn.apply(this, args);
16 | };
17 | }([]);
18 | },
19 |
20 | periodical: function(fn, period, bind) {
21 | return fn.periodical(period, bind, slice.call(arguments, 3));
22 | },
23 |
24 | merge: Object.merge,
25 |
26 | //f(a,b//) -> f(b,a..)
27 | flip: function(f) {
28 | return function() {
29 | var args = slice.call(arguments);
30 | args = args.slice(1, 2).concat(args.slice(0, 1), args.slice(2));
31 | return f.apply(null, args);
32 | };
33 | },
34 |
35 | //makes it into next version of _
36 | negate: function(fn) {
37 | return function() {
38 | return !fn.apply(this, arguments);
39 | };
40 | },
41 |
42 | /* jshint devel:true */
43 | log: function() {
44 | if (console && console.log) console.log(arguments);
45 | },
46 |
47 | //https://gist.github.com/rjz/2815273
48 | assign: function(obj, key, value) {
49 | var keys = key.split("."),
50 | cur, ptr = obj;
51 |
52 | while ((cur = keys.shift()) && keys.length) {
53 | if (!_.isObject(ptr[cur])) {
54 | ptr[cur] = {};
55 | }
56 | ptr = ptr[cur];
57 | }
58 | ptr[cur] = value;
59 | return obj;
60 | },
61 |
62 | lookup: function (obj, key){
63 | var type = typeof key;
64 | if (type == "string" || type == "number") key = ("" + key).split(".");
65 | for (var i = 0, l = key.length; i < l; i++){
66 | if (_.has(obj, key[i])) obj = obj[key[i]];
67 | else return undefined;
68 | }
69 | return obj;
70 | },
71 |
72 | item: function(xs, n) {
73 | return xs == null ? null : xs[n];
74 | }
75 |
76 | //.alias({a:1,b:{alpha:'a'}}, {a: 'test', c: 'rawf'}) => {a: 1, b: Object, test: 1}
77 | // alias: function(obj, aliases, force) {//obj is an object and aliases is a dictionary of (string union listof string)
78 | // function makeAliases(alias, key) {
79 | // if(_.has(obj, key)) {
80 | // if(_.isArray(alias)) {
81 | // _.each(alias, function(alias) {makeAliases(alias, key)});
82 | // } else if(_.isString(alias) && (force || !_.has(obj, alias))) {
83 | // obj[alias] = obj[key];
84 | // }
85 | // }
86 | // }
87 | // _.each(aliases, makeAliases);
88 | // return obj;
89 | // }
90 | });
91 |
92 | })(this._);
--------------------------------------------------------------------------------
/js/src/irc/irc_Whois.js:
--------------------------------------------------------------------------------
1 | /**
2 | * ircclient whois handlers whippeee
3 | *
4 | * @depends [irc/Client]
5 | * @depends [util/utils]
6 | * @provides [irc/Whois]
7 | */
8 |
9 | function whoisWrapper(type, fn) {
10 | type = "whois" + type.camelCase().capitalize();
11 | return _.compose(function(data) {
12 | data.type = type;
13 | data.msgs = Array.from(data.msgs || data.message).map(function(msg) {
14 | if(_.isString(msg)) return { message: msg };
15 | return msg;
16 | });
17 | this.trigger("whois", data);
18 | return true;
19 | }, fn);
20 | }
21 |
22 | var genericText = whoisWrapper("genericText", function(data) {
23 | return {
24 | nick: data.args[1],
25 | message: _.last(data.args) //w/e text
26 | };
27 | });
28 |
29 | irc.Client.implement({
30 | _whoisAway: whoisWrapper("away", _.identity),
31 |
32 | irc_RPL_WHOISUSER: whoisWrapper("user", function(data) {
33 | var nick = data.args[1];
34 | var ident = data.args[2];
35 | var hostname = data.args[3];
36 | this._whoisNick = nick;
37 |
38 | return {
39 | nick: nick,
40 | msgs: [{
41 | host: ident + "@" + hostname
42 | },
43 | {
44 | message: data.args[5],
45 | type: "whoisRealname"
46 | }]
47 | };
48 | }),
49 |
50 | irc_RPL_WHOISSERVER: whoisWrapper("server", function(data) {
51 | return {
52 | nick: data.args[1],
53 | server: data.args[2],
54 | message: _.last(data.args)
55 | };
56 | }),
57 |
58 | irc_RPL_WHOISOPERATOR: whoisWrapper("oper", function(data) {
59 | return {
60 | nick: data.args[1]
61 | // opertext: _.last(data.args)
62 | };
63 | }),
64 |
65 | irc_RPL_WHOISIDLE: whoisWrapper("idle", function(data) {
66 | return {
67 | nick: data.args[1],
68 | idle: data.args[2],
69 | message: data.args[3]
70 | };
71 | }),
72 |
73 | irc_RPL_WHOISCHANNELS: whoisWrapper("channels", function(data) {
74 | return {
75 | nick: data.args[1],
76 | message: _.last(data.args) //the channels
77 | };
78 | }),
79 |
80 | irc_RPL_WHOISACCOUNT: whoisWrapper("account", function(data) {
81 | return {
82 | nick: data.args[1],
83 | message: data.args[2] //the account
84 | };
85 | }),
86 |
87 | irc_RPL_WHOISACTUALLY: whoisWrapper("actually", function(data) {
88 | return {
89 | nick: data.args[1],
90 | message: data.args[2], //users hostmask
91 | ip: data.args[3]
92 | };
93 | }),
94 |
95 | irc_RPL_WHOISOPERNAME: whoisWrapper("opername", function(data) {
96 | return {
97 | nick: data.args[1],
98 | message: data.args[2] //opername
99 | };
100 | }),
101 |
102 | irc_RPL_WHOISGENERICTEXT: genericText,
103 |
104 | //whoiswebirc
105 | irc_RPL_UNIQOPIS: genericText,
106 |
107 | irc_RPL_WHOISSECURE: genericText,
108 |
109 | irc_RPL_ENDOFWHOIS: whoisWrapper("end", function(/*data*/) {
110 | this._whoisNick = null;
111 | return {};
112 | })
113 | });
114 |
--------------------------------------------------------------------------------
/panes/privacypolicy.hbs:
--------------------------------------------------------------------------------
1 | ![]() |
5 | 6 | | qwebirc Privacy policy |
7 |
Whenever your web browser downloads a page our various webservers store industry standard logs in the following format or one very similar to it:
22 |2008-12-06 21:34:32+0000 1.2.3.4 "GET / HTTP/1.1" 200 449 "http://webchat.quakenet.org/" "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.4.154.29 Safari/525.19"
23 |These components are: 24 |
When you use the Log in functionality the Authgate passes your Q account details to the Webchat system, which contains the data you gave us when you created your Q account, your user id, the time you logged in and some cryptographic data.
35 |This information is logged on the Authgate, as part of the design of the system it also appears in the Webchat server logs.
36 |When you connect to IRC the remote IRC server logs the nickname you signed on with, the time and the IP address you were using at that time.
38 |This site defaults to use local storage to store user data and will fallback to corresponding cookies, specifically. (below is not updated we use more cookies than that)
40 |48 | 49 |
![]() |
5 | 6 | | qwebirc v{{version}} |
7 |
This is a rewrite of Chris Porter's qwebirc inspired by cinq's brouhaha integrated with Atheme's iris for channel list supports.
12 | 13 |By megawac © 2013-2014. Source of the project or for file issues is https://github.com/megawac/qwebirc-enhancements. Cheers!
14 | 15 ||
18 | 20 | Copyright © 2006-2008 Valerio Proietti, MIT license. 21 | 29 | Copyright 2013 Twitter, Inc 30 | 37 | Copyright © 2007 Scott Schiller (schillmania.com), BSD license. 38 | 41 | Released into the public domain. 42 | |
44 |
Special thanks to various comments/suggestions/hardware/bug reports from Zarjazz, Bazerka, boojah, meeb, Microbe, morphium, Starman, truff, coekie, qip, soczol, tomaw, the muppets in #rogue (hi dunks!) and everyone else I forgot :(.
48 | 49 | 50 | Copyright © 2008-2011 Chris Porter and the qwebirc project.
53 | http://www.qwebirc.org/
54 |
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
56 |This software contains portions by the following third parties:
57 | 58 | 59 |