fixed invisible support for cmd_up and some other functions using getChanUser
authorpk910 <philipp@zoelle1.de>
Sun, 15 Jan 2012 19:31:32 +0000 (20:31 +0100)
committerpk910 <philipp@zoelle1.de>
Sun, 15 Jan 2012 19:33:41 +0000 (20:33 +0100)
src/ChanUser.c
src/cmd_neonserv_up.c

index 9ac06912ef0683039cd2bb1accc4cf529e09365f..b9ffde32ca1d76bcf07b57d134fdb5d09560ece2 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "ChanUser.h"
 #include "ChanNode.h"
+#include "ModeNode.h"
 #include "UserNode.h"
 
 struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) {
@@ -72,18 +73,32 @@ struct ChanUser* addInvisibleChanUser(struct ChanNode *chan, struct UserNode *us
 
 int isUserOnChan(struct UserNode *user, struct ChanNode *chan) {
     struct ChanUser *chanuser;
-    for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
-        if(chanuser->chan == chan)
-            return 1;
+    if(isModeSet(chan->modes, 'd') || isModeSet(chan->modes, 'D')) {
+        for(chanuser = chan->user; chanuser; chanuser = chanuser->next_user) {
+            if(chanuser->user == user)
+                return 1;
+        }
+    } else {
+        for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
+            if(chanuser->chan == chan)
+                return 1;
+        }
     }
     return 0;
 }
 
 struct ChanUser* getChanUser(struct UserNode *user, struct ChanNode *chan) {
     struct ChanUser *chanuser;
-    for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
-        if(chanuser->chan == chan)
-            return chanuser;
+    if(isModeSet(chan->modes, 'd') || isModeSet(chan->modes, 'D')) {
+        for(chanuser = chan->user; chanuser; chanuser = chanuser->next_user) {
+            if(chanuser->user == user)
+                return chanuser;
+        }
+    } else {
+        for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
+            if(chanuser->chan == chan)
+                return chanuser;
+        }
     }
     return NULL;
 }
index d8bd7ef84651689431aa3fabe40ca4c98186cd82..930df02331b38d57241671a41490da682d4cfb72 100644 (file)
 * no arguments
 */
 
+struct neonserv_cmd_up_cache {
+    struct ClientSocket *client;
+    struct ClientSocket *textclient;
+    struct UserNode *user;
+    struct Event *event;
+};
+
+static void neonserv_cmd_up_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event);
+static USERLIST_CALLBACK(neonserv_cmd_up_userlist_lookup);
+
 CMD_BIND(neonserv_cmd_up) {
+    if(isModeSet(chan->modes, 'd') || isModeSet(chan->modes, 'D')) {
+        struct neonserv_cmd_up_cache *cache = malloc(sizeof(*cache));
+        if (!cache) {
+            perror("malloc() failed");
+            return;
+        }
+        cache->client = client;
+        cache->textclient = getTextBot();
+        cache->user = user;
+        cache->event = event;
+        get_userlist_if_invisible(chan, neonserv_cmd_up_userlist_lookup, cache);
+    } else {
+        neonserv_cmd_up_async1(client, getTextBot(), user, chan, event);
+    }
+}
+
+static USERLIST_CALLBACK(neonserv_cmd_up_userlist_lookup) {
+    struct neonserv_cmd_up_cache *cache = data;
+    neonserv_cmd_up_async1(cache->client, cache->textclient, cache->user, chan, cache->event);
+    free(cache);
+}
+
+static void neonserv_cmd_up_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event) {
     struct ChanUser *chanuser = getChanUser(user, chan);
     if(!chanuser) {
         reply(getTextBot(), user, "NS_NOT_ON_CHANNEL_YOU", chan->name);