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.setupGenericErrors();
34 dispatch: function(data
) {
35 var message
= data
[0];
36 if(message
== "connect") {
38 } else if(message
== "disconnect") {
39 if(data
.length
== 0) {
40 this.disconnected("No error!");
42 this.disconnected(data
[1]);
45 } else if(message
== "c") {
46 var command
= data
[1].toUpperCase();
50 var n
= qwebirc
.irc
.Numerics
[command
];
56 var o
= this["irc_" + n
];
59 var r
= o
.run([prefix
, sl
], this);
61 this.rawNumeric(command
, prefix
, sl
);
63 this.rawNumeric(command
, prefix
, sl
);
67 isChannel: function(target
) {
68 var c
= target
.charAt(0);
71 irc_RPL_WELCOME: function(prefix
, params
) {
72 this.nickname
= params
[0];
74 this.__signedOn
= true;
75 this.signedOn(this.nickname
);
77 irc_ERR_NICKNAMEINUSE: function(prefix
, params
) {
78 this.genericError(params
[1], params
.indexFromEnd(-1).replace("in use.", "in use"));
83 var newnick
= params
[1] + "_";
84 if(newnick
== this.lastnick
)
85 newnick
= "qwebirc" + Math
.floor(Math
.random() * 1024 * 1024);
87 this.send("NICK " + newnick
);
88 this.lastnick
= newnick
;
91 irc_NICK: function(prefix
, params
) {
93 var oldnick
= user
.hostToNick();
94 var newnick
= params
[0];
96 if(this.nickname
== oldnick
)
97 this.nickname
= newnick
;
99 this.nickChanged(user
, newnick
);
103 irc_QUIT: function(prefix
, params
) {
106 var message
= params
.indexFromEnd(-1);
108 this.userQuit(user
, message
);
112 irc_PART: function(prefix
, params
) {
114 var channel
= params
[0];
115 var message
= params
[1];
117 var nick
= user
.hostToNick();
119 if((nick
== this.nickname
) && this.channels
[channel
])
120 delete this.channels
[channel
];
122 this.userPart(user
, channel
, message
);
126 irc_KICK: function(prefix
, params
) {
128 var channel
= params
[0];
129 var kickee
= params
[1];
130 var message
= params
[2];
132 if((kickee
== this.nickname
) && this.channels
[channel
])
133 delete this.channels
[channel
];
135 this.userKicked(kicker
, channel
, kickee
, message
);
139 irc_PING: function(prefix
, params
) {
140 this.send("PONG :" + params
.indexFromEnd(-1));
144 irc_JOIN: function(prefix
, params
) {
145 var channel
= params
[0];
147 var nick
= user
.hostToNick();
149 if(nick
== this.nickname
)
150 this.channels
[channel
] = true;
152 this.userJoined(user
, channel
);
156 irc_TOPIC: function(prefix
, params
) {
158 var channel
= params
[0];
159 var topic
= params
.indexFromEnd(-1);
161 this.channelTopic(user
, channel
, topic
);
165 processCTCP: function(message
) {
166 if(message
.charAt(0) != "\x01")
169 if(message
.charAt(message
.length
- 1) == "\x01") {
170 message
= message
.substr(1, message
.length
- 2);
172 message
= message
.substr(1);
174 return message
.splitMax(" ", 2);
176 irc_PRIVMSG: function(prefix
, params
) {
178 var target
= params
[0];
179 var message
= params
.indexFromEnd(-1);
181 var ctcp
= this.processCTCP(message
);
183 var type
= ctcp
[0].toUpperCase();
185 var replyfn
= qwebirc
.irc
.RegisteredCTCPs
[type
];
187 var t
= new Date().getTime() / 1000;
188 if(t
> this.nextctcp
)
189 this.send("NOTICE " + user
.hostToNick() + " :\x01" + type
+ " " + replyfn(ctcp
[1]) + "\x01");
190 this.nextctcp
= t
+ 5;
193 if(target
== this.nickname
) {
194 this.userCTCP(user
, type
, ctcp
[1]);
196 this.channelCTCP(user
, target
, type
, ctcp
[1]);
199 if(target
== this.nickname
) {
200 this.userPrivmsg(user
, message
);
202 this.channelPrivmsg(user
, target
, message
);
208 irc_NOTICE: function(prefix
, params
) {
210 var target
= params
[0];
211 var message
= params
.indexFromEnd(-1);
213 if((user
== "") || (user
.indexOf("!") == -1)) {
214 this.serverNotice(user
, message
);
215 } else if(target
== this.nickname
) {
216 var ctcp
= this.processCTCP(message
);
218 this.userCTCPReply(user
, ctcp
[0], ctcp
[1]);
220 this.userNotice(user
, message
);
223 this.channelNotice(user
, target
, message
);
228 irc_INVITE: function(prefix
, params
) {
230 var channel
= params
.indexFromEnd(-1);
232 this.userInvite(user
, channel
);
236 irc_ERROR: function(prefix
, params
) {
237 var message
= params
.indexFromEnd(-1);
239 this.serverError(message
);
243 irc_MODE: function(prefix
, params
) {
245 var target
= params
[0];
246 var args
= params
.slice(1);
248 if(target
== this.nickname
) {
251 var modes
= args
[0].split("");
252 var xargs
= args
.slice(1);
259 modes
.each(function(mode
) {
260 if((mode
== "+") || (mode
== "-")) {
266 if(this.pmodes
[mode
]) {
267 d
= [cmode
, mode
, xargs
[carg
++]]
275 this.channelMode(user
, target
, data
, args
);
280 irc_RPL_ISUPPORT: function(prefix
, params
) {
281 var supported
= params
.slice(1, -1);
282 var supportedhash
= {};
284 for(var i
=0;i
<supported
.length
;i
++) {
285 var l
= supported
[i
].splitMax("=", 2);
286 this.supported(l
[0], l
[1]);
289 irc_RPL_MYINFO: function(prefix
, params
) {
290 if(params
.length
< 6)
293 var pmodes
= params
[5].split("");
296 pmodes
.each(function(pmode
) {
297 this.pmodes
[pmode
] = true;
300 irc_RPL_NAMREPLY: function(prefix
, params
) {
301 var channel
= params
[2];
302 var names
= params
[3];
304 this.channelNames(channel
, names
.split(" "));
308 irc_RPL_ENDOFNAMES: function(prefix
, params
) {
309 var channel
= params
[1];
311 this.channelNames(channel
, []);
314 irc_RPL_NOTOPIC: function(prefix
, params
) {
315 var channel
= params
[1];
317 if(this.channels
[channel
]) {
318 this.initialTopic(channel
, "");
322 irc_RPL_TOPIC: function(prefix
, params
) {
323 var channel
= params
[1];
324 var topic
= params
.indexFromEnd(-1);
326 if(this.channels
[channel
]) {
327 this.initialTopic(channel
, topic
);
331 irc_RPL_TOPICWHOTIME: function(prefix
, params
) {
334 irc_RPL_WHOISUSER: function(prefix
, params
) {
335 var nick
= params
[1];
336 this.whoisNick
= nick
;
338 return this.whois(nick
, "user", {ident: params
[2], hostname: params
[3], realname: params
.indexFromEnd(-1)});
340 irc_RPL_WHOISSERVER: function(prefix
, params
) {
341 var nick
= params
[1];
342 var server
= params
[2];
343 var serverdesc
= params
.indexFromEnd(-1);
345 return this.whois(nick
, "server", {server: params
[2], serverdesc: params
.indexFromEnd(-1)});
347 irc_RPL_WHOISOPERATOR: function(prefix
, params
) {
348 var nick
= params
[1];
349 var text
= params
.indexFromEnd(-1);
351 return this.whois(nick
, "oper", {opertext: params
.indexFromEnd(-1)});
353 irc_RPL_WHOISIDLE: function(prefix
, params
) {
354 var nick
= params
[1];
356 return this.whois(nick
, "idle", {idle: params
[2], connected: params
[3]});
358 irc_RPL_WHOISCHANNELS: function(prefix
, params
) {
359 var nick
= params
[1];
361 return this.whois(nick
, "channels", {channels: params
.indexFromEnd(-1)});
363 irc_RPL_WHOISACCOUNT: function(prefix
, params
) {
364 var nick
= params
[1];
366 return this.whois(nick
, "account", {account: params
[2]});
368 irc_RPL_WHOISACTUALLY: function(prefix
, params
) {
369 var nick
= params
[1];
371 return this.whois(nick
, "actually", {hostmask: params
[2], ip: params
[3]});
373 irc_RPL_WHOISOPERNAME: function(prefix
, params
) {
374 var nick
= params
[1];
375 var opername
= params
[2];
377 return this.whois(nick
, "opername", {opername: params
[2]});
379 irc_RPL_ENDOFWHOIS: function(prefix
, params
) {
380 var nick
= params
[1];
381 var text
= params
.indexFromEnd(-1);
382 this.whoisNick
= null;
384 return this.whois(nick
, "end", {});
386 irc_genericError: function(prefix
, params
) {
387 var target
= params
[1];
388 var message
= params
.indexFromEnd(-1);
390 this.genericError(target
, message
);
393 irc_genericQueryError: function(prefix
, params
) {
394 var target
= params
[1];
395 var message
= params
.indexFromEnd(-1);
397 this.genericQueryError(target
, message
);
400 setupGenericErrors: function() {
401 this.irc_ERR_CHANOPPRIVSNEEDED
= this.irc_ERR_CANNOTSENDTOCHAN
= this.irc_genericError
;
402 this.irc_ERR_NOSUCHNICK
= this.irc_genericQueryError
;
405 irc_RPL_AWAY: function(prefix
, params
) {
406 var nick
= params
[1];
407 var text
= params
.indexFromEnd(-1);
409 if(this.whoisNick
&& (this.whoisNick
== nick
))
410 return this.whois(nick
, "away", {"away": text
});
412 this.awayMessage(nick
, text
);
415 irc_RPL_NOWAWAY: function(prefix
, params
) {
416 this.awayStatus(true, params
.indexFromEnd(-1));
419 irc_RPL_UNAWAY: function(prefix
, params
) {
420 this.awayStatus(false, params
.indexFromEnd(-1));