diff options
-rw-r--r-- | include/commands/cmd_who.h | 1 | ||||
-rw-r--r-- | src/cmd_who.cpp | 15 |
2 files changed, 15 insertions, 1 deletions
diff --git a/include/commands/cmd_who.h b/include/commands/cmd_who.h index 8b5bbe89e..299b70cdd 100644 --- a/include/commands/cmd_who.h +++ b/include/commands/cmd_who.h @@ -26,6 +26,7 @@ */ class cmd_who : public command_t { + bool CanView(chanrec* chan, userrec* user); public: cmd_who (InspIRCd* Instance) : command_t(Instance,"WHO",0,1) { syntax = "<server>|<nickname>|<channel>|<realname>|<host>|0 [ohur]"; } CmdResult Handle(const char** parameters, int pcnt, userrec *user); diff --git a/src/cmd_who.cpp b/src/cmd_who.cpp index 81145a91c..508956c44 100644 --- a/src/cmd_who.cpp +++ b/src/cmd_who.cpp @@ -82,6 +82,19 @@ extern "C" command_t* init_command(InspIRCd* Instance) return new cmd_who(Instance); } +bool cmd_who::CanView(chanrec* chan, userrec* user) +{ + /* Execute items in fastest-to-execute first order */ + if (*user->oper) + return true; + else if (!chan->IsModeSet('s') && !chan->IsModeSet('p')) + return true; + else if (chan->HasUser(user)) + return true; + + return false; +} + CmdResult cmd_who::Handle (const char** parameters, int pcnt, userrec *user) { /* @@ -145,7 +158,7 @@ CmdResult cmd_who::Handle (const char** parameters, int pcnt, userrec *user) /* who on a channel? */ ch = ServerInstance->FindChan(matchtext); - if (ch) + if ((ch) && (CanView(ch,user))) { /* who on a channel. */ CUList *cu = ch->GetUsers(); |