+ overrides.clear();
+ for (int j =0; j < Conf->Enumerate("type"); j++)
+ {
+ std::string typen = Conf->ReadValue("type","name",j);
+ std::string tokenlist = Conf->ReadValue("type","override",j);
+ overrides[typen] = tokenlist;
+ }
+
+ DELETE(Conf);
+ }
+
+ void Implements(char* List)
+ {
+ List[I_OnRehash] = List[I_OnAccessCheck] = List[I_On005Numeric] = List[I_OnUserPreJoin] = List[I_OnUserPreKick] = 1;
+ }
+
+ virtual void On005Numeric(std::string &output)
+ {
+ output.append(" OVERRIDE");
+ }
+
+ virtual bool CanOverride(userrec* source, char* token)
+ {
+ // checks to see if the oper's type has <type:override>
+ override_t::iterator j = overrides.find(source->oper);
+
+ if (j != overrides.end())
+ {
+ // its defined, return its value as a boolean for if the token is set
+ return (j->second.find(token, 0) != std::string::npos);
+ }
+
+ // its not defined at all, count as false
+ return false;
+ }
+
+ virtual int OnUserPreKick(userrec* source, userrec* user, chanrec* chan, const std::string &reason)
+ {
+ if ((*source->oper) && (CanOverride(source,"KICK")))
+ {
+ if (((Srv->ChanMode(source,chan) == "%") && (Srv->ChanMode(user,chan) == "@")) || (Srv->ChanMode(source,chan) == ""))
+ {
+ Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Kicked "+std::string(user->nick)+" on "+std::string(chan->name)+" ("+reason+")");
+ }
+ /* Returning -1 explicitly allows the kick */
+ return -1;
+ }
+ return 0;