Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Porter <slug@qwebirc.org>2010-04-24 15:18:38 (GMT)
committer Chris Porter <slug@qwebirc.org>2010-04-24 15:18:38 (GMT)
commit7c8b8cd744ff08cc5a2481d6157e2346ce5cfd2b (patch)
tree5a3b97f0469433d5e67925a9aa72364ee1783608
parenta7f3629f9b00d81080b38c3e0f384b3099cf55a8 (diff)
Complete support for CHANMODES and PREFIX.
Thanks to Bazerka for finding the problem areas.
-rw-r--r--js/irc/baseircclient.js47
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];