From 02830985a18950497003f3392cf8d6cc30c15c50 Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Sat, 5 Oct 2013 04:55:11 +0100 Subject: Move stuff around a bit: - Create FileSystem class: * Move ServerConfig::CleanFilename to FileSystem::GetFileName and rewrite. * Move ServerConfig::ExpandPath to FileSystem. * Move ServerConfig::FileExists to FileSystem. * Move ServerConfig::StartsWithWindowsDriveLetter to FileSystem. - Move FileReader to fileutils.cpp and fix documentation. - Move UserManager::DoBackgroundUserStuff to usermanager.cpp. --- src/usermanager.cpp | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) (limited to 'src/usermanager.cpp') diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 538feaade..191760686 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -337,3 +337,71 @@ bool UserManager::AllModulesReportReady(LocalUser* user) FIRST_MOD_RESULT(OnCheckReady, res, (user)); return (res == MOD_RES_PASSTHRU); } + +/** + * 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; + } + } +} -- cgit v1.2.3