]>
jfr.im git - irc/quakenet/qwebirc.git/blob - js/irc/baseircclient.js
1 var Numerics
= {"001": "RPL_WELCOME", "433": "ERR_NICKNAMEINUSE", "004": "RPL_MYINFO", "005": "RPL_ISUPPORT", "353": "RPL_NAMREPLY", "366": "RPL_ENDOFNAMES", "331": "RPL_NOTOPIC", "332": "RPL_TOPIC", "333": "RPL_TOPICWHOTIME"};
3 var RegisteredCTCPs
= {
4 "VERSION": function(x
) {
5 return "qwebirc v" + QWEBIRC_VERSION
+ ", copyright (C) Chris Porter 2008 -- user agent: " + Browser
.Engine
.name
+ " (" + Browser
.Platform
.name
+ ")";
7 "USERINFO": function(x
) { return "qwebirc"; },
8 "TIME": function(x
) { return IRCTime(new Date()); },
9 "PING": function(x
) { return x
; },
10 "CLIENTINFO": function(x
) { return "PING VERSION TIME USERINFO CLIENTINFO"; }
13 var BaseIRCClient
= new Class({
14 Implements: [Options
],
18 initialize: function(options
) {
19 this.setOptions(options
);
21 this.nickname
= this.options
.nickname
;
23 this.__signedOn
= false;
24 this.pmodes
= ["b", "k,", "o", "l", "v"];
28 this.connection
= new IRCConnection({initialNickname: this.nickname
, onRecv: this.dispatch
.bind(this)});
30 this.send
= this.connection
.send
.bind(this.connection
);
31 this.connect
= this.connection
.connect
.bind(this.connection
);
32 this.disconnect
= this.connection
.disconnect
.bind(this.connection
);
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
= Numerics
[command
];
56 var o
= this["irc_" + n
];
59 var r
= o
.attempt([prefix
, sl
], this);
61 this.rawNumeric(command
, prefix
, sl
);
63 this.rawNumeric(command
, prefix
, sl
);
68 irc_RPL_WELCOME: function(prefix
, params
) {
69 this.nickname
= params
[0];
71 this.__signedOn
= true;
72 this.signedOn(this.nickname
);
74 irc_ERR_NICKNAMEINUSE: function(prefix
, params
) {
78 var newnick
= params
[1] + "_";
79 if(newnick
== this.lastnick
)
80 newnick
= "webchat" + Math
.floor(Math
.random() * 1024 * 1024);
82 this.send("NICK " + newnick
);
83 this.lastnick
= newnick
;
85 irc_NICK: function(prefix
, params
) {
87 var oldnick
= user
.hostToNick();
88 var newnick
= params
[0];
90 if(this.nickname
== oldnick
)
91 this.nickname
= newnick
;
93 this.nickChanged(user
, newnick
);
97 irc_QUIT: function(prefix
, params
) {
100 var message
= params
.indexFromEnd(-1);
102 this.userQuit(user
, message
);
106 irc_PART: function(prefix
, params
) {
108 var channel
= params
[0];
109 var message
= params
[1];
111 var nick
= user
.hostToNick();
113 if((nick
== this.nickname
) && this.channels
[channel
])
114 delete this.channels
[channel
];
116 this.userPart(user
, channel
, message
);
120 irc_KICK: function(prefix
, params
) {
122 var channel
= params
[0];
123 var kickee
= params
[1];
124 var message
= params
[2];
126 if((kickee
== this.nickname
) && this.channels
[channel
])
127 delete this.channels
[channel
];
129 this.userKicked(kicker
, channel
, kickee
, message
);
133 irc_PING: function(prefix
, params
) {
134 this.send("PONG :" + params
.indexFromEnd(-1));
138 irc_JOIN: function(prefix
, params
) {
139 var channel
= params
[0];
141 var nick
= user
.hostToNick();
143 if(nick
== this.nickname
)
144 this.channels
[channel
] = true;
146 this.userJoined(user
, channel
);
150 irc_TOPIC: function(prefix
, params
) {
152 var channel
= params
[0];
153 var topic
= params
.indexFromEnd(-1);
155 this.channelTopic(user
, channel
, topic
);
159 processCTCP: function(message
) {
160 if(message
.charAt(0) != "\x01")
163 if(message
.charAt(message
.length
- 1) == "\x01") {
164 message
= message
.substr(1, message
.length
- 2);
166 message
= message
.substr(1);
168 return message
.splitMax(" ", 2);
170 irc_PRIVMSG: function(prefix
, params
) {
172 var target
= params
[0];
173 var message
= params
.indexFromEnd(-1);
175 var ctcp
= this.processCTCP(message
);
177 var type
= ctcp
[0].toUpperCase();
179 var replyfn
= RegisteredCTCPs
[type
];
181 var t
= new Date().getTime() / 1000;
182 if(t
> this.nextctcp
)
183 this.send("NOTICE " + user
.hostToNick() + " :\x01" + type
+ " " + replyfn(ctcp
[1]) + "\x01");
184 this.nextctcp
= t
+ 5;
187 if(target
== this.nickname
) {
188 this.userCTCP(user
, type
, ctcp
[1]);
190 this.channelCTCP(user
, target
, type
, ctcp
[1]);
193 if(target
== this.nickname
) {
194 this.userPrivmsg(user
, message
);
196 this.channelPrivmsg(user
, target
, message
);
202 irc_NOTICE: function(prefix
, params
) {
204 var target
= params
[0];
205 var message
= params
.indexFromEnd(-1);
208 this.serverNotice(message
);
209 } else if(target
== this.nickname
) {
210 var ctcp
= this.processCTCP(message
);
212 this.userCTCPReply(user
, ctcp
[0], ctcp
[1]);
214 this.userNotice(user
, message
);
217 this.channelNotice(user
, target
, message
);
222 irc_INVITE: function(prefix
, params
) {
224 var channel
= params
.indexFromEnd(-1);
226 this.userInvite(user
, channel
);
230 irc_ERROR: function(prefix
, params
) {
231 var message
= params
.indexFromEnd(-1);
233 this.serverError(message
);
237 irc_MODE: function(prefix
, params
) {
239 var target
= params
[0];
240 var args
= params
.slice(1);
242 if(target
== this.nickname
) {
245 var modes
= args
[0].split("");
246 var xargs
= args
.slice(1);
253 modes
.each(function(mode
) {
254 if((mode
== "+") || (mode
== "-")) {
259 if(this.pmodes
[mode
]) {
260 d
= [cmode
, mode
, xargs
[carg
++]]
268 this.channelMode(user
, target
, data
, args
);
273 irc_RPL_ISUPPORT: function(prefix
, params
) {
274 var supported
= params
.slice(1, -1);
275 var supportedhash
= {};
277 for(var i
=0;i
<supported
.length
;i
++) {
278 var l
= supported
[i
].splitMax("=", 2);
279 this.supported(l
[0], l
[1]);
282 irc_RPL_MYINFO: function(prefix
, params
) {
283 var pmodes
= params
[5].split("");
286 pmodes
.each(function(pmode
) {
287 this.pmodes
[pmode
] = true;
290 irc_RPL_NAMREPLY: function(prefix
, params
) {
291 var channel
= params
[2];
292 var names
= params
[3];
294 this.channelNames(channel
, names
.split(" "));
298 irc_RPL_ENDOFNAMES: function(prefix
, params
) {
299 var channel
= params
[1];
301 this.channelNames(channel
, []);
304 irc_RPL_NOTOPIC: function(prefix
, params
) {
307 irc_RPL_TOPIC: function(prefix
, params
) {
308 var channel
= params
[1];
309 var topic
= params
.indexFromEnd(-1);
311 if(this.channels
[channel
]) {
312 this.initialTopic(channel
, topic
);
316 irc_RPL_TOPICWHOTIME: function(prefix
, params
) {