fixed botwar detection for bot deops
[NeonServV5.git] / src / ChanUser.c
index 9ac06912ef0683039cd2bb1accc4cf529e09365f..795d237a2da298075a093404c4ea29d386da9803 100644 (file)
 
 #include "ChanUser.h"
 #include "ChanNode.h"
+#include "ModeNode.h"
 #include "UserNode.h"
 
 struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) {
-    struct ChanUser *chanuser = malloc(sizeof(*chan));
+    struct ChanUser *chanuser = malloc(sizeof(*chanuser));
     if (!chanuser)
     {
         perror("malloc() failed");
@@ -48,7 +49,7 @@ struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) {
 }
 
 struct ChanUser* addInvisibleChanUser(struct ChanNode *chan, struct UserNode *user) {
-    struct ChanUser *chanuser = malloc(sizeof(*chan));
+    struct ChanUser *chanuser = malloc(sizeof(*chanuser));
     if (!chanuser)
     {
         perror("malloc() failed");
@@ -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;
 }