X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_auditorium.cpp;h=166d1bcc44c3fdea69a984d2721b51319425c3c4;hb=4c25d5ecbb2f782cc4eccb9833e68f9bcb02320c;hp=c60bed9b9e6151f14b4a10732842f2651cbfcc01;hpb=bb6a9af0cf3ce7c66bc131f4ba37d6c0f7008841;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_auditorium.cpp b/src/modules/m_auditorium.cpp index c60bed9b9..166d1bcc4 100644 --- a/src/modules/m_auditorium.cpp +++ b/src/modules/m_auditorium.cpp @@ -49,6 +49,9 @@ class ModuleAuditorium : public Module { private: AuditoriumMode* aum; + bool ShowOps; + CUList nl; + CUList except_list; public: ModuleAuditorium(InspIRCd* Me) : Module::Module(Me) @@ -56,6 +59,7 @@ class ModuleAuditorium : public Module aum = new AuditoriumMode(ServerInstance); if (!ServerInstance->AddMode(aum, 'u')) throw ModuleException("Could not add new modes!"); + OnRehash(NULL, ""); } virtual ~ModuleAuditorium() @@ -64,6 +68,12 @@ class ModuleAuditorium : public Module DELETE(aum); } + virtual void OnRehash(userrec* user, const std::string ¶meter) + { + ConfigReader conf(ServerInstance); + ShowOps = conf.ReadFlag("auditorium", "showops", 0); + } + Priority Prioritize() { /* To ensure that we get priority over namesx for names list generation on +u channels */ @@ -77,17 +87,37 @@ class ModuleAuditorium : public Module void Implements(char* List) { - List[I_OnUserJoin] = List[I_OnUserPart] = List[I_OnUserKick] = List[I_OnUserQuit] = List[I_OnUserList] = 1; + List[I_OnUserJoin] = List[I_OnUserPart] = List[I_OnUserKick] = List[I_OnUserQuit] = List[I_OnUserList] = List[I_OnRehash] = 1; } - virtual int OnUserList(userrec* user, chanrec* Ptr) + virtual int OnUserList(userrec* user, chanrec* Ptr, CUList* &nameslist) { if (Ptr->IsModeSet('u')) { - /* HELLOOO, IS ANYBODY THERE? -- nope, just us. */ - user->WriteServ("353 %s = %s :%s", user->nick, Ptr->name, user->nick); - user->WriteServ("366 %s %s :End of /NAMES list.", user->nick, Ptr->name); - return 1; + if (ShowOps) + { + /* Leave the names list alone, theyre an op + * doing /names on the channel after joining it + */ + if (Ptr->GetStatus(user) >= STATUS_OP) + { + nameslist = Ptr->GetUsers(); + return 0; + } + + /* Show all the opped users */ + nl = *(Ptr->GetOppedUsers()); + nl[user] = user->nick; + nameslist = &nl; + return 0; + } + else + { + /* HELLOOO, IS ANYBODY THERE? -- nope, just us. */ + user->WriteServ("353 %s = %s :%s", user->nick, Ptr->name, user->nick); + user->WriteServ("366 %s %s :End of /NAMES list.", user->nick, Ptr->name); + return 1; + } } return 0; } @@ -95,19 +125,44 @@ class ModuleAuditorium : public Module virtual void OnUserJoin(userrec* user, chanrec* channel, bool &silent) { if (channel->IsModeSet('u')) + { silent = true; + /* Because we silenced the event, make sure it reaches the user whos joining (but only them of course) */ + user->WriteFrom(user, "JOIN %s", channel->name); + if (ShowOps) + channel->WriteAllExcept(user, false, channel->GetStatus(user) >= STATUS_OP ? 0 : '@', except_list, "JOIN %s", channel->name); + } } void OnUserPart(userrec* user, chanrec* channel, const std::string &partmessage, bool &silent) { if (channel->IsModeSet('u')) + { silent = true; + /* Because we silenced the event, make sure it reaches the user whos leaving (but only them of course) */ + user->WriteFrom(user, "PART %s%s%s", channel->name, + partmessage.empty() ? "" : " :", + partmessage.empty() ? "" : partmessage.c_str()); + if (ShowOps) + { + channel->WriteAllExcept(user, false, channel->GetStatus(user) >= STATUS_OP ? 0 : '@', except_list, "PART %s%s%s", channel->name, partmessage.empty() ? "" : " :", + partmessage.empty() ? "" : partmessage.c_str()); + } + } } void OnUserKick(userrec* source, userrec* user, chanrec* chan, const std::string &reason, bool &silent) { if (chan->IsModeSet('u')) + { silent = true; + /* Send silenced event only to the user being kicked and the user doing the kick */ + source->WriteFrom(source, "KICK %s %s %s", chan->name, user->nick, reason.c_str()); + if (ShowOps) + chan->WriteAllExcept(source, false, chan->GetStatus(source) >= STATUS_OP ? 0 : '@', except_list, "KICK %s %s %s", chan->name, user->nick, reason.c_str()); + else + user->WriteFrom(source, "KICK %s %s %s", chan->name, user->nick, reason.c_str()); + } } void OnUserQuit(userrec* user, const std::string &reason, const std::string &oper_message)