1
0

HandleCommand now returns an CommandResult enum.

This commit is contained in:
STRWarrior 2014-06-17 14:55:15 +02:00
parent 8928310fd8
commit 15ae4ce233
2 changed files with 19 additions and 23 deletions

View File

@ -257,18 +257,13 @@ bool cPluginManager::CallHookBlockToPickups(
bool cPluginManager::CallHookChat(cPlayer * a_Player, AString & a_Message) bool cPluginManager::CallHookChat(cPlayer * a_Player, AString & a_Message)
{ {
bool WasCommandForbidden = false; if (HandleCommand(a_Player, a_Message, true) != crUnknownCommand) // We use HandleCommand as opposed to ExecuteCommand to accomodate the need to the WasCommandForbidden bool
if (HandleCommand(a_Player, a_Message, true, WasCommandForbidden)) // We use HandleCommand as opposed to ExecuteCommand to accomodate the need to the WasCommandForbidden bool
{ {
return true; // Chat message was handled as command return true; // Chat message was handled as command
} }
else if (WasCommandForbidden) // Couldn't be handled as command, was it because of insufficient permissions?
{
return true; // Yes - message was sent in HandleCommand, abort
}
// Check if it was a standard command (starts with a slash) // Check if it was a standard command (starts with a slash)
// If it was, we know that it was completely unrecognised (WasCommandForbidden == false) // If it was, we know that it was completely unrecognised
if (!a_Message.empty() && (a_Message[0] == '/')) if (!a_Message.empty() && (a_Message[0] == '/'))
{ {
AStringVector Split(StringSplit(a_Message, " ")); AStringVector Split(StringSplit(a_Message, " "));
@ -1318,28 +1313,28 @@ bool cPluginManager::CallHookWorldTick(cWorld & a_World, float a_Dt, int a_LastT
bool cPluginManager::HandleCommand(cPlayer * a_Player, const AString & a_Command, bool a_ShouldCheckPermissions, bool & a_WasCommandForbidden) cPluginManager::CommandResult cPluginManager::HandleCommand(cPlayer * a_Player, const AString & a_Command, bool a_ShouldCheckPermissions)
{ {
ASSERT(a_Player != NULL); ASSERT(a_Player != NULL);
AStringVector Split(StringSplit(a_Command, " ")); AStringVector Split(StringSplit(a_Command, " "));
if (Split.empty()) if (Split.empty())
{ {
return false; return crUnknownCommand;
} }
CommandMap::iterator cmd = m_Commands.find(Split[0]); CommandMap::iterator cmd = m_Commands.find(Split[0]);
if (cmd == m_Commands.end()) if (cmd == m_Commands.end())
{ {
// Command not found // Command not found
return false; return crUnknownCommand;
} }
// Ask plugins first if a command is okay to execute the command: // Ask plugins first if a command is okay to execute the command:
if (CallHookExecuteCommand(a_Player, Split)) if (CallHookExecuteCommand(a_Player, Split))
{ {
LOGINFO("Player %s tried executing command \"%s\" that was stopped by the HOOK_EXECUTE_COMMAND hook", a_Player->GetName().c_str(), Split[0].c_str()); LOGINFO("Player %s tried executing command \"%s\" that was stopped by the HOOK_EXECUTE_COMMAND hook", a_Player->GetName().c_str(), Split[0].c_str());
return false; return crError;
} }
if ( if (
@ -1350,8 +1345,7 @@ bool cPluginManager::HandleCommand(cPlayer * a_Player, const AString & a_Command
{ {
a_Player->SendMessageFailure(Printf("Forbidden command; insufficient privileges: \"%s\"", Split[0].c_str())); a_Player->SendMessageFailure(Printf("Forbidden command; insufficient privileges: \"%s\"", Split[0].c_str()));
LOGINFO("Player %s tried to execute forbidden command: \"%s\"", a_Player->GetName().c_str(), Split[0].c_str()); LOGINFO("Player %s tried to execute forbidden command: \"%s\"", a_Player->GetName().c_str(), Split[0].c_str());
a_WasCommandForbidden = true; return crError;
return false;
} }
ASSERT(cmd->second.m_Plugin != NULL); ASSERT(cmd->second.m_Plugin != NULL);
@ -1359,10 +1353,10 @@ bool cPluginManager::HandleCommand(cPlayer * a_Player, const AString & a_Command
if (!cmd->second.m_Plugin->HandleCommand(Split, a_Player)) if (!cmd->second.m_Plugin->HandleCommand(Split, a_Player))
{ {
a_Player->SendMessageFailure(Printf("Something went wrong while executing command \"%s\"", Split[0].c_str())); a_Player->SendMessageFailure(Printf("Something went wrong while executing command \"%s\"", Split[0].c_str()));
return true; // The command handler was found and executed, so we return true. return crError;
} }
return true; return crExecuted;
} }
@ -1561,7 +1555,7 @@ AString cPluginManager::GetCommandPermission(const AString & a_Command)
bool cPluginManager::ExecuteCommand(cPlayer * a_Player, const AString & a_Command) bool cPluginManager::ExecuteCommand(cPlayer * a_Player, const AString & a_Command)
{ {
return HandleCommand(a_Player, a_Command, true); return (HandleCommand(a_Player, a_Command, true) == crExecuted);
} }
@ -1570,7 +1564,7 @@ bool cPluginManager::ExecuteCommand(cPlayer * a_Player, const AString & a_Comman
bool cPluginManager::ForceExecuteCommand(cPlayer * a_Player, const AString & a_Command) bool cPluginManager::ForceExecuteCommand(cPlayer * a_Player, const AString & a_Command)
{ {
return HandleCommand(a_Player, a_Command, false); return (HandleCommand(a_Player, a_Command, false) == crExecuted);
} }

View File

@ -58,6 +58,13 @@ public: // tolua_export
// Called each tick // Called each tick
virtual void Tick(float a_Dt); virtual void Tick(float a_Dt);
enum CommandResult
{
crExecuted,
crUnknownCommand,
crError,
} ;
// tolua_begin // tolua_begin
enum PluginHook enum PluginHook
{ {
@ -322,12 +329,7 @@ private:
bool AddPlugin(cPlugin * a_Plugin); bool AddPlugin(cPlugin * a_Plugin);
/** Tries to match a_Command to the internal table of commands, if a match is found, the corresponding plugin is called. Returns true if the command is executed. */ /** Tries to match a_Command to the internal table of commands, if a match is found, the corresponding plugin is called. Returns true if the command is executed. */
bool HandleCommand(cPlayer * a_Player, const AString & a_Command, bool a_ShouldCheckPermissions, bool & a_WasCommandForbidden); cPluginManager::CommandResult HandleCommand(cPlayer * a_Player, const AString & a_Command, bool a_ShouldCheckPermissions);
bool HandleCommand(cPlayer * a_Player, const AString & a_Command, bool a_ShouldCheckPermissions)
{
bool DummyBoolean = false;
return HandleCommand(a_Player, a_Command, a_ShouldCheckPermissions, DummyBoolean);
}
} ; // tolua_export } ; // tolua_export