mirror of
https://github.com/mangosfour/server.git
synced 2025-12-15 10:37:02 +00:00
[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:
parent
373f607a44
commit
edace1948e
7 changed files with 365 additions and 126 deletions
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue