]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_timedbans.cpp
Fix more timedban stuff - possible infinite loop if ban expires after the channel...
[user/henk/code/inspircd.git] / src / modules / m_timedbans.cpp
index 2f4f040c06f67b910cc15155b088756aa815d4eb..610057ae3a9fb1c21d3b75b4a0c79a6fbbd75a42 100644 (file)
@@ -45,6 +45,7 @@ class cmd_tban : public command_t
        cmd_tban () : command_t("TBAN", 0, 3)
        {
                this->source = "m_timedbans.so";
+               syntax = "<channel> <duration> <banmask>";
        }
 
        void Handle (const char** parameters, int pcnt, userrec *user)
@@ -60,13 +61,9 @@ class cmd_tban : public command_t
                                        Srv->SendServ(user->fd,"NOTICE "+std::string(user->nick)+" :Invalid ban mask");
                                        return;
                                }
-                               for (timedbans::iterator i = TimedBanList.begin(); i < TimedBanList.end(); i++)
+                               for (BanList::iterator i = channel->bans.begin(); i != channel->bans.end(); i++)
                                {
-                                       irc::string listitem = i->mask.c_str();
-                                       irc::string target = parameters[2];
-                                       irc::string listchan = i->channel.c_str();
-                                       irc::string targetchan = parameters[0];
-                                       if ((listitem == target) && (listchan == targetchan))
+                                       if (!strcasecmp(i->data,parameters[2]))
                                        {
                                                Srv->SendServ(user->fd,"NOTICE "+std::string(user->nick)+" :The ban "+std::string(parameters[2])+" is already on the banlist of "+std::string(parameters[0]));
                                                return;
@@ -90,11 +87,19 @@ class cmd_tban : public command_t
                                // use CallCommandHandler to make it so that the user sets the mode
                                // themselves
                                Srv->CallCommandHandler("MODE",setban,3,user);
-                               T.channel = channelname;
-                               T.mask = mask;
-                               T.expire = expire;
-                               TimedBanList.push_back(T);
-                               Srv->SendChannelServerNotice(Srv->GetServerName(),channel,"NOTICE "+std::string(channel->name)+" :"+std::string(user->nick)+" added a timed ban on "+mask+" lasting for "+std::string(duration)+" seconds.");
+                               /* Check if the ban was actually added (e.g. banlist was NOT full) */
+                               bool was_added = false;
+                               for (BanList::iterator i = channel->bans.begin(); i != channel->bans.end(); i++)
+                                       if (!strcasecmp(i->data,mask.c_str()))
+                                               was_added = true;
+                               if (was_added)
+                               {
+                                       T.channel = channelname;
+                                       T.mask = mask;
+                                       T.expire = expire;
+                                       TimedBanList.push_back(T);
+                                       Srv->SendChannelServerNotice(Srv->GetServerName(),channel,"NOTICE "+std::string(channel->name)+" :"+std::string(user->nick)+" added a timed ban on "+mask+" lasting for "+std::string(duration)+" seconds.");
+                               }
                                return;
                        }
                        else WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, channel->name);
@@ -172,6 +177,11 @@ class ModuleTimedBans : public Module
                                                Srv->SendMode(setban,3,temp);
                                                DELETE(temp);
                                        }
+                                       else
+                                       {
+                                               /* Where the hell did our channel go?! */
+                                               TimedBanList.erase(i);
+                                       }
                                        // we used to delete the item here, but we dont need to as the servermode above does it for us,
                                        break;
                                }