]>
jfr.im git - irc/quakenet/qwebirc.git/blob - static/js/irc/ircclient.js
1 function IRCClient(nickname
, ui
) {
4 this.modeprefixes
= "ov";
6 var newLine = function(window
, type
, data
) {
10 ui
.newLine(window
, type
, data
);
13 var newChanLine = function(channel
, type
, user
, extra
) {
17 extra
["n"] = hosttonick(user
);
18 extra
["h"] = hosttohost(user
);
20 extra
["-"] = self
.nickname
;
22 newLine(channel
, type
, extra
);
25 var newServerLine = function(type
, data
) {
26 newLine("", type
, data
);
29 var newActiveLine = function(type
, data
) {
30 newLine(false, type
, data
);
33 this.rawNumeric = function(numeric
, prefix
, params
) {
34 newServerLine("RAW", {"n": "numeric", "m": params
.slice(1).join(" ")});
37 this.signedOn = function(nickname
) {
38 self
.tracker
= new IRCTracker();
39 self
.nickname
= nickname
;
40 newServerLine("SIGNON");
43 this.updateNickList = function(channel
) {
44 var n1
= self
.tracker
.getChannel(channel
);
45 var names
= new Array();
46 var tff
= String
.fromCharCode(255);
54 if(nc
.prefixes
.length
> 0) {
55 var c
= nc
.prefixes
.charAt(0);
56 nx
= String
.fromCharCode(self
.prefixes
.indexOf(c
)) + toIRCLower(n
);
59 nx
= tff
+ toIRCLower(n
);
67 var sortednames
= new Array();
68 forEach(names
, function(name
) {
69 sortednames
.push(nh
[name
]);
71 ui
.updateNickList(channel
, sortednames
);
74 this.userJoined = function(user
, channel
) {
75 var nick
= hosttonick(user
);
76 var host
= hosttohost(user
);
78 if(nick
== self
.nickname
) {
79 ui
.newWindow(channel
, true);
80 ui
.selectTab(channel
);
82 self
.tracker
.addNickToChannel(nick
, channel
);
84 newChanLine(channel
, "JOIN", user
);
86 self
.updateNickList(channel
);
89 this.userPart = function(user
, channel
, message
) {
90 var nick
= hosttonick(user
);
91 var host
= hosttohost(user
);
93 if(nick
== self
.nickname
) {
94 self
.tracker
.removeChannel(channel
);
96 self
.tracker
.removeNickFromChannel(nick
, channel
);
97 newChanLine(channel
, "PART", user
, {"m": message
});
100 self
.updateNickList(channel
);
102 if(nick
== self
.nickname
)
103 ui
.closeWindow(channel
);
106 this.userKicked = function(kicker
, channel
, kickee
, message
) {
107 if(kickee
== self
.nickname
) {
108 self
.tracker
.removeChannel(channel
);
109 ui
.closeWindow(channel
);
111 self
.tracker
.removeNickFromChannel(kickee
, channel
);
112 self
.updateNickList(channel
);
115 newChanLine(channel
, "KICK", kicker
, {"v": kickee
, "m": message
});
118 this.channelMode = function(user
, channel
, modes
, raw
) {
119 forEach(modes
, function(mo
) {
120 var direction
= mo
[0];
123 var prefixindex
= self
.modeprefixes
.indexOf(mode
);
124 if(prefixindex
== -1)
128 var prefixchar
= self
.prefixes
.charAt(prefixindex
);
130 var nc
= self
.tracker
.getOrCreateNickOnChannel(nick
, channel
);
131 if(direction
== "-") {
132 self
.removePrefix(nc
, prefixchar
);
134 self
.addPrefix(nc
, prefixchar
);
138 newChanLine(channel
, "MODE", user
, {"m": raw
.join(" ")});
140 self
.updateNickList(channel
);
143 this.userQuit = function(user
, message
) {
144 var nick
= hosttonick(user
);
146 var channels
= self
.tracker
.getNick(nick
);
149 for(var c
in channels
) {
151 newChanLine(c
, "QUIT", user
, {"m": message
});
154 self
.tracker
.removeNick(nick
);
156 forEach(clist
, function(cli
) {
157 self
.updateNickList(cli
);
161 this.nickChanged = function(user
, newnick
) {
162 var oldnick
= hosttonick(user
);
164 if(oldnick
== self
.nickname
)
165 self
.nickname
= newnick
;
167 self
.tracker
.renameNick(oldnick
, newnick
);
169 var channels
= self
.tracker
.getNick(newnick
);
171 for(var c
in channels
) {
172 newChanLine(c
, "NICK", user
, {"w": newnick
});
173 /* TODO: rename queries */
174 self
.updateNickList(c
);
178 this.channelTopic = function(user
, channel
, topic
) {
179 newChanLine(channel
, "TOPIC", user
, {"m": topic
});
180 ui
.updateTopic(channel
, topic
);
183 this.initialTopic = function(channel
, topic
) {
184 ui
.updateTopic(channel
, topic
);
187 this.chanCTCP = function(user
, channel
, type
, args
) {
188 if(args
== undefined)
191 if(type
== "ACTION") {
192 newChanLine(channel
, "CHANACTION", user
, {"m": args
, "c": channel
});
196 newChanLine(channel
, "CHANCTCP", user
, {"x": type
, "m": args
, "c": channel
});
199 this.userCTCP = function(user
, type
, args
) {
200 var nick
= hosttonick(user
);
201 var host
= hosttohost(user
);
202 if(args
== undefined)
205 if(type
== "ACTION") {
206 ui
.newWindow(nick
, false);
207 newLine(nick
, "PRIVACTION", {"m": args
, "x": type
, "h": host
, "n": nick
});
211 if(ui
.getWindow(nick
)) {
212 newLine(nick
, "PRIVCTCP", {"m": args
, "x": type
, "h": host
, "n": nick
, "-": self
.nickname
});
214 newActiveLine("PRIVCTCP", {"m": args
, "x": type
, "h": host
, "n": nick
, "-": self
.nickname
});
218 this.userCTCPReply = function(user
, type
, args
) {
219 var nick
= hosttonick(user
);
220 var host
= hosttohost(user
);
221 if(args
== undefined)
224 if(ui
.getWindow(nick
)) {
225 newLine(nick
, "CTCPREPLY", {"m": args
, "x": type
, "h": host
, "n": nick
, "-": self
.nickname
});
227 newActiveLine("CTCPREPLY", {"m": args
, "x": type
, "h": host
, "n": nick
, "-": self
.nickname
});
231 this.channelPrivmsg = function(user
, channel
, message
) {
232 newChanLine(channel
, "CHANMSG", user
, {"m": message
});
235 this.channelNotice = function(user
, channel
, message
) {
236 newChanLine(channel
, "CHANNOTICE", user
, {"m": message
});
239 this.userPrivmsg = function(user
, message
) {
240 var nick
= hosttonick(user
);
241 var host
= hosttohost(user
);
242 ui
.newWindow(nick
, false);
243 newLine(nick
, "PRIVMSG", {"m": message
, "h": host
, "n": nick
});
246 this.serverNotice = function(message
) {
247 newServerLine("SERVERNOTICE", {"m": message
});
250 this.userNotice = function(user
, message
) {
251 var nick
= hosttonick(user
);
252 var host
= hosttohost(user
);
254 if(ui
.getWindow(nick
)) {
255 newLine(nick
, "PRIVNOTICE", {"m": message
, "h": host
, "n": nick
});
257 newActiveLine("PRIVNOTICE", {"m": message
, "h": host
, "n": nick
});
261 this.userInvite = function(user
, channel
) {
262 var nick
= hosttonick(user
);
263 var host
= hosttohost(user
);
265 newServerLine("INVITE", {"c": channel
, "h": host
, "n": nick
});
268 this.userMode = function(modes
) {
269 newServerLine("UMODE", {"m": modes
, "n": self
.nickname
});
272 this.addPrefix = function(nickchanentry
, prefix
) {
273 var ncp
= nickchanentry
.prefixes
+ prefix
;
274 var prefixes
= new Array();
277 for(var i
=0;i
<self
.prefixes
.length
;i
++) {
278 var pc
= self
.prefixes
.charAt(i
);
279 var index
= ncp
.indexOf(pc
);
284 nickchanentry
.prefixes
= prefixes
.join("");
287 this.removePrefix = function(nickchanentry
, prefix
) {
288 nickchanentry
.prefixes
= nickchanentry
.prefixes
.replaceAll(prefix
, "");
291 this.channelNames = function(channel
, names
) {
292 if(names
.length
== 0) {
293 self
.updateNickList(channel
);
297 forEach(names
, function(nick
) {
299 var splitnick
= nick
.split("");
302 forEach(splitnick
, function(c
) {
303 if(self
.prefixes
.indexOf(c
) == -1) {
304 nick
= nick
.substr(i
);
312 var nc
= self
.tracker
.addNickToChannel(nick
, channel
);
313 forEach(prefixes
, function(p
) {
314 self
.addPrefix(nc
, p
);
319 this.disconnected = function() {
320 for(var x
in this.parent
.channels
) {
324 self
.tracker
= undefined;
326 newServerLine("DISCONNECT");
330 this.supported = function(key
, value
) {
331 if(key
== "PREFIX") {
332 var l
= (value
.length
- 2) / 2;
334 self
.modeprefixes
= value
.substr(1, l
);
335 self
.prefixes
= value
.substr(l
+ 2, l
);
339 this.connected = function() {
340 newServerLine("CONNECT");
343 this.serverError = function(message
) {
344 newServerLine("ERROR", {"m": message
});
347 this.parent
= new BaseIRCClient(nickname
, this);
348 this.commandparser
= new CommandParser(ui
, this.parent
.send
);
349 ui
.send
= this.commandparser
.dispatch
;
350 ui
.getNickname = function() {
351 return self
.nickname
;
354 this.connect
= this.parent
.connect
;
355 this.disconnect
= this.parent
.disconnect
;