diff --git a/common/emu_constants.cpp b/common/emu_constants.cpp index 0d5f3c8cd..7c084bc9d 100644 --- a/common/emu_constants.cpp +++ b/common/emu_constants.cpp @@ -298,4 +298,42 @@ std::string EQ::constants::GetBodyTypeName(bodyType bodytype_id) return bodytypes[bodytype_id]; } return std::string(); -} \ No newline at end of file +} + +const std::map& EQ::constants::GetAccountStatusMap() +{ + static const std::map account_status_map = { + { AccountStatus::Player, "Player" }, + { AccountStatus::Steward, "Steward" }, + { AccountStatus::ApprenticeGuide, "Apprentice Guide" }, + { AccountStatus::Guide, "Guide" }, + { AccountStatus::QuestTroupe, "Quest Troupe" }, + { AccountStatus::SeniorGuide, "Senior Guide" }, + { AccountStatus::GMTester, "GM Tester" }, + { AccountStatus::EQSupport, "EQ Support" }, + { AccountStatus::GMStaff, "GM Staff" }, + { AccountStatus::GMAdmin, "GM Admin" }, + { AccountStatus::GMLeadAdmin, "GM Lead Admin" }, + { AccountStatus::QuestMaster, "Quest Master" }, + { AccountStatus::GMAreas, "GM Areas" }, + { AccountStatus::GMCoder, "GM Coder" }, + { AccountStatus::GMMgmt, "GM Mgmt" }, + { AccountStatus::GMImpossible, "GM Impossible" }, + { AccountStatus::Max, "GM Max" } + }; + return account_status_map; +} + +std::string EQ::constants::GetAccountStatusName(uint8 account_status) +{ + auto account_statuses = EQ::constants::GetAccountStatusMap(); + std::string status_name; + for (auto status_level = account_statuses.rbegin(); status_level != account_statuses.rend(); ++status_level) { + if (account_status >= status_level->first) { + status_name = status_level->second; + break; + } + } + + return status_name; +} diff --git a/common/emu_constants.h b/common/emu_constants.h index 3c5680a37..20985378f 100644 --- a/common/emu_constants.h +++ b/common/emu_constants.h @@ -245,6 +245,9 @@ namespace EQ extern const std::map& GetBodyTypeMap(); std::string GetBodyTypeName(bodyType bodytype_id); + extern const std::map& GetAccountStatusMap(); + std::string GetAccountStatusName(uint8 account_status); + const int STANCE_TYPE_FIRST = stancePassive; const int STANCE_TYPE_LAST = stanceBurnAE; const int STANCE_TYPE_COUNT = stanceBurnAE; diff --git a/zone/gm_commands/who.cpp b/zone/gm_commands/who.cpp index f39733d1e..43077573e 100755 --- a/zone/gm_commands/who.cpp +++ b/zone/gm_commands/who.cpp @@ -2,91 +2,53 @@ void command_who(Client *c, const Seperator *sep) { - std::string query = - SQL ( - SELECT - character_data.account_id, - character_data.name, - character_data.zone_id, - character_data.zone_instance, - COALESCE( - ( - select - guilds.name - from - guilds - where - id = ( + std::string query = SQL( + SELECT + character_data.account_id, + character_data.name, + character_data.zone_id, + character_data.zone_instance, + COALESCE( + ( + SELECT guilds.name FROM guilds WHERE id = ( ( - select - guild_id - from - guild_members - where - char_id = character_data.id - ) - ) - ), - "" - ) as guild_name, - character_data.level, - character_data.race, - character_data.class, - COALESCE( - ( - select - account.status - from - account - where - account.id = character_data.account_id - LIMIT - 1 - ), 0 - ) as account_status, - COALESCE( - ( - select - account.name - from - account - where - account.id = character_data.account_id - LIMIT - 1 - ), - 0 - ) as account_name, - COALESCE( - ( - select - account_ip.ip - from - account_ip - where - account_ip.accid = character_data.account_id - ORDER BY - account_ip.lastused DESC - LIMIT - 1 - ), - "" - ) as account_ip - FROM - character_data - WHERE - last_login > (UNIX_TIMESTAMP() - 600) - ORDER BY - character_data.name; - ); + SELECT guild_id FROM guild_members WHERE char_id = character_data.id + ) + ) + ), + "" + ) AS guild_name, + character_data.level, + character_data.race, + character_data.class, + COALESCE( + ( + SELECT account.status FROM account WHERE account.id = character_data.account_id LIMIT 1 + ), + 0 + ) AS account_status, + COALESCE( + ( + SELECT account.name FROM account WHERE account.id = character_data.account_id LIMIT 1 + ), + 0 + ) AS account_name, + COALESCE( + ( + SELECT account_ip.ip FROM account_ip WHERE account_ip.accid = character_data.account_id ORDER BY account_ip.lastused DESC LIMIT 1 + ), + "" + ) AS account_ip + FROM + character_data + WHERE + last_login > (UNIX_TIMESTAMP() - 600) + ORDER BY + character_data.name; + ); auto results = database.QueryDatabase(query); - if (!results.Success()) { - return; - } - - if (results.RowCount() == 0) { - c->Message(Chat::Yellow, "No results found"); + if (!results.Success() || !results.RowCount()) { return; } @@ -98,36 +60,36 @@ void command_who(Client *c, const Seperator *sep) int found_count = 0; - c->Message(Chat::Magenta, "Players in EverQuest"); - c->Message(Chat::Magenta, "--------------------"); + c->Message(Chat::Who, "Players in EverQuest:"); + c->Message(Chat::Who, "------------------------------"); - for (auto row = results.begin(); row != results.end(); ++row) { - auto account_id = static_cast(atoi(row[0])); - std::string player_name = row[1]; - auto zone_id = static_cast(atoi(row[2])); - std::string zone_short_name = ZoneName(zone_id); - auto zone_instance = static_cast(atoi(row[3])); - std::string guild_name = row[4]; - auto player_level = static_cast(atoi(row[5])); - auto player_race = static_cast(atoi(row[6])); - auto player_class = static_cast(atoi(row[7])); - auto account_status = static_cast(atoi(row[8])); - std::string account_name = row[9]; - std::string account_ip = row[10]; - std::string base_class_name = GetClassIDName(static_cast(player_class), 1); + for (auto row : results) { + auto account_id = std::stoul(row[0]); + std::string player_name = row[1]; + auto zone_id = std::stoul(row[2]); + std::string zone_short_name = ZoneName(zone_id); + std::string zone_long_name = ZoneLongName(zone_id); + auto zone_instance = std::stoul(row[3]); + std::string guild_name = row[4]; + auto player_level = std::stoul(row[5]); + auto player_race = std::stoul(row[6]); + auto player_class = std::stoul(row[7]); + auto account_status = std::stoul(row[8]); + std::string account_name = row[9]; + std::string account_ip = row[10]; + std::string base_class_name = GetClassIDName(static_cast(player_class)); std::string displayed_race_name = GetRaceIDName(static_cast(player_race)); - if (search_string.length() > 0) { - bool found_search_term = - ( - str_tolower(player_name).find(search_string) != std::string::npos || - str_tolower(zone_short_name).find(search_string) != std::string::npos || - str_tolower(displayed_race_name).find(search_string) != std::string::npos || - str_tolower(base_class_name).find(search_string) != std::string::npos || - str_tolower(guild_name).find(search_string) != std::string::npos || - str_tolower(account_name).find(search_string) != std::string::npos || - str_tolower(account_ip).find(search_string) != std::string::npos - ); + if (search_string.length()) { + bool found_search_term = ( + str_tolower(player_name).find(search_string) != std::string::npos || + str_tolower(zone_short_name).find(search_string) != std::string::npos || + str_tolower(displayed_race_name).find(search_string) != std::string::npos || + str_tolower(base_class_name).find(search_string) != std::string::npos || + str_tolower(guild_name).find(search_string) != std::string::npos || + str_tolower(account_name).find(search_string) != std::string::npos || + str_tolower(account_ip).find(search_string) != std::string::npos + ); if (!found_search_term) { continue; @@ -135,68 +97,145 @@ void command_who(Client *c, const Seperator *sep) } std::string displayed_guild_name; - if (guild_name.length() > 0) { + if (guild_name.length()) { displayed_guild_name = EQ::SayLinkEngine::GenerateQuestSaylink( - StringFormat( - "#who \"%s\"", - guild_name.c_str()), + fmt::format( + "#who \"{}\"", + guild_name + ), false, - StringFormat("<%s>", guild_name.c_str()) + fmt::format( + "<{}>", + guild_name + ) ); } - std::string goto_saylink = EQ::SayLinkEngine::GenerateQuestSaylink( - StringFormat("#goto %s", player_name.c_str()), false, "Goto" + auto goto_saylink = EQ::SayLinkEngine::GenerateQuestSaylink( + fmt::format( + "#goto {}", + player_name + ), + false, + "Goto" + ); + + auto summon_saylink = EQ::SayLinkEngine::GenerateQuestSaylink( + fmt::format( + "#summon {}", + player_name + ), + false, + "Summon" ); std::string display_class_name = GetClassIDName( static_cast(player_class), - static_cast(player_level)); + static_cast(player_level) + ); + + auto class_saylink = EQ::SayLinkEngine::GenerateQuestSaylink( + fmt::format( + "#who {}", + base_class_name + ), + false, + display_class_name + ); + + auto race_saylink = EQ::SayLinkEngine::GenerateQuestSaylink( + fmt::format( + "#who %s", + displayed_race_name + ), + false, + displayed_race_name + ); + + auto zone_saylink = EQ::SayLinkEngine::GenerateQuestSaylink( + fmt::format( + "#who {}", + zone_short_name + ), + false, + zone_long_name + ); + + auto account_saylink = EQ::SayLinkEngine::GenerateQuestSaylink( + fmt::format( + "#who {}", + account_name + ), + false, + account_name + ); + + auto account_ip_saylink = EQ::SayLinkEngine::GenerateQuestSaylink( + fmt::format( + "#who {}", + account_ip + ), + false, + account_ip + ); + + auto status_level = ( + account_status ? + fmt::format( + "* {} * ", + EQ::constants::GetAccountStatusName(account_status) + ) : + "" + ); + + auto version_string = ( + zone_instance ? + fmt::format( + " ({})", + zone_instance + ) : + "" + ); c->Message( - 5, "%s[%u %s] %s (%s) %s ZONE: %s (%u) (%s) (%s) (%s)", - (account_status > 0 ? "* GM * " : ""), - player_level, - EQ::SayLinkEngine::GenerateQuestSaylink( - StringFormat("#who %s", base_class_name.c_str()), - false, - display_class_name - ).c_str(), - player_name.c_str(), - EQ::SayLinkEngine::GenerateQuestSaylink( - StringFormat("#who %s", displayed_race_name.c_str()), - false, - displayed_race_name - ).c_str(), - displayed_guild_name.c_str(), - EQ::SayLinkEngine::GenerateQuestSaylink( - StringFormat("#who %s", zone_short_name.c_str()), - false, - zone_short_name - ).c_str(), - zone_instance, - goto_saylink.c_str(), - EQ::SayLinkEngine::GenerateQuestSaylink( - StringFormat("#who %s", account_name.c_str()), - false, - account_name - ).c_str(), - EQ::SayLinkEngine::GenerateQuestSaylink( - StringFormat("#who %s", account_ip.c_str()), - false, - account_ip + Chat::Who, + fmt::format( + "{}[{} {} ({})] {} ({}) ({}) ({}) {} ZONE: {}{} ({} | {})", + status_level, + player_level, + class_saylink, + base_class_name, + player_name, + race_saylink, + account_saylink, + account_ip_saylink, + displayed_guild_name, + zone_saylink, + version_string, + goto_saylink, + summon_saylink ).c_str() ); found_count++; } + std::string count_string = found_count == 1 ? "is" : "are"; + std::string message = ( - found_count > 0 ? - StringFormat("There is %i player(s) in EverQuest", found_count).c_str() : - "There are no players in EverQuest that match those who filters." + found_count ? + fmt::format( + "There {} {} player{} in EverQuest.", + count_string, + found_count, + found_count > 1 ? "s" : "" + ) : + "There are no players in EverQuest that match those filters." ); - c->Message(Chat::Magenta, message.c_str()); + c->Message( + Chat::Who, + message.c_str() + ); }