fixed invisible support for cmd_up and some other functions using getChanUser
[NeonServV5.git] / src / ChanUser.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;
 }