From 1b3dabf0ba0088bf7a8493fe89e478731ad0d307 Mon Sep 17 00:00:00 2001 From: danieldg Date: Wed, 2 Sep 2009 00:51:56 +0000 Subject: Add OnSendWhoLine hook, and use it in the oper hiding modules git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11650 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/commands/cmd_who.cpp | 6 +++++- src/modules.cpp | 1 + src/modules/m_hideoper.cpp | 11 +++++++++++ src/modules/m_invisible.cpp | 26 +++++++++++++++++--------- 4 files changed, 34 insertions(+), 10 deletions(-) (limited to 'src') 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& 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) -- cgit v1.2.3