diff options
-rw-r--r-- | include/modules.h | 10 | ||||
-rw-r--r-- | src/commands/cmd_who.cpp | 6 | ||||
-rw-r--r-- | src/modules.cpp | 1 | ||||
-rw-r--r-- | src/modules/m_hideoper.cpp | 11 | ||||
-rw-r--r-- | src/modules/m_invisible.cpp | 26 |
5 files changed, 43 insertions, 11 deletions
diff --git a/include/modules.h b/include/modules.h index cb8ffdada..ebfa52b36 100644 --- a/include/modules.h +++ b/include/modules.h @@ -428,7 +428,7 @@ enum Implementation I_OnPostOper, I_OnSyncNetwork, I_OnSetAway, I_OnUserList, I_OnPostCommand, I_OnPostJoin, I_OnWhoisLine, I_OnBuildExemptList, I_OnRawSocketConnect, I_OnGarbageCollect, I_OnBufferFlushed, I_OnText, I_OnPassCompare, I_OnRunTestSuite, I_OnNamesListItem, I_OnNumeric, I_OnHookIO, - I_OnHostCycle, I_OnPreRehash, I_OnModuleRehash, + I_OnHostCycle, I_OnPreRehash, I_OnModuleRehash, I_OnSendWhoLine, I_END }; @@ -1413,6 +1413,14 @@ class CoreExport Module : public Extensible * even if it is enabled. */ virtual ModResult OnHostCycle(User* user); + + /** Called whenever a result from /WHO is about to be returned + * @param source The user running the /WHO query + * @param user The user that this line of the query is about + * @param channel The channel being queried (or NULL if not a channel query) + * @param line The raw line to send; modifiable, if empty no line will be returned. + */ + virtual void OnSendWhoLine(User* source, User* user, Channel* channel, std::string& line); }; diff --git a/src/commands/cmd_who.cpp b/src/commands/cmd_who.cpp index 489c668c0..a85e00fa3 100644 --- a/src/commands/cmd_who.cpp +++ b/src/commands/cmd_who.cpp @@ -171,7 +171,11 @@ void CommandWho::SendWhoLine(User* user, const std::string &initial, Channel* ch } wholine = wholine + (ch ? ch->GetPrefixChar(u) : (chlast ? chlast->GetPrefixChar(u) : "")) + " :0 " + u->fullname; - whoresults.push_back(wholine); + + FOREACH_MOD(I_OnSendWhoLine, OnSendWhoLine(user, u, ch, wholine)); + + if (!wholine.empty()) + whoresults.push_back(wholine); } CmdResult CommandWho::Handle (const std::vector<std::string>& parameters, User *user) diff --git a/src/modules.cpp b/src/modules.cpp index c5c8aa2ca..ab2975d7c 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -198,6 +198,7 @@ void Module::OnNamesListItem(User*, User*, Channel*, std::string&, std::string& ModResult Module::OnNumeric(User*, unsigned int, const std::string&) { return MOD_RES_PASSTHRU; } void Module::OnHookIO(EventHandler*, ListenSocketBase*) { } ModResult Module::OnHostCycle(User*) { return MOD_RES_PASSTHRU; } +void Module::OnSendWhoLine(User*, User*, Channel*, std::string&) { } ModuleManager::ModuleManager(InspIRCd* Ins) : ModCount(0), Instance(Ins) { diff --git a/src/modules/m_hideoper.cpp b/src/modules/m_hideoper.cpp index b19ecb97c..757f2d9af 100644 --- a/src/modules/m_hideoper.cpp +++ b/src/modules/m_hideoper.cpp @@ -86,6 +86,17 @@ class ModuleHideOper : public Module return MOD_RES_PASSTHRU; } + + void OnSendWhoLine(User* source, User* user, Channel* channel, std::string& line) + { + if (user->IsModeSet('H') && !source->HasPrivPermission("users/auspex")) + { + // hide the "*" that marks the user as an oper from the /WHO line + std::string::size_type pos = line.find("* "); + if (pos != std::string::npos) + line.erase(pos); + } + } }; diff --git a/src/modules/m_invisible.cpp b/src/modules/m_invisible.cpp index 1d8c8a385..678b9cc49 100644 --- a/src/modules/m_invisible.cpp +++ b/src/modules/m_invisible.cpp @@ -117,8 +117,11 @@ class ModuleInvisible : public Module /* Yeah i know people can take this out. I'm not about to obfuscate code just to be a pain in the ass. */ ServerInstance->Users->ServerNoticeAll("*** m_invisible.so has just been loaded on this network. For more information, please visit http://inspircd.org/wiki/Modules/invisible"); - Implementation eventlist[] = { I_OnUserPreMessage, I_OnUserPreNotice, I_OnUserJoin, I_OnUserPart, I_OnUserQuit, I_OnRehash, I_OnHostCycle }; - ServerInstance->Modules->Attach(eventlist, this, 7); + Implementation eventlist[] = { + I_OnUserPreMessage, I_OnUserPreNotice, I_OnUserJoin, I_OnUserPart, I_OnUserQuit, + I_OnRehash, I_OnHostCycle, I_OnSendWhoLine + }; + ServerInstance->Modules->Attach(eventlist, this, 8); }; virtual ~ModuleInvisible() @@ -128,17 +131,16 @@ class ModuleInvisible : public Module delete conf; }; - virtual Version GetVersion(); - virtual void OnUserJoin(User* user, Channel* channel, bool sync, bool &silent, bool created); - virtual void OnRehash(User* user); + Version GetVersion(); + void OnUserJoin(User* user, Channel* channel, bool sync, bool &silent, bool created); + void OnRehash(User* user); void OnUserPart(User* user, Channel* channel, std::string &partmessage, bool &silent); void OnUserQuit(User* user, const std::string &reason, const std::string &oper_message); ModResult OnHostCycle(User* user); - /* No privmsg response when hiding - submitted by Eric at neowin */ - virtual ModResult OnUserPreNotice(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list); - virtual ModResult OnUserPreMessage(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list); - /* Fix by Eric @ neowin.net, thanks :) -- Brain */ + ModResult OnUserPreNotice(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list); + ModResult OnUserPreMessage(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list); void WriteCommonFrom(User *user, Channel* channel, const char* text, ...) CUSTOM_PRINTF(4, 5); + void OnSendWhoLine(User* source, User* user, Channel* channel, std::string& line); }; Version ModuleInvisible::GetVersion() @@ -246,4 +248,10 @@ void ModuleInvisible::WriteCommonFrom(User *user, Channel* channel, const char* } } +void ModuleInvisible::OnSendWhoLine(User* source, User* user, Channel* channel, std::string& line) +{ + if (user->IsModeSet('Q') && !IS_OPER(source)) + line.clear(); +} + MODULE_INIT(ModuleInvisible) |