+ int chanListIndex = get_chanlist_entry(chan->name[1]);
+ if(chanListIndex == -1) return;
+ struct ChanNode *cchan, *last_chan = NULL;
+ for(cchan = chanList[chanListIndex]; cchan; cchan = cchan->next) {
+ if(cchan == chan) {
+ if(last_chan)
+ last_chan->next = chan->next;
+ else
+ chanList[chanListIndex] = chan->next;
+ break;
+ } 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)
+ freeChanNode(chan);
+ else
+ chan->next = NULL;
+}
+
+void freeChanNode(struct ChanNode* chan) {
+ if(chan->trigger) {
+ struct trigger_cache *trigger, *next_trigger;
+ for(trigger = chan->trigger; trigger; trigger = next_trigger) {
+ next_trigger = trigger->next;
+ free(trigger->trigger);
+ free(trigger);
+ }
+ }
+ freeModeNode(chan->modes);
+ if(chan->bans)
+ removeChannelBans(chan);
+ free(chan);
+}
+
+void checkChannelVisibility(struct ChanNode* chan) {
+ struct ChanUser *chanuser, *next;
+ for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) {
+ if(chanuser->user->flags & USERFLAG_ISBOT) {
+ chan->chanbot = chanuser->user;
+ 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);