[10324] Implement new basic functions for chat command parsing.

* Now can be used as quotes any strings with symbols ' " [] around.
  For example can be used: .additem [Tourch] or .additem "Tourch".
  And in similar cases wher before [] or "" only canbe used in commands.

* New functions support propertly extraction shift-links as optional first args
* Also added more safe functions for extraction int32/uint32/float values.

For more wide use new functuons specialized extraction functions also need chnaged to same way work.
This is goal for future work at this part code.
This commit is contained in:
VladimirMangos 2010-08-06 06:14:18 +04:00
parent 373f607a44
commit edace1948e
7 changed files with 365 additions and 126 deletions

View file

@ -918,14 +918,11 @@ bool ChatHandler::HandleLoadScriptsCommand(char* args)
bool ChatHandler::HandleAccountSetGmLevelCommand(char* args)
{
char* arg1;
char* arg2;
extractOptFirstArg(args, &arg1, &arg2);
char* accountStr = ExtractOptArg(&args);
std::string targetAccountName;
Player* targetPlayer = NULL;
uint32 targetAccountId = extractAccountId(arg1, &targetAccountName, &targetPlayer);
uint32 targetAccountId = extractAccountId(accountStr, &targetAccountName, &targetPlayer);
if (!targetAccountId)
return false;
@ -933,7 +930,10 @@ bool ChatHandler::HandleAccountSetGmLevelCommand(char* args)
if (GetAccountId() == targetAccountId)
return false;
int32 gm = (int32)atoi(arg2);
int32 gm;
if (!ExtractInt32(&args, gm))
return false;
if ( gm < SEC_PLAYER || gm > SEC_ADMINISTRATOR )
{
SendSysMessage(LANG_BAD_VALUE);
@ -3279,11 +3279,11 @@ bool ChatHandler::HandleGuildCreateCommand(char* args)
if(!extractPlayerTarget(*args!='"' ? args : NULL, &target))
return false;
char* tailStr = *args!='"' ? strtok(NULL, "") : args;
if(!tailStr)
char* tail = *args!='"' ? strtok(NULL, "") : args;
if(!tail)
return false;
char* guildStr = extractQuotedArg(tailStr);
char* guildStr = ExtractQuotedArg(&tail);
if(!guildStr)
return false;
@ -3318,11 +3318,11 @@ bool ChatHandler::HandleGuildInviteCommand(char *args)
if(!extractPlayerTarget(*args!='"' ? args : NULL, NULL, &target_guid))
return false;
char* tailStr = *args!='"' ? strtok(NULL, "") : args;
if(!tailStr)
char* tail = *args!='"' ? strtok(NULL, "") : args;
if(!tail)
return false;
char* guildStr = extractQuotedArg(tailStr);
char* guildStr = ExtractQuotedArg(&tail);
if(!guildStr)
return false;
@ -3359,11 +3359,7 @@ bool ChatHandler::HandleGuildUninviteCommand(char *args)
bool ChatHandler::HandleGuildRankCommand(char *args)
{
char* nameStr;
char* rankStr;
extractOptFirstArg(args, &nameStr, &rankStr);
if(!rankStr)
return false;
char* nameStr = ExtractOptArg(&args);
Player* target;
uint64 target_guid;
@ -3379,7 +3375,10 @@ bool ChatHandler::HandleGuildRankCommand(char *args)
if (!targetGuild)
return false;
uint32 newrank = uint32 (atoi (rankStr));
uint32 newrank;
if (!ExtractUInt32(&args, newrank))
return false;
if (newrank > targetGuild->GetLowestRank ())
return false;
@ -3392,7 +3391,7 @@ bool ChatHandler::HandleGuildDeleteCommand(char* args)
if (!*args)
return false;
char* guildStr = extractQuotedArg(args);
char* guildStr = ExtractQuotedArg(&args);
if(!guildStr)
return false;
@ -4033,17 +4032,23 @@ void ChatHandler::HandleCharacterLevel(Player* player, uint64 player_guid, uint3
bool ChatHandler::HandleCharacterLevelCommand(char* args)
{
char* nameStr;
char* levelStr;
extractOptFirstArg(args, &nameStr, &levelStr);
if (!levelStr)
return false;
char* nameStr = ExtractOptArg(&args);
int32 newlevel;
bool nolevel = false;
// exception opt second arg: .character level $name
if (isalpha(levelStr[0]))
if (!ExtractInt32(&args, newlevel))
{
nameStr = levelStr;
levelStr = NULL; // current level will used
if (!nameStr)
{
nameStr = ExtractArg(&args);
if (!nameStr)
return false;
nolevel = true;
}
else
return false;
}
Player* target;
@ -4053,7 +4058,8 @@ bool ChatHandler::HandleCharacterLevelCommand(char* args)
return false;
int32 oldlevel = target ? target->getLevel() : Player::GetLevelFromDB(target_guid);
int32 newlevel = levelStr ? atoi(levelStr) : oldlevel;
if (nolevel)
newlevel = oldlevel;
if (newlevel < 1)
return false; // invalid level
@ -4061,7 +4067,7 @@ bool ChatHandler::HandleCharacterLevelCommand(char* args)
if (newlevel > STRONG_MAX_LEVEL) // hardcoded maximum level
newlevel = STRONG_MAX_LEVEL;
HandleCharacterLevel(target,target_guid,oldlevel,newlevel);
HandleCharacterLevel(target, target_guid, oldlevel, newlevel);
if (!m_session || m_session->GetPlayer() != target) // including player==NULL
{
@ -4074,15 +4080,21 @@ bool ChatHandler::HandleCharacterLevelCommand(char* args)
bool ChatHandler::HandleLevelUpCommand(char* args)
{
char* nameStr;
char* levelStr;
extractOptFirstArg(args, &nameStr, &levelStr);
int32 addlevel = 1;
char* nameStr = NULL;
// exception opt second arg: .character level $name
if (levelStr && isalpha(levelStr[0]))
if (*args)
{
nameStr = levelStr;
levelStr = NULL; // current level will used
nameStr = ExtractOptArg(&args);
// exception opt second arg: .levelup $name
if (!ExtractInt32(&args, addlevel))
{
if (!nameStr)
nameStr = ExtractArg(&args);
else
return false;
}
}
Player* target;
@ -4092,7 +4104,6 @@ bool ChatHandler::HandleLevelUpCommand(char* args)
return false;
int32 oldlevel = target ? target->getLevel() : Player::GetLevelFromDB(target_guid);
int32 addlevel = levelStr ? atoi(levelStr) : 1;
int32 newlevel = oldlevel + addlevel;
if (newlevel < 1)
@ -6295,13 +6306,10 @@ bool ChatHandler::HandleAccountCharactersCommand(char* args)
bool ChatHandler::HandleAccountSetAddonCommand(char* args)
{
///- Get the command line arguments
char* arg1;
char* arg2;
extractOptFirstArg(args, &arg1, &arg2);
char* accountStr = ExtractOptArg(&args);
std::string account_name;
uint32 account_id = extractAccountId(arg1, &account_name);
uint32 account_id = extractAccountId(accountStr, &account_name);
if (!account_id )
return false;
@ -6311,8 +6319,8 @@ bool ChatHandler::HandleAccountSetAddonCommand(char* args)
HasLowerSecurityAccount (NULL,account_id,true))
return false;
int lev=atoi(arg2); //get int anyway (0 if error)
if (lev < 0)
uint32 lev;
if (!ExtractUInt32(&args, lev))
return false;
// No SQL injection
@ -6331,19 +6339,15 @@ bool ChatHandler::HandleSendItemsCommand(char* args)
if (!extractPlayerTarget(args, &receiver, &receiver_guid, &receiver_name))
return false;
char* tail1 = strtok(NULL, "");
if (!tail1)
char* tail = strtok(NULL, "");
if (!tail)
return false;
char* msgSubject = extractQuotedArg(tail1);
char* msgSubject = ExtractQuotedArg(&tail);
if (!msgSubject)
return false;
char* tail2 = strtok(NULL, "");
if(!tail2)
return false;
char* msgText = extractQuotedArg(tail2);
char* msgText = ExtractQuotedArg(&tail);
if (!msgText)
return false;
@ -6356,9 +6360,6 @@ bool ChatHandler::HandleSendItemsCommand(char* args)
typedef std::list< ItemPair > ItemPairs;
ItemPairs items;
// get all tail string
char* tail = strtok(NULL, "");
// get from tail next item str
while(char* itemStr = strtok(tail, " "))
{
@ -6438,24 +6439,19 @@ bool ChatHandler::HandleSendMoneyCommand(char* args)
if (!extractPlayerTarget(args, &receiver, &receiver_guid, &receiver_name))
return false;
char* tail1 = strtok(NULL, "");
if (!tail1)
char* tail = strtok(NULL, "");
if (!tail)
return false;
char* msgSubject = extractQuotedArg(tail1);
char* msgSubject = ExtractQuotedArg(&tail);
if (!msgSubject)
return false;
char* tail2 = strtok(NULL, "");
if (!tail2)
return false;
char* msgText = extractQuotedArg(tail2);
char* msgText = ExtractQuotedArg(&tail);
if (!msgText)
return false;
char* money_str = strtok(NULL, "");
int32 money = money_str ? atoi(money_str) : 0;
int32 money = tail ? atoi(tail) : 0;
if (money <= 0)
return false;