]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Add <auditorium showops> which determines if auditorium works like ircnet +a (anonymo...
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Fri, 4 May 2007 16:23:40 +0000 (16:23 +0000)
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Fri, 4 May 2007 16:23:40 +0000 (16:23 +0000)
The old behaviour is similar to anonymous channels, only showing the current user.

git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@6875 e03df62e-2008-0410-955e-edbf42e46eb7

include/channels.h
include/modules.h
src/channels.cpp
src/modules.cpp
src/modules/m_auditorium.cpp
src/modules/m_namesx.cpp

index 305ff9974e8243c71f8f715e8db5c6d59f1b42e9..0e60e305f423019eaf628fa292cb1d2c72d6e461 100644 (file)
@@ -436,8 +436,10 @@ class chanrec : public Extensible
 
        /** Spool the NAMES list for this channel to the given user
         * @param user The user to spool the NAMES list to
+        * @param ulist The user list to send, NULL to use the
+        * channel's default names list of everyone
         */
-       void UserList(userrec *user);
+       void UserList(userrec *user, CUList* ulist = NULL);
 
        /** Get the number of invisible users on this channel
         * @return Number of invisible users
index 51eb5a19baaba9f8affcf6bb1e0e5918adca4a13..78bb103fa0d68bc7a9262f467e26becf02bfe8ce 100644 (file)
@@ -1338,7 +1338,7 @@ class Module : public Extensible
         * and if you do you must return 1. If you do not handle the names list,
         * return 0.
         */
-       virtual int OnUserList(userrec* user, chanrec* Ptr);
+       virtual int OnUserList(userrec* user, chanrec* Ptr, CUList* &userlist);
 
        /** Called whenever a line of WHOIS output is sent to a user.
         * You may change the numeric and the text of the output by changing
index 00f8dbce6f466a502676e33cdbaf78669ab13251..700487af906eb6ee66da4e46b381925af3c1c9ba 100644 (file)
@@ -802,7 +802,7 @@ char* chanrec::ChanModes(bool showkey)
 /* compile a userlist of a channel into a string, each nick seperated by
  * spaces and op, voice etc status shown as @ and +, and send it to 'user'
  */
-void chanrec::UserList(userrec *user)
+void chanrec::UserList(userrec *user, CUList *ulist)
 {
        char list[MAXBUF];
        size_t dlen, curlen;
@@ -811,7 +811,7 @@ void chanrec::UserList(userrec *user)
        if (!IS_LOCAL(user))
                return;
 
-       FOREACH_RESULT(I_OnUserList,OnUserList(user, this));
+       FOREACH_RESULT(I_OnUserList,OnUserList(user, this, ulist));
        if (MOD_RESULT == 1)
                return;
 
@@ -820,7 +820,8 @@ void chanrec::UserList(userrec *user)
        int numusers = 0;
        char* ptr = list + dlen;
 
-       CUList *ulist= this->GetUsers();
+       if (!ulist)
+               ulist= this->GetUsers();
 
        /* Improvement by Brain - this doesnt change in value, so why was it inside
         * the loop?
index f4cc5d3b99c85ecf8f252a2e7bc8e8eef1177ade..f4b2b294f2ec4b346ddeacf29bc5dc81a5eea17b 100644 (file)
@@ -188,7 +188,7 @@ void                Module::OnChannelDelete(chanrec* chan) { };
 Priority       Module::Prioritize() { return PRIORITY_DONTCARE; }
 void           Module::OnSetAway(userrec* user) { };
 void           Module::OnCancelAway(userrec* user) { };
-int            Module::OnUserList(userrec* user, chanrec* Ptr) { return 0; };
+int            Module::OnUserList(userrec* user, chanrec* Ptr, CUList* &userlist) { return 0; };
 int            Module::OnWhoisLine(userrec* user, userrec* dest, int &numeric, std::string &text) { return 0; };
 void           Module::OnBuildExemptList(MessageType message_type, chanrec* chan, userrec* sender, char status, CUList &exempt_list) { };
 void           Module::OnGarbageCollect() { };
index f6b1ff3d8d2c4ce8240cc13ab9fdd720a7faf3cc..8bab76b4958117ef1509996703cfdd7dfc582417 100644 (file)
@@ -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 &parameter)
+       {
+               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,28 @@ 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)
+                       {
+                               /* Show all the opped users */
+                               nl = *(Ptr->GetOppedUsers());
+                               nl[user] = user;
+                               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;
        }
@@ -99,6 +120,8 @@ class ModuleAuditorium : public Module
                        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, '@', except_list, "JOIN %s", channel->name);
                }
        }
 
@@ -111,6 +134,9 @@ class ModuleAuditorium : public Module
                        user->WriteFrom(user, "PART %s%s%s", channel->name,
                                        partmessage.empty() ? "" : " :",
                                        partmessage.empty() ? "" : partmessage.c_str());
+                       if (ShowOps)
+                               channel->WriteAllExcept(user, false, '@', except_list, "PART %s%s%s", channel->name, partmessage.empty() ? "" : " :",
+                                               partmessage.empty() ? "" : partmessage.c_str());
                }
        }
 
@@ -121,7 +147,10 @@ class ModuleAuditorium : public Module
                        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());
-                       user->WriteFrom(source, "KICK %s %s %s", chan->name, user->nick, reason.c_str());
+                       if (ShowOps)
+                               chan->WriteAllExcept(source, false, '@', 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());
                }
        }
 
index badbae074790c138885ecd41a9830b67830b876d..5194224b791994ea1ba28ae8a61e6d02f8b1c64a 100644 (file)
@@ -67,7 +67,7 @@ class ModuleNamesX : public Module
                return 0;
        }
 
-       virtual int OnUserList(userrec* user, chanrec* Ptr)
+       virtual int OnUserList(userrec* user, chanrec* Ptr, CUList* &ulist)
        {
                if (user->GetExt("NAMESX"))
                {
@@ -76,7 +76,10 @@ class ModuleNamesX : public Module
                        dlen = curlen = snprintf(list,MAXBUF,"353 %s = %s :", user->nick, Ptr->name);
                        int numusers = 0;
                        char* ptr = list + dlen;
-                       CUList *ulist= Ptr->GetUsers();
+
+                       if (!ulist)
+                               ulist = Ptr->GetUsers();
+
                        bool has_user = Ptr->HasUser(user);
                        for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++)
                        {