diff options
author | Chris Porter <slug@qwebirc.org> | 2010-04-24 15:18:38 (GMT) |
---|---|---|
committer | Chris Porter <slug@qwebirc.org> | 2010-04-24 15:18:38 (GMT) |
commit | 7c8b8cd744ff08cc5a2481d6157e2346ce5cfd2b (patch) | |
tree | 5a3b97f0469433d5e67925a9aa72364ee1783608 | |
parent | a7f3629f9b00d81080b38c3e0f384b3099cf55a8 (diff) |
Complete support for CHANMODES and PREFIX.
Thanks to Bazerka for finding the problem areas.
-rw-r--r-- | js/irc/baseircclient.js | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/js/irc/baseircclient.js b/js/irc/baseircclient.js index 012e2f2..c4f3a3e 100644 --- a/js/irc/baseircclient.js +++ b/js/irc/baseircclient.js @@ -1,3 +1,8 @@ +qwebirc.irc.PMODE_LIST = 0; +qwebirc.irc.PMODE_SET_UNSET = 1; +qwebirc.irc.PMODE_SET_ONLY = 2; +qwebirc.irc.PMODE_REGULAR_MODE = 3; + qwebirc.irc.RegisteredCTCPs = { "VERSION": function(x) { return "qwebirc v" + qwebirc.VERSION + ", copyright (C) Chris Porter 2008-2009 -- " + qwebirc.util.browserVersion(); @@ -23,7 +28,7 @@ qwebirc.irc.BaseIRCClient = new Class({ this.lowerNickname = this.toIRCLower(this.nickname); this.__signedOn = false; - this.pmodes = {b: true, k: true, o: true, l: true, v: true}; + this.pmodes = {b: qwebirc.irc.PMODE_LIST, l: qwebirc.irc.PMODE_SET_ONLY, k: qwebirc.irc.PMODE_SET_UNSET, o: qwebirc.irc.PMODE_SET_UNSET, v: qwebirc.irc.PMODE_SET_UNSET}; this.channels = {} this.nextctcp = 0; @@ -85,8 +90,20 @@ qwebirc.irc.BaseIRCClient = new Class({ } else { /* TODO: warn */ } + this.lowerNickname = this.toIRCLower(this.nickname); + } else if(key == "CHANMODES") { + var smodes = value.split(","); + for(var i=0;i<smodes.length;i++) + for(var j=0;j<smodes[i].length;j++) + this.pmodes[smodes[i].charAt(j)] = i; + } else if(key == "PREFIX") { + var l = (value.length - 2) / 2; + + var modeprefixes = value.substr(1, l).split(""); + modeprefixes.each(function(modeprefix) { + this.pmodes[modeprefix] = qwebirc.irc.PMODE_SET_UNSET; + }, this); } - this.lowerNickname = this.toIRCLower(this.nickname); }, irc_RPL_WELCOME: function(prefix, params) { this.nickname = params[0]; @@ -294,7 +311,8 @@ qwebirc.irc.BaseIRCClient = new Class({ } var d; - if(this.pmodes[mode]) { + var pmode = this.pmodes[mode]; + if(pmode == qwebirc.irc.PMODE_LIST || pmode == qwebirc.irc.PMODE_SET_UNSET || (cmode == "+" && pmode == qwebirc.irc.PMODE_SET_ONLY)) { d = [cmode, mode, xargs[carg++]] } else { d = [cmode, mode] @@ -310,24 +328,21 @@ qwebirc.irc.BaseIRCClient = new Class({ }, irc_RPL_ISUPPORT: function(prefix, params) { var supported = params.slice(1, -1); - var supportedhash = {}; + var items = {}; for(var i=0;i<supported.length;i++) { var l = supported[i].splitMax("=", 2); - this.supported(l[0], l[1]); + items[l[0]] = true; } - }, - irc_RPL_MYINFO: function(prefix, params) { - if(params.length < 6) - return; - - var pmodes = params[5].split(""); - this.pmodes = {} - pmodes.each(function(pmode) { - this.pmodes[pmode] = true; - }, this); - }, + if(items.CHANMODES && items.PREFIX) /* nasty hack */ + this.pmodes = {}; + + for(var i=0;i<supported.length;i++) { + var l = supported[i].splitMax("=", 2); + this.supported(l[0], l[1]); + } + }, irc_RPL_NAMREPLY: function(prefix, params) { var channel = params[2]; var names = params[3]; |