]> jfr.im git - irc/quakenet/qwebirc.git/blob - static/js/irc/baseirc.js
fbc2d3b99547f734f97b7e3a8671c7de5e060a6a
[irc/quakenet/qwebirc.git] / static / js / irc / baseirc.js
1 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"}
2
3 function BaseIRCClient(nickname, view) {
4 var self = this;
5 this.nickname = nickname;
6 this.signedOn = false;
7 this.pmodes = ["b", "k,", "o", "l", "v"];
8
9 /* attempt javascript inheritence! */
10 this.dispatch = function(data) {
11 var message = data[0];
12 if(message == "connect") {
13 view.connected();
14 } else if(message == "disconnect") {
15 view.disconnected();
16 } else if(message == "c") {
17 var command = data[1];
18
19 var prefix = data[2];
20 var sl = data[3];
21 var n = Numerics[command];
22
23 var x = n;
24 if(!n)
25 n = command;
26
27 var o = view["irc_" + n];
28 if(!o)
29 o = self["irc_" + n];
30
31 if(o) {
32 var r = o(prefix, sl);
33 if(!r)
34 view.rawNumeric(command, prefix, sl);
35 } else {
36 view.rawNumeric(command, prefix, sl);
37 }
38 }
39 }
40
41 this.irc_RPL_WELCOME = function(prefix, params) {
42 self.nickname = params[0];
43
44 self.signedOn = true;
45 view.signedOn(self.nickname);
46 }
47
48 this.irc_ERR_NICKNAMEINUSE = function(prefix, params) {
49 if(self.signedOn == false) {
50 var newnick = params[1] + "_";
51 if(newnick == self.lastnick)
52 newnick = "webchat" + Math.floor(Math.random() * 1024 * 1024);
53
54 self.send("NICK " + newnick);
55 self.lastnick = newnick;
56 }
57 }
58
59 this.irc_NICK = function(prefix, params) {
60 var user = prefix;
61 var oldnick = user.split("!", 1);
62 var newnick = params[0];
63
64 if(self.nickname == oldnick)
65 self.nickname = newnick;
66
67 view.nickChanged(user, newnick);
68
69 return true;
70 }
71
72 this.irc_QUIT = function(prefix, params) {
73 var user = prefix;
74
75 var message = ANI(params, -1);
76
77 view.userQuit(user, message);
78
79 return true;
80 }
81
82 this.irc_PART = function(prefix, params) {
83 var user = prefix;
84 var channel = params[0];
85 var message = params[1];
86
87 view.userPart(user, channel, message);
88
89 return true;
90 }
91
92 this.irc_KICK = function(prefix, params) {
93 var kicker = prefix;
94 var channel = params[0];
95 var kickee = params[1];
96 var message = params[2];
97
98 view.userKicked(kicker, channel, kickee, message);
99
100 return true;
101 }
102
103 this.irc_PING = function(prefix, params) {
104 self.send("PONG :" + ANI(params, -1));
105
106 return true;
107 }
108
109 this.irc_JOIN = function(prefix, params) {
110 var channel = params[0];
111 var user = prefix;
112
113 view.userJoined(user, channel);
114
115 return true;
116 }
117
118 this.irc_TOPIC = function(prefix, params) {
119 var user = prefix;
120 var channel = params[0];
121 var topic = ANI(params, -1);
122
123 view.channelTopic(user, channel, topic);
124
125 return true;
126 }
127
128 this.irc_PRIVMSG = function(prefix, params) {
129 var user = prefix;
130 var target = params[0];
131 var message = ANI(params, -1);
132
133 if(target == self.nickname) {
134 view.userPrivmsg(user, message);
135 } else {
136 view.channelPrivmsg(user, target, message);
137 }
138
139 return true;
140 }
141
142 this.irc_NOTICE = function(prefix, params) {
143 var user = prefix;
144 var target = params[0];
145 var message = ANI(params, -1);
146
147 if(user == "") {
148 view.serverNotice(message);
149 } else if(target == self.nickname) {
150 view.userNotice(user, message);
151 } else {
152 view.channelNotice(user, target, message);
153 }
154
155 return true;
156 }
157
158 this.irc_INVITE = function(prefix, params) {
159 var user = prefix;
160 var channel = ANI(params, -1);
161
162 view.userInvite(user, channel);
163
164 return true;
165 }
166
167 this.irc_ERROR = function(prefix, params) {
168 var message = ANI(params, -1);
169
170 view.serverError(message);
171
172 return true;
173 }
174
175 this.irc_MODE = function(prefix, params) {
176 var user = prefix;
177 var target = params[0];
178 var args = params.slice(1);
179
180 if(target == self.nickname) {
181 view.userMode(args);
182 } else {
183 var modes = args[0].split("");
184 var xargs = args.slice(1);
185
186 var data = []
187 var carg = 0;
188 var pos = 0;
189 var cmode = "+";
190
191 forEach(modes, function(mode) {
192 if((mode == "+") || (mode == "-")) {
193 cmode = mode;
194 return;
195 }
196
197 if(self.pmodes[mode]) {
198 d = [cmode, mode, xargs[carg++]]
199 } else {
200 d = [cmode, mode]
201 }
202
203 data.push(d);
204 });
205
206 view.channelMode(user, target, data, args);
207 }
208
209 return true;
210 }
211
212 this.irc_RPL_ISUPPORT = function(prefix, params) {
213 var supported = params.slice(1, -1);
214 var supportedhash = {};
215
216 for(var i=0;i<supported.length;i++) {
217 var l = supported[i].split("=", 2);
218 view.supported(l[0], l[1]);
219 }
220 }
221
222 this.irc_RPL_MYINFO = function(prefix, params) {
223 var pmodes = params[5].split("");
224 self.pmodes = {}
225 forEach(pmodes, function(pmode) {
226 self.pmodes[pmode] = true;
227 });
228 }
229
230 this.irc_RPL_NAMREPLY = function(prefix, params) {
231 var channel = params[2];
232 var names = params[3];
233
234 view.channelNames(channel, names.split(" "));
235
236 return true;
237 }
238
239 this.irc_RPL_ENDOFNAMES = function(prefix, params) {
240 var channel = params[1];
241
242 view.channelNames(channel, []);
243 return true;
244 }
245
246 this.irc_RPL_NOTOPIC = function(prefix, params) {
247 return true;
248 }
249
250 this.irc_RPL_TOPIC = function(prefix, params) {
251 var channel = params[1];
252 var topic = ANI(params, -1);
253
254 view.initialTopic(channel, topic);
255 return true;
256 }
257
258 this.irc_RPL_TOPICWHOTIME = function(prefix, params) {
259 return true;
260 }
261
262 this.connection = new TCPConnection(nickname, this);
263 this.send = this.connection.send;
264 this.connect = this.connection.connect;
265 this.disconnect = this.connection.disconnect;
266 }