[9886] Implement new commands for account search

* .lookup account email, .lookup account ip, .lookup account name
* For new commands and for .lookup player versions use first arg as part of email/ip/name search
* Use similar output format for player/account lists.
This commit is contained in:
VladimirMangos 2010-05-13 11:10:00 +04:00
parent a3e61dc560
commit 080727cbfa
12 changed files with 249 additions and 113 deletions

View file

@ -24,7 +24,7 @@ CREATE TABLE `db_version` (
`version` varchar(120) default NULL, `version` varchar(120) default NULL,
`creature_ai_version` varchar(120) default NULL, `creature_ai_version` varchar(120) default NULL,
`cache_id` int(10) default '0', `cache_id` int(10) default '0',
`required_9883_01_mangos_scripts` bit(1) default NULL `required_9886_02_mangos_command` bit(1) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';
-- --
@ -632,6 +632,9 @@ INSERT INTO `command` VALUES
('list object',3,'Syntax: .list object #gameobject_id [#max_count]\r\n\r\nOutput gameobjects with gameobject id #gameobject_id found in world. Output gameobject guids and coordinates sorted by distance from character. Will be output maximum #max_count gameobject. If #max_count not provided use 10 as default value.'), ('list object',3,'Syntax: .list object #gameobject_id [#max_count]\r\n\r\nOutput gameobjects with gameobject id #gameobject_id found in world. Output gameobject guids and coordinates sorted by distance from character. Will be output maximum #max_count gameobject. If #max_count not provided use 10 as default value.'),
('list talents',3,'Syntax: .list talents\r\n\r\nShow list all really known (as learned spells) talent rank spells for selected player or self.'), ('list talents',3,'Syntax: .list talents\r\n\r\nShow list all really known (as learned spells) talent rank spells for selected player or self.'),
('loadscripts',3,'Syntax: .loadscripts $scriptlibraryname\r\n\r\nUnload current and load the script library $scriptlibraryname or reload current if $scriptlibraryname omitted, in case you changed it while the server was running.'), ('loadscripts',3,'Syntax: .loadscripts $scriptlibraryname\r\n\r\nUnload current and load the script library $scriptlibraryname or reload current if $scriptlibraryname omitted, in case you changed it while the server was running.'),
('lookup account email',2,'Syntax: .lookup account email $emailpart [#limit] \r\n\r\n Searchs accounts, which email including $emailpart with optional parametr #limit of results. If #limit not provided expected 100.'),
('lookup account ip',2,'Syntax: lookup account ip $ippart [#limit] \r\n\r\n Searchs accounts, which last used ip inluding $ippart (textual) with optional parametr #$limit of results. If #limit not provided expected 100.'),
('lookup account name',2,'Syntax: .lookup account name $accountpart [#limit] \r\n\r\n Searchs accounts, which username including $accountpart with optional parametr #limit of results. If #limit not provided expected 100.'),
('lookup area',1,'Syntax: .lookup area $namepart\r\n\r\nLooks up an area by $namepart, and returns all matches with their area ID\'s.'), ('lookup area',1,'Syntax: .lookup area $namepart\r\n\r\nLooks up an area by $namepart, and returns all matches with their area ID\'s.'),
('lookup creature',3,'Syntax: .lookup creature $namepart\r\n\r\nLooks up a creature by $namepart, and returns all matches with their creature ID\'s.'), ('lookup creature',3,'Syntax: .lookup creature $namepart\r\n\r\nLooks up a creature by $namepart, and returns all matches with their creature ID\'s.'),
('lookup event',2,'Syntax: .lookup event $name\r\nAttempts to find the ID of the event with the provided $name.'), ('lookup event',2,'Syntax: .lookup event $name\r\nAttempts to find the ID of the event with the provided $name.'),
@ -639,9 +642,9 @@ INSERT INTO `command` VALUES
('lookup item',3,'Syntax: .lookup item $itemname\r\n\r\nLooks up an item by $itemname, and returns all matches with their Item ID\'s.'), ('lookup item',3,'Syntax: .lookup item $itemname\r\n\r\nLooks up an item by $itemname, and returns all matches with their Item ID\'s.'),
('lookup itemset',3,'Syntax: .lookup itemset $itemname\r\n\r\nLooks up an item set by $itemname, and returns all matches with their Item set ID\'s.'), ('lookup itemset',3,'Syntax: .lookup itemset $itemname\r\n\r\nLooks up an item set by $itemname, and returns all matches with their Item set ID\'s.'),
('lookup object',3,'Syntax: .lookup object $objname\r\n\r\nLooks up an gameobject by $objname, and returns all matches with their Gameobject ID\'s.'), ('lookup object',3,'Syntax: .lookup object $objname\r\n\r\nLooks up an gameobject by $objname, and returns all matches with their Gameobject ID\'s.'),
('lookup player account',2,'Syntax: .lookup player account $account ($limit) \r\n\r\n Searchs players, which account username is $account with optional parametr $limit of results.'), ('lookup player account',2,'Syntax: .lookup player account $accountpart [#limit] \r\n\r\n Searchs players, which account username including $accountpart with optional parametr #limit of results. If #limit not provided expected 100.'),
('lookup player ip',2,'Syntax: .lookup player ip $ip ($limit) \r\n\r\n Searchs players, which account ast_ip is $ip with optional parametr $limit of results.'), ('lookup player email',2,'Syntax: .lookup player email $emailpart [#limit] \r\n\r\n Searchs players, which account email including $emailpart with optional parametr #limit of results. If #limit not provided expected 100.'),
('lookup player email',2,'Syntax: .lookup player email $email ($limit) \r\n\r\n Searchs players, which account email is $email with optional parametr $limit of results.'), ('lookup player ip',2,'Syntax: .lookup player ip $ippart [#limit] \r\n\r\n Searchs players, which account last used ip inluding $ippart (textual) with optional parametr #limit of results. If #limit not provided expected 100.'),
('lookup quest',3,'Syntax: .lookup quest $namepart\r\n\r\nLooks up a quest by $namepart, and returns all matches with their quest ID\'s.'), ('lookup quest',3,'Syntax: .lookup quest $namepart\r\n\r\nLooks up a quest by $namepart, and returns all matches with their quest ID\'s.'),
('lookup skill',3,'Syntax: .lookup skill $$namepart\r\n\r\nLooks up a skill by $namepart, and returns all matches with their skill ID\'s.'), ('lookup skill',3,'Syntax: .lookup skill $$namepart\r\n\r\nLooks up a skill by $namepart, and returns all matches with their skill ID\'s.'),
('lookup spell',3,'Syntax: .lookup spell $namepart\r\n\r\nLooks up a spell by $namepart, and returns all matches with their spell ID\'s.'), ('lookup spell',3,'Syntax: .lookup spell $namepart\r\n\r\nLooks up a spell by $namepart, and returns all matches with their spell ID\'s.'),
@ -3585,10 +3588,9 @@ INSERT INTO `mangos_string` VALUES
(1007,'Account %s NOT created (probably sql file format was updated)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (1007,'Account %s NOT created (probably sql file format was updated)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1008,'Account %s NOT created (unknown error)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (1008,'Account %s NOT created (unknown error)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1009,'Player %s (Guid: %u) Account %s (Id: %u) deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (1009,'Player %s (Guid: %u) Account %s (Id: %u) deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1010,'| Account | Character | IP | GM | Expansion |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (1010,'| ID | Account | Character | IP | GM | Expansion |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1011,'|<Error> | %20s |<Error> |<Er>| <Error> |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (1012,'========================================================================================',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1012,'===========================================================================',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (1013,'| %10u |%15s| %20s | %15s |%4d| %9d |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1013,'|%15s| %20s | %15s |%4d| %9d |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1014,'No online players.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (1014,'No online players.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1015,'Used not fully typed quit command, need type it fully (quit), or command used not in RA command line.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (1015,'Used not fully typed quit command, need type it fully (quit), or command used not in RA command line.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1016, '| GUID | Name | Account | Delete Date |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (1016, '| GUID | Name | Account | Delete Date |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
@ -3644,6 +3646,7 @@ INSERT INTO `mangos_string` VALUES
(1139, '| GUID | Name | Race | Class | Level |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (1139, '| GUID | Name | Race | Class | Level |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1140, '| %10u | %20s | %15s | %15s | %5u |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (1140, '| %10u | %20s | %15s | %15s | %5u |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1141, '%u - |cffffffff|Hplayer:%s|h[%s]|h|r %s %s %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (1141, '%u - |cffffffff|Hplayer:%s|h[%s]|h|r %s %s %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1142,'%u - %s (Online:%s IP:%s GM:%u Expansion:%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1200,'You try to view cinemitic %u but it doesn\'t exist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (1200,'You try to view cinemitic %u but it doesn\'t exist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1201,'You try to view movie %u but it doesn\'t exist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); (1201,'You try to view movie %u but it doesn\'t exist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
/*!40000 ALTER TABLE `mangos_string` ENABLE KEYS */; /*!40000 ALTER TABLE `mangos_string` ENABLE KEYS */;

View file

@ -0,0 +1,8 @@
ALTER TABLE db_version CHANGE COLUMN required_9883_01_mangos_scripts required_9886_01_mangos_mangos_string bit;
DELETE FROM mangos_string WHERE entry IN (1011,1010,1012,1013,1142);
INSERT INTO mangos_string VALUES
(1010,'| ID | Account | Character | IP | GM | Expansion |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1012,'========================================================================================',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1013,'| %10u |%15s| %20s | %15s |%4d| %9d |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1142,'%u - %s (Online:%s IP:%s GM:%u Expansion:%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);

View file

@ -0,0 +1,10 @@
ALTER TABLE db_version CHANGE COLUMN required_9886_01_mangos_mangos_string required_9886_02_mangos_command bit;
DELETE FROM command WHERE name IN('lookup account email','lookup account ip','lookup account name','lookup player account','lookup player ip','lookup player email');
INSERT INTO command (name, security, help) VALUES
('lookup account email',2,'Syntax: .lookup account email $emailpart [#limit] \r\n\r\n Searchs accounts, which email including $emailpart with optional parametr #limit of results. If #limit not provided expected 100.'),
('lookup account ip',2,'Syntax: lookup account ip $ippart [#limit] \r\n\r\n Searchs accounts, which last used ip inluding $ippart (textual) with optional parametr #$limit of results. If #limit not provided expected 100.'),
('lookup account name',2,'Syntax: .lookup account name $accountpart [#limit] \r\n\r\n Searchs accounts, which username including $accountpart with optional parametr #limit of results. If #limit not provided expected 100.'),
('lookup player account',2,'Syntax: .lookup player account $accountpart [#limit] \r\n\r\n Searchs players, which account username including $accountpart with optional parametr #limit of results. If #limit not provided expected 100.'),
('lookup player email',2,'Syntax: .lookup player email $emailpart [#limit] \r\n\r\n Searchs players, which account email including $emailpart with optional parametr #limit of results. If #limit not provided expected 100.'),
('lookup player ip',2,'Syntax: .lookup player ip $ippart [#limit] \r\n\r\n Searchs players, which account last used ip inluding $ippart (textual) with optional parametr #limit of results. If #limit not provided expected 100.');

View file

@ -60,6 +60,8 @@ pkgdata_DATA = \
9854_01_mangos_spell_bonus_data.sql \ 9854_01_mangos_spell_bonus_data.sql \
9881_01_mangos_scripts.sql \ 9881_01_mangos_scripts.sql \
9883_01_mangos_scripts.sql \ 9883_01_mangos_scripts.sql \
9886_01_mangos_mangos_string.sql \
9886_02_mangos_command.sql \
README README
## Additional files to include when running 'make dist' ## Additional files to include when running 'make dist'
@ -100,4 +102,6 @@ EXTRA_DIST = \
9854_01_mangos_spell_bonus_data.sql \ 9854_01_mangos_spell_bonus_data.sql \
9881_01_mangos_scripts.sql \ 9881_01_mangos_scripts.sql \
9883_01_mangos_scripts.sql \ 9883_01_mangos_scripts.sql \
9886_01_mangos_mangos_string.sql \
9886_02_mangos_command.sql \
README README

View file

@ -285,16 +285,25 @@ ChatCommand * ChatHandler::getCommandTable()
{ NULL, 0, false, NULL, "", NULL } { NULL, 0, false, NULL, "", NULL }
}; };
static ChatCommand lookupAccountCommandTable[] =
{
{ "email", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupAccountEmailCommand, "", NULL },
{ "ip", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupAccountIpCommand, "", NULL },
{ "name", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupAccountNameCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand lookupPlayerCommandTable[] = static ChatCommand lookupPlayerCommandTable[] =
{ {
{ "ip", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerIpCommand, "", NULL },
{ "account", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerAccountCommand, "", NULL }, { "account", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerAccountCommand, "", NULL },
{ "email", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerEmailCommand, "", NULL }, { "email", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerEmailCommand, "", NULL },
{ "ip", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerIpCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL } { NULL, 0, false, NULL, "", NULL }
}; };
static ChatCommand lookupCommandTable[] = static ChatCommand lookupCommandTable[] =
{ {
{ "account", SEC_GAMEMASTER, true, NULL, "", lookupAccountCommandTable },
{ "area", SEC_MODERATOR, true, &ChatHandler::HandleLookupAreaCommand, "", NULL }, { "area", SEC_MODERATOR, true, &ChatHandler::HandleLookupAreaCommand, "", NULL },
{ "creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupCreatureCommand, "", NULL }, { "creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupCreatureCommand, "", NULL },
{ "event", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupEventCommand, "", NULL }, { "event", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupEventCommand, "", NULL },

View file

@ -233,6 +233,9 @@ class ChatHandler
bool HandleListObjectCommand(const char* args); bool HandleListObjectCommand(const char* args);
bool HandleListTalentsCommand(const char * args); bool HandleListTalentsCommand(const char * args);
bool HandleLookupAccountEmailCommand(const char* args);
bool HandleLookupAccountIpCommand(const char* args);
bool HandleLookupAccountNameCommand(const char* args);
bool HandleLookupAreaCommand(const char* args); bool HandleLookupAreaCommand(const char* args);
bool HandleLookupCreatureCommand(const char* args); bool HandleLookupCreatureCommand(const char* args);
bool HandleLookupEventCommand(const char* args); bool HandleLookupEventCommand(const char* args);
@ -544,7 +547,9 @@ class ChatHandler
// Utility methods for commands // Utility methods for commands
void ShowTicket(uint64 guid, char const* text, char const* time); void ShowTicket(uint64 guid, char const* text, char const* time);
bool LookupPlayerSearchCommand(QueryResult* result, int32 limit); bool ShowAccountListHelper(QueryResult* result, uint32* limit = NULL, bool title = true, bool error = true);
bool ShowPlayerListHelper(QueryResult* result, uint32* limit = NULL, bool title = true, bool error = true);
bool LookupPlayerSearchCommand(QueryResult* result, uint32* limit = NULL);
bool HandleBanListHelper(QueryResult* result); bool HandleBanListHelper(QueryResult* result);
bool HandleBanHelper(BanMode mode,char const* args); bool HandleBanHelper(BanMode mode,char const* args);
bool HandleBanInfoHelper(uint32 accountid, char const* accountname); bool HandleBanInfoHelper(uint32 accountid, char const* accountname);

View file

@ -776,9 +776,9 @@ enum MangosStrings
LANG_ACCOUNT_NOT_CREATED = 1008, LANG_ACCOUNT_NOT_CREATED = 1008,
LANG_CHARACTER_DELETED = 1009, LANG_CHARACTER_DELETED = 1009,
LANG_ACCOUNT_LIST_HEADER = 1010, LANG_ACCOUNT_LIST_HEADER = 1010,
LANG_ACCOUNT_LIST_ERROR = 1011, // = 1011, not used
LANG_ACCOUNT_LIST_BAR = 1012, LANG_ACCOUNT_LIST_BAR = 1012,
LANG_ACCOUNT_LIST_LINE = 1013, LANG_ACCOUNT_LIST_LINE_CONSOLE = 1013,
LANG_ACCOUNT_LIST_EMPTY = 1014, LANG_ACCOUNT_LIST_EMPTY = 1014,
LANG_QUIT_WRONG_USE_ERROR = 1015, LANG_QUIT_WRONG_USE_ERROR = 1015,
LANG_CHARACTER_DELETED_LIST_HEADER = 1016, LANG_CHARACTER_DELETED_LIST_HEADER = 1016,
@ -833,11 +833,12 @@ enum MangosStrings
LANG_LIST_TALENTS_TITLE = 1135, LANG_LIST_TALENTS_TITLE = 1135,
LANG_LIST_TALENTS_COUNT = 1136, LANG_LIST_TALENTS_COUNT = 1136,
LANG_GO_LIST_CHAT = 1137, LANG_GO_LIST_CHAT = 1137,
LANG_ACCOUNT_CHARACTERS_LIST_BAR = 1138, LANG_CHARACTERS_LIST_BAR = 1138,
LANG_ACCOUNT_CHARACTERS_LIST_HEADER = 1139, LANG_CHARACTERS_LIST_HEADER = 1139,
LANG_ACCOUNT_CHARACTERS_LIST_LINE_CONSOLE = 1140, LANG_CHARACTERS_LIST_LINE_CONSOLE = 1140,
LANG_ACCOUNT_CHARACTERS_LIST_LINE_CHAT = 1141, LANG_CHARACTERS_LIST_LINE_CHAT = 1141,
// Room for more level 3 1142-1199 not used LANG_ACCOUNT_LIST_LINE_CHAT = 1142,
// Room for more level 3 1143-1199 not used
// Debug commands // Debug commands
LANG_CINEMATIC_NOT_EXIST = 1200, LANG_CINEMATIC_NOT_EXIST = 1200,

View file

@ -4092,6 +4092,112 @@ bool ChatHandler::HandleLearnAllRecipesCommand(const char* args)
return true; return true;
} }
bool ChatHandler::HandleLookupAccountEmailCommand(const char* args)
{
if (!*args)
return false;
std::string email = strtok ((char*)args, " ");
char* limit_str = strtok (NULL, " ");
uint32 limit = limit_str ? atoi (limit_str) : 100;
loginDatabase.escape_string (email);
// 0 1 2 3 4
QueryResult *result = loginDatabase.PQuery("SELECT id, username, last_ip, gmlevel, expansion FROM account WHERE email "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"), email.c_str ());
return ShowAccountListHelper(result,&limit);
}
bool ChatHandler::HandleLookupAccountIpCommand(const char* args)
{
if (!*args)
return false;
std::string ip = strtok ((char*)args, " ");
char* limit_str = strtok (NULL, " ");
uint32 limit = limit_str ? atoi (limit_str) : 100;
loginDatabase.escape_string (ip);
// 0 1 2 3 4
QueryResult *result = loginDatabase.PQuery("SELECT id, username, last_ip, gmlevel, expansion FROM account WHERE last_ip "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"), ip.c_str ());
return ShowAccountListHelper(result,&limit);
}
bool ChatHandler::HandleLookupAccountNameCommand(const char* args)
{
if (!*args)
return false;
std::string account = strtok ((char*)args, " ");
char* limit_str = strtok (NULL, " ");
uint32 limit = limit_str ? atoi (limit_str) : 100;
if (!AccountMgr::normalizeString (account))
return false;
loginDatabase.escape_string (account);
// 0 1 2 3 4
QueryResult *result = loginDatabase.PQuery("SELECT id, username, last_ip, gmlevel, expansion FROM account WHERE username "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"), account.c_str ());
return ShowAccountListHelper(result,&limit);
}
bool ChatHandler::ShowAccountListHelper(QueryResult* result, uint32* limit, bool title, bool error)
{
if (!result)
{
if (error)
SendSysMessage(LANG_ACCOUNT_LIST_EMPTY);
return true;
}
///- Display the list of account/characters online
if (!m_session && title) // not output header for online case
{
SendSysMessage(LANG_ACCOUNT_LIST_BAR);
SendSysMessage(LANG_ACCOUNT_LIST_HEADER);
SendSysMessage(LANG_ACCOUNT_LIST_BAR);
}
///- Circle through accounts
do
{
// check limit
if (limit)
{
if(*limit == 0)
break;
--*limit;
}
Field *fields = result->Fetch();
uint32 account = fields[0].GetUInt32();
WorldSession* session = sWorld.FindSession(account);
Player* player = session ? session->GetPlayer() : NULL;
char const* char_name = player ? player->GetName() : " - ";
if(m_session)
PSendSysMessage(LANG_ACCOUNT_LIST_LINE_CHAT,
account,fields[1].GetString(),char_name,fields[2].GetString(),fields[3].GetUInt32(),fields[4].GetUInt32());
else
PSendSysMessage(LANG_ACCOUNT_LIST_LINE_CONSOLE,
account,fields[1].GetString(),char_name,fields[2].GetString(),fields[3].GetUInt32(),fields[4].GetUInt32());
}while(result->NextRow());
delete result;
if (!m_session) // not output header for online case
SendSysMessage(LANG_ACCOUNT_LIST_BAR);
return true;
}
bool ChatHandler::HandleLookupPlayerIpCommand(const char* args) bool ChatHandler::HandleLookupPlayerIpCommand(const char* args)
{ {
@ -4100,13 +4206,13 @@ bool ChatHandler::HandleLookupPlayerIpCommand(const char* args)
std::string ip = strtok ((char*)args, " "); std::string ip = strtok ((char*)args, " ");
char* limit_str = strtok (NULL, " "); char* limit_str = strtok (NULL, " ");
int32 limit = limit_str ? atoi (limit_str) : -1; uint32 limit = limit_str ? atoi (limit_str) : 100;
loginDatabase.escape_string (ip); loginDatabase.escape_string (ip);
QueryResult* result = loginDatabase.PQuery ("SELECT id,username FROM account WHERE last_ip = '%s'", ip.c_str ()); QueryResult* result = loginDatabase.PQuery ("SELECT id,username FROM account WHERE last_ip "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"), ip.c_str ());
return LookupPlayerSearchCommand (result,limit); return LookupPlayerSearchCommand (result,&limit);
} }
bool ChatHandler::HandleLookupPlayerAccountCommand(const char* args) bool ChatHandler::HandleLookupPlayerAccountCommand(const char* args)
@ -4116,16 +4222,16 @@ bool ChatHandler::HandleLookupPlayerAccountCommand(const char* args)
std::string account = strtok ((char*)args, " "); std::string account = strtok ((char*)args, " ");
char* limit_str = strtok (NULL, " "); char* limit_str = strtok (NULL, " ");
int32 limit = limit_str ? atoi (limit_str) : -1; uint32 limit = limit_str ? atoi (limit_str) : 100;
if (!AccountMgr::normalizeString (account)) if (!AccountMgr::normalizeString (account))
return false; return false;
loginDatabase.escape_string (account); loginDatabase.escape_string (account);
QueryResult* result = loginDatabase.PQuery ("SELECT id,username FROM account WHERE username = '%s'", account.c_str ()); QueryResult* result = loginDatabase.PQuery ("SELECT id,username FROM account WHERE username "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"), account.c_str ());
return LookupPlayerSearchCommand (result,limit); return LookupPlayerSearchCommand (result,&limit);
} }
bool ChatHandler::HandleLookupPlayerEmailCommand(const char* args) bool ChatHandler::HandleLookupPlayerEmailCommand(const char* args)
@ -4136,57 +4242,57 @@ bool ChatHandler::HandleLookupPlayerEmailCommand(const char* args)
std::string email = strtok ((char*)args, " "); std::string email = strtok ((char*)args, " ");
char* limit_str = strtok (NULL, " "); char* limit_str = strtok (NULL, " ");
int32 limit = limit_str ? atoi (limit_str) : -1; uint32 limit = limit_str ? atoi (limit_str) : 100;
loginDatabase.escape_string (email); loginDatabase.escape_string (email);
QueryResult* result = loginDatabase.PQuery ("SELECT id,username FROM account WHERE email = '%s'", email.c_str ()); QueryResult* result = loginDatabase.PQuery ("SELECT id,username FROM account WHERE email "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"), email.c_str ());
return LookupPlayerSearchCommand (result,limit); return LookupPlayerSearchCommand (result,&limit);
} }
bool ChatHandler::LookupPlayerSearchCommand(QueryResult* result, int32 limit) bool ChatHandler::LookupPlayerSearchCommand(QueryResult* result, uint32* limit)
{ {
if(!result) if (!result)
{ {
PSendSysMessage(LANG_NO_PLAYERS_FOUND); PSendSysMessage(LANG_NO_PLAYERS_FOUND);
SetSentErrorMessage(true); SetSentErrorMessage(true);
return false; return false;
} }
int i =0; uint32 limit_original = limit ? *limit : 100;
uint32 limit_local = limit_original;
if (!limit)
limit = &limit_local;
do do
{ {
if (limit && *limit == 0)
break;
Field* fields = result->Fetch(); Field* fields = result->Fetch();
uint32 acc_id = fields[0].GetUInt32(); uint32 acc_id = fields[0].GetUInt32();
std::string acc_name = fields[1].GetCppString(); std::string acc_name = fields[1].GetCppString();
QueryResult* chars = CharacterDatabase.PQuery("SELECT guid,name FROM characters WHERE account = '%u'", acc_id); ///- Get the characters for account id
if(chars) QueryResult *chars = CharacterDatabase.PQuery( "SELECT guid, name, race, class, level FROM characters WHERE account = %u", acc_id);
if (chars)
{
if (chars->GetRowCount())
{ {
PSendSysMessage(LANG_LOOKUP_PLAYER_ACCOUNT,acc_name.c_str(),acc_id); PSendSysMessage(LANG_LOOKUP_PLAYER_ACCOUNT,acc_name.c_str(),acc_id);
ShowPlayerListHelper(chars,limit,true,false);
uint64 guid = 0; }
std::string name; else
do
{
Field* charfields = chars->Fetch();
guid = charfields[0].GetUInt64();
name = charfields[1].GetCppString();
PSendSysMessage(LANG_LOOKUP_PLAYER_CHARACTER,name.c_str(),guid);
++i;
} while( chars->NextRow() && ( limit == -1 || i < limit ) );
delete chars; delete chars;
} }
} while(result->NextRow()); } while(result->NextRow());
delete result; delete result;
if(i==0) // empty accounts only if (*limit==limit_original) // empty accounts only
{ {
PSendSysMessage(LANG_NO_PLAYERS_FOUND); PSendSysMessage(LANG_NO_PLAYERS_FOUND);
SetSentErrorMessage(true); SetSentErrorMessage(true);

View file

@ -6136,24 +6136,23 @@ bool ChatHandler::HandleServerSetMotdCommand(const char* args)
return true; return true;
} }
/// Output list of character for account bool ChatHandler::ShowPlayerListHelper(QueryResult* result, uint32* limit, bool title, bool error)
bool ChatHandler::HandleAccountCharactersCommand(const char* args)
{ {
///- Get the command line arguments if (!result)
std::string account_name;
Player* target = NULL; // only for triggering use targeted player account
uint32 account_id = extractAccountId((char*)args, &account_name, &target);
if (!account_id )
return false;
///- Get the characters for account id
QueryResult *result = CharacterDatabase.PQuery( "SELECT guid, name, race, class, level FROM characters WHERE account = %u", account_id);
if (!m_session)
{ {
SendSysMessage(LANG_ACCOUNT_CHARACTERS_LIST_BAR); if (error)
SendSysMessage(LANG_ACCOUNT_CHARACTERS_LIST_HEADER); {
SendSysMessage(LANG_ACCOUNT_CHARACTERS_LIST_BAR); PSendSysMessage(LANG_NO_PLAYERS_FOUND);
SetSentErrorMessage(true);
}
return false;
}
if (!m_session && title)
{
SendSysMessage(LANG_CHARACTERS_LIST_BAR);
SendSysMessage(LANG_CHARACTERS_LIST_HEADER);
SendSysMessage(LANG_CHARACTERS_LIST_BAR);
} }
if (result) if (result)
@ -6161,6 +6160,14 @@ bool ChatHandler::HandleAccountCharactersCommand(const char* args)
///- Circle through them. Display username and GM level ///- Circle through them. Display username and GM level
do do
{ {
// check limit
if (limit)
{
if(*limit == 0)
break;
--*limit;
}
Field *fields = result->Fetch(); Field *fields = result->Fetch();
uint32 guid = fields[0].GetUInt32(); uint32 guid = fields[0].GetUInt32();
std::string name = fields[1].GetCppString(); std::string name = fields[1].GetCppString();
@ -6175,9 +6182,9 @@ bool ChatHandler::HandleAccountCharactersCommand(const char* args)
char const* class_name = classEntry ? classEntry->name[GetSessionDbcLocale()] : "<?>"; char const* class_name = classEntry ? classEntry->name[GetSessionDbcLocale()] : "<?>";
if (!m_session) if (!m_session)
PSendSysMessage(LANG_ACCOUNT_CHARACTERS_LIST_LINE_CONSOLE, guid, name.c_str(), race_name, class_name, level); PSendSysMessage(LANG_CHARACTERS_LIST_LINE_CONSOLE, guid, name.c_str(), race_name, class_name, level);
else else
PSendSysMessage(LANG_ACCOUNT_CHARACTERS_LIST_LINE_CHAT, guid, name.c_str(), name.c_str(), race_name, class_name, level); PSendSysMessage(LANG_CHARACTERS_LIST_LINE_CHAT, guid, name.c_str(), name.c_str(), race_name, class_name, level);
}while( result->NextRow() ); }while( result->NextRow() );
@ -6185,11 +6192,28 @@ bool ChatHandler::HandleAccountCharactersCommand(const char* args)
} }
if (!m_session) if (!m_session)
SendSysMessage(LANG_ACCOUNT_CHARACTERS_LIST_BAR); SendSysMessage(LANG_CHARACTERS_LIST_BAR);
return true; return true;
} }
/// Output list of character for account
bool ChatHandler::HandleAccountCharactersCommand(const char* args)
{
///- Get the command line arguments
std::string account_name;
Player* target = NULL; // only for triggering use targeted player account
uint32 account_id = extractAccountId((char*)args, &account_name, &target);
if (!account_id )
return false;
///- Get the characters for account id
QueryResult *result = CharacterDatabase.PQuery( "SELECT guid, name, race, class, level FROM characters WHERE account = %u", account_id);
return ShowPlayerListHelper(result);
}
/// Set/Unset the expansion level for an account /// Set/Unset the expansion level for an account
bool ChatHandler::HandleAccountSetAddonCommand(const char* args) bool ChatHandler::HandleAccountSetAddonCommand(const char* args)
{ {

View file

@ -476,50 +476,16 @@ bool ChatHandler::HandleServerExitCommand(const char* /*args*/)
} }
/// Display info on users currently in the realm /// Display info on users currently in the realm
bool ChatHandler::HandleAccountOnlineListCommand(const char* /*args*/) bool ChatHandler::HandleAccountOnlineListCommand(const char* args)
{ {
char* limit_str = *args ? strtok((char*)args, " ") : NULL;
uint32 limit = limit_str ? atoi (limit_str) : 100;
///- Get the list of accounts ID logged to the realm ///- Get the list of accounts ID logged to the realm
QueryResult *resultDB = CharacterDatabase.Query("SELECT name,account FROM characters WHERE online > 0"); // 0 1 2 3 4
if (!resultDB) QueryResult *result = loginDatabase.PQuery("SELECT id, username, last_ip, gmlevel, expansion FROM account WHERE realm = %u", realmID);
{
SendSysMessage(LANG_ACCOUNT_LIST_EMPTY);
return true;
}
///- Display the list of account/characters online return ShowAccountListHelper(result,&limit);
SendSysMessage(LANG_ACCOUNT_LIST_BAR);
SendSysMessage(LANG_ACCOUNT_LIST_HEADER);
SendSysMessage(LANG_ACCOUNT_LIST_BAR);
///- Circle through accounts
do
{
Field *fieldsDB = resultDB->Fetch();
std::string name = fieldsDB[0].GetCppString();
uint32 account = fieldsDB[1].GetUInt32();
///- Get the username, last IP and GM level of each account
// No SQL injection. account is uint32.
// 0 1 2 3
QueryResult *resultLogin = loginDatabase.PQuery("SELECT username, last_ip, gmlevel, expansion FROM account WHERE id = '%u'",account);
if(resultLogin)
{
Field *fieldsLogin = resultLogin->Fetch();
PSendSysMessage(LANG_ACCOUNT_LIST_LINE,
fieldsLogin[0].GetString(),name.c_str(),fieldsLogin[1].GetString(),fieldsLogin[2].GetUInt32(),fieldsLogin[3].GetUInt32());
delete resultLogin;
}
else
PSendSysMessage(LANG_ACCOUNT_LIST_ERROR,name.c_str());
}while(resultDB->NextRow());
delete resultDB;
SendSysMessage(LANG_ACCOUNT_LIST_BAR);
return true;
} }
/// Create an account /// Create an account

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "9885" #define REVISION_NR "9886"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__

View file

@ -1,6 +1,6 @@
#ifndef __REVISION_SQL_H__ #ifndef __REVISION_SQL_H__
#define __REVISION_SQL_H__ #define __REVISION_SQL_H__
#define REVISION_DB_CHARACTERS "required_9849_01_characters_saved_variables" #define REVISION_DB_CHARACTERS "required_9849_01_characters_saved_variables"
#define REVISION_DB_MANGOS "required_9883_01_mangos_scripts" #define REVISION_DB_MANGOS "required_9886_02_mangos_command"
#define REVISION_DB_REALMD "required_9748_01_realmd_realmlist" #define REVISION_DB_REALMD "required_9748_01_realmd_realmlist"
#endif // __REVISION_SQL_H__ #endif // __REVISION_SQL_H__