void hchannel_remove_inactive_users(void) { hchannel *hchan = hchannels; for (;hchan;hchan = hchan->next) { if (hchan->flags & H_ANTI_IDLE && !(hchan->flags & H_PASSIVE)) { hchannel_user **hchanuser = &hchan->channel_users; while (*hchanuser) { if ( (huser_get_level((*hchanuser)->husr) == H_PEON) && (time(NULL) - huser_on_channel((*hchanuser)->husr,hchan)->last_activity >= hchan->max_idle) && !(on_queue((*hchanuser)->husr, huser_on_channel((*hchanuser)->husr, hchan))) && !IsSetHost((*hchanuser)->husr->real_user) ) { if (huser_on_channel((*hchanuser)->husr, hchan)->flags & H_IDLE_WARNING) { const char *banmask = hban_ban_string((*hchanuser)->husr->real_user, HBAN_HOST); int bantime = 10; helpmod_setban(hchan, banmask, time(NULL) + bantime * HDEF_m, MCB_ADD, HLAZY); helpmod_kick(hchan, (*hchanuser)->husr, "Please do not idle in %s (%dmin anti-idle tempban). If you still require assistance, please try again later.", hchannel_get_name(hchan), bantime); continue; } else { helpmod_reply((*hchanuser)->husr, NULL, "You are currently idle in %s. Please part the channel if you have nothing to do there", hchannel_get_name(hchan)); huser_on_channel((*hchanuser)->husr, hchan)->flags |= H_IDLE_WARNING; } } /*hcommit_modes();*/ hchanuser = &(*hchanuser)->next; } hcommit_modes(); } /* Additionally, test if the channel has queue but no idle opers / staff */ if (hchan->flags & H_QUEUE && hchan->flags & H_QUEUE_TIMEOUT) { hchannel_user *tmp; for (tmp = hchan->channel_users;tmp;tmp = tmp->next) if (huser_get_level(tmp->husr) >= H_TRIAL) { huser_channel *huserchan = huser_on_channel(tmp->husr, hchan); if ((time(NULL) - huserchan->last_activity < HELPMOD_QUEUE_TIMEOUT) && (huserchan->last_activity != tmp->time_joined)) break; } if (!tmp) { hchan->flags &= ~H_QUEUE; if (hchan->flags & H_REPORT && hchannel_is_valid(hchan->report_to)) helpmod_message_channel(hchan->report_to, "%s: Channel queue deactivated because of inactivity", hchannel_get_name(hchan)); hchannel_conf_change(hchan, hchan->flags | H_QUEUE); } } } }
int hchannels_on_queue(huser *husr) { huser_channel *huserchan = husr->hchannels; for (;huserchan;huserchan = huserchan->next) if (on_queue(husr, huserchan)) return 1; return 0; }
int hchannel_count_queue(hchannel *hchan) { int count = 0; hchannel_user *hchanuser = hchan->channel_users; for (;hchanuser;hchanuser = hchanuser->next) { if (on_queue(hchanuser->husr, huser_on_channel(hchanuser->husr, hchan))) count++; } return count; }
static int hqueue_on_queue(hqueue_entry *qentry) { return on_queue(qentry->hchanuser->husr, qentry->huserchan); }