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.nickname
= this.options
.nickname
;
21 this.__signedOn
= false;
22 this.pmodes
= {b: true, k: true, o: true, l: true, v: true};
26 this.connection
= new qwebirc
.irc
.IRCConnection({initialNickname: this.nickname
, onRecv: this.dispatch
.bind(this)});
28 this.send
= this.connection
.send
.bind(this.connection
);
29 this.connect
= this.connection
.connect
.bind(this.connection
);
30 this.disconnect
= this.connection
.disconnect
.bind(this.connection
);
32 this.toIRCLower
= qwebirc
.irc
.RFC1459toIRCLower
;
33 this.setupGenericErrors();
35 dispatch: function(data
) {
36 var message
= data
[0];
37 if(message
== "connect") {
39 } else if(message
== "disconnect") {
40 if(data
.length
== 0) {
41 this.disconnected("No error!");
43 this.disconnected(data
[1]);
46 } else if(message
== "c") {
47 var command
= data
[1].toUpperCase();
51 var n
= qwebirc
.irc
.Numerics
[command
];
57 var o
= this["irc_" + n
];
60 var r
= o
.run([prefix
, sl
], this);
62 this.rawNumeric(command
, prefix
, sl
);
64 this.rawNumeric(command
, prefix
, sl
);
68 isChannel: function(target
) {
69 var c
= target
.charAt(0);
72 supported: function(key
, value
) {
73 if(key
== "CASEMAPPING") {
74 if(value
== "ascii") {
75 this.toIRCLower
= qwebirc
.irc
.ASCIItoIRCLower
;
76 } else if(value
== "rfc1459") {
83 irc_RPL_WELCOME: function(prefix
, params
) {
84 this.nickname
= params
[0];
86 this.__signedOn
= true;
87 this.signedOn(this.nickname
);
89 irc_ERR_NICKNAMEINUSE: function(prefix
, params
) {
90 this.genericError(params
[1], params
.indexFromEnd(-1).replace("in use.", "in use"));
95 var newnick
= params
[1] + "_";
96 if(newnick
== this.lastnick
)
97 newnick
= "qwebirc" + Math
.floor(Math
.random() * 1024 * 1024);
99 this.send("NICK " + newnick
);
100 this.lastnick
= newnick
;
103 irc_NICK: function(prefix
, params
) {
105 var oldnick
= user
.hostToNick();
106 var newnick
= params
[0];
108 if(this.nickname
== oldnick
)
109 this.nickname
= newnick
;
111 this.nickChanged(user
, newnick
);
115 irc_QUIT: function(prefix
, params
) {
118 var message
= params
.indexFromEnd(-1);
120 this.userQuit(user
, message
);
124 irc_PART: function(prefix
, params
) {
126 var channel
= params
[0];
127 var message
= params
[1];
129 var nick
= user
.hostToNick();
131 if((nick
== this.nickname
) && this.channels
[channel
])
132 delete this.channels
[channel
];
134 this.userPart(user
, channel
, message
);
138 irc_KICK: function(prefix
, params
) {
140 var channel
= params
[0];
141 var kickee
= params
[1];
142 var message
= params
[2];
144 if((kickee
== this.nickname
) && this.channels
[channel
])
145 delete this.channels
[channel
];
147 this.userKicked(kicker
, channel
, kickee
, message
);
151 irc_PING: function(prefix
, params
) {
152 this.send("PONG :" + params
.indexFromEnd(-1));
156 irc_JOIN: function(prefix
, params
) {
157 var channel
= params
[0];
159 var nick
= user
.hostToNick();
161 if(nick
== this.nickname
)
162 this.channels
[channel
] = true;
164 this.userJoined(user
, channel
);
168 irc_TOPIC: function(prefix
, params
) {
170 var channel
= params
[0];
171 var topic
= params
.indexFromEnd(-1);
173 this.channelTopic(user
, channel
, topic
);
177 processCTCP: function(message
) {
178 if(message
.charAt(0) != "\x01")
181 if(message
.charAt(message
.length
- 1) == "\x01") {
182 message
= message
.substr(1, message
.length
- 2);
184 message
= message
.substr(1);
186 return message
.splitMax(" ", 2);
188 irc_PRIVMSG: function(prefix
, params
) {
190 var target
= params
[0];
191 var message
= params
.indexFromEnd(-1);
193 var ctcp
= this.processCTCP(message
);
195 var type
= ctcp
[0].toUpperCase();
197 var replyfn
= qwebirc
.irc
.RegisteredCTCPs
[type
];
199 var t
= new Date().getTime() / 1000;
200 if(t
> this.nextctcp
)
201 this.send("NOTICE " + user
.hostToNick() + " :\x01" + type
+ " " + replyfn(ctcp
[1]) + "\x01");
202 this.nextctcp
= t
+ 5;
205 if(target
== this.nickname
) {
206 this.userCTCP(user
, type
, ctcp
[1]);
208 this.channelCTCP(user
, target
, type
, ctcp
[1]);
211 if(target
== this.nickname
) {
212 this.userPrivmsg(user
, message
);
214 this.channelPrivmsg(user
, target
, message
);
220 irc_NOTICE: function(prefix
, params
) {
222 var target
= params
[0];
223 var message
= params
.indexFromEnd(-1);
225 if((user
== "") || (user
.indexOf("!") == -1)) {
226 this.serverNotice(user
, message
);
227 } else if(target
== this.nickname
) {
228 var ctcp
= this.processCTCP(message
);
230 this.userCTCPReply(user
, ctcp
[0], ctcp
[1]);
232 this.userNotice(user
, message
);
235 this.channelNotice(user
, target
, message
);
240 irc_INVITE: function(prefix
, params
) {
242 var channel
= params
.indexFromEnd(-1);
244 this.userInvite(user
, channel
);
248 irc_ERROR: function(prefix
, params
) {
249 var message
= params
.indexFromEnd(-1);
251 this.serverError(message
);
255 irc_MODE: function(prefix
, params
) {
257 var target
= params
[0];
258 var args
= params
.slice(1);
260 if(target
== this.nickname
) {
263 var modes
= args
[0].split("");
264 var xargs
= args
.slice(1);
271 modes
.each(function(mode
) {
272 if((mode
== "+") || (mode
== "-")) {
278 if(this.pmodes
[mode
]) {
279 d
= [cmode
, mode
, xargs
[carg
++]]
287 this.channelMode(user
, target
, data
, args
);
292 irc_RPL_ISUPPORT: function(prefix
, params
) {
293 var supported
= params
.slice(1, -1);
294 var supportedhash
= {};
296 for(var i
=0;i
<supported
.length
;i
++) {
297 var l
= supported
[i
].splitMax("=", 2);
298 this.supported(l
[0], l
[1]);
301 irc_RPL_MYINFO: function(prefix
, params
) {
302 if(params
.length
< 6)
305 var pmodes
= params
[5].split("");
308 pmodes
.each(function(pmode
) {
309 this.pmodes
[pmode
] = true;
312 irc_RPL_NAMREPLY: function(prefix
, params
) {
313 var channel
= params
[2];
314 var names
= params
[3];
316 this.channelNames(channel
, names
.split(" "));
320 irc_RPL_ENDOFNAMES: function(prefix
, params
) {
321 var channel
= params
[1];
323 this.channelNames(channel
, []);
326 irc_RPL_NOTOPIC: function(prefix
, params
) {
327 var channel
= params
[1];
329 if(this.channels
[channel
]) {
330 this.initialTopic(channel
, "");
334 irc_RPL_TOPIC: function(prefix
, params
) {
335 var channel
= params
[1];
336 var topic
= params
.indexFromEnd(-1);
338 if(this.channels
[channel
]) {
339 this.initialTopic(channel
, topic
);
343 irc_RPL_TOPICWHOTIME: function(prefix
, params
) {
346 irc_RPL_WHOISUSER: function(prefix
, params
) {
347 var nick
= params
[1];
348 this.whoisNick
= nick
;
350 return this.whois(nick
, "user", {ident: params
[2], hostname: params
[3], realname: params
.indexFromEnd(-1)});
352 irc_RPL_WHOISSERVER: function(prefix
, params
) {
353 var nick
= params
[1];
354 var server
= params
[2];
355 var serverdesc
= params
.indexFromEnd(-1);
357 return this.whois(nick
, "server", {server: params
[2], serverdesc: params
.indexFromEnd(-1)});
359 irc_RPL_WHOISOPERATOR: function(prefix
, params
) {
360 var nick
= params
[1];
361 var text
= params
.indexFromEnd(-1);
363 return this.whois(nick
, "oper", {opertext: params
.indexFromEnd(-1)});
365 irc_RPL_WHOISIDLE: function(prefix
, params
) {
366 var nick
= params
[1];
368 return this.whois(nick
, "idle", {idle: params
[2], connected: params
[3]});
370 irc_RPL_WHOISCHANNELS: function(prefix
, params
) {
371 var nick
= params
[1];
373 return this.whois(nick
, "channels", {channels: params
.indexFromEnd(-1)});
375 irc_RPL_WHOISACCOUNT: function(prefix
, params
) {
376 var nick
= params
[1];
378 return this.whois(nick
, "account", {account: params
[2]});
380 irc_RPL_WHOISACTUALLY: function(prefix
, params
) {
381 var nick
= params
[1];
383 return this.whois(nick
, "actually", {hostmask: params
[2], ip: params
[3]});
385 irc_RPL_WHOISOPERNAME: function(prefix
, params
) {
386 var nick
= params
[1];
387 var opername
= params
[2];
389 return this.whois(nick
, "opername", {opername: params
[2]});
391 irc_RPL_ENDOFWHOIS: function(prefix
, params
) {
392 var nick
= params
[1];
393 var text
= params
.indexFromEnd(-1);
394 this.whoisNick
= null;
396 return this.whois(nick
, "end", {});
398 irc_genericError: function(prefix
, params
) {
399 var target
= params
[1];
400 var message
= params
.indexFromEnd(-1);
402 this.genericError(target
, message
);
405 irc_genericQueryError: function(prefix
, params
) {
406 var target
= params
[1];
407 var message
= params
.indexFromEnd(-1);
409 this.genericQueryError(target
, message
);
412 setupGenericErrors: function() {
413 this.irc_ERR_CHANOPPRIVSNEEDED
= this.irc_ERR_CANNOTSENDTOCHAN
= this.irc_genericError
;
414 this.irc_ERR_NOSUCHNICK
= this.irc_genericQueryError
;
417 irc_RPL_AWAY: function(prefix
, params
) {
418 var nick
= params
[1];
419 var text
= params
.indexFromEnd(-1);
421 if(this.whoisNick
&& (this.whoisNick
== nick
))
422 return this.whois(nick
, "away", {"away": text
});
424 this.awayMessage(nick
, text
);
427 irc_RPL_NOWAWAY: function(prefix
, params
) {
428 this.awayStatus(true, params
.indexFromEnd(-1));
431 irc_RPL_UNAWAY: function(prefix
, params
) {
432 this.awayStatus(false, params
.indexFromEnd(-1));