1 qwebirc
.irc
.RegisteredCTCPs
= {
2 "VERSION": function(x
) {
3 return "qwebirc v" + qwebirc
.VERSION
+ ", copyright (C) Chris Porter 2008 -- user agent: " + Browser
.Engine
.name
+ " (" + Browser
.Platform
.name
+ ")";
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", "k,", "o", "l", "v"];
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
.chatAt(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
) {
81 var newnick
= params
[1] + "_";
82 if(newnick
== this.lastnick
)
83 newnick
= "webchat" + Math
.floor(Math
.random() * 1024 * 1024);
85 this.send("NICK " + newnick
);
86 this.lastnick
= newnick
;
88 irc_NICK: function(prefix
, params
) {
90 var oldnick
= user
.hostToNick();
91 var newnick
= params
[0];
93 if(this.nickname
== oldnick
)
94 this.nickname
= newnick
;
96 this.nickChanged(user
, newnick
);
100 irc_QUIT: function(prefix
, params
) {
103 var message
= params
.indexFromEnd(-1);
105 this.userQuit(user
, message
);
109 irc_PART: function(prefix
, params
) {
111 var channel
= params
[0];
112 var message
= params
[1];
114 var nick
= user
.hostToNick();
116 if((nick
== this.nickname
) && this.channels
[channel
])
117 delete this.channels
[channel
];
119 this.userPart(user
, channel
, message
);
123 irc_KICK: function(prefix
, params
) {
125 var channel
= params
[0];
126 var kickee
= params
[1];
127 var message
= params
[2];
129 if((kickee
== this.nickname
) && this.channels
[channel
])
130 delete this.channels
[channel
];
132 this.userKicked(kicker
, channel
, kickee
, message
);
136 irc_PING: function(prefix
, params
) {
137 this.send("PONG :" + params
.indexFromEnd(-1));
141 irc_JOIN: function(prefix
, params
) {
142 var channel
= params
[0];
144 var nick
= user
.hostToNick();
146 if(nick
== this.nickname
)
147 this.channels
[channel
] = true;
149 this.userJoined(user
, channel
);
153 irc_TOPIC: function(prefix
, params
) {
155 var channel
= params
[0];
156 var topic
= params
.indexFromEnd(-1);
158 this.channelTopic(user
, channel
, topic
);
162 processCTCP: function(message
) {
163 if(message
.charAt(0) != "\x01")
166 if(message
.charAt(message
.length
- 1) == "\x01") {
167 message
= message
.substr(1, message
.length
- 2);
169 message
= message
.substr(1);
171 return message
.splitMax(" ", 2);
173 irc_PRIVMSG: function(prefix
, params
) {
175 var target
= params
[0];
176 var message
= params
.indexFromEnd(-1);
178 var ctcp
= this.processCTCP(message
);
180 var type
= ctcp
[0].toUpperCase();
182 var replyfn
= qwebirc
.irc
.RegisteredCTCPs
[type
];
184 var t
= new Date().getTime() / 1000;
185 if(t
> this.nextctcp
)
186 this.send("NOTICE " + user
.hostToNick() + " :\x01" + type
+ " " + replyfn(ctcp
[1]) + "\x01");
187 this.nextctcp
= t
+ 5;
190 if(target
== this.nickname
) {
191 this.userCTCP(user
, type
, ctcp
[1]);
193 this.channelCTCP(user
, target
, type
, ctcp
[1]);
196 if(target
== this.nickname
) {
197 this.userPrivmsg(user
, message
);
199 this.channelPrivmsg(user
, target
, message
);
205 irc_NOTICE: function(prefix
, params
) {
207 var target
= params
[0];
208 var message
= params
.indexFromEnd(-1);
211 this.serverNotice(message
);
212 } else if(target
== this.nickname
) {
213 var ctcp
= this.processCTCP(message
);
215 this.userCTCPReply(user
, ctcp
[0], ctcp
[1]);
217 this.userNotice(user
, message
);
220 this.channelNotice(user
, target
, message
);
225 irc_INVITE: function(prefix
, params
) {
227 var channel
= params
.indexFromEnd(-1);
229 this.userInvite(user
, channel
);
233 irc_ERROR: function(prefix
, params
) {
234 var message
= params
.indexFromEnd(-1);
236 this.serverError(message
);
240 irc_MODE: function(prefix
, params
) {
242 var target
= params
[0];
243 var args
= params
.slice(1);
245 if(target
== this.nickname
) {
248 var modes
= args
[0].split("");
249 var xargs
= args
.slice(1);
256 modes
.each(function(mode
) {
257 if((mode
== "+") || (mode
== "-")) {
262 if(this.pmodes
[mode
]) {
263 d
= [cmode
, mode
, xargs
[carg
++]]
271 this.channelMode(user
, target
, data
, args
);
276 irc_RPL_ISUPPORT: function(prefix
, params
) {
277 var supported
= params
.slice(1, -1);
278 var supportedhash
= {};
280 for(var i
=0;i
<supported
.length
;i
++) {
281 var l
= supported
[i
].splitMax("=", 2);
282 this.supported(l
[0], l
[1]);
285 irc_RPL_MYINFO: function(prefix
, params
) {
286 var pmodes
= params
[5].split("");
289 pmodes
.each(function(pmode
) {
290 this.pmodes
[pmode
] = true;
293 irc_RPL_NAMREPLY: function(prefix
, params
) {
294 var channel
= params
[2];
295 var names
= params
[3];
297 this.channelNames(channel
, names
.split(" "));
301 irc_RPL_ENDOFNAMES: function(prefix
, params
) {
302 var channel
= params
[1];
304 this.channelNames(channel
, []);
307 irc_RPL_NOTOPIC: function(prefix
, params
) {
308 var channel
= params
[1];
310 if(this.channels
[channel
]) {
311 this.initialTopic(channel
, "");
315 irc_RPL_TOPIC: function(prefix
, params
) {
316 var channel
= params
[1];
317 var topic
= params
.indexFromEnd(-1);
319 if(this.channels
[channel
]) {
320 this.initialTopic(channel
, topic
);
324 irc_RPL_TOPICWHOTIME: function(prefix
, params
) {
327 irc_RPL_WHOISUSER: function(prefix
, params
) {
328 var nick
= params
[1];
329 this.whoisNick
= nick
;
331 return this.whois(nick
, "user", {ident: params
[2], hostname: params
[3], realname: params
.indexFromEnd(-1)});
333 irc_RPL_WHOISSERVER: function(prefix
, params
) {
334 var nick
= params
[1];
335 var server
= params
[2];
336 var serverdesc
= params
.indexFromEnd(-1);
338 return this.whois(nick
, "server", {server: params
[2], serverdesc: params
.indexFromEnd(-1)});
340 irc_RPL_WHOISOPERATOR: function(prefix
, params
) {
341 var nick
= params
[1];
342 var text
= params
.indexFromEnd(-1);
344 return this.whois(nick
, "oper", {opertext: params
.indexFromEnd(-1)});
346 irc_RPL_WHOISIDLE: function(prefix
, params
) {
347 var nick
= params
[1];
349 return this.whois(nick
, "idle", {idle: params
[2], connected: params
[3]});
351 irc_RPL_WHOISCHANNELS: function(prefix
, params
) {
352 var nick
= params
[1];
354 return this.whois(nick
, "channels", {channels: params
.indexFromEnd(-1)});
356 irc_RPL_WHOISACCOUNT: function(prefix
, params
) {
357 var nick
= params
[1];
359 return this.whois(nick
, "account", {account: params
[2]});
361 irc_RPL_WHOISACTUALLY: function(prefix
, params
) {
362 var nick
= params
[1];
364 return this.whois(nick
, "actually", {hostmask: params
[2], ip: params
[3]});
366 irc_RPL_WHOISOPERNAME: function(prefix
, params
) {
367 var nick
= params
[1];
368 var opername
= params
[2];
370 return this.whois(nick
, "opername", {opername: params
[2]});
372 irc_RPL_ENDOFWHOIS: function(prefix
, params
) {
373 var nick
= params
[1];
374 var text
= params
.indexFromEnd(-1);
375 this.whoisNick
= null;
377 return this.whois(nick
, "end", {});
379 irc_genericError: function(prefix
, params
) {
380 var target
= params
[1];
381 var message
= params
.indexFromEnd(-1);
383 this.genericError(target
, message
);
386 setupGenericErrors: function() {
387 this.irc_ERR_CHANOPPRIVSNEEDED
= this.irc_ERR_NOSUCHNICK
= this.irc_ERR_CANNOTSENDTOCHAN
= this.irc_genericError
;
390 irc_RPL_AWAY: function(prefix
, params
) {
391 var nick
= params
[1];
392 var text
= params
.indexFromEnd(-1);
394 if(this.whoisNick
&& (this.whoisNick
== nick
))
395 return this.whois(nick
, "away", {"away": text
});
397 this.awayMessage(nick
, text
);
400 irc_RPL_NOWAWAY: function(prefix
, params
) {
401 this.awayStatus(true, params
.indexFromEnd(-1));
404 irc_RPL_UNAWAY: function(prefix
, params
) {
405 this.awayStatus(false, params
.indexFromEnd(-1));