"CLIENTINFO": function(x) { return "PING VERSION TIME USERINFO CLIENTINFO"; }\r
};\r
\r
-function BaseIRCClient(nickname, view) {\r
- var self = this;\r
- this.nickname = nickname;\r
- this.signedOn = false;\r
- this.pmodes = ["b", "k,", "o", "l", "v"];\r
- this.channels = {}\r
- var nextctcp = 0;\r
+var BaseIRCClient = new Class({\r
+ Implements: [Options],\r
+ options: {\r
+ nickname: "WCunset",\r
+ },\r
+ initialize: function(options) {\r
+ this.setOptions(options);\r
+\r
+ this.nickname = this.options.nickname;\r
+ \r
+ this.__signedOn = false;\r
+ this.pmodes = ["b", "k,", "o", "l", "v"];\r
+ this.channels = {}\r
+ this.nextctcp = 0; \r
+\r
+ this.connection = new IRCConnection({initialNickname: this.nickname, onRecv: this.dispatch.bind(this)});\r
\r
- /* attempt javascript inheritence! */\r
- this.dispatch = function(data) {\r
+ this.send = this.connection.send.bind(this.connection);\r
+ this.connect = this.connection.connect.bind(this.connection);\r
+ this.disconnect = this.connection.disconnect;\r
+ },\r
+ dispatch: function(data) {\r
var message = data[0];\r
if(message == "connect") {\r
- view.connected();\r
+ this.connected();\r
} else if(message == "disconnect") {\r
- view.disconnected();\r
+ this.disconnected();\r
} else if(message == "c") {\r
- var command = data[1];\r
+ var command = data[1].toUpperCase();\r
\r
var prefix = data[2];\r
var sl = data[3];\r
if(!n)\r
n = command; \r
\r
- var o = view["irc_" + n];\r
- if(!o)\r
- o = self["irc_" + n];\r
+ var o = this["irc_" + n];\r
\r
if(o) {\r
- var r = o(prefix, sl);\r
+ var r = o.attempt([prefix, sl], this);\r
if(!r)\r
- view.rawNumeric(command, prefix, sl);\r
+ this.rawNumeric(command, prefix, sl);\r
} else {\r
- view.rawNumeric(command, prefix, sl);\r
+ this.rawNumeric(command, prefix, sl);\r
}\r
}\r
- }\r
- \r
- this.irc_RPL_WELCOME = function(prefix, params) {\r
- self.nickname = params[0];\r
+ },\r
+\r
+ irc_RPL_WELCOME: function(prefix, params) {\r
+ this.nickname = params[0];\r
\r
- self.signedOn = true;\r
- view.signedOn(self.nickname);\r
- }\r
- \r
- this.irc_ERR_NICKNAMEINUSE = function(prefix, params) {\r
- if(self.signedOn == false) {\r
- var newnick = params[1] + "_";\r
- if(newnick == self.lastnick)\r
- newnick = "webchat" + Math.floor(Math.random() * 1024 * 1024);\r
+ this.__signedOn = true;\r
+ this.signedOn(this.nickname);\r
+ },\r
+ irc_ERR_NICKNAMEINUSE: function(prefix, params) {\r
+ if(this.__signedOn)\r
+ return;\r
+ \r
+ var newnick = params[1] + "_";\r
+ if(newnick == this.lastnick)\r
+ newnick = "webchat" + Math.floor(Math.random() * 1024 * 1024);\r
\r
- self.send("NICK " + newnick);\r
- self.lastnick = newnick;\r
- }\r
- }\r
- \r
- this.irc_NICK = function(prefix, params) {\r
+ this.send("NICK " + newnick);\r
+ this.lastnick = newnick;\r
+ },\r
+ irc_NICK: function(prefix, params) {\r
var user = prefix;\r
var oldnick = user.hostToNick();\r
var newnick = params[0];\r
\r
- if(self.nickname == oldnick)\r
- self.nickname = newnick;\r
+ if(this.nickname == oldnick)\r
+ this.nickname = newnick;\r
\r
- view.nickChanged(user, newnick);\r
+ this.nickChanged(user, newnick);\r
\r
return true;\r
- }\r
- \r
- this.irc_QUIT = function(prefix, params) {\r
+ },\r
+ irc_QUIT: function(prefix, params) {\r
var user = prefix;\r
\r
var message = params.indexFromEnd(-1);\r
\r
- view.userQuit(user, message);\r
+ this.userQuit(user, message);\r
\r
return true;\r
- }\r
-\r
- this.irc_PART = function(prefix, params) {\r
+ },\r
+ irc_PART: function(prefix, params) {\r
var user = prefix;\r
var channel = params[0];\r
var message = params[1];\r
\r
var nick = user.hostToNick();\r
\r
- if((nick == self.nickname) && self.channels[channel])\r
- delete self.channels[channel];\r
- view.userPart(user, channel, message);\r
+ if((nick == this.nickname) && this.channels[channel])\r
+ delete this.channels[channel];\r
+ \r
+ this.userPart(user, channel, message);\r
\r
return true;\r
- }\r
- \r
- this.irc_KICK = function(prefix, params) {\r
+ },\r
+ irc_KICK: function(prefix, params) {\r
var kicker = prefix;\r
var channel = params[0];\r
var kickee = params[1];\r
var message = params[2];\r
\r
- if((kickee == self.nickname) && self.channels[channel])\r
- delete self.channels[channel];\r
- view.userKicked(kicker, channel, kickee, message);\r
+ if((kickee == this.nickname) && this.channels[channel])\r
+ delete this.channels[channel];\r
+ \r
+ this.userKicked(kicker, channel, kickee, message);\r
\r
return true;\r
- }\r
- \r
- this.irc_PING = function(prefix, params) {\r
- self.send("PONG :" + params.indexFromEnd(-1));\r
+ },\r
+ irc_PING: function(prefix, params) {\r
+ this.send("PONG :" + params.indexFromEnd(-1));\r
\r
return true;\r
- }\r
- \r
- this.irc_JOIN = function(prefix, params) {\r
+ },\r
+ irc_JOIN: function(prefix, params) {\r
var channel = params[0];\r
var user = prefix;\r
var nick = user.hostToNick();\r
\r
- if(nick == self.nickname)\r
- self.channels[channel] = true;\r
+ if(nick == this.nickname)\r
+ this.channels[channel] = true;\r
\r
- view.userJoined(user, channel);\r
+ this.userJoined(user, channel);\r
\r
return true;\r
- }\r
- \r
- this.irc_TOPIC = function(prefix, params) {\r
+ },\r
+ irc_TOPIC: function(prefix, params) {\r
var user = prefix;\r
var channel = params[0];\r
var topic = params.indexFromEnd(-1);\r
\r
- view.channelTopic(user, channel, topic);\r
+ this.channelTopic(user, channel, topic);\r
\r
return true;\r
- }\r
- \r
- var processCTCP = function(message) {\r
- if(message.charAt(0) == "\x01") {\r
- if(message.charAt(message.length - 1) == "\x01") {\r
- message = message.substr(1, message.length - 2);\r
- } else {\r
- message = message.substr(1);\r
- }\r
- return message.splitMax(" ", 2);\r
+ },\r
+ processCTCP: function(message) {\r
+ if(message.charAt(0) != "\x01")\r
+ return;\r
+ \r
+ if(message.charAt(message.length - 1) == "\x01") {\r
+ message = message.substr(1, message.length - 2);\r
+ } else {\r
+ message = message.substr(1);\r
}\r
- }\r
- \r
- this.irc_PRIVMSG = function(prefix, params) {\r
+ return message.splitMax(" ", 2);\r
+ },\r
+ irc_PRIVMSG: function(prefix, params) {\r
var user = prefix;\r
var target = params[0];\r
var message = params.indexFromEnd(-1);\r
\r
- var ctcp = processCTCP(message);\r
+ var ctcp = this.processCTCP(message);\r
if(ctcp) {\r
var type = ctcp[0].toUpperCase();\r
\r
- var replyfn = registeredCTCPs[type];\r
+ var replyfn = RegisteredCTCPs[type];\r
if(replyfn) {\r
var t = new Date().getTime() / 1000;\r
- if(t > nextctcp)\r
- self.send("NOTICE " + user.hostToNick() + " :\x01" + type + " " + replyfn(ctcp[1]) + "\x01");\r
- nextctcp = t + 5;\r
+ if(t > this.nextctcp)\r
+ this.send("NOTICE " + user.hostToNick() + " :\x01" + type + " " + replyfn(ctcp[1]) + "\x01");\r
+ this.nextctcp = t + 5;\r
}\r
\r
- if(target == self.nickname) {\r
- view.userCTCP(user, type, ctcp[1]);\r
+ if(target == this.nickname) {\r
+ this.userCTCP(user, type, ctcp[1]);\r
} else {\r
- view.channelCTCP(user, target, type, ctcp[1]);\r
+ this.channelCTCP(user, target, type, ctcp[1]);\r
}\r
} else {\r
- if(target == self.nickname) {\r
- view.userPrivmsg(user, message);\r
+ if(target == this.nickname) {\r
+ this.userPrivmsg(user, message);\r
} else {\r
- view.channelPrivmsg(user, target, message);\r
+ this.channelPrivmsg(user, target, message);\r
}\r
}\r
\r
return true;\r
- }\r
-\r
- this.irc_NOTICE = function(prefix, params) {\r
+ },\r
+ irc_NOTICE: function(prefix, params) {\r
var user = prefix;\r
var target = params[0];\r
var message = params.indexFromEnd(-1);\r
\r
if(user == "") {\r
- view.serverNotice(message);\r
- } else if(target == self.nickname) {\r
- var ctcp = processCTCP(message);\r
+ this.serverNotice(message);\r
+ } else if(target == this.nickname) {\r
+ var ctcp = this.processCTCP(message);\r
if(ctcp) {\r
- view.userCTCPReply(user, ctcp[0], ctcp[1]);\r
+ this.userCTCPReply(user, ctcp[0], ctcp[1]);\r
} else {\r
- view.userNotice(user, message);\r
+ this.userNotice(user, message);\r
}\r
} else {\r
- view.channelNotice(user, target, message);\r
+ this.channelNotice(user, target, message);\r
}\r
\r
return true;\r
- }\r
-\r
- this.irc_INVITE = function(prefix, params) {\r
+ },\r
+ irc_INVITE: function(prefix, params) {\r
var user = prefix;\r
var channel = params.indexFromEnd(-1);\r
\r
- view.userInvite(user, channel);\r
+ this.userInvite(user, channel);\r
\r
return true;\r
- }\r
-\r
- this.irc_ERROR = function(prefix, params) {\r
+ },\r
+ irc_ERROR: function(prefix, params) {\r
var message = params.indexFromEnd(-1);\r
\r
- view.serverError(message);\r
+ this.serverError(message);\r
\r
return true;\r
- }\r
- \r
- this.irc_MODE = function(prefix, params) {\r
+ },\r
+ irc_MODE: function(prefix, params) {\r
var user = prefix;\r
var target = params[0];\r
var args = params.slice(1);\r
\r
- if(target == self.nickname) {\r
- view.userMode(args);\r
+ if(target == this.nickname) {\r
+ this.userMode(args);\r
} else {\r
var modes = args[0].split("");\r
var xargs = args.slice(1);\r
var pos = 0;\r
var cmode = "+";\r
\r
- forEach(modes, function(mode) {\r
+ modes.each(function(mode) {\r
if((mode == "+") || (mode == "-")) {\r
cmode = mode;\r
return;\r
}\r
\r
- if(self.pmodes[mode]) { \r
+ if(this.pmodes[mode]) { \r
d = [cmode, mode, xargs[carg++]]\r
} else {\r
d = [cmode, mode]\r
}\r
\r
data.push(d);\r
- });\r
+ }, this);\r
\r
- view.channelMode(user, target, data, args);\r
+ this.channelMode(user, target, data, args);\r
}\r
\r
return true;\r
- }\r
- \r
- this.irc_RPL_ISUPPORT = function(prefix, params) {\r
+ }, \r
+ irc_RPL_ISUPPORT: function(prefix, params) {\r
var supported = params.slice(1, -1);\r
var supportedhash = {};\r
\r
for(var i=0;i<supported.length;i++) {\r
var l = supported[i].splitMax("=", 2);\r
- view.supported(l[0], l[1]);\r
+ this.supported(l[0], l[1]);\r
}\r
- }\r
- \r
- this.irc_RPL_MYINFO = function(prefix, params) {\r
+ }, \r
+ irc_RPL_MYINFO: function(prefix, params) {\r
var pmodes = params[5].split("");\r
- self.pmodes = {}\r
- forEach(pmodes, function(pmode) {\r
- self.pmodes[pmode] = true;\r
- });\r
- }\r
- \r
- this.irc_RPL_NAMREPLY = function(prefix, params) {\r
+ this.pmodes = {}\r
+ \r
+ pmodes.each(function(pmode) {\r
+ this.pmodes[pmode] = true;\r
+ }, this);\r
+ }, \r
+ irc_RPL_NAMREPLY: function(prefix, params) {\r
var channel = params[2]; \r
var names = params[3];\r
\r
- view.channelNames(channel, names.split(" "));\r
+ this.channelNames(channel, names.split(" "));\r
\r
return true;\r
- }\r
-\r
- this.irc_RPL_ENDOFNAMES = function(prefix, params) {\r
+ },\r
+ irc_RPL_ENDOFNAMES: function(prefix, params) {\r
var channel = params[1];\r
\r
- view.channelNames(channel, []);\r
+ this.channelNames(channel, []);\r
return true;\r
- }\r
-\r
- this.irc_RPL_NOTOPIC = function(prefix, params) {\r
+ },\r
+ irc_RPL_NOTOPIC: function(prefix, params) {\r
return true;\r
- }\r
- \r
- this.irc_RPL_TOPIC = function(prefix, params) {\r
+ }, \r
+ irc_RPL_TOPIC: function(prefix, params) {\r
var channel = params[1];\r
var topic = params.indexFromEnd(-1);\r
\r
- if(self.channels[channel]) {\r
- view.initialTopic(channel, topic);\r
+ if(this.channels[channel]) {\r
+ this.initialTopic(channel, topic);\r
return true;\r
}\r
- }\r
- \r
- this.irc_RPL_TOPICWHOTIME = function(prefix, params) {\r
+ }, \r
+ irc_RPL_TOPICWHOTIME: function(prefix, params) {\r
return true;\r
}\r
- \r
- this.connection = new IRCConnection({initialNickname: nickname, onRecv: this.dispatch});\r
- \r
- this.send = this.connection.send.bind(this.connection);\r
- this.connect = this.connection.connect.bind(this.connection);\r
- this.disconnect = this.connection.disconnect;\r
-}\r
+});\r
"Q": "QUERY"\r
};\r
\r
- this.send = parentObject.__send;\r
+ this.send = parentObject.send;\r
this.parentObject = parentObject;\r
- \r
- this.commands = {\r
- ME: [true, undefined, undefined, function(args) {\r
- if(args == undefined)\r
- args = "";\r
- this.send("PRIVMSG " + w.name + " :\x01ACTION " + args + "\x01");\r
- this.newTargetLine(w.name, "ACTION", args);\r
- }],\r
- CTCP: [false, 3, 2, function(args) {\r
- var target = args[0];\r
- var type = args[1].toUpperCase();\r
- var message = args[2];\r
- \r
- if(message == undefined)\r
- message = "";\r
-\r
- if(message == "") {\r
- this.send("PRIVMSG " + target + " :\x01" + type + "\x01");\r
- } else {\r
- this.send("PRIVMSG " + target + " :\x01" + type + " " + message + "\x01");\r
- }\r
- \r
- this.newTargetLine(target, "CTCP", message, {"x": type});\r
- }],\r
- PRIVMSG: [false, 2, 2, function(args) {\r
- var target = args[0];\r
- var message = args[1];\r
- \r
- this.newTargetLine(target, "MSG", message, {});\r
- \r
- this.send("PRIVMSG " + target + " :" + message);\r
- }],\r
- NOTICE: [false, 2, 2, function(args) {\r
- var target = args[0];\r
- var message = args[1];\r
-\r
- this.newTargetLine(target, "NOTICE", message);\r
- this.send("NOTICE " + target + " :" + message);\r
- }],\r
- QUERY: [false, 2, 1, function(args) {\r
- this.parentObject.newWindow(args[0], WINDOW_QUERY, true);\r
-\r
- if((args.length > 1) && (args[1] != ""))\r
- return ["SAY", args[1]];\r
- }],\r
- SAY: [true, undefined, undefined, function(args) {\r
- if(args == undefined)\r
- args = "";\r
- \r
- return ["PRIVMSG", this.parentObject.getActiveWindow().name + " " + args]\r
- }],\r
- KICK: [true, 3, 2, function(args) {\r
- var channel = args[0];\r
- var target = args[1];\r
- var message = args[2];\r
- if(!message)\r
- message = "";\r
- \r
- this.send("KICK " + channel + " " + target + " :" + message);\r
- }]\r
- }; \r
},\r
newTargetLine: function(target, type, message, extra) {\r
if(!extra)\r
command = aliascmd;\r
\r
for(;;) {\r
- var cmdopts = this.commands[command];\r
+ var cmdopts = this["cmd_" + command];\r
if(!cmdopts) {\r
if(args) {\r
this.send(command + " " + args);\r
command = ret[0];\r
args = ret[1];\r
}\r
- }\r
+ },\r
+ \r
+ \r
+ cmd_ME: [true, undefined, undefined, function(args) {\r
+ if(args == undefined)\r
+ args = "";\r
+ return ["SAY", "\x01ACTION " + args + "\x01"];\r
+ }],\r
+ cmd_CTCP: [false, 3, 2, function(args) {\r
+ var target = args[0];\r
+ var type = args[1].toUpperCase();\r
+ var message = args[2];\r
+ \r
+ if(message == undefined)\r
+ message = "";\r
+\r
+ if(message == "") {\r
+ this.send("PRIVMSG " + target + " :\x01" + type + "\x01");\r
+ } else {\r
+ this.send("PRIVMSG " + target + " :\x01" + type + " " + message + "\x01");\r
+ }\r
+ \r
+ this.newTargetLine(target, "CTCP", message, {"x": type});\r
+ }],\r
+ cmd_PRIVMSG: [false, 2, 2, function(args) {\r
+ var target = args[0];\r
+ var message = args[1];\r
+ \r
+ this.newTargetLine(target, "MSG", message, {});\r
+ \r
+ this.send("PRIVMSG " + target + " :" + message);\r
+ }],\r
+ cmd_NOTICE: [false, 2, 2, function(args) {\r
+ var target = args[0];\r
+ var message = args[1];\r
+\r
+ this.newTargetLine(target, "NOTICE", message);\r
+ this.send("NOTICE " + target + " :" + message);\r
+ }],\r
+ cmd_QUERY: [false, 2, 1, function(args) {\r
+ this.parentObject.newWindow(args[0], WINDOW_QUERY, true);\r
+\r
+ if((args.length > 1) && (args[1] != ""))\r
+ return ["SAY", args[1]];\r
+ }],\r
+ cmd_SAY: [true, undefined, undefined, function(args) {\r
+ if(args == undefined)\r
+ args = "";\r
+ \r
+ return ["PRIVMSG", this.parentObject.getActiveWindow().name + " " + args]\r
+ }],\r
+ KICK: [true, 3, 2, function(args) {\r
+ var channel = args[0];\r
+ var target = args[1];\r
+ var message = args[2];\r
+ if(!message)\r
+ message = "";\r
+ \r
+ this.send("KICK " + channel + " " + target + " :" + message);\r
+ }],\r
});\r
-function IRCClient(nickname, ui, autojoin) {\r
- var self = this;\r
- this.prefixes = "@+";\r
- this.modeprefixes = "ov";\r
- this.windows = {};\r
- \r
- var newLine = function(window, type, data) {\r
+var IRCClient = new Class({\r
+ Extends: BaseIRCClient,\r
+ options: {\r
+ nickname: "WCunset",\r
+ autojoin: "",\r
+ },\r
+ initialize: function(options, ui) {\r
+ this.parent(options);\r
+\r
+ this.ui = ui;\r
+\r
+ this.prefixes = "@+";\r
+ this.modeprefixes = "ov";\r
+ this.windows = {};\r
+ \r
+ this.commandparser = new CommandParser(this);\r
+ this.exec = this.commandparser.dispatch.bind(this.commandparser);\r
+\r
+ this.statusWindow = this.ui.newClient(this);\r
+ },\r
+ newLine: function(window, type, data) {\r
if(!data)\r
data = {};\r
\r
- var w = self.getWindow(window);\r
+ var w = this.getWindow(window);\r
if(w) {\r
w.addLine(type, data);\r
} else {\r
- self.statusWindow.addLine(type, data);\r
+ this.statusWindow.addLine(type, data);\r
}\r
- }\r
- this.newLine = newLine;\r
- \r
- var newChanLine = function(channel, type, user, extra) {\r
+ },\r
+ newChanLine: function(channel, type, user, extra) {\r
if(!extra)\r
extra = {};\r
\r
extra["n"] = user.hostToNick();\r
extra["h"] = user.hostToHost();\r
extra["c"] = channel;\r
- extra["-"] = self.nickname;\r
+ extra["-"] = this.nickname;\r
\r
- newLine(channel, type, extra);\r
- }\r
- \r
- var newServerLine = function(type, data) {\r
- self.statusWindow.addLine(type, data);\r
- }\r
-\r
- var newActiveLine = function(type, data) {\r
- ui.getActiveWindow().addLine(type, data);\r
- }\r
- \r
- this.rawNumeric = function(numeric, prefix, params) {\r
- newServerLine("RAW", {"n": "numeric", "m": params.slice(1).join(" ")});\r
- }\r
- \r
- this.signedOn = function(nickname) {\r
- self.tracker = new IRCTracker();\r
- self.nickname = nickname;\r
- newServerLine("SIGNON");\r
- \r
- if(autojoin)\r
- self.__send("JOIN " + autojoin);\r
- }\r
-\r
- this.updateNickList = function(channel) {\r
- var n1 = self.tracker.getChannel(channel);\r
+ this.newLine(channel, type, extra);\r
+ },\r
+ newServerLine: function(type, data) {\r
+ this.statusWindow.addLine(type, data);\r
+ },\r
+ newActiveLine: function(type, data) {\r
+ this.ui.getActiveWindow().addLine(type, data);\r
+ },\r
+ updateNickList: function(channel) {\r
+ var n1 = this.tracker.getChannel(channel);\r
var names = new Array();\r
var tff = String.fromCharCode(255);\r
var nh = {}\r
\r
if(nc.prefixes.length > 0) {\r
var c = nc.prefixes.charAt(0);\r
- nx = String.fromCharCode(self.prefixes.indexOf(c)) + n.toIRCLower();\r
+ nx = String.fromCharCode(this.prefixes.indexOf(c)) + n.toIRCLower();\r
nh[nx] = c + n;\r
} else {\r
nx = tff + n.toIRCLower();\r
names.sort();\r
\r
var sortednames = new Array();\r
- forEach(names, function(name) {\r
+ names.each(function(name) {\r
sortednames.push(nh[name]);\r
});\r
\r
- var w = self.getWindow(channel);\r
+ var w = this.getWindow(channel);\r
if(w)\r
w.updateNickList(sortednames);\r
- }\r
- \r
- this.getWindow = function(name) {\r
- return self.windows[name];\r
- }\r
- \r
- this.newWindow = function(name, type, select) {\r
- var w = self.getWindow(name);\r
+ },\r
+ getWindow: function(name) {\r
+ return this.windows[name];\r
+ },\r
+ newWindow: function(name, type, select) {\r
+ var w = this.getWindow(name);\r
if(!w) {\r
- w = self.windows[name] = ui.newWindow(self, type, name);\r
+ w = this.windows[name] = this.ui.newWindow(this, type, name);\r
\r
w.addEvent("close", function(w) {\r
- delete self.windows[name];\r
- });\r
+ delete this.windows[name];\r
+ }.bind(this));\r
}\r
\r
if(select)\r
- ui.selectWindow(w);\r
+ this.ui.selectWindow(w);\r
\r
return w;\r
- }\r
+ },\r
+ getActiveWindow: function() {\r
+ return this.ui.getActiveWindow();\r
+ },\r
+ getNickname: function() {\r
+ return this.nickname;\r
+ },\r
+ addPrefix: function(nickchanentry, prefix) {\r
+ var ncp = nickchanentry.prefixes + prefix;\r
+ var prefixes = [];\r
+ \r
+ /* O(n^2) */\r
+ for(var i=0;i<this.prefixes.length;i++) {\r
+ var pc = this.prefixes.charAt(i);\r
+ var index = ncp.indexOf(pc);\r
+ if(index != -1)\r
+ prefixes.push(pc);\r
+ }\r
+ \r
+ nickchanentry.prefixes = prefixes.join("");\r
+ },\r
+ removePrefix: function(nickchanentry, prefix) {\r
+ nickchanentry.prefixes = nickchanentry.prefixes.replaceAll(prefix, "");\r
+ },\r
\r
- this.userJoined = function(user, channel) {\r
+ /* from here down are events */\r
+ rawNumeric: function(numeric, prefix, params) {\r
+ this.newServerLine("RAW", {"n": "numeric", "m": params.slice(1).join(" ")});\r
+ },\r
+ signedOn: function(nickname) {\r
+ this.tracker = new IRCTracker();\r
+ this.nickname = nickname;\r
+ this.newServerLine("SIGNON");\r
+ \r
+ if(this.autojoin)\r
+ this.send("JOIN " + this.autojoin);\r
+ },\r
+ userJoined: function(user, channel) {\r
var nick = user.hostToNick();\r
var host = user.hostToHost();\r
\r
- if((nick == self.nickname) && !self.getWindow(channel))\r
- self.newWindow(channel, WINDOW_CHANNEL, true);\r
- self.tracker.addNickToChannel(nick, channel);\r
+ if((nick == this.nickname) && !this.getWindow(channel))\r
+ this.newWindow(channel, WINDOW_CHANNEL, true);\r
+ this.tracker.addNickToChannel(nick, channel);\r
\r
- newChanLine(channel, "JOIN", user);\r
- \r
- self.updateNickList(channel);\r
- }\r
- \r
- this.userPart = function(user, channel, message) {\r
+ this.newChanLine(channel, "JOIN", user);\r
+ this.updateNickList(channel);\r
+ },\r
+ userPart: function(user, channel, message) {\r
var nick = user.hostToNick();\r
var host = user.hostToHost();\r
\r
- if(nick == self.nickname) {\r
- self.tracker.removeChannel(channel);\r
+ if(nick == this.nickname) {\r
+ this.tracker.removeChannel(channel);\r
} else {\r
- self.tracker.removeNickFromChannel(nick, channel);\r
- newChanLine(channel, "PART", user, {"m": message});\r
+ this.tracker.removeNickFromChannel(nick, channel);\r
+ this.newChanLine(channel, "PART", user, {"m": message});\r
}\r
\r
- self.updateNickList(channel);\r
+ this.updateNickList(channel);\r
\r
- var w = self.getWindow(channel)\r
+ var w = this.getWindow(channel)\r
if(w)\r
w.close();\r
- }\r
-\r
- this.userKicked = function(kicker, channel, kickee, message) {\r
- if(kickee == self.nickname) {\r
- self.tracker.removeChannel(channel);\r
- self.getWindow(channel).close();\r
+ },\r
+ userKicked: function(kicker, channel, kickee, message) {\r
+ if(kickee == this.nickname) {\r
+ this.tracker.removeChannel(channel);\r
+ this.getWindow(channel).close();\r
} else {\r
- self.tracker.removeNickFromChannel(kickee, channel);\r
- self.updateNickList(channel);\r
+ this.tracker.removeNickFromChannel(kickee, channel);\r
+ this.updateNickList(channel);\r
}\r
\r
- newChanLine(channel, "KICK", kicker, {"v": kickee, "m": message});\r
- }\r
- \r
- this.channelMode = function(user, channel, modes, raw) {\r
- forEach(modes, function(mo) {\r
+ this.newChanLine(channel, "KICK", kicker, {"v": kickee, "m": message});\r
+ },\r
+ channelMode: function(user, channel, modes, raw) {\r
+ modes.each(function(mo) {\r
var direction = mo[0];\r
var mode = mo[1];\r
\r
- var prefixindex = self.modeprefixes.indexOf(mode);\r
+ var prefixindex = this.modeprefixes.indexOf(mode);\r
if(prefixindex == -1)\r
return;\r
\r
var nick = mo[2];\r
- var prefixchar = self.prefixes.charAt(prefixindex);\r
+ var prefixchar = this.prefixes.charAt(prefixindex);\r
\r
- var nc = self.tracker.getOrCreateNickOnChannel(nick, channel);\r
+ var nc = this.tracker.getOrCreateNickOnChannel(nick, channel);\r
if(direction == "-") {\r
- self.removePrefix(nc, prefixchar);\r
+ this.removePrefix(nc, prefixchar);\r
} else {\r
- self.addPrefix(nc, prefixchar);\r
+ this.addPrefix(nc, prefixchar);\r
}\r
- });\r
+ }, this);\r
\r
- newChanLine(channel, "MODE", user, {"m": raw.join(" ")});\r
+ this.newChanLine(channel, "MODE", user, {"m": raw.join(" ")});\r
\r
- self.updateNickList(channel);\r
- }\r
-\r
- this.userQuit = function(user, message) {\r
+ this.updateNickList(channel);\r
+ },\r
+ userQuit: function(user, message) {\r
var nick = user.hostToNick();\r
\r
- var channels = self.tracker.getNick(nick);\r
+ var channels = this.tracker.getNick(nick);\r
\r
var clist = [];\r
for(var c in channels) {\r
clist.push(c);\r
- newChanLine(c, "QUIT", user, {"m": message});\r
+ this.newChanLine(c, "QUIT", user, {"m": message});\r
}\r
\r
- self.tracker.removeNick(nick);\r
+ this.tracker.removeNick(nick);\r
\r
- forEach(clist, function(cli) {\r
- self.updateNickList(cli);\r
- });\r
- }\r
-\r
- this.nickChanged = function(user, newnick) {\r
+ clist.each(function(cli) {\r
+ this.updateNickList(cli);\r
+ }, this);\r
+ },\r
+ nickChanged: function(user, newnick) {\r
var oldnick = user.hostToNick();\r
\r
- if(oldnick == self.nickname)\r
- self.nickname = newnick;\r
+ if(oldnick == this.nickname)\r
+ this.nickname = newnick;\r
\r
- self.tracker.renameNick(oldnick, newnick);\r
+ this.tracker.renameNick(oldnick, newnick);\r
\r
- var channels = self.tracker.getNick(newnick);\r
+ var channels = this.tracker.getNick(newnick);\r
\r
for(var c in channels) {\r
- newChanLine(c, "NICK", user, {"w": newnick});\r
+ this.newChanLine(c, "NICK", user, {"w": newnick});\r
/* TODO: rename queries */\r
- self.updateNickList(c);\r
+ this.updateNickList(c);\r
}\r
- }\r
- \r
- this.channelTopic = function(user, channel, topic) {\r
- newChanLine(channel, "TOPIC", user, {"m": topic});\r
- self.getWindow(channel).updateTopic(topic);\r
- }\r
- \r
- this.initialTopic = function(channel, topic) {\r
- self.getWindow(channel).updateTopic(topic);\r
- }\r
- \r
- this.channelCTCP = function(user, channel, type, args) {\r
+ },\r
+ channelTopic: function(user, channel, topic) {\r
+ this.newChanLine(channel, "TOPIC", user, {"m": topic});\r
+ this.getWindow(channel).updateTopic(topic);\r
+ },\r
+ initialTopic: function(channel, topic) {\r
+ this.getWindow(channel).updateTopic(topic);\r
+ },\r
+ channelCTCP: function(user, channel, type, args) {\r
if(args == undefined)\r
args = "";\r
\r
if(type == "ACTION") {\r
- newChanLine(channel, "CHANACTION", user, {"m": args, "c": channel});\r
+ this.newChanLine(channel, "CHANACTION", user, {"m": args, "c": channel});\r
return;\r
}\r
\r
- newChanLine(channel, "CHANCTCP", user, {"x": type, "m": args, "c": channel});\r
- }\r
- \r
- this.userCTCP = function(user, type, args) {\r
+ this.newChanLine(channel, "CHANCTCP", user, {"x": type, "m": args, "c": channel});\r
+ },\r
+ userCTCP: function(user, type, args) {\r
var nick = user.hostToNick();\r
var host = user.hostToHost();\r
if(args == undefined)\r
args = "";\r
\r
if(type == "ACTION") { \r
- self.newWindow(nick, WINDOW_QUERY);\r
- newLine(nick, "PRIVACTION", {"m": args, "x": type, "h": host, "n": nick});\r
+ this.newWindow(nick, WINDOW_QUERY);\r
+ this.newLine(nick, "PRIVACTION", {"m": args, "x": type, "h": host, "n": nick});\r
return;\r
}\r
\r
- if(self.getWindow(nick)) {\r
- newLine(nick, "PRIVCTCP", {"m": args, "x": type, "h": host, "n": nick, "-": self.nickname});\r
+ if(this.getWindow(nick)) {\r
+ this.newLine(nick, "PRIVCTCP", {"m": args, "x": type, "h": host, "n": nick, "-": this.nickname});\r
} else {\r
- newActiveLine("PRIVCTCP", {"m": args, "x": type, "h": host, "n": nick, "-": self.nickname});\r
+ this.newActiveLine("PRIVCTCP", {"m": args, "x": type, "h": host, "n": nick, "-": this.nickname});\r
}\r
- }\r
- \r
- this.userCTCPReply = function(user, type, args) {\r
+ },\r
+ userCTCPReply: function(user, type, args) {\r
var nick = user.hostToNick();\r
var host = user.hostToHost();\r
if(args == undefined)\r
args = "";\r
\r
- if(self.getWindow(nick)) {\r
- newLine(nick, "CTCPREPLY", {"m": args, "x": type, "h": host, "n": nick, "-": self.nickname});\r
+ if(this.getWindow(nick)) {\r
+ this.newLine(nick, "CTCPREPLY", {"m": args, "x": type, "h": host, "n": nick, "-": this.nickname});\r
} else {\r
- newActiveLine("CTCPREPLY", {"m": args, "x": type, "h": host, "n": nick, "-": self.nickname});\r
+ this.newActiveLine("CTCPREPLY", {"m": args, "x": type, "h": host, "n": nick, "-": this.nickname});\r
}\r
- }\r
- \r
- this.channelPrivmsg = function(user, channel, message) {\r
- newChanLine(channel, "CHANMSG", user, {"m": message});\r
- }\r
-\r
- this.channelNotice = function(user, channel, message) {\r
- newChanLine(channel, "CHANNOTICE", user, {"m": message});\r
- }\r
-\r
- this.userPrivmsg = function(user, message) {\r
+ },\r
+ channelPrivmsg: function(user, channel, message) {\r
+ this.newChanLine(channel, "CHANMSG", user, {"m": message});\r
+ },\r
+ channelNotice: function(user, channel, message) {\r
+ this.newChanLine(channel, "CHANNOTICE", user, {"m": message});\r
+ },\r
+ userPrivmsg: function(user, message) {\r
var nick = user.hostToNick();\r
var host = user.hostToHost();\r
\r
- self.newWindow(nick, WINDOW_QUERY);\r
+ this.newWindow(nick, WINDOW_QUERY);\r
\r
- newLine(nick, "PRIVMSG", {"m": message, "h": host, "n": nick});\r
- }\r
- \r
- this.serverNotice = function(message) {\r
- newServerLine("SERVERNOTICE", {"m": message});\r
- }\r
- \r
- this.userNotice = function(user, message) {\r
+ this.newLine(nick, "PRIVMSG", {"m": message, "h": host, "n": nick});\r
+ },\r
+ serverNotice: function(message) {\r
+ this.newServerLine("SERVERNOTICE", {"m": message});\r
+ },\r
+ userNotice: function(user, message) {\r
var nick = user.hostToNick();\r
var host = user.hostToHost();\r
\r
- if(self.getWindow(nick)) {\r
- newLine(nick, "PRIVNOTICE", {"m": message, "h": host, "n": nick});\r
+ if(this.getWindow(nick)) {\r
+ this.newLine(nick, "PRIVNOTICE", {"m": message, "h": host, "n": nick});\r
} else {\r
- newActiveLine("PRIVNOTICE", {"m": message, "h": host, "n": nick});\r
+ this.newActiveLine("PRIVNOTICE", {"m": message, "h": host, "n": nick});\r
}\r
- }\r
- \r
- this.userInvite = function(user, channel) {\r
+ },\r
+ userInvite: function(user, channel) {\r
var nick = user.hostToNick();\r
var host = user.hostToHost();\r
\r
- newServerLine("INVITE", {"c": channel, "h": host, "n": nick});\r
- }\r
- \r
- this.userMode = function(modes) {\r
- newServerLine("UMODE", {"m": modes, "n": self.nickname});\r
- }\r
- \r
- this.addPrefix = function(nickchanentry, prefix) {\r
- var ncp = nickchanentry.prefixes + prefix;\r
- var prefixes = new Array();\r
- \r
- /* O(n^2) */\r
- for(var i=0;i<self.prefixes.length;i++) {\r
- var pc = self.prefixes.charAt(i);\r
- var index = ncp.indexOf(pc);\r
- if(index != -1)\r
- prefixes.push(pc);\r
- }\r
- \r
- nickchanentry.prefixes = prefixes.join("");\r
- }\r
- \r
- this.removePrefix = function(nickchanentry, prefix) {\r
- nickchanentry.prefixes = nickchanentry.prefixes.replaceAll(prefix, "");\r
- }\r
-\r
- this.channelNames = function(channel, names) {\r
+ this.newServerLine("INVITE", {"c": channel, "h": host, "n": nick});\r
+ },\r
+ userMode: function(modes) {\r
+ this.newServerLine("UMODE", {"m": modes, "n": this.nickname});\r
+ },\r
+ channelNames: function(channel, names) {\r
if(names.length == 0) {\r
- self.updateNickList(channel);\r
+ this.updateNickList(channel);\r
return;\r
}\r
\r
- forEach(names, function(nick) {\r
+ names.each(function(nick) {\r
var prefixes = [];\r
var splitnick = nick.split("");\r
\r
- var i = 0;\r
- forEach(splitnick, function(c) {\r
- if(self.prefixes.indexOf(c) == -1) {\r
+ splitnick.every(function(c, i) {\r
+ if(this.prefixes.indexOf(c) == -1) {\r
nick = nick.substr(i);\r
- return true;\r
+ return false;\r
}\r
\r
prefixes.push(c);\r
- i++;\r
- });\r
+ return true;\r
+ }, this);\r
\r
- var nc = self.tracker.addNickToChannel(nick, channel);\r
- forEach(prefixes, function(p) {\r
- self.addPrefix(nc, p);\r
- });\r
- });\r
- }\r
- \r
- this.disconnected = function() {\r
- for(var x in this.parent.channels) {\r
- ui.closeWindow(x);\r
- }\r
+ var nc = this.tracker.addNickToChannel(nick, channel);\r
+ prefixes.each(function(p) {\r
+ this.addPrefix(nc, p);\r
+ }, this);\r
+ }, this);\r
+ },\r
+ disconnected: function() {\r
+ for(var x in this.parent.channels)\r
+ this.ui.closeWindow(x);\r
\r
- self.tracker = undefined;\r
+ this.tracker = undefined;\r
\r
- newServerLine("DISCONNECT");\r
- self.disconnect();\r
- }\r
- \r
- this.supported = function(key, value) {\r
+ this.newServerLine("DISCONNECT");\r
+ },\r
+ supported: function(key, value) {\r
if(key == "PREFIX") {\r
var l = (value.length - 2) / 2;\r
\r
- self.modeprefixes = value.substr(1, l);\r
- self.prefixes = value.substr(l + 2, l);\r
- } \r
- }\r
- \r
- this.connected = function() {\r
- newServerLine("CONNECT");\r
- }\r
- \r
- this.serverError = function(message) {\r
- newServerLine("ERROR", {"m": message});\r
- }\r
-\r
- this.getActiveWindow = function() {\r
- return ui.getActiveWindow();\r
- }\r
- \r
- this.getNickname = function() {\r
- return self.nickname;\r
- }\r
- \r
- this.parent = new BaseIRCClient(nickname, this);\r
- this.__send = this.parent.send;\r
- \r
- this.commandparser = new CommandParser(this);\r
- this.dispatch = this.commandparser.dispatch.bind(this.commandparser);\r
-\r
- this.statusWindow = ui.newClient(self);\r
-\r
- this.connect = this.parent.connect;\r
- this.disconnect = this.parent.disconnect;\r
-}\r
-\r
+ this.modeprefixes = value.substr(1, l);\r
+ this.prefixes = value.substr(l + 2, l);\r
+ alert(this.prefixes);\r
+ }\r
+ },\r
+ connected: function() {\r
+ this.newServerLine("CONNECT");\r
+ },\r
+ serverError: function(message) {\r
+ this.newServerLine("ERROR", {"m": message});\r
+ }\r
+});\r