]> jfr.im git - irc/quakenet/qwebirc.git/blob - js/irc/commandparser.js
4efad3916350fcecf2581a0529070260a4ad57ca
[irc/quakenet/qwebirc.git] / js / irc / commandparser.js
1 qwebirc.irc.CommandParser = new Class({
2 initialize: function(parentObject) {
3 this.aliases = {
4 "J": "JOIN",
5 "K": "KICK",
6 "MSG": "PRIVMSG",
7 "Q": "QUERY",
8 "BACK": "AWAY",
9 "HOP": "CYCLE"
10 };
11
12 this.send = parentObject.send;
13 this.parentObject = parentObject;
14 },
15 newTargetLine: function(target, type, message, extra) {
16 if(!extra)
17 extra = {}
18
19 extra["n"] = this.parentObject.getNickname();
20 extra["m"] = message;
21 extra["t"] = target;
22
23 var window = this.parentObject.getWindow(target);
24 var channel;
25 if(!window) {
26 type = "TARGETED" + type;
27 target = false;
28 this.parentObject.newActiveLine("OUR" + type, extra);
29 return;
30 } else if(window.type == qwebirc.ui.WINDOW_CHANNEL) {
31 type = "CHAN" + type;
32 } else {
33 type = "PRIV" + type;
34 }
35
36 this.parentObject.newLine(target, "OUR" + type, extra);
37 },
38 dispatch: function(line) {
39 if(line.length == 0)
40 return;
41
42 if(line.charAt(0) != "/")
43 line = "/SAY " + line;
44
45 var line = line.substr(1);
46 var allargs = line.splitMax(" ", 2);
47 var command = allargs[0].toUpperCase();
48 var args = allargs[1];
49
50 var aliascmd = this.aliases[command];
51 if(aliascmd)
52 command = aliascmd;
53
54 for(;;) {
55 var cmdopts = this["cmd_" + command];
56 if(!cmdopts) {
57 if(args) {
58 this.send(command + " " + args);
59 } else {
60 this.send(command);
61 }
62 return;
63 }
64
65 var activewin = cmdopts[0];
66 var splitargs = cmdopts[1];
67 var minargs = cmdopts[2];
68 var fn = cmdopts[3];
69
70 var w = this.parentObject.getActiveWindow();
71 if(activewin && w.type == qwebirc.ui.WINDOW_STATUS) {
72 w.errorMessage("Can't use this command in this window");
73 return;
74 }
75
76 if((splitargs != undefined) && (args != undefined))
77 args = args.splitMax(" ", splitargs);
78
79 if((minargs != undefined) && (
80 ((args != undefined) && (minargs > args.length)) ||
81 ((args == undefined) && (minargs > 0))
82 )) {
83 w.errorMessage("Insufficient arguments for command.");
84 return;
85 }
86
87 var ret = fn.attempt([args], this);
88 if(ret == undefined)
89 return;
90
91 command = ret[0];
92 args = ret[1];
93 }
94 },
95 /* [require_active_window, splitintoXargs, minargs, function] */
96 cmd_ME: [true, undefined, undefined, function(args) {
97 if(args == undefined)
98 args = "";
99
100 var target = this.parentObject.getActiveWindow().name;
101 if(!this.send("PRIVMSG " + target + " :\x01ACTION " + args + "\x01"))
102 return;
103
104 this.newTargetLine(target, "ACTION", args);
105 }],
106 cmd_CTCP: [false, 3, 2, function(args) {
107 var target = args[0];
108 var type = args[1].toUpperCase();
109 var message = args[2];
110
111 if(message == undefined)
112 message = "";
113
114 if(message == "") {
115 if(!this.send("PRIVMSG " + target + " :\x01" + type + "\x01"))
116 return;
117 } else {
118 if(!this.send("PRIVMSG " + target + " :\x01" + type + " " + message + "\x01"))
119 return;
120 }
121
122 this.newTargetLine(target, "CTCP", message, {"x": type});
123 }],
124 cmd_PRIVMSG: [false, 2, 2, function(args) {
125 var target = args[0];
126 var message = args[1];
127
128 if(this.send("PRIVMSG " + target + " :" + message))
129 this.newTargetLine(target, "MSG", message, {});
130 }],
131 cmd_NOTICE: [false, 2, 2, function(args) {
132 var target = args[0];
133 var message = args[1];
134
135 if(this.send("NOTICE " + target + " :" + message))
136 this.newTargetLine(target, "NOTICE", message);
137 }],
138 cmd_QUERY: [false, 2, 1, function(args) {
139 this.parentObject.newWindow(args[0], qwebirc.ui.WINDOW_QUERY, true);
140
141 if((args.length > 1) && (args[1] != ""))
142 return ["SAY", args[1]];
143 }],
144 cmd_SAY: [true, undefined, undefined, function(args) {
145 if(args == undefined)
146 args = "";
147
148 return ["PRIVMSG", this.parentObject.getActiveWindow().name + " " + args]
149 }],
150 cmd_ABOUT: [false, undefined, undefined, function(args) {
151 var lines = [
152 "",
153 "qwebirc v" + qwebirc.VERSION,
154 "Copyright (C) 2008 Chris Porter. All rights reserved.",
155 "http://webchat.quakenet.org/",
156 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.",
157 "",
158 "This software contains portions by the following third parties:",
159 "- MooTools v1.2 -- http://mootools.net/",
160 " Copyright (C) 2006-2008 Valerio Proietti, MIT license.",
161 "",
162 "Thank you for flying QuakeNet!",
163 "",
164 ];
165
166 var aw = this.parentObject.getActiveWindow();
167 lines.forEach(function(x) {
168 this.parentObject.newActiveLine("", x);
169 }.bind(this));
170 }],
171 cmd_QUOTE: [false, 1, 1, function(args) {
172 this.send(args[0]);
173 }],
174 cmd_KICK: [true, 2, 1, function(args) {
175 var channel = this.parentObject.getActiveWindow().name;
176
177 var message = "";
178 var target = args[0];
179
180 if(args.length == 2)
181 message = args[1];
182
183 this.send("KICK " + channel + " " + target + " :" + message);
184 }],
185 automode: function(direction, mode, args) {
186 var channel = this.parentObject.getActiveWindow().name;
187
188 var modes = direction;
189 for(var i=0;i<args.length;i++)
190 modes = modes + mode;
191
192 this.send("MODE " + channel + " " + modes + " " + args.join(" "));
193 },
194 cmd_OP: [true, 6, 1, function(args) {
195 this.automode("+", "o", args);
196 }],
197 cmd_DEOP: [true, 6, 1, function(args) {
198 this.automode("-", "o", args);
199 }],
200 cmd_VOICE: [true, 6, 1, function(args) {
201 this.automode("+", "v", args);
202 }],
203 cmd_DEVOICE: [true, 6, 1, function(args) {
204 this.automode("-", "v", args);
205 }],
206 cmd_TOPIC: [true, 1, 1, function(args) {
207 this.send("TOPIC " + this.parentObject.getActiveWindow().name + " :" + args[0]);
208 }],
209 cmd_AWAY: [false, 1, 0, function(args) {
210 this.send("AWAY :" + (args?args[0]:""));
211 }],
212 cmd_CYCLE: [true, 1, 0, function(args) {
213 var c = this.parentObject.getActiveWindow().name;
214
215 this.send("PART " + c + " :" + (args?args[0]:"rejoining. . ."));
216 this.send("JOIN " + c);
217 }],
218 cmd_CLEAR: [false, undefined, undefined, function(args) {
219 var w = this.parentObject.getActiveWindow().lines;
220 while(w.childNodes.length > 0)
221 w.removeChild(w.firstChild);
222 }],
223 cmd_PART: [false, 2, 0, function(args) {
224 var w = this.parentObject.getActiveWindow();
225 var message = "";
226 var channel;
227
228 if(w.type == qwebirc.ui.WINDOW_STATUS) {
229 if(!args || args.length == 0) {
230 w.errorMessage("Insufficient arguments for command.");
231 return;
232 }
233 channel = args[0];
234 if(args.length > 1)
235 message = args[1];
236 } else {
237 if(!args || args.length == 0) {
238 channel = w.name;
239 } else {
240 var isChan = args[0].charAt(0) == '#';
241 if(isChan) {
242 channel = args[0];
243 if(args.length > 1)
244 message = args[1];
245 } else {
246 channel = w.name;
247 message = args.join(" ");
248 }
249 }
250 }
251
252 this.send("PART " + channel + " :" + message);
253 }]
254 });