X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_timedbans.cpp;h=3783590ccd135235f0a57ef6252854e5dd2d7306;hb=124bc04e841f9ca527b99c37563f19a85dec63fc;hp=400ec098ec87006a74795a6ab9fd350307bfaeb3;hpb=8f7d880d0ba747ae31e70476dbf7606df9da5a91;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_timedbans.cpp b/src/modules/m_timedbans.cpp index 400ec098e..3783590cc 100644 --- a/src/modules/m_timedbans.cpp +++ b/src/modules/m_timedbans.cpp @@ -23,14 +23,13 @@ using namespace std; #include "users.h" #include "channels.h" #include "modules.h" - #include "hashcomp.h" #include "configreader.h" #include "inspircd.h" - - +/** Holds a timed ban + */ class TimedBan : public classbase { public: @@ -42,6 +41,8 @@ class TimedBan : public classbase typedef std::vector timedbans; timedbans TimedBanList; +/** Handle /TBAN + */ class cmd_tban : public command_t { public: @@ -51,7 +52,7 @@ class cmd_tban : public command_t syntax = " "; } - void Handle (const char** parameters, int pcnt, userrec *user) + CmdResult Handle (const char** parameters, int pcnt, userrec *user) { chanrec* channel = ServerInstance->FindChan(parameters[0]); if (channel) @@ -62,14 +63,14 @@ class cmd_tban : public command_t if (!ServerInstance->IsValidMask(parameters[2])) { user->WriteServ("NOTICE "+std::string(user->nick)+" :Invalid ban mask"); - return; + return CMD_FAILURE; } for (BanList::iterator i = channel->bans.begin(); i != channel->bans.end(); i++) { if (!strcasecmp(i->data,parameters[2])) { user->WriteServ("NOTICE "+std::string(user->nick)+" :The ban "+std::string(parameters[2])+" is already on the banlist of "+std::string(parameters[0])); - return; + return CMD_FAILURE; } } TimedBan T; @@ -78,7 +79,7 @@ class cmd_tban : public command_t if (ServerInstance->Duration(parameters[1]) < 1) { user->WriteServ("NOTICE "+std::string(user->nick)+" :Invalid ban time"); - return; + return CMD_FAILURE; } char duration[MAXBUF]; snprintf(duration,MAXBUF,"%lu",ServerInstance->Duration(parameters[1])); @@ -102,13 +103,15 @@ class cmd_tban : public command_t T.expire = expire; TimedBanList.push_back(T); channel->WriteChannelWithServ(ServerInstance->Config->ServerName, "NOTICE %s :%s added a timed ban on %s lasting for %s seconds.", channel->name, user->nick, mask.c_str(), duration); + return CMD_SUCCESS; } - return; + return CMD_FAILURE; } else user->WriteServ("482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, channel->name); - return; + return CMD_FAILURE; } user->WriteServ("401 %s %s :No such channel",user->nick, parameters[0]); + return CMD_FAILURE; } }; @@ -137,11 +140,13 @@ class ModuleTimedBans : public Module virtual int OnDelBan(userrec* source, chanrec* chan, const std::string &banmask) { + irc::string listitem = banmask.c_str(); + irc::string thischan = chan->name; 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) + irc::string tchan = i->channel.c_str(); + if ((listitem == target) && (tchan == thischan)) { TimedBanList.erase(i); break; @@ -166,28 +171,25 @@ class ModuleTimedBans : public Module { cr->WriteChannelWithServ(ServerInstance->Config->ServerName, "NOTICE %s :Timed ban on %s expired.", cr->name, i->mask.c_str()); const char *setban[3]; - setban[0] = strdup(i->channel.c_str()); + setban[0] = i->channel.c_str(); setban[1] = "-b"; - setban[2] = strdup(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 // hash and set its descriptor to FD_MAGIC_NUMBER so the data // falls into the abyss :p userrec* temp = new userrec(ServerInstance); - temp->fd = FD_MAGIC_NUMBER; - ServerInstance->SendMode(setban,3,temp); + temp->SetFd(FD_MAGIC_NUMBER); /* FIX: Send mode remotely*/ std::deque n; n.push_back(setban[0]); n.push_back("-b"); n.push_back(setban[2]); + ServerInstance->SendMode(setban,3,temp); Event rmode((char *)&n, NULL, "send_mode"); rmode.Send(ServerInstance); DELETE(temp); - // i hate free. - free((char*)setban[0]); - free((char*)setban[2]); } else { @@ -203,7 +205,7 @@ class ModuleTimedBans : public Module virtual Version GetVersion() { - return Version(1,0,0,0,VF_VENDOR); + return Version(1,1,0,0,VF_VENDOR,API_VERSION); } };