]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_safelist.cpp
Yet more const ref changes
[user/henk/code/inspircd.git] / src / modules / m_safelist.cpp
index b89cbec02dcdb76fa0e62618e7108166f8666958..ca820e86e90659e6931a1e009b1df0dc5aab1c42 100644 (file)
@@ -39,23 +39,30 @@ class ListData
 /* $ModDesc: A module overriding /list, and making it safe - stop those sendq problems. */
  
 typedef std::vector<userrec *> UserList;
+UserList listusers;    /* vector of people doing a /list */
 
+/*
+ * To create a timer which recurs every second, we inherit from InspTimer.
+ * InspTimer is only one-shot however, so at the end of each Tick() we simply
+ * insert another of ourselves into the pending queue :)
+ */
 class ListTimer : public InspTimer
 {
  private:
+
        Server* Srv;
+       char buffer[MAXBUF];
+       chanrec *chan;
+
  public:
+
        ListTimer(long interval, Server* Me) : InspTimer(interval,TIME), Srv(Me)
        {
        }
 
        virtual void Tick(time_t TIME)
        {
-               log(DEBUG,"*** Timer tick!");
-
                 bool go_again = true;
-                chanrec *chan;
-                char buffer[MAXBUF];
 
                 while (go_again)
                 {
@@ -86,28 +93,39 @@ class ListTimer : public InspTimer
                                 do
                                 {
                                         log(DEBUG,"Channel %ld",ld->list_position);
+                                       if (!ld->list_position)
+                                               WriteServ(u->fd,"321 %s Channel :Users Name",u->nick);
                                         chan = Srv->GetChannelIndex(ld->list_position);
                                         /* spool details */
-                                        if (chan)
+                                       bool has_user = (chan && chan->HasUser(u));
+                                        if ((chan) && (((!(chan->binarymodes & CM_PRIVATE)) && (!(chan->binarymodes & CM_SECRET))) || (has_user)))
                                         {
                                                 /* Increment total plus linefeed */
-                                                int counter = snprintf(buffer,MAXBUF,"322 %s %s %d :[+%s] %s",u->nick,chan->name,usercount_i(chan),chanmodes(chan,has_channel(u,chan)),chan->topic);
-                                                amount_sent += counter + 4 + Srv->GetServerName().length();
-                                                log(DEBUG,"m_safelist.so: Sent %ld of safe %ld / 2",amount_sent,u->sendqmax);
-                                                WriteServ_NoFormat(u->fd,buffer);
+                                               long users = usercount_i(chan);
+                                               /* If there are only invisible users on the channel, dont show it */
+                                               if (users)
+                                               {
+                                                       int counter = snprintf(buffer,MAXBUF,"322 %s %s %ld :[+%s] %s",u->nick,chan->name,users,chanmodes(chan,has_user),chan->topic);
+                                                       amount_sent += counter + 4 + Srv->GetServerName().length();
+                                                       log(DEBUG,"m_safelist.so: Sent %ld of safe %ld / 4",amount_sent,u->sendqmax);
+                                                       WriteServ_NoFormat(u->fd,buffer);
+                                               }
                                         }
                                         else
                                         {
-                                                if (!ld->list_ended)
-                                                {
-                                                        ld->list_ended = true;
-                                                        WriteServ(u->fd,"323 %s :End of channel list.",u->nick);
-                                                }
+                                               if (!chan)
+                                               {
+                                                       if (!ld->list_ended)
+                                                       {
+                                                               ld->list_ended = true;
+                                                               WriteServ(u->fd,"323 %s :End of channel list.",u->nick);
+                                                       }
+                                               }
                                         }
 
                                         ld->list_position++;
                                 }
-                                while ((chan != NULL) && (amount_sent < (u->sendqmax / 2)));
+                                while ((chan != NULL) && (amount_sent < (u->sendqmax / 4)));
                         }
                 }
 
@@ -121,7 +139,6 @@ class ModuleSafeList : public Module
  private:
         Server *Srv;
         ListTimer* MyTimer;
-        UserList listusers;    /* vector of people doing a /list */
  public:
        ModuleSafeList(Server* Me) : Module::Module(Me)
        {
@@ -142,14 +159,14 @@ class ModuleSafeList : public Module
  
        void Implements(char* List)
        {
-               List[I_OnPreCommand] List[I_OnCleanup] = List[I_OnUserQuit] = List[I_On005Numeric] = 1;
+               List[I_OnPreCommand] List[I_OnCleanup] = List[I_OnUserQuit] = List[I_On005Numeric] = 1;
        }
 
        /*
         * OnPreCommand()
         *   Intercept the LIST command.
         */ 
-       virtual int OnPreCommand(std::string command, char **parameters, int pcnt, userrec *user, bool validated)
+       virtual int OnPreCommand(const std::string &command, char **parameters, int pcnt, userrec *user, bool validated)
        {
                /* If the command doesnt appear to be valid, we dont want to mess with it. */
                if (!validated)
@@ -200,13 +217,7 @@ class ModuleSafeList : public Module
                time_t* llt = new time_t;
                *llt = TIME;
                user->Extend("safelist_last",(char*)llt);
-               
-               WriteServ(user->fd,"321 %s Channel :Users Name",user->nick);
-               /*
-                * If we can, we try and fill up the user's sendq right now with the first batch of channels,
-                * which on a small net, may be ALL of them.
-                */
-               this->OnBackgroundTimer(TIME);
+       
                return 1;
        }
 
@@ -244,7 +255,7 @@ class ModuleSafeList : public Module
                output.append(" SAFELIST");
        }
 
-       virtual void OnUserQuit(userrec* user, std::string message)
+       virtual void OnUserQuit(userrec* user, const std::string &message)
        {
                this->OnCleanup(TYPE_USER,user);
        }