rewrote IRC cache parser to be (hopefully) more stable
[NeonServV5.git] / src / ChanUser.c
index 9ac06912ef0683039cd2bb1accc4cf529e09365f..0d370c1dcd25ef9e55b127fcd58813c32d32471d 100644 (file)
@@ -1,4 +1,4 @@
-/* ChanUser.c - NeonServ v5.3
+/* ChanUser.c - NeonServ v5.4
  * Copyright (C) 2011-2012  Philipp Kreil (pk910)
  * 
  * This program is free software: you can redistribute it and/or modify
 
 #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");
@@ -29,6 +30,7 @@ struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) {
     chanuser->flags = 0;
     chanuser->user = user;
     chanuser->chan = chan;
+    chanuser->visCount = 0;
     
     chanuser->changeTime = 0;
     chanuser->spamnode = NULL;
@@ -48,7 +50,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");
@@ -57,6 +59,7 @@ struct ChanUser* addInvisibleChanUser(struct ChanNode *chan, struct UserNode *us
     chanuser->flags = CHANUSERFLAG_INVISIBLE;
     chanuser->user = user;
     chanuser->chan = chan;
+    chanuser->visCount = 0;
     
     chanuser->changeTime = 0;
     chanuser->spamnode = NULL;
@@ -72,18 +75,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;
 }