1 qwebirc
.irc
.RegisteredCTCPs
= {
2 "VERSION": function(x
) {
3 return "qwebirc v" + qwebirc
.VERSION
+ ", copyright (C) Chris Porter 2008-2009 -- " + qwebirc
.util
.browserVersion();
5 "USERINFO": function(x
) { return "qwebirc"; },
6 "TIME": function(x
) { return qwebirc
.irc
.IRCTime(new Date()); },
7 "PING": function(x
) { return x
; },
8 "CLIENTINFO": function(x
) { return "PING VERSION TIME USERINFO CLIENTINFO"; }
11 qwebirc
.irc
.BaseIRCClient
= new Class({
12 Implements: [Options
],
16 initialize: function(options
) {
17 this.setOptions(options
);
19 this.toIRCLower
= qwebirc
.irc
.RFC1459toIRCLower
;
21 this.nickname
= this.options
.nickname
;
22 this.lowerNickname
= this.toIRCLower(this.nickname
);
24 this.__signedOn
= false;
25 this.pmodes
= {b: true, k: true, o: true, l: true, v: true};
29 this.connection
= new qwebirc
.irc
.IRCConnection({
30 initialNickname: this.nickname
,
31 onRecv: this.dispatch
.bind(this),
32 serverPassword: this.options
.serverPassword
35 this.send
= this.connection
.send
.bind(this.connection
);
36 this.connect
= this.connection
.connect
.bind(this.connection
);
37 this.disconnect
= this.connection
.disconnect
.bind(this.connection
);
39 this.setupGenericErrors();
41 dispatch: function(data
) {
42 var message
= data
[0];
43 if(message
== "connect") {
45 } else if(message
== "disconnect") {
46 if(data
.length
== 0) {
47 this.disconnected("No error!");
49 this.disconnected(data
[1]);
52 } else if(message
== "c") {
53 var command
= data
[1].toUpperCase();
57 var n
= qwebirc
.irc
.Numerics
[command
];
63 var o
= this["irc_" + n
];
66 var r
= o
.run([prefix
, sl
], this);
68 this.rawNumeric(command
, prefix
, sl
);
70 this.rawNumeric(command
, prefix
, sl
);
74 isChannel: function(target
) {
75 var c
= target
.charAt(0);
78 supported: function(key
, value
) {
79 if(key
== "CASEMAPPING") {
80 if(value
== "ascii") {
81 this.toIRCLower
= qwebirc
.irc
.ASCIItoIRCLower
;
82 } else if(value
== "rfc1459") {
88 this.lowerNickname
= this.toIRCLower(this.nickname
);
90 irc_RPL_WELCOME: function(prefix
, params
) {
91 this.nickname
= params
[0];
92 this.lowerNickname
= this.toIRCLower(this.nickname
);
93 this.__signedOn
= true;
94 this.signedOn(this.nickname
);
96 irc_ERR_NICKNAMEINUSE: function(prefix
, params
) {
97 this.genericError(params
[1], params
.indexFromEnd(-1).replace("in use.", "in use"));
102 var newnick
= params
[1] + "_";
103 if(newnick
== this.lastnick
)
104 newnick
= "qwebirc" + Math
.floor(Math
.random() * 1024 * 1024);
106 this.send("NICK " + newnick
);
107 this.lastnick
= newnick
;
110 irc_NICK: function(prefix
, params
) {
112 var oldnick
= user
.hostToNick();
113 var newnick
= params
[0];
115 if(this.nickname
== oldnick
) {
116 this.nickname
= newnick
;
117 this.lowerNickname
= this.toIRCLower(this.nickname
);
120 this.nickChanged(user
, newnick
);
124 irc_QUIT: function(prefix
, params
) {
127 var message
= params
.indexFromEnd(-1);
129 this.userQuit(user
, message
);
133 irc_PART: function(prefix
, params
) {
135 var channel
= params
[0];
136 var message
= params
[1];
138 var nick
= user
.hostToNick();
140 if((nick
== this.nickname
) && this.__getChannel(channel
))
141 this.__killChannel(channel
);
143 this.userPart(user
, channel
, message
);
147 __getChannel: function(name
) {
148 return this.channels
[this.toIRCLower(name
)];
150 __killChannel: function(name
) {
151 delete this.channels
[this.toIRCLower(name
)];
153 __nowOnChannel: function(name
) {
154 this.channels
[this.toIRCLower(name
)] = 1;
156 irc_KICK: function(prefix
, params
) {
158 var channel
= params
[0];
159 var kickee
= params
[1];
160 var message
= params
[2];
162 if((kickee
== this.nickname
) && this.__getChannel(channel
))
163 this.__killChannel(channel
);
165 this.userKicked(kicker
, channel
, kickee
, message
);
169 irc_PING: function(prefix
, params
) {
170 this.send("PONG :" + params
.indexFromEnd(-1));
174 irc_JOIN: function(prefix
, params
) {
175 var channel
= params
[0];
177 var nick
= user
.hostToNick();
179 if(nick
== this.nickname
)
180 this.__nowOnChannel(channel
);
182 this.userJoined(user
, channel
);
186 irc_TOPIC: function(prefix
, params
) {
188 var channel
= params
[0];
189 var topic
= params
.indexFromEnd(-1);
191 this.channelTopic(user
, channel
, topic
);
195 processCTCP: function(message
) {
196 if(message
.charAt(0) != "\x01")
199 if(message
.charAt(message
.length
- 1) == "\x01") {
200 message
= message
.substr(1, message
.length
- 2);
202 message
= message
.substr(1);
204 return message
.splitMax(" ", 2);
206 irc_PRIVMSG: function(prefix
, params
) {
208 var target
= params
[0];
209 var message
= params
.indexFromEnd(-1);
211 var ctcp
= this.processCTCP(message
);
213 var type
= ctcp
[0].toUpperCase();
215 var replyfn
= qwebirc
.irc
.RegisteredCTCPs
[type
];
217 var t
= new Date().getTime() / 1000;
218 if(t
> this.nextctcp
)
219 this.send("NOTICE " + user
.hostToNick() + " :\x01" + type
+ " " + replyfn(ctcp
[1]) + "\x01");
220 this.nextctcp
= t
+ 5;
223 if(target
== this.nickname
) {
224 this.userCTCP(user
, type
, ctcp
[1]);
226 this.channelCTCP(user
, target
, type
, ctcp
[1]);
229 if(target
== this.nickname
) {
230 this.userPrivmsg(user
, message
);
232 this.channelPrivmsg(user
, target
, message
);
238 irc_NOTICE: function(prefix
, params
) {
240 var target
= params
[0];
241 var message
= params
.indexFromEnd(-1);
243 if((user
== "") || (user
.indexOf("!") == -1)) {
244 this.serverNotice(user
, message
);
245 } else if(target
== this.nickname
) {
246 var ctcp
= this.processCTCP(message
);
248 this.userCTCPReply(user
, ctcp
[0], ctcp
[1]);
250 this.userNotice(user
, message
);
253 this.channelNotice(user
, target
, message
);
258 irc_INVITE: function(prefix
, params
) {
260 var channel
= params
.indexFromEnd(-1);
262 this.userInvite(user
, channel
);
266 irc_ERROR: function(prefix
, params
) {
267 var message
= params
.indexFromEnd(-1);
269 this.serverError(message
);
273 irc_MODE: function(prefix
, params
) {
275 var target
= params
[0];
276 var args
= params
.slice(1);
278 if(target
== this.nickname
) {
281 var modes
= args
[0].split("");
282 var xargs
= args
.slice(1);
289 modes
.each(function(mode
) {
290 if((mode
== "+") || (mode
== "-")) {
296 if(this.pmodes
[mode
]) {
297 d
= [cmode
, mode
, xargs
[carg
++]]
305 this.channelMode(user
, target
, data
, args
);
310 irc_RPL_ISUPPORT: function(prefix
, params
) {
311 var supported
= params
.slice(1, -1);
312 var supportedhash
= {};
314 for(var i
=0;i
<supported
.length
;i
++) {
315 var l
= supported
[i
].splitMax("=", 2);
316 this.supported(l
[0], l
[1]);
319 irc_RPL_MYINFO: function(prefix
, params
) {
320 if(params
.length
< 6)
323 var pmodes
= params
[5].split("");
326 pmodes
.each(function(pmode
) {
327 this.pmodes
[pmode
] = true;
330 irc_RPL_NAMREPLY: function(prefix
, params
) {
331 var channel
= params
[2];
332 var names
= params
[3];
334 this.channelNames(channel
, names
.split(" "));
338 irc_RPL_ENDOFNAMES: function(prefix
, params
) {
339 var channel
= params
[1];
341 this.channelNames(channel
, []);
344 irc_RPL_NOTOPIC: function(prefix
, params
) {
345 var channel
= params
[1];
347 if(this.__getChannel(channel
)) {
348 this.initialTopic(channel
, "");
352 irc_RPL_TOPIC: function(prefix
, params
) {
353 var channel
= params
[1];
354 var topic
= params
.indexFromEnd(-1);
356 if(this.__getChannel(channel
)) {
357 this.initialTopic(channel
, topic
);
361 irc_RPL_TOPICWHOTIME: function(prefix
, params
) {
364 irc_RPL_WHOISUSER: function(prefix
, params
) {
365 var nick
= params
[1];
366 this.whoisNick
= nick
;
368 return this.whois(nick
, "user", {ident: params
[2], hostname: params
[3], realname: params
.indexFromEnd(-1)});
370 irc_RPL_WHOISSERVER: function(prefix
, params
) {
371 var nick
= params
[1];
372 var server
= params
[2];
373 var serverdesc
= params
.indexFromEnd(-1);
375 return this.whois(nick
, "server", {server: params
[2], serverdesc: params
.indexFromEnd(-1)});
377 irc_RPL_WHOISOPERATOR: function(prefix
, params
) {
378 var nick
= params
[1];
379 var text
= params
.indexFromEnd(-1);
381 return this.whois(nick
, "oper", {opertext: params
.indexFromEnd(-1)});
383 irc_RPL_WHOISIDLE: function(prefix
, params
) {
384 var nick
= params
[1];
386 return this.whois(nick
, "idle", {idle: params
[2], connected: params
[3]});
388 irc_RPL_WHOISCHANNELS: function(prefix
, params
) {
389 var nick
= params
[1];
391 return this.whois(nick
, "channels", {channels: params
.indexFromEnd(-1)});
393 irc_RPL_WHOISACCOUNT: function(prefix
, params
) {
394 var nick
= params
[1];
396 return this.whois(nick
, "account", {account: params
[2]});
398 irc_RPL_WHOISACTUALLY: function(prefix
, params
) {
399 var nick
= params
[1];
401 return this.whois(nick
, "actually", {hostmask: params
[2], ip: params
[3]});
403 irc_RPL_WHOISOPERNAME: function(prefix
, params
) {
404 var nick
= params
[1];
405 var opername
= params
[2];
407 return this.whois(nick
, "opername", {opername: params
[2]});
409 irc_RPL_WHOISGENERICTEXT: function(prefix
, params
) {
410 var nick
= params
[1];
411 var text
= params
.indexFromEnd(-1);
413 return this.whois(nick
, "generictext", {text: text
});
415 irc_RPL_ENDOFWHOIS: function(prefix
, params
) {
416 var nick
= params
[1];
417 var text
= params
.indexFromEnd(-1);
418 this.whoisNick
= null;
420 return this.whois(nick
, "end", {});
422 irc_genericError: function(prefix
, params
) {
423 var target
= params
[1];
424 var message
= params
.indexFromEnd(-1);
426 this.genericError(target
, message
);
429 irc_genericQueryError: function(prefix
, params
) {
430 var target
= params
[1];
431 var message
= params
.indexFromEnd(-1);
433 this.genericQueryError(target
, message
);
436 setupGenericErrors: function() {
437 this.irc_ERR_CHANOPPRIVSNEEDED
= this.irc_ERR_CANNOTSENDTOCHAN
= this.irc_genericError
;
438 this.irc_ERR_NOSUCHNICK
= this.irc_genericQueryError
;
441 irc_RPL_AWAY: function(prefix
, params
) {
442 var nick
= params
[1];
443 var text
= params
.indexFromEnd(-1);
445 if(this.whoisNick
&& (this.whoisNick
== nick
))
446 return this.whois(nick
, "away", {"away": text
});
448 this.awayMessage(nick
, text
);
451 irc_RPL_NOWAWAY: function(prefix
, params
) {
452 this.awayStatus(true, params
.indexFromEnd(-1));
455 irc_RPL_UNAWAY: function(prefix
, params
) {
456 this.awayStatus(false, params
.indexFromEnd(-1));
459 irc_WALLOPS: function(prefix
, params
) {
461 var text
= params
.indexFromEnd(-1);
463 this.wallops(user
, text
);
466 irc_RPL_CREATIONTIME: function(prefix
, params
) {
467 var channel
= params
[1];
468 var time
= params
[2];
470 this.channelCreationTime(channel
, time
);
472 irc_RPL_CHANNELMODEIS: function(prefix
, params
) {
473 var channel
= params
[1];
474 var modes
= params
.slice(2);
476 this.channelModeIs(channel
, modes
);