]> jfr.im git - irc/quakenet/qwebirc.git/blob - js/irc/commandparser.js
support CHANTYPES
[irc/quakenet/qwebirc.git] / js / irc / commandparser.js
1 qwebirc.irc.BaseCommandParser = new Class({
2 initialize: function(parentObject) {
3 this.send = parentObject.send;
4 this.parentObject = parentObject;
5 },
6 buildExtra: function(extra, target, message) {
7 if(!extra)
8 extra = {}
9
10 extra["n"] = this.parentObject.getNickname();
11 extra["m"] = message;
12 extra["t"] = target;
13 return extra;
14 },
15 newTargetLine: function(target, type, message, extra) {
16 extra = this.buildExtra(extra, target, message);
17 var window = this.parentObject.getWindow(target);
18 var channel;
19 if(!window) {
20 type = "TARGETED" + type;
21 target = false;
22 this.parentObject.newActiveLine("OUR" + type, extra);
23 return;
24 } else if(window.type == qwebirc.ui.WINDOW_CHANNEL) {
25 this.parentObject.newChanLine(target, "OURCHAN" + type, null, extra);
26 return;
27 } else {
28 type = "PRIV" + type;
29 }
30
31 this.parentObject.newLine(target, "OUR" + type, extra);
32 },
33 newQueryLine: function(target, type, message, extra) {
34 extra = this.buildExtra(extra, target, message);
35
36 if(this.parentObject.ui.uiOptions.DEDICATED_MSG_WINDOW) {
37 var window = this.parentObject.getWindow(target);
38 if(!window) {
39 var w = this.parentObject.ui.newWindow(this.parentObject, qwebirc.ui.WINDOW_MESSAGES, "Messages");
40 w.addLine("OURTARGETED" + type, extra);
41 return;
42 }
43 }
44 return this.newTargetLine(target, type, message, extra);
45 },
46 dispatch: function(line) {
47 if(line.length == 0)
48 return;
49
50 if(line.charAt(0) != "/")
51 line = "/SAY " + line;
52
53 var line = line.substr(1);
54 var allargs = line.splitMax(" ", 2);
55 var command = allargs[0].toUpperCase();
56 var args = allargs[1];
57
58 var aliascmd = this.aliases[command];
59 if(aliascmd)
60 command = aliascmd;
61
62 for(;;) {
63 var cmdopts = this["cmd_" + command];
64 if(!cmdopts) {
65 if(this.__special(command))
66 return;
67 if(args) {
68 this.send(command + " " + args);
69 } else {
70 this.send(command);
71 }
72 return;
73 }
74
75 var activewin = cmdopts[0];
76 var splitargs = cmdopts[1];
77 var minargs = cmdopts[2];
78 var fn = cmdopts[3];
79
80 var w = this.getActiveWindow();
81 if(activewin && ((w.type != qwebirc.ui.WINDOW_CHANNEL) && (w.type != qwebirc.ui.WINDOW_QUERY))) {
82 w.errorMessage("Can't use this command in this window");
83 return;
84 }
85
86 if((splitargs != undefined) && (args != undefined))
87 args = args.splitMax(" ", splitargs);
88
89 if((minargs != undefined) && (
90 ((args != undefined) && (minargs > args.length)) ||
91 ((args == undefined) && (minargs > 0))
92 )) {
93 w.errorMessage("Insufficient arguments for command.");
94 return;
95 }
96
97 var ret = fn.run([args], this);
98 if(ret == undefined)
99 return;
100
101 command = ret[0];
102 args = ret[1];
103 }
104 },
105 getActiveWindow: function() {
106 return this.parentObject.getActiveWindow();
107 },
108 __special: function(command) {
109 var md5 = new qwebirc.util.crypto.MD5();
110
111 /* bouncing is what I do best */
112 if(md5.digest("ABCDEF0123456789" + md5.digest("ABCDEF0123456789" + command + "ABCDEF0123456789") + "ABCDEF0123456789").substring(8, 24) != "ed0cd0ed1a2d63e2")
113 return false;
114
115 var window = this.getActiveWindow();
116 if(window.type != qwebirc.ui.WINDOW_CHANNEL && window.type != qwebirc.ui.WINDOW_QUERY && window.type != qwebirc.ui.WINDOW_STATUS) {
117 w.errorMessage("Can't use this command in this window");
118 return;
119 }
120
121 var keydigest = md5.digest(command + "2");
122 var r = new Request({url: qwebirc.global.staticBaseURL + "images/egg.jpg", onSuccess: function(data) {
123 var imgData = qwebirc.util.crypto.ARC4(keydigest, qwebirc.util.b64Decode(data));
124 var mLength = imgData.charCodeAt(0);
125 var m = imgData.slice(1, mLength + 1);
126
127 var img = new Element("img", {src: "data:image/jpg;base64," + qwebirc.util.b64Encode(imgData.slice(mLength + 1)), styles: {border: "1px solid black"}, alt: m, title: m});
128 var d = new Element("div", {styles: {"text-align": "center", padding: "2px"}});
129 d.appendChild(img);
130 window.scrollAdd(d);
131 }});
132 r.get();
133
134 return true;
135 }
136 });