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 hcensor_match(hchannel *hchan, huser *husr, hcensor *hcens) { switch (hcens->type) { case HCENSOR_WARN: if (hcens->reason) helpmod_reply(husr, NULL, "%s", hcens->reason->content); return 0; case HCENSOR_KICK: helpmod_kick(hchan, husr, "%s", hcens->reason?hcens->reason->content:"Improper user"); return !0; case HCENSOR_CHANBAN: helpmod_setban(hchan, hban_ban_string(husr->real_user, HBAN_HOST), HCMD_OUT_DEFAULT + time(NULL), MCB_ADD, HNOW); helpmod_kick(hchan, husr, "%s", hcens->reason?hcens->reason->content:"Censor violation"); return !0; case HCENSOR_BAN: hban_add(hban_ban_string(husr->real_user, HBAN_HOST), hcens->reason?hcens->reason->content:"Censor violation", HCMD_OUT_DEFAULT + time(NULL), 1); return !0; default: Error("helpmod", ERR_ERROR, "Unknown censor type %d", hcens->type); return !0; } }
void hchannel_activate_join_flood(hchannel *hchan) { hchannel_user **hchanuser = &hchan->channel_users; helpmod_simple_modes(hchan, CHANMODE_REGONLY, 0, 1); /* clean the channel of the already joined clients */ while (*hchanuser) if (((*hchanuser)->time_joined > (time(NULL) - 5)) && huser_get_level((*hchanuser)->husr) < H_STAFF) helpmod_kick(hchan, (*hchanuser)->husr, "Join flood"); else hchanuser = &(*hchanuser)->next; hchan->flags |= H_JOIN_FLOOD; scheduleoneshot(time(NULL) + 60, &hchannel_deactivate_join_flood, NULL); }
hban *hban_add(const char* pat, const char* rsn, time_t exp, int now) { hban *ptr; chanban *tmp; if (hban_get(pat) || exp <= time(NULL)) return NULL; if ((tmp = makeban(pat)) == NULL) /* bad ban */ return NULL; ptr = (hban*)malloc(sizeof(hban)); ptr->real_ban = tmp; ptr->expiration = exp; if (rsn == NULL) ptr->reason = NULL; else ptr->reason = getsstring(rsn, strlen(rsn)); ptr->next = hbans; hbans = ptr; { /* additional logic here */ huser* tmpu; for (tmpu = husers;tmpu;tmpu = tmpu->next) if (nickmatchban(tmpu->real_user, tmp, 0) && !IsOper(tmpu->real_user)) { hchannel *assert_hchan = NULL; while (tmpu->hchannels) { if (tmpu->hchannels->hchan == assert_hchan) { Error("helpmod", ERR_ERROR, "hban.c hban_add() current channel is the previous channel. Preventing lockup."); break; } assert_hchan = tmpu->hchannels->hchan; helpmod_setban(tmpu->hchannels->hchan, bantostring(ptr->real_ban), HELPMOD_BAN_DURATION, MCB_ADD, now); helpmod_kick(tmpu->hchannels->hchan, tmpu, "%s", hban_get_reason(ptr)); } } } return ptr; }