X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcommands%2Fcmd_lusers.cpp;h=91a71809034902d3cf312763eabc52ea8fd671bb;hb=4c751dbbe8945e5efc230a59b0ed51c2ba10cf92;hp=389a2602d8cc9fb0fc9d6fdf110756e4daf3fd3a;hpb=19523c7500bfa5624c2c9c80075f5ddb166c833e;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/commands/cmd_lusers.cpp b/src/commands/cmd_lusers.cpp index 389a2602d..91a718090 100644 --- a/src/commands/cmd_lusers.cpp +++ b/src/commands/cmd_lusers.cpp @@ -24,16 +24,18 @@ struct LusersCounters { unsigned int max_local; unsigned int max_global; + unsigned int invisible; LusersCounters() - : max_local(ServerInstance->Users->LocalUserCount() - ServerInstance->Users->UnregisteredUserCount()) + : max_local(ServerInstance->Users->LocalUserCount()) , max_global(ServerInstance->Users->RegisteredUserCount()) + , invisible(ServerInstance->Users->ModeCount('i')) { } inline void UpdateMaxUsers() { - unsigned int current = ServerInstance->Users->LocalUserCount() - ServerInstance->Users->UnregisteredUserCount(); + unsigned int current = ServerInstance->Users->LocalUserCount(); if (current > max_local) max_local = current; @@ -70,15 +72,13 @@ class CommandLusers : public Command */ CmdResult CommandLusers::Handle (const std::vector&, User *user) { - unsigned int n_users = ServerInstance->Users->UserCount(); - unsigned int n_invis = ServerInstance->Users->ModeCount('i'); + unsigned int n_users = ServerInstance->Users->RegisteredUserCount(); ProtoServerList serverlist; ServerInstance->PI->GetServerList(serverlist); - int n_serv = 0; - int n_local_servs = 0; + unsigned int n_serv = serverlist.size(); + unsigned int n_local_servs = 0; for(ProtoServerList::iterator i = serverlist.begin(); i != serverlist.end(); ++i) { - n_serv++; if (i->parentname == ServerInstance->Config->ServerName) n_local_servs++; } @@ -89,7 +89,7 @@ CmdResult CommandLusers::Handle (const std::vector&, User *user) counters.UpdateMaxUsers(); user->WriteNumeric(251, "%s :There are %d users and %d invisible on %d servers",user->nick.c_str(), - n_users-n_invis, n_invis, n_serv); + n_users - counters.invisible, counters.invisible, n_serv); if (ServerInstance->Users->OperCount()) user->WriteNumeric(252, "%s %d :operator(s) online",user->nick.c_str(),ServerInstance->Users->OperCount()); @@ -105,27 +105,63 @@ CmdResult CommandLusers::Handle (const std::vector&, User *user) return CMD_SUCCESS; } +class InvisibleWatcher : public ModeWatcher +{ + unsigned int& invisible; +public: + InvisibleWatcher(Module* mod, unsigned int& Invisible) + : ModeWatcher(mod, 'i', MODETYPE_USER), invisible(Invisible) + { + } + + void AfterMode(User* source, User* dest, Channel* channel, const std::string& parameter, bool adding, ModeType type) + { + if (dest->registered != REG_ALL) + return; + + if (adding) + invisible++; + else + invisible--; + } +}; + class ModuleLusers : public Module { LusersCounters counters; CommandLusers cmd; + InvisibleWatcher mw; public: ModuleLusers() - : cmd(this, counters) + : cmd(this, counters), mw(this, counters.invisible) { } void init() { ServerInstance->Modules->AddService(cmd); - Implementation events[] = { I_OnPostConnect }; + Implementation events[] = { I_OnPostConnect, I_OnUserQuit }; ServerInstance->Modules->Attach(events, this, sizeof(events)/sizeof(Implementation)); + ServerInstance->Modes->AddModeWatcher(&mw); } void OnPostConnect(User* user) { counters.UpdateMaxUsers(); + if (user->IsModeSet('i')) + counters.invisible++; + } + + void OnUserQuit(User* user, const std::string& message, const std::string& oper_message) + { + if (user->IsModeSet('i')) + counters.invisible--; + } + + ~ModuleLusers() + { + ServerInstance->Modes->DelModeWatcher(&mw); } Version GetVersion()