X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_timedbans.cpp;h=610057ae3a9fb1c21d3b75b4a0c79a6fbbd75a42;hb=2a81a451185b41ca563e6a43d24a054050ec82ee;hp=470d0edeeca58f9e7d8c4d7740a9bdd6bbba5ab4;hpb=9ec715957b95578172c136e6706e58e873956689;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_timedbans.cpp b/src/modules/m_timedbans.cpp index 470d0edee..610057ae3 100644 --- a/src/modules/m_timedbans.cpp +++ b/src/modules/m_timedbans.cpp @@ -28,7 +28,7 @@ using namespace std; static Server *Srv; -class TimedBan +class TimedBan : public classbase { public: std::string channel; @@ -45,9 +45,10 @@ class cmd_tban : public command_t cmd_tban () : command_t("TBAN", 0, 3) { this->source = "m_timedbans.so"; + syntax = " "; } - void Handle (char **parameters, int pcnt, userrec *user) + void Handle (const char** parameters, int pcnt, userrec *user) { chanrec* channel = Srv->FindChannel(parameters[0]); if (channel) @@ -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; @@ -83,18 +80,26 @@ class cmd_tban : public command_t char duration[MAXBUF]; snprintf(duration,MAXBUF,"%lu",Srv->CalcDuration(parameters[1])); std::string mask = parameters[2]; - char *setban[32]; + const char *setban[32]; setban[0] = parameters[0]; setban[1] = "+b"; setban[2] = parameters[2]; // 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); @@ -127,18 +132,18 @@ class ModuleTimedBans : public Module List[I_OnDelBan] = List[I_OnBackgroundTimer] = 1; } - virtual int OnDelBan(userrec* source, chanrec* chan, std::string banmask) + virtual int OnDelBan(userrec* source, chanrec* chan, const std::string &banmask) { - for (timedbans::iterator i = TimedBanList.begin(); i < TimedBanList.end(); i++) - { - irc::string listitem = banmask.c_str(); - irc::string target = i->mask.c_str(); - if (listitem == target) - { - TimedBanList.erase(i); - break; - } - } + for (timedbans::iterator i = TimedBanList.begin(); i < TimedBanList.end(); i++) + { + irc::string listitem = banmask.c_str(); + irc::string target = i->mask.c_str(); + if (listitem == target) + { + TimedBanList.erase(i); + break; + } + } return 0; } @@ -157,10 +162,10 @@ class ModuleTimedBans : public Module if (cr) { Srv->SendChannelServerNotice(Srv->GetServerName(),cr,"NOTICE "+std::string(cr->name)+" :Timed ban on "+i->mask+" expired."); - char *setban[3]; - setban[0] = (char*)i->channel.c_str(); + const char *setban[3]; + setban[0] = i->channel.c_str(); setban[1] = "-b"; - setban[2] = (char*)i->mask.c_str(); + setban[2] = i->mask.c_str(); // kludge alert! // ::SendMode expects a userrec* to send the numeric replies // back to, so we create it a fake user that isnt in the user @@ -170,7 +175,12 @@ class ModuleTimedBans : public Module temp->fd = FD_MAGIC_NUMBER; temp->server = ""; Srv->SendMode(setban,3,temp); - delete 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;