+ /*
+ * We call OnPreCommand here seperately if the command exists, so the magic above can
+ * truncate to max_params if necessary. -- w00t
+ */
+ ModResult MOD_RESULT;
+ FIRST_MOD_RESULT(OnPreCommand, MOD_RESULT, (command, command_p, user, false, cmd));
+ if (MOD_RESULT == MOD_RES_DENY)
+ return true;
+
+ /* activity resets the ping pending timer */
+ user->nping = ServerInstance->Time() + user->MyClass->GetPingTime();
+
+ if (cm->second->flags_needed)
+ {
+ if (!user->IsModeSet(cm->second->flags_needed))
+ {
+ user->CommandFloodPenalty += failpenalty;
+ user->WriteNumeric(ERR_NOPRIVILEGES, "%s :Permission Denied - You do not have the required operator privileges",user->nick.c_str());
+ return do_more;
+ }
+ if (!user->HasPermission(command))
+ {
+ user->CommandFloodPenalty += failpenalty;
+ user->WriteNumeric(ERR_NOPRIVILEGES, "%s :Permission Denied - Oper type %s does not have access to command %s",
+ user->nick.c_str(), user->oper->NameStr(), command.c_str());
+ return do_more;
+ }
+ }
+ if ((user->registered == REG_ALL) && (!IS_OPER(user)) && (cm->second->IsDisabled()))
+ {
+ /* command is disabled! */
+ user->CommandFloodPenalty += failpenalty;
+ if (ServerInstance->Config->DisabledDontExist)
+ {
+ user->WriteNumeric(ERR_UNKNOWNCOMMAND, "%s %s :Unknown command",user->nick.c_str(),command.c_str());
+ }
+ else
+ {
+ user->WriteNumeric(ERR_UNKNOWNCOMMAND, "%s %s :This command has been disabled.",
+ user->nick.c_str(), command.c_str());
+ }
+
+ ServerInstance->SNO->WriteToSnoMask('a', "%s denied for %s (%s@%s)",
+ command.c_str(), user->nick.c_str(), user->ident.c_str(), user->host.c_str());
+ return do_more;
+ }
+
+ if ((!command_p.empty()) && (command_p.back().empty()) && (!cm->second->allow_empty_last_param))
+ command_p.pop_back();
+
+ if (command_p.size() < cm->second->min_params)
+ {
+ user->CommandFloodPenalty += failpenalty;
+ user->WriteNumeric(ERR_NEEDMOREPARAMS, "%s %s :Not enough parameters.", user->nick.c_str(), command.c_str());
+ if ((ServerInstance->Config->SyntaxHints) && (user->registered == REG_ALL) && (cm->second->syntax.length()))
+ user->WriteNumeric(RPL_SYNTAX, "%s :SYNTAX %s %s", user->nick.c_str(), cm->second->name.c_str(), cm->second->syntax.c_str());
+ return do_more;
+ }
+ if ((user->registered != REG_ALL) && (!cm->second->WorksBeforeReg()))
+ {
+ user->CommandFloodPenalty += failpenalty;
+ user->WriteNumeric(ERR_NOTREGISTERED, "%s %s :You have not registered", user->nick.c_str(), command.c_str());
+ return do_more;
+ }
+ else
+ {
+ /* passed all checks.. first, do the (ugly) stats counters. */
+ cm->second->use_count++;
+ cm->second->total_bytes += cmd.length();
+
+ /* module calls too */
+ FIRST_MOD_RESULT(OnPreCommand, MOD_RESULT, (command, command_p, user, true, cmd));
+ if (MOD_RESULT == MOD_RES_DENY)
+ return do_more;
+
+ /*
+ * WARNING: be careful, the user may be deleted soon
+ */
+ CmdResult result = cm->second->Handle(command_p, user);
+
+ FOREACH_MOD(I_OnPostCommand,OnPostCommand(command, command_p, user, result,cmd));
+ return do_more;