]> jfr.im git - irc/quakenet/qwebirc.git/commitdiff
Merge.
authorChris Porter <redacted>
Fri, 5 Jun 2009 00:27:45 +0000 (01:27 +0100)
committerChris Porter <redacted>
Fri, 5 Jun 2009 00:27:45 +0000 (01:27 +0100)
js/irc/ircclient.js
js/jslib.js
js/ui/frontends/qui.js
js/ui/menuitems.js

index 5939c35bf074b39b65b117c1dce4442caf371a8b..155a55237791ed6bcce935c5ce87b3f1a9587bdd 100644 (file)
@@ -497,6 +497,13 @@ qwebirc.irc.IRCClient = new Class({
     
     this.newServerLine("DISCONNECT", {"m": message});
   },
+  nickOnChanHasPrefix: function(nick, channel, prefix) {
+    var entry = this.tracker.getNickOnChannel(nick, channel);
+    if(!$defined(entry))
+      return false; /* shouldn't happen */
+   
+    return entry.prefixes.indexOf(prefix) != -1;
+  },
   supported: function(key, value) {
     if(key == "PREFIX") {
       var l = (value.length - 2) / 2;
index e58bd954257941a924e91539a421cbe097766260..b07fba134c6e3b0b0ab000249975dba4486b7cd7 100644 (file)
@@ -312,3 +312,21 @@ qwebirc.util.b64Decode = function(data) {
 
   return output.join("");
 }
+
+qwebirc.util.composeAnd = function() {
+ var xargs = arguments;
+
+  return function() {
+    for(var i=0;i<xargs.length;i++)
+      if(!xargs[i].apply(this, arguments))
+        return false;
+        
+    return true;
+  }
+}
+
+qwebirc.util.invertFn = function(fn) {
+  return function() {
+    return !fn.apply(this, arguments);
+  }
+}
index a5557029d3a6414d327db0516708253cb667b79c..5e3255e62e56fd233a4075cefcd47d254822ad66 100644 (file)
@@ -423,15 +423,19 @@ qwebirc.ui.QUI.Window = new Class({
     parent.appendChild(e);
     e.addClass("menu");
     
+    var nickArray = [nick];
     qwebirc.ui.MENU_ITEMS.forEach(function(x) {
+      if(!x.predicate || x.predicate !== true && !x.predicate.apply(this, nickArray))
+        return;
+      
       var e2 = new Element("a");
       e.appendChild(e2);
-      
+
       e2.href = "#";
-      e2.set("text", "- " + x[0]);
-      
+      e2.set("text", "- " + x.text);
+
       e2.addEvent("focus", function() { this.blur() }.bind(e2));
-      e2.addEvent("click", function(ev) { new Event(ev.stop()); this.menuClick(x[1]); }.bind(this));
+      e2.addEvent("click", function(ev) { new Event(ev.stop()); this.menuClick(x.fn); }.bind(this));
     }.bind(this));
     return e;
   },
@@ -481,7 +485,7 @@ qwebirc.ui.QUI.Window = new Class({
       this.prevNick = e;
       e.addClass("selected");
       this.moveMenuClass();
-      e.menu = this.createMenu(x.realNick, e);
+      e.menu = this.createMenu(e.realNick, e);
       new Event(x).stop();
     }.bind(this));
     
index c5c05230a1b13d458222b3e8d52b283ca7dabd9b..05bc92157346578eca98897736be0a2a7e40909f 100644 (file)
@@ -1,15 +1,3 @@
-qwebirc.ui.MENU_ITEMS = [
-  ["whois", function(nick) {
-    this.client.exec("/WHOIS " + nick);
-  }],
-  ["query", function(nick) {
-    this.client.exec("/QUERY " + nick);
-  }],
-  ["slap", function(nick) {
-    this.client.exec("/ME slaps " + nick + " around a bit with a large fishbot");
-  }]
-];
-
 qwebirc.ui.UI_COMMANDS = [
   ["Options", "options"],
   ["Add webchat to your site", "embedded"],
@@ -18,3 +6,78 @@ qwebirc.ui.UI_COMMANDS = [
   ["Frequently asked questions", "faq"],
   ["About qwebirc", "about"]
 ];
+
+qwebirc.ui.MENU_ITEMS = function() {
+  var isOpped = function(nick) {
+    var channel = this.name; /* window name */
+    var myNick = this.client.nickname;
+
+    return this.client.nickOnChanHasPrefix(myNick, channel, "@");
+  };
+
+  var isVoiced = function(nick) {
+    var channel = this.name;
+    var myNick = this.client.nickname;
+
+    return this.client.nickOnChanHasPrefix(myNick, channel, "+");
+  };
+
+  var targetOpped = function(nick) {
+    var channel = this.name;
+    return this.client.nickOnChanHasPrefix(nick, channel, "@");
+  };
+
+  var targetVoiced = function(nick) {
+    var channel = this.name;
+    return this.client.nickOnChanHasPrefix(nick, channel, "+");
+  };
+
+  var invert = qwebirc.util.invertFn, compose = qwebirc.util.composeAnd;
+  
+  var command = function(cmd) {
+    return function(nick) { this.client.exec("/" + cmd + " " + nick); };
+  };
+  
+  return [
+    {
+      text: "whois", 
+      fn: command("whois"),
+      predicate: true
+    },
+    {
+      text: "query",
+      fn: command("query"),
+      predicate: true
+    },
+    {
+      text: "slap",
+      fn: function(nick) { this.client.exec("/ME slaps " + nick + " around a bit with a large fishbot"); },
+      predicate: true
+    },
+    {
+      text: "kick", /* TODO: disappear when we're deopped */
+      fn: function(nick) { this.client.exec("/KICK " + nick + " wibble"); },
+      predicate: isOpped
+    },
+    {
+      text: "op",
+      fn: command("op"),
+      predicate: compose(isOpped, invert(targetOpped))
+    },
+    {
+      text: "deop",
+      fn: command("deop"),
+      predicate: compose(isOpped, targetOpped)
+    },
+    {
+      text: "voice",
+      fn: command("voice"),
+      predicate: compose(isOpped, invert(targetVoiced))
+    },
+    {
+      text: "devoice",
+      fn: command("devoice"),
+      predicate: compose(isOpped, targetVoiced)
+    }
+  ];
+}();