+
+ public:
+ ModuleWhoWas() : cmd(this)
+ {
+ }
+
+ void init()
+ {
+ ServerInstance->Modules->AddService(cmd);
+ Implementation eventlist[] = { I_OnGarbageCollect, I_OnUserQuit, I_OnStats, I_OnRehash };
+ ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation));
+ OnRehash(NULL);
+ }
+
+ void OnGarbageCollect()
+ {
+ /* Removes all entries older than WhoWasMaxKeep */
+ cmd.MaintainWhoWas(ServerInstance->Time());
+ }
+
+ void OnUserQuit(User* user, const std::string& message, const std::string& oper_message)
+ {
+ cmd.AddToWhoWas(user);
+ }
+
+ ModResult OnStats(char symbol, User* user, string_list &results)
+ {
+ if (symbol == 'z')
+ results.push_back(ServerInstance->Config->ServerName+" 249 "+user->nick+" :"+cmd.GetStats());
+
+ return MOD_RES_PASSTHRU;
+ }
+
+ void OnRehash(User* user)
+ {
+ ConfigTag* tag = ServerInstance->Config->ConfValue("whowas");
+ int NewGroupSize = tag->getInt("groupsize");
+ int NewMaxGroups = tag->getInt("maxgroups");
+ int NewMaxKeep = InspIRCd::Duration(tag->getString("maxkeep"));
+
+ RangeCheck(NewGroupSize, 0, 10000, 10, "<whowas:groupsize>");
+ RangeCheck(NewMaxGroups, 0, 1000000, 10240, "<whowas:maxgroups>");
+ RangeCheck(NewMaxKeep, 3600, INT_MAX, 3600, "<whowas:maxkeep>");
+
+ if ((NewGroupSize == cmd.WhoWasGroupSize) && (NewMaxGroups == cmd.WhoWasMaxGroups) && (NewMaxKeep == cmd.WhoWasMaxKeep))
+ return;
+
+ cmd.WhoWasGroupSize = NewGroupSize;
+ cmd.WhoWasMaxGroups = NewMaxGroups;
+ cmd.WhoWasMaxKeep = NewMaxKeep;
+ cmd.PruneWhoWas(ServerInstance->Time());
+ }
+
+ Version GetVersion()
+ {
+ return Version("WHOWAS", VF_VENDOR);
+ }
+};
+
+MODULE_INIT(ModuleWhoWas)