+ /* syntax: CBAN #channel time :reason goes here */
+ /* 'time' is a human-readable timestring, like 2d3h2s. */
+
+ if(pcnt == 1)
+ {
+ /* form: CBAN #channel removes a CBAN */
+ for (cbanlist::iterator iter = cbans.begin(); iter != cbans.end(); iter++)
+ {
+ if (parameters[0] == iter->chname)
+ {
+ unsigned long remaining = (iter->set_on + iter->length) - ServerInstance->Time();
+ user->WriteServ( "386 %s %s :Removed CBAN with %lu seconds left before expiry (%s)", user->nick, iter->chname.c_str(), remaining, iter->reason.c_str());
+ cbans.erase(iter);
+ break;
+ }
+ }
+ }
+ else if (pcnt >= 2)
+ {
+ /* full form to add a CBAN */
+ if (ServerInstance->IsChannel(parameters[0]))
+ {
+ // parameters[0] = #channel
+ // parameters[1] = 1h3m2s
+ // parameters[2] = Tortoise abuser
+ long length = ServerInstance->Duration(parameters[1]);
+ std::string reason = (pcnt > 2) ? parameters[2] : "No reason supplied";
+
+ cbans.push_back(CBan(parameters[0], user->nick, ServerInstance->Time(), length, reason));
+
+ std::sort(cbans.begin(), cbans.end(), CBanComp);
+
+ if(length > 0)
+ {
+ user->WriteServ( "385 %s %s :Added %lu second channel ban (%s)", user->nick, parameters[0], length, reason.c_str());
+ ServerInstance->WriteOpers("*** %s added %lu second channel ban on %s (%s)", user->nick, length, parameters[0], reason.c_str());
+ }
+ else
+ {
+ user->WriteServ( "385 %s %s :Added permenant channel ban (%s)", user->nick, parameters[0], reason.c_str());
+ ServerInstance->WriteOpers("*** %s added permenant channel ban on %s (%s)", user->nick, parameters[0], reason.c_str());
+ }
+ }
+ else
+ {
+ user->WriteServ( "403 %s %s :Invalid channel name", user->nick, parameters[0]);
+ return CMD_FAILURE;
+ }
+ }
+
+ /* we want this routed! */
+ return CMD_SUCCESS;