Exemple #1
0
void hchanban_schedule_entry(hchanban* item)
{
    if (hchannel_is_valid(item->hchan))
        helpmod_setban(item->hchan, item->banmask->content, 0, MCB_DEL, HNOW);

    hchanban_del(item);
}
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);
            }
        }
    }
}
Exemple #3
0
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;
}
Exemple #4
0
hban *hban_del(hban* hb, int now)
{
    hban **ptr = &hbans;
    for (;*ptr;ptr = &(*ptr)->next)
        if (*ptr == hb)
        {
            hban *tmp = (*ptr)->next;

            { /* additional logic here */
                hchannel *hchan;
                for (hchan = hchannels;hchan;hchan = hchan->next)
                    helpmod_setban(hchan, bantostring((*ptr)->real_ban), 0, MCB_DEL, now);
            }

            freechanban((*ptr)->real_ban); /* evil ? */
            freesstring((*ptr)->reason);
            free(*ptr);

            *ptr = tmp;
            return NULL;
        }
    return hb;
}
Exemple #5
0
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;
    }
}