added raw_topic, raw_privmsg and wrote the small "dead channel garbage collector"
[NeonServV5.git] / ChanNode.c
index 77071243119f886af200ca12f2579d538cdd65be..9bb9b313e465cde9cb708d401e2c26a6bfd42445 100644 (file)
@@ -1,4 +1,6 @@
 #include "ChanNode.h"
+#include "ChanUser.h"
+#include "UserNode.h"
 
 static struct ChanNode **chanList;
 
@@ -97,8 +99,36 @@ void delChannel(struct ChanNode* chan, int freeChan) {
         } else
             last_chan = cchan;
     }
+    if(chan->user) {
+        //free all chanusers
+        struct ChanUser *chanuser, *next;
+        for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = next) {
+            next = getChannelUsers(chan, chanuser);
+            removeChanUserFromLists(chanUser, 0, 1, 1);
+        }
+    }
     if(freeChan)
         free(chan);
     else
         chan->next = NULL;
 }
+
+void checkChannelVisibility(struct ChanNode* chan) {
+    struct ChanUser *chanuser, *cchanuser, *next, *last = NULL;
+    for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) {
+        if(chanuser->user->flags & USERFLAG_ISBOT) return;
+    }
+    //free the channel...
+    for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = next) {
+        next = getChannelUsers(chan, chanuser);
+        //remove the channel from the user's channel-list
+        removeChanUserFromLists(chanUser, 0, 1, 0);
+        if(!chanuser->user->channel) {
+            //free the user (no more channels)
+            delUser(chanuser->user, 1);
+        }
+        free(chanuser);
+    }
+    chan->user = NULL;
+    delChannel(chan, 1);
+}