]> jfr.im git - irc/quakenet/qwebirc.git/blob - js/irc/commandparser.js
7952d650d0fa24782bb88b3ed0ea33d138a1d58f
[irc/quakenet/qwebirc.git] / js / irc / commandparser.js
1 var CommandParser = new Class({
2 initialize: function(parentObject) {
3 this.aliases = {
4 "J": "JOIN",
5 "K": "KICK",
6 "MSG": "PRIVMSG",
7 "Q": "QUERY"
8 };
9
10 this.send = parentObject.send;
11 this.parentObject = parentObject;
12 },
13 newTargetLine: function(target, type, message, extra) {
14 if(!extra)
15 extra = {}
16
17 extra["n"] = this.parentObject.getNickname();
18 extra["m"] = message;
19 extra["t"] = target;
20
21 var window = this.parentObject.getWindow(target);
22 var channel;
23 if(!window) {
24 type = "TARGETED" + type;
25 target = false;
26 this.parentObject.newActiveLine("OUR" + type, extra);
27 return;
28 } else if(window.type == WINDOW_CHANNEL) {
29 type = "CHAN" + type;
30 } else {
31 type = "PRIV" + type;
32 }
33
34 this.parentObject.newLine(target, "OUR" + type, extra);
35 },
36 dispatch: function(line) {
37 if(line.length == 0)
38 return;
39
40 if(line.charAt(0) != "/")
41 line = "/SAY " + line;
42
43 var line = line.substr(1);
44 var allargs = line.splitMax(" ", 2);
45 var command = allargs[0].toUpperCase();
46 var args = allargs[1];
47
48 var aliascmd = this.aliases[command];
49 if(aliascmd)
50 command = aliascmd;
51
52 for(;;) {
53 var cmdopts = this["cmd_" + command];
54 if(!cmdopts) {
55 if(args) {
56 this.send(command + " " + args);
57 } else {
58 this.send(command);
59 }
60 return;
61 }
62
63 var activewin = cmdopts[0];
64 var splitargs = cmdopts[1];
65 var minargs = cmdopts[2];
66 var fn = cmdopts[3];
67
68 var w = this.parentObject.getActiveWindow();
69 if(activewin && w.type == WINDOW_STATUS) {
70 w.errorMessage("Can't use this command in this window");
71 return;
72 }
73
74 if((splitargs != undefined) && (args != undefined))
75 args = args.splitMax(" ", splitargs);
76
77 if((minargs != undefined) && (
78 ((args != undefined) && (minargs > args.length)) ||
79 ((args == undefined) && (minargs > 0))
80 )) {
81 w.errorMessage("Insufficient arguments for command.");
82 return;
83 }
84
85 var ret = fn.attempt([args], this);
86 if(ret == undefined)
87 return;
88
89 command = ret[0];
90 args = ret[1];
91 }
92 },
93 cmd_ME: [true, undefined, undefined, function(args) {
94 if(args == undefined)
95 args = "";
96
97 var target = this.parentObject.getActiveWindow().name;
98 if(!this.send("PRIVMSG " + target + " :\x01ACTION " + args + "\x01"))
99 return;
100
101 this.newTargetLine(target, "ACTION", args);
102 }],
103 cmd_CTCP: [false, 3, 2, function(args) {
104 var target = args[0];
105 var type = args[1].toUpperCase();
106 var message = args[2];
107
108 if(message == undefined)
109 message = "";
110
111 if(message == "") {
112 if(!this.send("PRIVMSG " + target + " :\x01" + type + "\x01"))
113 return;
114 } else {
115 if(!this.send("PRIVMSG " + target + " :\x01" + type + " " + message + "\x01"))
116 return;
117 }
118
119 this.newTargetLine(target, "CTCP", message, {"x": type});
120 }],
121 cmd_PRIVMSG: [false, 2, 2, function(args) {
122 var target = args[0];
123 var message = args[1];
124
125 if(this.send("PRIVMSG " + target + " :" + message))
126 this.newTargetLine(target, "MSG", message, {});
127 }],
128 cmd_NOTICE: [false, 2, 2, function(args) {
129 var target = args[0];
130 var message = args[1];
131
132 if(this.send("NOTICE " + target + " :" + message))
133 this.newTargetLine(target, "NOTICE", message);
134 }],
135 cmd_QUERY: [false, 2, 1, function(args) {
136 this.parentObject.newWindow(args[0], WINDOW_QUERY, true);
137
138 if((args.length > 1) && (args[1] != ""))
139 return ["SAY", args[1]];
140 }],
141 cmd_SAY: [true, undefined, undefined, function(args) {
142 if(args == undefined)
143 args = "";
144
145 return ["PRIVMSG", this.parentObject.getActiveWindow().name + " " + args]
146 }],
147 KICK: [true, 3, 2, function(args) {
148 var channel = args[0];
149 var target = args[1];
150 var message = args[2];
151 if(!message)
152 message = "";
153
154 this.send("KICK " + channel + " " + target + " :" + message);
155 }]
156 });