X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=ChanUser.c;h=c31e202340ee9099d5560c3169b8c76a4abbd1f6;hb=795115bf680185ae01043bd1222b78bfed8c1d87;hp=a4cf9de629daab860c5d3eef50eac04f92c05fe2;hpb=b3330a3915ac73d3074551ef7e69cc8aeb54e6b7;p=NeonServV5.git diff --git a/ChanUser.c b/ChanUser.c index a4cf9de..c31e202 100644 --- a/ChanUser.c +++ b/ChanUser.c @@ -10,11 +10,15 @@ struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) { perror("malloc() failed"); return NULL; } + chanuser->flags = 0; chanuser->user = user; chanuser->chan = chan; + + chanuser->changeTime = 0; chanuser->next_user = chan->user; chan->user = chanuser; + chan->usercount++; chanuser->next_chan = user->channel; user->channel = chanuser; @@ -22,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) { @@ -57,22 +81,25 @@ 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 last = NULL; for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) { if(cchanuser == chanuser) { + chanuser->chan->usercount--; if(last) last->next_user = chanuser->next_user; else @@ -90,23 +117,41 @@ void delChanUser(struct ChanUser *chanuser, int freeChanUser) { } } -void quitChanUser(struct ChanUser *chanuser, int freeChanUser) { - struct ChanUser *cchanuser, *last = NULL; - last = NULL; - for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) { - if(cchanuser == chanuser) { - if(last) - last->next_user = chanuser->next_user; - else - chanuser->chan->user = chanuser->next_user; - break; - } else - last = cchanuser; +void removeChanUserFromLists(struct ChanUser *chanuser, int remove_from_userlist, int remove_from_channellist, int freeChanUser) { + struct ChanUser *cchanuser, *last; + if(remove_from_userlist) { + //remove it from the channel's user-list + last = NULL; + for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) { + if(cchanuser == chanuser) { + chanuser->chan->usercount--; + if(last) + last->next_user = chanuser->next_user; + else + chanuser->chan->user = chanuser->next_user; + break; + } else + last = cchanuser; + } + chanuser->next_user = NULL; } - + if(remove_from_channellist) { + //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; + } + chanuser->next_chan = NULL; + } + if(freeChanUser) free(chanuser); - else - chanuser->next_user = NULL; }