Exemplo n.º 1
0
/**
 * This function is called once a second from the mainloop.
 * It is intended to do background checking on all the user structs, e.g.
 * stuff like ping checks, registration timeouts, etc.
 */
void UserManager::DoBackgroundUserStuff()
{
    /*
     * loop over all local users..
     */
    for (LocalUserList::iterator i = local_users.begin(); i != local_users.end(); ++i)
    {
        LocalUser* curr = *i;

        if (curr->quitting)
            continue;

        if (curr->CommandFloodPenalty || curr->eh.getSendQSize())
        {
            unsigned int rate = curr->MyClass->GetCommandRate();
            if (curr->CommandFloodPenalty > rate)
                curr->CommandFloodPenalty -= rate;
            else
                curr->CommandFloodPenalty = 0;
            curr->eh.OnDataReady();
        }

        switch (curr->registered)
        {
        case REG_ALL:
            if (ServerInstance->Time() > curr->nping)
            {
                // This user didn't answer the last ping, remove them
                if (!curr->lastping)
                {
                    time_t time = ServerInstance->Time() - (curr->nping - curr->MyClass->GetPingTime());
                    const std::string message = "Ping timeout: " + ConvToStr(time) + (time == 1 ? " seconds" : " second");
                    this->QuitUser(curr, message);
                    continue;
                }

                curr->Write("PING :" + ServerInstance->Config->ServerName);
                curr->lastping = 0;
                curr->nping = ServerInstance->Time() + curr->MyClass->GetPingTime();
            }
            break;
        case REG_NICKUSER:
            if (AllModulesReportReady(curr))
            {
                /* User has sent NICK/USER, modules are okay, DNS finished. */
                curr->FullConnect();
                continue;
            }
            break;
        }

        if (curr->registered != REG_ALL && (ServerInstance->Time() > (curr->age + curr->MyClass->GetRegTimeout())))
        {
            /*
             * registration timeout -- didnt send USER/NICK/HOST
             * in the time specified in their connection class.
             */
            this->QuitUser(curr, "Registration timeout");
            continue;
        }
    }
}
Exemplo n.º 2
0
/**
 * This function is called once a second from the mainloop.
 * It is intended to do background checking on all the user structs, e.g.
 * stuff like ping checks, registration timeouts, etc.
 */
void InspIRCd::DoBackgroundUserStuff()
{
	/*
	 * loop over all local users..
	 */
	LocalUserList::reverse_iterator count2 = this->Users->local_users.rbegin();
	while (count2 != this->Users->local_users.rend())
	{
		LocalUser *curr = *count2;
		count2++;

		if (curr->quitting)
			continue;

		if (curr->CommandFloodPenalty || curr->eh.getSendQSize())
		{
			unsigned int rate = curr->MyClass->GetCommandRate();
			if (curr->CommandFloodPenalty > rate)
				curr->CommandFloodPenalty -= rate;
			else
				curr->CommandFloodPenalty = 0;
			curr->eh.OnDataReady();
		}

		switch (curr->registered)
		{
			case REG_ALL:
				if (Time() > curr->nping)
				{
					// This user didn't answer the last ping, remove them
					if (!curr->lastping)
					{
						time_t time = this->Time() - (curr->nping - curr->MyClass->GetPingTime());
						char message[MAXBUF];
						snprintf(message, MAXBUF, "Ping timeout: %ld second%s", (long)time, time > 1 ? "s" : "");
						curr->lastping = 1;
						curr->nping = Time() + curr->MyClass->GetPingTime();
						this->Users->QuitUser(curr, message);
						continue;
					}

					curr->Write("PING :%s",this->Config->ServerName.c_str());
					curr->lastping = 0;
					curr->nping = Time()  +curr->MyClass->GetPingTime();
				}
				break;
			case REG_NICKUSER:
				if (AllModulesReportReady(curr))
				{
					/* User has sent NICK/USER, modules are okay, DNS finished. */
					curr->FullConnect();
					continue;
				}
				break;
		}

		if (curr->registered != REG_ALL && (Time() > (curr->age + curr->MyClass->GetRegTimeout())))
		{
			/*
			 * registration timeout -- didnt send USER/NICK/HOST
			 * in the time specified in their connection class.
			 */
			this->Users->QuitUser(curr, "Registration timeout");
			continue;
		}
	}
}