changed Makefile; build all commands as an own file
[NeonServV5.git] / ChanUser.c
index 69fc006621744b3d91061f134c6560490e8c8817..c31e202340ee9099d5560c3169b8c76a4abbd1f6 100644 (file)
@@ -13,6 +13,8 @@ struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) {
     chanuser->flags = 0;
     chanuser->user = user;
     chanuser->chan = chan;
+    
+    chanuser->changeTime = 0;
 
     chanuser->next_user = chan->user;
     chan->user = chanuser;
@@ -24,6 +26,26 @@ struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) {
     return chanuser;
 }
 
+struct ChanUser* addInvisibleChanUser(struct ChanNode *chan, struct UserNode *user) {
+    struct ChanUser *chanuser = malloc(sizeof(*chan));
+    if (!chanuser)
+    {
+        perror("malloc() failed");
+        return NULL;
+    }
+    chanuser->flags = CHANUSERFLAG_INVISIBLE;
+    chanuser->user = user;
+    chanuser->chan = chan;
+    
+    chanuser->changeTime = 0;
+
+    chanuser->next_user = chan->user;
+    chan->user = chanuser;
+    chan->usercount++;
+
+    return chanuser;
+}
+
 int isUserOnChan(struct UserNode *user, struct ChanNode *chan) {
     struct ChanUser *chanuser;
     for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
@@ -59,16 +81,18 @@ struct ChanUser* getUserChannels(struct UserNode *user, struct ChanUser *last) {
 void delChanUser(struct ChanUser *chanuser, int freeChanUser) {
     struct ChanUser *cchanuser, *last;
     //remove it from the user's channel-list
-    last = NULL;
-    for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
-        if(cchanuser == chanuser) {
-            if(last) 
-                last->next_chan = chanuser->next_chan;
-            else
-                chanuser->user->channel = chanuser->next_chan;
-            break;
-        } else
-            last = cchanuser;
+    if(!(chanuser->flags & CHANUSERFLAG_INVISIBLE)) {
+        last = NULL;
+        for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
+            if(cchanuser == chanuser) {
+                if(last) 
+                    last->next_chan = chanuser->next_chan;
+                else
+                    chanuser->user->channel = chanuser->next_chan;
+                break;
+            } else
+                last = cchanuser;
+        }
     }
 
     //remove it from the channel's user-list